Vim. Gasmus: Vim portiert auf WebAssembly Dieses Projekt ist eine experimentelle Gabel von VIM -Editor von @rhysd, um es mit Emscripten und Binary in WebAssembly zusammenzustellen. Vim läuft auf Web Worker und interagiert mit dem Haupt -Thread über SharedArrayBuffer .
Das Ziel dieses Projekts ist es, VIM -Editor für Browser zu betreiben, ohne die leistungsstarken Funktionen von VIM zu verlieren, indem VIM -C -Quellen in WebAssembly zusammengestellt werden.

VERWENDUNG
:write nur eine Datei im Speicher. Den aktuellen Puffer herunterladen von :export oder spezifische Datei nach :export {file} ."* wird unterstützt. Fügen Sie beispielsweise das System zwischen den Clipboard -Text mit "*p oder :put * , und kopieren Sie den Text in VIM in System -Zwischenablage mit "*y oder :yank * . Wenn Sie die VIM -Zwischenablage von VIM mit System :set clipboard=unnamed synchronisieren möchten, sollten Sie wie normale VIM funktionieren.~/.vim -Verzeichnis werden persistent in indiziertem dB gespeichert. Bitte schreiben Sie Ihre bevorzugte Konfiguration in ~/.vim/vimrc (nicht ~/.vimrc ).file={filepath}={url} holt eine Datei von {url} nach {filepath} ab. Beliebige Remote -Dateien können geöffnet werden (Care for CORs).:!/path/to/file.js bewertet den JavaScript -Code im Browser. :!% bewertet den aktuellen Puffer.:e tutor .arg= Abfrageparameter hinzu (z ?arg=~%2f.vim%2fvimrc&arg=hello.txt ), um vim -Befehlszeilenargumente hinzuzufügen.BEACHTEN
SharedArrayBuffer und Atomics verwendet. Auf Firefox oder Safari müssen vorerst Feature -Flags ( javascript.options.shared_memory für Firefox) aktiviert werden.keydown -Ereignis auf. Bitte deaktivieren Sie Ihre Browser -Erweiterungen, die wichtige Ereignisse abfangen (der Inkognito -Modus wäre der beste).:quit , aber es schließt keinen Browser -Registerkarte. Bitte schließen Sie es manuell :) Dieses Projekt wird als vim-wasm -NPM Pacakge verpackt, der in der Webanwendung problemlos verwendet werden kann. Bitte lesen Sie die Dokumentation für weitere Details.
Die aktuelle portierte VIM -Version ist 8.2.0055 mit "normalen" und "kleinen" Funktionen. Bitte überprüfen Sie ChangeLog auf Update -Historie.
Die folgenden Projekte beziehen sich auf dieses NPM -Paket und sind möglicherweise besser für Ihren Anwendungsfall geeignet.

Im Arbeiter -Thread wird Vim durch kompiliert zu WASM ausgeführt. Der Worker -Thread wird beim Öffnen der Seite als dedizierter Webarbeiter aus dem Haupt -Thread hervorgebracht.
Nehmen wir an, Sie geben etwas mit Tastatur ein. Browser nimmt es als KeyboardEvent für keydown -Ereignis an. JavaScript im Haupt -Thread erfasst das Ereignis und speichert Keydown -Informationen in einem gemeinsamen Speicherpuffer.
Der Puffer wird mit dem Arbeiter -Thread geteilt. Vim wartet und erhält die Keydown -Informationen, indem er den gemeinsam genutzten Speicherpuffer über die Atomics -API von JavaScript befragt. Wenn Schlüsselinformationen im Puffer gefunden werden, wird die Informationen geladen und die Schlüsselsequenz berechnet. Über JS zu Wasm API dank EMSCIPTEN wird die Sequenz zu Vims Eingangspuffer in WASM hinzugefügt.
Die Sequenz im Eingabepuffer wird von der Kerneditor -Logik (Aktualisieren Sie Puffer, Bildschirm, ...) verarbeitet. Aufgrund der Updates ereignen sich einige Zeichnungsereignisse wie Zeichnen von Text, Zeichnen von Richten, Scrollregionen, ...
Diese Draw -Ereignisse werden dank Emscriptens JS an C API an JavaScript in Worker -Thread von WASM gesendet. Unter Berücksichtigung des Geräte -Pixel -Verhältnisses und <canvas/> -API werden die Ereignisse berechnet und diese berechneten Rendering -Ereignisse werden von Worker -Thread zu Haupt -Thread über die Meldung mit postMessage() übergeben.
Hauptfache JavaScript empfängt und erlebt diese Rendering -Ereignisse. Auf dem Animationsrahmen wird sie zu <canvas/> übertragen.
Schließlich können Sie den gerenderten Bildschirm auf der Seite sehen.

Das WebAssembly -Frontend für VIM wird wie andere GUI wie GTK Frontend als neuer GUI -Frontend von VIM implementiert. C -Quellen werden mit jeder LLVM -Bitcode -Dateien kompiliert und dann von emcc mit einer Bitcode -Datei vim.bc verknüpft. emcc wird schließlich den vim.bc mithilfe von Binary in vim.wasm -Binary zusammenstellen und erzeugt HTML/JavaScript -Laufzeit.
Der Unterschied, mit dem ich zuerst konfrontiert war, war der Mangel an Terminalbibliothek wie NCURSES. Ich habe configure geändert, um die Überprüfung der Terminalbibliothek zu ignorieren. Es ist in Ordnung, da die GUI -Frontend für WASM immer anstelle von CUI -Frontend verwendet wird. Ich brauchte viele Problemumgehungen, um configure zu bestehen.
EMSCIPTEN bietet eine unixartige Umgebung. Also kann os_unix.c WASM unterstützen. Einige Funktionen werden jedoch nicht von EMSCIPTEN unterstützt. Ich habe viele #ifdef FEAT_GUI_WASM -Wächter hinzugefügt, um Funktionen zu deaktivieren, die nicht von WASM (dh fork (2) unterstützt werden können, PTY -Unterstützung, Signalhandler sind stropfen, ... usw.).
Ich gui_mac.c gui_wasm.c erstellt gui_w32.c Ereignisschleife ( gui_mch_update() und gui_mch_wait_for_chars() ) wird einfach mit blockierender Wartezeit implementiert. Und fast alle UI -Rendering -Ereignisse werden dank EMSCIPTEN an JavaScript Layer übergeben, indem JavaScript -Funktionen von C aufgerufen werden.
C -Quellen werden (mit vielen Optimierungen) in LLVM -Bitcode mit Clang zusammengestellt, das in Emscripten integriert ist. Anschließend sind alle Bitcode-Dateien ( .o ) mit einem Bitcode-Datei vim.bc mit llvm-link Linker verknüpft (auch in EMSCIPTEN integriert).
Und ich habe JavaScript -Laufzeit in TypeScript erstellt, um die von C. JavaScript -Laufzeit gesendeten Rendering -Ereignisse in zwei Teile zu unterteilen. Hauptfaden und Worker -Thread. wasm/main.ts ist für den Hauptfaden. Es startet VIM im Worker -Thread und zeichnet VIM -Bildschirm auf <canvas> Ereignisse von Zeichnungen von VIM. wasm/runtime.ts und wasm/pre.ts sind für Worker -Thread. Sie werden mit EMSCIPTEN -API geschrieben.
emcc (Emscriptens C -Compiler) kompiliert die vim.bc und runtime.js in vim.wasm , vim.js und vim.data mit vorgeladenen VIM -Laufzeitdateien (dh ColorScheme) mit Binary. Laufzeitdateien werden auf einem virtuellen Dateisystem geladen, das von Emscripten in einem Browser bereitgestellt wird. Hier werden diese Dateien für Worker -Thread kompiliert. wasm/main.js startet einen speziellen Webarbeiter, vim.js lädt.
Schließlich habe ich ein kleines wasm/index.html erstellt, das <canvas/> enthält, um VIM -Bildschirm zu rendern und wasm/main.js zu laden.
Das Hosting wasm/index.html mit einem Webserver und zugreift mit Browser öffnet VIM. Es funktioniert.
sleep() auf JavaScript Am schwierigsten für diese Portierung war die Implementierung von Blockierungswartungen (normalerweise mit sleep() ).
Da das Blockieren des Hauptthreads auf der Webseite die Blockierung der Benutzerinteraktion bedeutet, ist er im Grunde verboten. Fast alle Vorgänge werden in JavaScript als asynchrone API implementiert. WASM, das auf dem Hauptfaden ausgeführt wird, kann den Thread mit Ausnahme der belebten Schleife nicht blockieren.
C -Programme verwenden jedoch beiläufig sleep() -Funktion, daher ist dies ein Problem beim Portieren der Programme. Es wird auch erwartet, dass Vims GUI -Frontend die Benutzereingabe mit Blockierungswartung wartet.
EMSCIPTEN bietet eine Problemumgehung für dieses Problem, EmterPeter. Mit EMERPRETER bietet EMSCIPTEN (pseudo) blockierende Wartefunktionen wie emscripten_sleep() . Wenn sie in der C -Funktion verwendet werden, kompiliert emcc die Funktion in den Emterpreter -Byte -Code anstelle von WASM. Und zur Laufzeit wird der Byte -Code auf einem Dolmetscher (auf WASM) ausgeführt. Wenn der Interpreter am Punkt erreicht wird, um emscripten_sleep() aufzurufen, setzt er die Byte -Codeausführung aus und legt Timer fest (mit setTimeout JS -Funktion). Nach Ablauf der Zeit setzt der Dolmetscher den Zustand fort und setzt die Ausführung fort.
Durch diesen Mechanismus sieht JavaScripts asynchrones Warten so aus, als ob synchrone Warten von C World. Zuerst habe ich Emterpreter verwendet und es hat funktioniert. Es gab jedoch mehrere Probleme.
Ich suchte nach einer Alternative und fand Atomics.wait() . Atomics.wait() ist eine synchrone primitive Funktion auf niedriger Ebene. Es wartet, bis ein bestimmtes Byte im gemeinsamen Speicherpuffer aktualisiert ist. Es blockiert das Warten . Natürlich ist es im Hauptfaden nicht verfügbar. Es muss auf einem Arbeiter -Thread verwendet werden.
Ich habe die WASM -Code -Basis in Web -Arbeiter umgelegt, die auf Worker -Thread ausgeführt werden, obwohl das Rendern von <canvas/> im Haupt -Thread immer noch durchgeführt wird.

Vim verwendet Atomics.wait() um die Benutzereingabe zu warten, indem Sie einen gemeinsam genutzten Speicherpuffer ansehen. Wenn ein Schlüsselereignis stattfindet, speichert der Haupt -Thread wichtige Ereignisdaten im gemeinsam genutzten Speicherpuffer und benachrichtigt, dass ein neues Schlüsselereignis von Atomics.notify() kam. Der Worker -Thread erkennt, dass der Puffer von Atomics.wait() aktualisiert wurde und die wichtigsten Ereignisdaten aus dem Puffer lädt. VIM berechnet eine Schlüsselsequenz aus den Daten und füge sie zum Eingabepuffer hinzu. Schließlich übernimmt VIM das Ereignis und sendet Draw -Ereignisse über JavaScript an den Haupt -Thread.
Als Bonus wird die Benutzerinteraktion nicht mehr verhindert, da fast alle Logik, einschließlich des gesamten VIM, im Worker -Thread ausgeführt werden.
Bitte stellen Sie sicher, dass EMSCIPTEN (ich verwende 1.38.37) und Binary (ich verwende v84). Wenn Sie MacOS verwenden, können sie mit brew install emscripten binaryen installiert werden.
Bitte verwenden Sie build.sh Skript, um dieses Projekt zu hacken. Kurz nach dem Klonen dieses Repositorys leiten Sie einfach ./build.sh . Es baut Vim. Gasmus im wasm/ Verzeichnis. Es braucht viel Zeit und CPU -Strom.
Hostieren Sie schließlich die wasm/ direkt auf localhost mit einem Webserver wie python -m http.server 1234 . Zugriff auf localhost:1234?debug startet VIM mit Debug -Protokollen. Beachten Sie, dass es viel langsamer als den Release Build ist, da viele Debug -Funktionen aktiviert sind. Bitte lesen Sie wasm/readme.md für weitere Details.
Bitte beachten Sie, dass wasm -Zweig dieses Repositorys häufig den neuesten VIM/VIM -Master -Zweig verschmelzen. Wenn Sie dieses Projekt hacken möchten, stellen Sie bitte sicher, dass Sie Ihre eigene Filiale erstellen und wasm -Filiale durch git merge in Ihre Filiale verschmelzen.
sleep() . Standardmäßig kompiliert Emscripten sleep() in eine geschäftige Schleife. So verwendet Vim. Gasmus EMERPRETER, das emscripten_sleep() liefert. Einige Whitelist -Funktionen werden mit EmterPeter ausgeführt. Diese Funktion ist jedoch nicht so stabil. Es macht gebaute Binärdateien größer und kompiliert sich länger.string -Parameter übergeben, nicht funktioniert.SharedArrayBuffer aufgrund der Sicherheitsanfälligkeit von Spectre Security deaktiviert ist. Dies kann mit Asyncify fixiert werden. Die Arbeiten sind im Gange und werden bei PR #35 verfolgt. Die Entwicklung wird in Github -Projekten verwaltet.
<canvas/> im Arbeiter -Thread mithilfe von Offscreen -Leinwand rendernDieses Projekt wurde stark von einem beeindruckenden Projekt Vim.js von Lu Wang inspiriert.
Alle zusätzlichen Dateien in diesem Repository sind unter derselben Lizenz wie VIM (VIM -Lizenz) lizenziert. Bitte beachten Sie :help license .
Original Readme folgt.

Für Übersetzungen dieser Readme siehe das Ende.
Vim ist eine stark verbesserte Version des guten alten Unix -Editors VI. Es wurden viele neue Funktionen hinzugefügt: Multi-Level-Rückgänger, Syntax-Hervorhebung, Befehlszeilenverlauf, Online-Hilfe, Zauberprüfung, Fertigstellung des Dateinamens, Blockvorgänge, Skriptsprache usw. Es gibt auch eine grafische Benutzeroberfläche (GUI). Trotzdem wird die VI -Kompatibilität beibehalten, diejenigen, die VI "in den Fingern" haben, werden sich wie zu Hause fühlen. Unter Unterschiede mit vi siehe runtime/doc/vi_diff.txt .
Dieser Editor ist sehr nützlich für die Bearbeitung von Programmen und anderen Klartextdateien. Alle Befehle werden mit normalen Tastaturzeichen gegeben, sodass diejenigen, die mit zehn Fingern tippen können, sehr schnell arbeiten können. Zusätzlich können Funktionstasten vom Benutzer auf Befehle abgebildet werden und die Maus verwendet werden.
Vim läuft unter MS-Windows (NT, 2000, XP, Vista, 7, 8, 10), Macintosh, VMs und fast allen Geschmacksrichtungen von Unix. Das Portieren auf andere Systeme sollte nicht sehr schwierig sein. Ältere Versionen von VIM-Lauf auf MS-DOS, MS-Windows 95/98/ME, Amiga DOS, Atari Mint, Beos, RISC OS und OS/2. Diese werden nicht mehr aufrechterhalten.
Sie können häufig Ihren bevorzugten Paketmanager verwenden, um VIM zu installieren. Auf Mac und Linux ist eine kleine Version von Vim vorinstalliert. Sie müssen weiterhin VIM installieren, wenn Sie mehr Funktionen wünschen.
Es gibt separate Verteilungen für UNIX, PC, Amiga und einige andere Systeme. Diese README.md -Datei wird mit dem Laufzeitarchiv ausgestattet. Es enthält Dokumentation, Syntaxdateien und andere Dateien, die zur Laufzeit verwendet werden. Um Vim zu führen, müssen Sie entweder eines der binären Archive oder ein Quellarchiv erhalten. Auf welchem Sie benötigen, hängt von dem System ab, auf dem Sie es ausführen möchten und ob Sie es selbst erstellen oder selbst kompilieren müssen. Überprüfen Sie http://www.vim.org/download.php, um einen Überblick über aktuell verfügbare Verteilungen zu erhalten.
Einige beliebte Orte, um den neuesten VIM zu erhalten:
Wenn Sie eine binäre Verteilung erhalten haben, müssen Sie keine VIM kompilieren. Wenn Sie eine Quellverteilung erhalten haben, befindet sich das gesamte Zeug zum Kompilieren von VIM im src -Verzeichnis. src/INSTALL Sie Anweisungen.
Eine dieser Dateien finden Sie systemspezifische Anweisungen. Entweder im ReadMedir -Verzeichnis (im Repository) oder im Top -Verzeichnis (wenn Sie ein Archiv auspacken):
README_ami.txt Amiga
README_unix.txt Unix
README_dos.txt MS-DOS and MS-Windows
README_mac.txt Macintosh
README_vms.txt VMS
Es gibt andere README_*.txt -Dateien, abhängig von der von Ihnen verwendeten Verteilung.
Der VIM -Tutor ist ein einstündiger Schulungskurs für Anfänger. Oft kann es als vimtutor gestartet werden. Weitere Informationen finden Sie unter :help tutor .
Das Beste ist zu verwenden :help in Vim. Wenn Sie noch keine ausführbare Datei haben, lesen Sie runtime/doc/help.txt . Es enthält Hinweise auf die anderen Dokumentationsdateien. Das Benutzerhandbuch liest wie ein Buch und wird empfohlen, um VIM zu verwenden. Siehe :help user-manual .
Vim ist Charityware. Sie können es so oft verwenden und kopieren, wie Sie möchten, aber Sie werden ermutigt, eine Spende zu leisten, um Waisen in Uganda zu helfen. Bitte lesen Sie die Datei runtime/doc/uganda.txt für Details (do :help uganda in Vim).
Zusammenfassung der Lizenz: Es gibt keine Einschränkungen bei der Verwendung oder Verteidigung einer nicht modifizierten Kopie von VIM. Teile von VIM können auch verteilt werden, aber der Lizenztext muss immer enthalten sein. Für geänderte Versionen gelten einige Einschränkungen. Die Lizenz ist GPL -kompatibel, Sie können VIM mit GPL -Bibliotheken kompilieren und diese verteilen.
Das Beheben von Fehler und Hinzufügen neuer Funktionen erfordert viel Zeit und Mühe. Um Ihre Wertschätzung für die Arbeit zu zeigen und Bram und andere zu motivieren, weiter an VIM zu arbeiten, senden Sie bitte eine Spende.
Da Bram wieder zu einem bezahlten Job geht, wird das Geld nun verwendet, um Kindern in Uganda zu helfen. Siehe runtime/doc/uganda.txt . Gleichzeitig erhöhen Spenden die Motivation von Bram, weiter an Vim zu arbeiten!
Die neuesten Informationen zum Sponsoring -Blick auf die VIM -Website: http://www.vim.org/sponsor/
Wenn Sie VIM besser machen möchten, sehen Sie sich die Datei bei der beitragen.md.
Die neuesten Nachrichten über VIM finden Sie auf der VIM -Homepage: http://www.vim.org/
Wenn Sie Probleme haben, schauen Sie sich die VIM -Dokumentation oder Tipps an: http://www.vim.org/docs.php http://vim.wikia.com/wiki/vim_tips_wiki
Wenn Sie weiterhin Probleme oder andere Fragen haben, verwenden Sie eine der Mailinglisten, um sie mit VIM -Benutzern und -Enternern zu besprechen: http://www.vim.org/maillist.php
Wenn nichts anderes funktioniert, melden Sie Fehler direkt: Bram Moolenaar [email protected]
Senden Sie weitere Kommentare, Patches, Blumen und Vorschläge an: Bram Moolenaar [email protected]
Dies ist README.md für Version 8.2 von VIM: VI verbessert.
Koreanisch