vim.wasm:VIM移植到WebAssembly該項目是@RHYSD的VIM編輯器實驗叉,可將其編譯為使用Emscripten和Binaryen的WebAssembly。 VIM在Web Worker上運行,並通過SharedArrayBuffer與主線程進行交互。
該項目的目的是在瀏覽器上運行VIM編輯器,而不會通過將VIM C源編譯到WebAssembly中而丟失VIM強大的功能。

用法
:write僅在內存上寫入文件。下載當前緩衝區:export或特定文件:export {file} 。"*p "*y "* :yank * :put * :set clipboard=unnamed~/.vim目錄下的文件持續存儲在索引DB中。請在~/.vim/vimrc (非~/.vimrc )中寫出您喜歡的配置。file={filepath}={url}將文件從{url}獲取到{filepath} 。可以打開任意遠程文件(關心CORS)。:!/path/to/file.js在瀏覽器中評估JavaScript代碼。 :!%評估當前緩衝區。:e tutor 。arg=查詢vim (例如?arg=~%2f.vim%2fvimrc&arg=hello.txt注意
SharedArrayBuffer和Atomics 。在Firefox或Safari上,必須暫時啟用功能標誌( javascript.options.shared_memory )。keydown事件中獲取密鑰輸入。請禁用您的瀏覽器擴展名截取關鍵事件(隱身模式將是最好的)。:quit ,但不會關閉瀏覽器選項卡。請手動關閉它:)該項目被包裝為vim-wasm NPM PACAKGE,可輕鬆在Web應用程序中使用。請閱讀文檔以獲取更多詳細信息。
當前的移植VIM版本為8.2.0055,具有“正常”和“小”功能集。請檢查變更記錄以獲取更新歷史記錄。
以下項目與此NPM軟件包有關,可能更適合您的用例。

在Worker線程中,VIM通過編譯為WASM運行。打開頁面時,將工作線程從主線程中產生為專用的Web Worker。
假設您用鍵盤輸入一些東西。瀏覽器將其作為keydown事件中的KeyboardEvent視為。主線程中的JavaScript捕獲事件,並將鍵盤信息存儲到共享內存緩衝區中。
緩衝區與工作線程共享。 VIM等待並通過通過JavaScript的Atomics API對共享內存緩衝區進行輪詢來獲取鍵盤信息。當在緩衝區中找到密鑰信息時,它會加載信息併計算關鍵序列。通過JS到WASM API得益於Emscripten,該序列被添加到WASM中VIM的輸入緩衝區中。
輸入緩衝區中的序列由Core Editor Logic(更新緩衝區,屏幕,...)處理。由於更新,某些繪製事件發生了,例如繪製文本,繪製式,滾動區域,...
由於Emscripten的JS至C API,這些抽獎活動將從WASM中的WARSM中發送給JavaScript。考慮到設備像素比和<canvas/> api,如何計算事件,這些計算出的渲染事件將通過postMessage()傳遞的消息傳遞到主線程。
主線程JavaScript接收並招募這些渲染事件。在動畫框架上,它將它們渲染為<canvas/> 。
最後,您可以在頁面中看到渲染的屏幕。

VIM的WebAssembly前端與其他GUI(例如GTK Frontend)一樣,是VIM的新GUI前端。 c源被編譯到每個LLVM比特代碼文件,然後將它們鏈接到一個emcc文件vim.bc emcc最終將使用二進制將vim.bc編譯為vim.wasm二進制,並生成HTML/JavaScript運行時。
我最初面臨的差異是缺乏終端庫,例如ncurses。我修改了configure腳本以忽略終端庫檢查。沒關係,因為WASM的GUI前端總是使用而不是CUI前端。我需要許多解決方法來傳遞configure檢查。
Emscripten提供類似Unix的環境。因此, os_unix.c可以支持WASM。但是,Emscripten不支持某些功能。我添加了許多#ifdef FEAT_GUI_WASM guards,以禁用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源(具有許多優化)與clang的LLVM比特碼合併到Emscripten。然後,所有比特代碼文件( .o )都鏈接到帶有llvm-link Linker(也集成到EMScripten)的一個BitCode文件vim.bc
我在打字稿中創建了JavaScript運行時,以繪製C. JavaScript運行時發送的渲染事件分為兩個部分;主線程和工人線程。 wasm/main.ts用於主線程。它在Worker線程中啟動VIM,並將VIM屏幕繪製為<canvas>從VIM接收繪製事件。 wasm/runtime.ts和wasm/pre.ts用於工作線程。它們是使用Emscripten API編寫的。
emcc (Emscripten的C編譯器)使用Binaryen編譯了帶有預加載的VIM Runtime Files(IE Colorscheme)的vim.wasm , vim.js和vim.data中的vim.bc和runtime.js 。運行時文件被加載在Emscripten在瀏覽器上提供的虛擬文件系統上。在這裡,這些文件是用於工作線程的。 wasm/main.js啟動了一個專用的Web Worker加載vim.js
最後,我創建了一個小的wasm/index.html ,其中包含<canvas/>以渲染vim屏幕並加載wasm/main.js 。
現在,使用Web服務器託管wasm/index.html並使用瀏覽器打開VIM訪問它。有用。
sleep()此移植最困難的部分是如何實現阻止等待(通常使用sleep()完成)。
由於在網頁上阻止主線程意味著阻止用戶交互,因此基本上禁止它。幾乎所有花費時間的操作在JavaScript中都實現為異步API。在主線程上運行的WASM不能阻止線程,除了繁忙的循環。
但是C程序隨便使用sleep()函數,因此移植程序時是一個問題。 VIM的GUI前端也有望通過阻止等待等待用戶輸入。
Emscripten為此問題提供解決方法,EmterPreter。使用EmterPreter,Emscripten提供(偽)阻止等待功能,例如emscripten_sleep() 。當它們用於C函數時, emcc將函數編譯為EmterPreter字節代碼而不是WASM。在運行時,字節代碼是在解釋器上運行的(在WASM上)。當解釋器在調用emscripten_sleep()點到達時,它暫停字節代碼執行並設置計時器(帶有setTimeout JS函數)。時間到期後,口譯員恢復狀態並繼續執行。
通過這種機制,JavaScript的異步等待看起來好像來自C World的同步等待。起初,我使用了Emterpreter,並且起作用。但是,有幾個問題。
我尋找了一個替代品和發現的Atomics.wait() 。 Atomics.wait()是低級同步原始函數。它等到共享內存緩衝區中的特定字節更新。它正在阻止等待。當然,它在主線程上不可用。它必須在工作線程上使用。
我將WASM代碼基庫移至Web Worker上在Worker線程上運行的Web Worker,儘管渲染<canvas/>仍在主線程中完成。

VIM使用Atomics.wait()通過觀看共享內存緩衝區來等待用戶輸入。當關鍵事件發生時,主線程將關鍵事件數據存儲到共享內存緩衝區中,並通知Atomics.notify()出現新的密鑰事件。 Worker線程檢測緩衝區是否通過Atomics.wait()更新,並從緩衝區加載關鍵事件數據。 VIM從數據中計算一個密鑰序列,並將其添加到輸入緩衝區中。最終,VIM處理事件,並通過JavaScript將DRAW事件發送到主線程。
作為獎勵,不再阻止用戶互動,因為幾乎所有邏輯(包括整個VIM)都在工作線程中運行。
請確保安裝了Emscripten(我使用的1.38.37)和二進制(我使用的V84)。如果您使用MACOS,則可以使用brew install emscripten binaryen安裝它們。
請使用build.sh腳本黑客入侵此項目。克隆此存儲庫後,只需運行./build.sh即可。它在wasm/ Directory中構建了vim.wasm。它需要時間,並且CPU電源很多。
最終,使用Web服務器(例如python -m http.server 1234託管wasm/直接在localhost上。訪問localhost:1234?debug將通過調試日誌開始VIM。請注意,由於啟用了許多調試功能,因此它比發行版本要慢得多。有關更多詳細信息,請閱讀WASM/readme.md。
請注意,該存儲庫的wasm分支經常合併最新的VIM/VIM主分支。如果您想入侵此項目,請確保創建自己的分支機構並通過git merge將wasm分支合併到您的分支機構中。
sleep() 。默認情況下,Emscripten將sleep()編譯成一個繁忙的循環。因此,vim.wasm使用的EmterPreter提供了emscripten_sleep() 。一些白名單的功能由EmterPreter運行。但是此功能不是那麼穩定。它使構建的二進製文件更大,並且編譯更長。string參數不起作用。SharedArrayBuffer被禁用。這可以通過異步固定。這項工作正在進行中,並在PR#35進行了跟踪。 開發是在GitHub項目中管理的。
<canvas/>在工作線程中該項目受到Lu Wang的令人印象深刻的VIM.JS的啟發。
此存儲庫中的所有其他文件均在與VIM(VIM許可證)相同的許可下獲得許可。請參閱:help license以獲取更多詳細信息。
原始Readme正在關注。

有關此讀數的翻譯,請參閱結尾。
VIM是Good Old Unix編輯器VI的大大改進版本。添加了許多新功能:多級撤消,語法突出顯示,命令行歷史記錄,在線幫助,拼寫檢查,文件名完成,塊操作,腳本語言等。還有一個圖形用戶界面(GUI)。儘管如此,維持VI兼容性,那些“手指”的VI的人會感到賓至如歸。有關VI的差異,請參見runtime/doc/vi_diff.txt 。
該編輯器對於編輯程序和其他純文本文件非常有用。所有命令均以普通鍵盤字符給出,因此那些可以用十個手指打字的人可以很快工作。此外,功能鍵可以由用戶映射到命令,並且可以使用鼠標。
VIM在MS-Windows(NT,2000,XP,Vista,7,8,10),Macintosh,VM和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導師是初學者一小時的培訓課程。通常,它可以作為vimtutor開始。請參閱:help tutor以獲取更多信息。
最好的是使用:help 。如果您還沒有可執行文件,請讀取runtime/doc/help.txt 。它包含其他文檔文件的指針。用戶手冊讀起來像一本書,建議學習使用VIM。請參閱:help user-manual 。
VIM是慈善軟件。您可以隨意使用並複制它,但鼓勵您捐款以幫助烏干達的孤兒。請閱讀文件runtime/doc/uganda.txt以獲取詳細信息(DO :help uganda內部的VIM)。
許可證的摘要:使用或分發未修改的VIM副本沒有任何限制。 VIM的一部分也可以分發,但必須始終包括許可文本。對於修改版本,適用一些限制。該許可證兼容GPL,您可以將VIM與GPL庫編譯並分發。
修復錯誤並添加新功能需要大量時間和精力。要表示您對工作的讚賞,並激勵Bram和其他人繼續研究VIM,請發送捐款。
由於Bram又回到了有償工作,因此資金現在將用於幫助烏干達的兒童。請參閱runtime/doc/uganda.txt 。但與此同時,捐贈增加了布拉姆繼續在VIM上工作的動機!
有關VIM網站上有關贊助外觀的最新信息:http://www.vim.org/sponsor/
如果您想幫助使VIM更好,請參閱contruting.md文件。
有關VIM的最新消息可以在VIM主頁上找到:http://www.vim.org/
如果有問題,請查看VIM文檔或提示:http://www.vim.org/docs.php http://vim.wikia.com/wiki/wiki/wiki/vim_tips_wiki
如果您仍然有問題或任何其他問題,請使用其中一個郵件列表與VIM用戶和開發人員討論:http://www.vim.org/maillist.php
如果沒有其他作用,請直接報告錯誤:bram moolenaar [email protected]
將任何其他評論,補丁,鮮花和建議發送到:bram moolenaar [email protected]
這是VIM:VI:VI改進的8.2版的README.md 。
韓國人