vim.wasm : vim이 webassembly로 포팅되었습니다 이 프로젝트는 @rhysd의 vim 편집기의 실험적 포크로, emscripten 및 binaryen을 사용하여 webassembly로 컴파일합니다. VIM은 웹 워커에서 실행되며 SharedArrayBuffer 통해 기본 스레드와 상호 작용합니다.
이 프로젝트의 목표는 Vim C 소스를 WebAssembly로 컴파일하여 Vim의 강력한 기능을 잃지 않고 브라우저에서 VIM 편집기를 실행하는 것입니다.

용법
:write 만 씁니다. 현재 버퍼를 다운로드하여 :export 또는 특정 파일에 의해 :export {file} ."* 는 지원됩니다. 예를 들어, "*p 또는 :put * 을 사용하여 시스템 클립 보드 텍스트를 Vim에 붙여 넣고 "*y 또는 :yank * . 시스템 클립 보드를 시스템 클립 보드와 동기화하려면 :set clipboard=unnamed 일반 Vim처럼 작동해야합니다.~/.vim 디렉토리 아래의 파일은 인덱스 된 db에 지속적으로 저장됩니다. 좋아하는 구성을 ~/.vim/vimrc ( ~/.vimrc 아님)로 작성하십시오.file={filepath}={url} 파일을 {url} 에서 {filepath} 로 가져옵니다. 임의의 원격 파일을 열 수 있습니다 (CORS CORS).:!/path/to/file.js 브라우저의 JavaScript 코드를 평가합니다. :!% 전류 버퍼를 평가합니다.:e tutor .vim 명령 줄 인수를 추가하려면 arg= 쿼리 매개 변수 (예 : ?arg=~%2f.vim%2fvimrc&arg=hello.txt )를 추가하십시오.알아채다
SharedArrayBuffer 및 Atomics 사용하기 때문에 데스크탑 크롬, 파이어 폭스, 사파리 또는 크롬 기반 브라우저에서 액세스하십시오. Firefox 또는 Safari에서는 현재 Firefox를위한 플래그 ( javascript.options.shared_memory )를 활성화해야합니다.keydown 이벤트에서 키 입력을 취합니다. 키 이벤트를 가로 채는 브라우저 확장을 비활성화하십시오 (시크릿 모드가 가장 좋습니다).:quit 하지만 브라우저 탭을 닫지 않습니다. 수동으로 닫으십시오 :) 이 프로젝트는 웹 애플리케이션에서 쉽게 사용할 수있는 vim-wasm NPM Pacakge로 포장되어 있습니다. 자세한 내용은 문서를 읽으십시오.
현재 포팅 된 VIM 버전은 8.2.0055이며 '정상'및 '작은'기능 세트가 있습니다. 업데이트 기록은 ChangElog를 확인하십시오.
다음 프로젝트는이 NPM 패키지와 관련이 있으며 사용 사례에 더 적합 할 수 있습니다.

작업자 스레드에서 Vim은 WASM으로 컴파일하여 실행됩니다. 작업자 스레드는 페이지를 열 때 메인 스레드에서 전용 웹 워커로 스폰됩니다.
키보드로 무언가를 입력한다고 가정 해 봅시다. 브라우저는 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 의 하나의 비트 코드 파일 vim.bc 에 연결됩니다. emcc Binaryen을 사용하여 vim.bc vim.wasm BINARY로 컴파일하고 HTML/JavaScript 런타임을 생성합니다.
내가 처음에 직면 한 차이점은 NCURSE와 같은 터미널 라이브러리의 부족이었습니다. 터미널 라이브러리 검사를 무시하도록 configure 수정했습니다. WASM의 Gui Frontend가 Cui Frontend 대신 항상 사용되기 때문에 괜찮습니다. configure 확인을 통과하려면 많은 해결 방법이 필요했습니다.
EMScripten은 Unix와 같은 환경을 제공합니다. 따라서 os_unix.c WASM을 지원할 수 있습니다. 그러나 일부 기능은 EMScripten에서 지원하지 않습니다. WASM (IE fork (2) 지원, Pty Support, Signal Handler가 스터브 된 등)에서 지원할 수없는 기능을 비활성화하기 위해 많은 #ifdef FEAT_GUI_WASM 경비원을 추가했습니다.
gui_mac.c 및 gui_w32.c 참조하는 gui_wasm.c 만들었습니다. 이벤트 루프 ( gui_mch_update() 및 gui_mch_wait_for_chars() )은 차단 대기로 간단히 구현됩니다. 그리고 거의 모든 UI 렌더링 이벤트는 emscripten 덕분에 C에서 JavaScript 함수를 호출하여 JavaScript 레이어로 전달됩니다.
C 소스는 EMScripten에 통합 된 Clang을 사용하여 LLVM 비트 코드로 컴파일됩니다. 그런 다음 모든 비트 코드 파일 ( .o )은 llvm-link 링커와 함께 하나의 비트 코드 파일 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 컴파일러)는 Binaryen을 사용하여 사전로드 된 VIM 런타임 파일 (예 : ColorsCheme)을 사용하여 vim.bc 및 runtime.js 를 vim.wasm , vim.js 및 vim.data 로 컴파일합니다. 런타임 파일은 emscripten의 브라우저에서 제공된 가상 파일 시스템에로드됩니다. 여기서이 파일은 작업자 스레드 용으로 컴파일됩니다. wasm/main.js vim.js 를로드하는 전용 웹 워커를 시작합니다.
마지막으로, vim 화면을 렌더링하기 위해 <canvas/> 포함하는 작은 wasm/index.html wasm/main.js 습니다.
이제 웹 서버와 함께 wasm/index.html 호스팅을하고 브라우저를 사용하여 액세스하면 VIM이 있습니다. 작동합니다.
sleep() 이 포팅의 가장 어려운 부분은 차단 대기를 구현하는 방법이었습니다 (일반적으로 sleep() 로 완료).
웹 페이지에서 기본 스레드를 차단한다는 것은 사용자 상호 작용을 차단하는 것을 의미하므로 기본적으로 금지됩니다. 시간이 걸리는 거의 모든 작업은 JavaScript에서 비동기 API로 구현됩니다. 주 스레드에서 실행되는 WASM은 바쁜 루프를 제외하고 스레드를 차단할 수 없습니다.
그러나 C 프로그램은 우연히 sleep() 기능을 사용하므로 프로그램을 포팅 할 때 문제가됩니다. VIM의 GUI Frontend는 또한 대기 차단으로 사용자 입력을 기다릴 것으로 예상됩니다.
Emscripten 은이 문제인 Emterpreter에 대한 해결 방법을 제공합니다. EmterPreter를 사용하면 Emscripten이 제공 (Pseudo) emscripten_sleep() 와 같은 대기 기능을 차단합니다. C 함수에서 사용되면 emcc 함수를 WASM 대신 EmterPreter 바이트 코드로 컴파일합니다. 런타임에 바이트 코드는 통역사 (on WASM)에서 실행됩니다. 통역사가 emscripten_sleep() 호출 지점에 도달하면 바이트 코드 실행을 일시 중단하고 타이머를 설정합니다 ( setTimeout js 함수 포함). 시간이 지남에 따라 통역사는 상태를 재개하고 계속 집행을합니다.
이 메커니즘에 의해 JavaScript의 비동기 대기는 마치 C World의 동기 대기처럼 보입니다. 처음에 나는 Emterpreter를 사용했고 효과가있었습니다. 그러나 몇 가지 문제가있었습니다.
대안을 찾아서 Atomics.wait() 찾았습니다. Atomics.wait() 는 낮은 수준의 동기 원시 기능입니다. 공유 메모리 버퍼의 특정 바이트가 업데이트 될 때까지 기다립니다. 차단 대기 중 입니다. 물론 메인 스레드에서는 사용할 수 없습니다. 작업자 실에 사용해야합니다.
WASM 코드베이스를 Worker 스레드에서 실행하는 웹 워커로 옮겼지만 <canvas/> 렌더링은 여전히 메인 스레드에서 수행됩니다.

VIM은 공유 메모리 버퍼를 시청하여 사용자 입력을 대기하기 위해 Atomics.wait() 사용합니다. 주요 이벤트가 발생하면 메인 스레드는 주요 이벤트 데이터를 공유 메모리 버퍼에 저장하고 새로운 키 이벤트가 Atomics.notify() 에 의해 나왔음을 알립니다. 작업자 스레드는 Atomics.wait() 에 의해 버퍼가 업데이트되었음을 감지하고 버퍼에서 주요 이벤트 데이터를로드합니다. VIM은 데이터에서 키 시퀀스를 계산하여 입력 버퍼에 추가합니다. 마지막으로 Vim은 이벤트를 처리하고 JavaScript를 통해 Draw 이벤트를 메인 스레드로 보냅니다.
보너스로, 전체 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 와 같은 웹 서버를 사용하여 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 비활성화 되었기 때문입니다. 이것은 비동기로 고정 될 수 있습니다. 작업이 진행 중이며 PR #35에서 추적됩니다. 개발은 GitHub 프로젝트에서 관리됩니다.
<canvas/> 렌더링합니다이 프로젝트는 Lu Wang의 인상적인 Project Vim.js에서 큰 영감을 받았습니다.
이 저장소의 모든 추가 파일은 VIM (VIM 라이센스)과 동일한 라이센스에 따라 라이센스가 부여됩니다. 자세한 내용은 :help license 참조하십시오.
오리지널 readme가 다음과 같습니다.

이 readme의 번역은 끝을 참조하십시오.
Vim은 Good Old Unix 편집기 VI의 크게 개선 된 버전입니다. 다중 레벨 취소, 구문 강조 표시, 명령 줄 기록, 온라인 도움말, 맞춤법 검사, 파일 이름 완료, 블록 작업, 스크립트 언어 등 다양한 새로운 기능이 추가되었습니다. GUI (Graphical User Interface)도 있습니다. 그럼에도 불구하고 VI 호환성은 유지되며 "손가락에"VI가있는 사람들은 집에서 느낄 것입니다. VI와의 차이점은 runtime/doc/vi_diff.txt 참조하십시오.
이 편집기는 프로그램 및 기타 일반 텍스트 파일을 편집하는 데 매우 유용합니다. 모든 명령은 일반 키보드 문자로 제공되므로 10 개의 손가락으로 입력 할 수있는 사람들은 매우 빠르게 작동 할 수 있습니다. 또한 기능 키는 사용자가 명령에 매핑 할 수 있으며 마우스를 사용할 수 있습니다.
VIM은 MS-Windows (NT, 2000, XP, Vista, 7, 8, 10), Macintosh, VMS 및 거의 모든 유닉스에서 실행됩니다. 다른 시스템으로의 포팅은 그리 어렵지 않아야합니다. MS-DOS, MS-Windows 95/98/ME, Amiga Dos, Atari Mint, Beos, RISC OS 및 OS/2에서 vim 버전의 구형 버전. 이것들은 더 이상 유지되지 않습니다.
좋아하는 패키지 관리자를 사용하여 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 읽으십시오 (VIM 내부의 :help uganda ).
라이센스 요약 : VIM의 수정되지 않은 사본을 사용하거나 배포하는 데 제한이 없습니다. VIM의 일부도 배포 될 수 있지만 라이센스 텍스트는 항상 포함되어야합니다. 수정 된 버전의 경우 몇 가지 제한이 적용됩니다. 라이센스는 GPL 호환 가능하며 GPL 라이브러리로 VIM을 컴파일하고 배포 할 수 있습니다.
버그 수정 및 새로운 기능 추가에는 많은 시간과 노력이 필요합니다. 작업에 대한 감사를 표하고 Bram과 다른 사람들이 VIM 작업을 계속하도록 동기를 부여하려면 기부금을 보내주십시오.
Bram은 유급 직업으로 돌아 왔기 때문에 이제 돈은 우간다의 어린이를 돕는 데 사용됩니다. runtime/doc/uganda.txt 참조하십시오. 그러나 동시에 기부금은 VIM에서 계속 일하려는 Bram의 동기를 증가시킵니다!
VIM 웹 사이트에서 후원하는 가장 최근의 정보는 http://www.vim.org/sponsor/
VIM을 개선하는 데 도움이 되려면 Contributing.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 입니다.
한국인