vim.wasm:webassemblyに移植されたVIMこのプロジェクトは、@RhysDによるVIMエディターの実験的なフォークで、EmscriptenとBinaryenを使用してWebAssemblyにコンパイルします。 VimはWebワーカーで実行され、 SharedArrayBufferを介してメインスレッドと対話します。
このプロジェクトの目標は、VIM CソースをWebAssemblyにコンパイルしてVIMの強力な機能を失うことなく、ブラウザでVIMエディターを実行することです。

使用法
:writeメモリにファイルのみを書き込みます。現在のバッファーをダウンロードして:exportまたは特定のファイル:export {file} 。"*がサポートされています。たとえば、システムクリップボードテキストにbimに"*p or :put *を貼り付け、vimのテキストを"*yまたは:yank *でシステムクリップボードにコピーします。VIMのクリップボードをシステムクリップボードと同期する場合は、 :set clipboard=unnamed通常のvimのように動作する必要があります。~/.vimディレクトリの下のファイルは、インデックス付きDBに永続的に保存されます。お気に入りの構成を~/.vim/vimrc ( ~/.vimrcではない)に記述してください。file={filepath}={url} {url}から{filepath}にファイルを取得します。任意のリモートファイルを開くことができます(CORSに注意してください)。:!/path/to/file.jsブラウザのJavaScriptコードを評価します。 :!%現在のバッファーを評価します。:e tutorで入手できます。arg= queryパラメーター(例?arg=~%2f.vim%2fvimrc&arg=hello.txt )を追加して、 vimコマンドライン引数を追加します。知らせ
SharedArrayBufferとAtomics使用しているため、デスクトップChrome、Firefox、Safari、またはChromiumベースのブラウザからアクセスしてください。 FirefoxまたはSafariでは、フィーチャーフラグ( javascript.options.shared_memory firefoxのmemory)を有効にする必要があります。keydownイベントからキー入力を受け取ります。キーイベントをインターセプトするブラウザ拡張機能を無効にしてください(Incognitoモードが最適です)。:quitが、ブラウザタブを閉じません。手動で閉じてください:)このプロジェクトは、Webアプリケーションで簡単に使用されるvim-wasm NPM PACAKGEとしてパッケージ化されています。詳細については、ドキュメントをお読みください。
現在の移植されたVIMバージョンは8.2.0055で、「通常」と「小さな」機能セットがあります。更新履歴については、changelogを確認してください。
次のプロジェクトはこのNPMパッケージに関連しており、ユースケースにより適している場合があります。

ワーカースレッドでは、VIMはWASMにコンパイルされて実行されています。ワーカースレッドは、ページを開くときにメインスレッドから専用のWebワーカーとして生成されます。
キーボードで何かを入力するとしましょう。ブラウザは、 keydownイベントでKeyboardEventとして撮影します。メインスレッドのJavaScriptはイベントをキャッチし、キーダウン情報を共有メモリバッファーに保存します。
バッファはワーカースレッドと共有されます。 Vimは、JavaScriptのAtomics APIを介して共有メモリバッファーを投票することにより、キーダウン情報を待って取得します。バッファーにキー情報が見つかると、情報がロードされ、キーシーケンスが計算されます。 emscriptenのおかげでJSを介してWASM APIに、WASMのVIMの入力バッファーにシーケンスが追加されます。
入力バッファーのシーケンスは、コアエディターロジック(更新バッファー、画面など)によって処理されます。更新により、描画テキスト、描画長、スクロール領域など、いくつかの描画イベントが発生します...
これらの抽選イベントは、EmscriptenのJSからC APIのおかげで、WASMからワーカースレッドのJavaScriptに送信されます。デバイスピクセル比と<canvas/> APIを考慮すると、イベントをレンダリングする方法が計算され、これらの計算されたレンダリングイベントは、 postMessage()でメッセージを渡すことでワーカースレッドからメインスレッドに渡されます。
メインスレッドJavaScriptは、これらのレンダリングイベントを受信してエンキューします。アニメーションフレームでは、それらを<canvas/>にレンダリングします。
最後に、ページにレンダリングされた画面を見ることができます。

VIMのWebAssembly FrontEndは、GTK Frontendなどの他のGUIのように、VIMの新しいGUIフロントエンドとして実装されます。 Cソースは各LLVMビットコードファイルにコンパイルされ、 emccによって1つのビットコードファイルvim.bcにリンクされます。 emccは最終的にvim.bcをvim.wasm BINARYにコンパイルし、HTML/JavaScriptランタイムを生成します。
私が最初に直面した違いは、ncursesなどのターミナルライブラリがないことでした。ターミナルライブラリチェックを無視するようにconfigureスクリプトを変更しました。 WASMのGUIフロントエンドは、CUI FrontEndの代わりに常に使用されているため、問題ありません。 configureチェックに合格するには、多くの回避策が必要でした。
EmscriptenはUNIXのような環境を提供します。したがって、 os_unix.c WASMをサポートできます。ただし、一部の機能はEmscriptenによってサポートされていません。 #ifdef FEAT_GUI_WASMガードを追加して、WASMでサポートできない機能を無効にしました(つまり、 fork (2)サポート、PTYサポート、信号ハンドラーはスタブなど)。
gui_wasm.cを作成しましたgui_mac.cおよびgui_w32.cを重視して参照しました。イベントループ( gui_mch_update()およびgui_mch_wait_for_chars() )は、ブロッキング待機で単純に実装されています。また、ほとんどすべてのUIレンダリングイベントは、emscriptenのおかげでcからJavaScript関数を呼び出すことにより、JavaScriptレイヤーに渡されます。
cソースは(多くの最適化を備えた)emscriptenに統合されたClangを使用してLLVMビットコードにコンパイルされます。次に、すべてのビットコードファイル( .o )はllvm-linkリンカーを備えた1つのビットコードファイルvim.bcにリンクされます(Emscriptenにも統合されます)。
そして、C。javaScriptのランタイムから送信されたレンダリングイベントを描くために、TypeScriptでJavaScriptランタイムを作成しました。メインスレッドとワーカースレッド。 wasm/main.tsはメインスレッド用です。ワーカースレッドでVIMを起動し、VIM画面を<canvas>に描画し、VIMから描画イベントを受信します。 wasm/runtime.tsおよびwasm/pre.tsは、ワーカースレッド用です。それらは、emscripten APIを使用して書かれています。
emcc (EMScriptenのCコンパイラ)は、 vim.bc 、 vim.js 、 vim.dataにvim.wasmとruntime.jsを、Binaryenを使用してプリロードされたVim Runtimeファイル(IE Colorscheme)にコンパイルします。ランタイムファイルは、emscriptenがブラウザに提供する仮想ファイルシステムにロードされます。ここでは、これらのファイルはワーカースレッド用にコンパイルされています。 wasm/main.js vim.jsをロードする専用のWebワーカーを起動します。
最後に、 <canvas/>を含む小さなwasm/index.htmlを作成して、vimスクリーンをレンダリングしてwasm/main.jsをロードしました。
Webサーバーを使用してwasm/index.htmlをホストし、ブラウザーでアクセスすることでVIMを開きます。それは動作します。
sleep()この移植の最も難しい部分は、ブロッキング待機を実装する方法でした(通常はsleep()で行われます)。
Webページでメインスレッドをブロックすることはユーザーの相互作用をブロックすることを意味するため、基本的に禁止されています。時間をかけるほとんどすべての操作は、JavaScriptの非同期APIとして実装されています。メインスレッドで実行されているWASMは、ビジーループを除いてスレッドをブロックできません。
しかし、Cプログラムはsleep()機能を何気なく使用するため、プログラムを移植するときに問題になります。 VIMのGUIフロントエンドは、ブロッキング待機でユーザーの入力を待つことも期待されています。
Emscriptenは、この問題の回避策を提供します。 emterpreterを使用すると、emscriptenは(擬似) emscripten_sleep()などの待機機能をブロックします。 C関数で使用される場合、 emcc WASMの代わりに関数をEmterPreterバイトコードにコンパイルします。実行時に、バイトコードは通訳(WASM)で実行されます。インタープリターがemscripten_sleep()を呼び出すポイントに到達すると、バイトコードの実行を中断し、タイマーを設定します( setTimeout JS機能を使用)。時間が経過すると、通訳者は状態を再開し、実行を継続します。
このメカニズムにより、JavaScriptの非同期待機は、Cの世界からの同期待機のように見えます。最初はemterpreterを使用しましたが、機能しました。ただし、いくつかの問題がありました。
私は代替品を探して、 Atomics.wait()見つけました。 Atomics.wait()は、低レベルの同期プリミティブ関数です。共有メモリバッファーの特定のバイトが更新されるまで待ちます。待機しています。もちろん、メインスレッドでは使用できません。ワーカースレッドで使用する必要があります。
WASMコードベースをワーカースレッドで実行しているWebワーカーに移動しましたが、レンダリング<canvas/>はメインスレッドでまだ実行されています。

VIMは、共有メモリバッファーを監視して、ユーザー入力を待機するためにAtomics.wait()を使用します。キーイベントが発生すると、メインスレッドはキーイベントデータを共有メモリバッファーに保存し、新しいキーイベントがAtomics.notify()によってもたらされたことを通知します。ワーカースレッドは、バッファがAtomics.wait()によって更新されたことを検出し、バッファーからキーイベントデータをロードします。 VIMは、データからキーシーケンスを計算し、入力バッファーに追加します。最後に、VIMはイベントを処理し、JavaScriptを介してメインスレッドに描画イベントを送信します。
ボーナスとして、VIM全体を含むほとんどすべてのロジックがワーカースレッドで実行されるため、ユーザーの相互作用はもはや防止されません。
Emscripten(1.38.37を使用している)とBinaryen(V84を使用している)がインストールされていることを確認してください。 MacOSを使用する場合、 brew install emscripten binaryenでインストールできます。
このプロジェクトをハッキングするには、 build.shスクリプトを使用してください。このリポジトリをクローニングした直後に、単に./build.shを実行します。 wasm/ディレクトリでVIM.WASMを構築します。時間がかかり、CPUのパワーがたくさんあります。
最後にpython -m http.server 1234などのWebサーバーを使用して、 localhostでwasm/直接ホストします。 localhost:1234?debugデバッグログでVIMを開始します。多くのデバッグ機能が有効になっているため、リリースビルドよりもはるかに遅いことに注意してください。詳細については、wasm/readme.mdをお読みください。
このリポジトリのwasmブランチは、最新のVIM/VIMマスターブランチを頻繁に統合することに注意してください。このプロジェクトをハッキングしたい場合は、独自のブランチを作成し、 git mergeでwasmブランチをブランチにマージしてください。
sleep()を提供しません。デフォルトでは、Emscriptenはsleep()ビジーループにコンパイルします。したがって、vim.wasmはemscripten_sleep()を提供するemterpreterを使用しています。いくつかのホワイトリスト機能は、emterpreterで実行されます。しかし、この機能はそれほど安定していません。構築されたバイナリを大きくし、より長く編集します。stringパラメーターを渡すJavaScriptからC関数を呼び出すことが機能しないことを意味します。SharedArrayBufferがSpecterのセキュリティの脆弱性のために無効になっているためです。これは、非同期で修正できます。作業は進行中であり、PR#35で追跡されています。 開発はGitHubプロジェクトで管理されています。
<canvas/>をレンダリングしますこのプロジェクトは、Lu Wangによる印象的なプロジェクトVIM.JSに重く触発されました。
このリポジトリのすべての追加ファイルは、VIM(VIMライセンス)と同じライセンスの下でライセンスされています。参照してください:help license 。
オリジナルのreadmeがフォローしています。

このreadmeの翻訳については、終わりを参照してください。
VIMは、古き良きUNIXエディターVIの大幅に改善されたバージョンです。マルチレベルの元に戻す、構文強調表示、コマンドライン履歴、オンラインヘルプ、スペルチェック、ファイル名の完了、ブロック操作、スクリプト言語などの多くの新機能が追加されています。グラフィカルユーザーインターフェイス(GUI)も利用できます。それでも、VIの互換性は維持されており、「指に」VIを持っている人は家にいると感じるでしょう。 VIとの違いについてはruntime/doc/vi_diff.txt参照してください。
このエディターは、プログラムやその他のプレーンテキストファイルの編集に非常に役立ちます。すべてのコマンドは通常のキーボード文字で与えられるため、10本の指で入力できる人は非常に速く動作できます。さらに、関数キーはユーザーがコマンドにマッピングでき、マウスを使用できます。
VimはMS-Windows(NT、2000、XP、Vista、7、8、10)、Macintosh、VMS、およびほとんどすべてのUnixのフレーバーの下で実行されます。他のシステムへの移植はそれほど難しくないはずです。 VIMの古いバージョンは、MS-DOS、MS-Windows 95/98/ME、Amiga Dos、Atari Mint、Beos、Risc OS、OS/2で実行されます。これらはもはや維持されていません。
多くの場合、お気に入りのパッケージマネージャーを使用してVIMをインストールできます。 MacとLinuxでは、VIMの小さなバージョンが事前にインストールされていますが、さらに機能が必要な場合はVIMをインストールする必要があります。
UNIX、PC、AMIGA、その他のシステムには個別の分布があります。このREADME.mdファイルには、ランタイムアーカイブが付属しています。これには、実行時に使用されるドキュメント、構文ファイル、その他のファイルが含まれています。 VIMを実行するには、バイナリアーカイブのいずれかまたはソースアーカイブを取得する必要があります。必要なものは、実行したいシステムと、自分でコンパイルする必要があるかどうかに依存します。現在利用可能な分布の概要については、http://www.vim.org/download.phpを確認してください。
最新のVIMを入手するための人気のある場所:
バイナリ分布を取得した場合、VIMをコンパイルする必要はありません。ソース分布を取得した場合、VIMをコンパイルするためのすべてのものがsrcディレクトリにあります。手順については、 src/INSTALL参照してください。
システム固有の命令については、これらのファイルのいずれかを参照してください。 readmedirディレクトリ(リポジトリ内)またはトップディレクトリ(アーカイブを開梱する場合)のいずれか:
README_ami.txt Amiga
README_unix.txt Unix
README_dos.txt MS-DOS and MS-Windows
README_mac.txt Macintosh
README_vms.txt VMS
使用した分布に応じて、他のREADME_*.txtファイルがあります。
VIMチューターは、初心者向けの1時間のトレーニングコースです。多くの場合、 vimtutorとして開始できます。参照:help tutor 。
最良のものは使用することです:help 。まだ実行可能なものがない場合は、 runtime/doc/help.txtお読みください。他のドキュメントファイルへのポインターが含まれています。ユーザーマニュアルは本のように読み取り、VIMの使用を学ぶことをお勧めします。参照:help user-manual 。
VIMはチャリティーウェアです。好きなだけ使用してコピーできますが、ウガンダで孤児を助けるために寄付をすることをお勧めします。詳細については、ファイルruntime/doc/uganda.txtをお読みください(do :help uganda in vim)。
ライセンスの概要:VIMの変更されていないコピーの使用または配布に制限はありません。 VIMの一部も配布される場合がありますが、ライセンステキストを常に含める必要があります。変更されたバージョンには、いくつかの制限が適用されます。ライセンスはGPL互換性があり、GPLライブラリを使用してVIMをコンパイルして配布することができます。
バグを修正し、新しい機能を追加するには、多くの時間と労力が必要です。仕事に対する感謝を示し、BRAMや他の人にVIMでの作業を続けるように動機付けするために、寄付を送ってください。
Bramは有給の仕事に戻っているので、今ではウガンダの子供たちを助けるためにお金が使用されます。 runtime/doc/uganda.txtを参照してください。しかし同時に、寄付はVIMで働き続けるというBRAMの動機を高めます!
VIM Webサイトでのスポンサーの外観に関する最新の情報:http://www.vim.org/sponsor/
VIMをより良くするのを手伝いたい場合は、converting.mdファイルをご覧ください。
VIMに関する最新のニュースは、VIMのホームページ:http://www.vim.org/で見つけることができます
問題がある場合は、VIMドキュメントまたはヒントをご覧ください:http://www.vim.org/docs.php http://vim.wikia.com/wiki/vim_tips_wiki
まだ問題やその他の質問がある場合は、メーリングリストのいずれかを使用して、VIMユーザーや開発者と話し合います:http://www.vim.org/maillist.php
他に何も機能しない場合は、バグを直接報告してください:bram moolenaar [email protected]
その他のコメント、パッチ、花、提案を送信してください:bram moolenaar [email protected]
これは、VIM:VIの改善のバージョン8.2のREADME.mdです。
韓国語