vim.wasm: Vim portado a WebAssembly Este proyecto es una bifurcación experimental de Vim Editor de @Rhysd para compilarlo en WebAssembly utilizando Emscripten y Binaryen. VIM se ejecuta en Web Worker e interactúa con el hilo principal a través de SharedArrayBuffer .
El objetivo de este proyecto es ejecutar Vim Editor en los navegadores sin perder las poderosas funcionalidades de VIM al compilar fuentes VIM C en WebAssembly.

USO
:write solo escritura en la memoria. Descargue el búfer actual por :export o archivo específico por :export {file} ."* es compatible. Por ejemplo, pegue el texto del portapapeles del sistema a VIM con "*p o :put * , y copie el texto en VIM al portapapeles del sistema con "*y o :yank * . Si desea sincronizar el portapapeles de VIM con el portapapeles del sistema,: :set clipboard=unnamed debe funcionar como el vim normal.~/.vim se almacenan persistentemente en DB indexado. Escriba su configuración favorita en ~/.vim/vimrc (no ~/.vimrc ).file={filepath}={url} obtiene un archivo de {url} a {filepath} . Se pueden abrir archivos remotos arbitrarios (se preocupan por CORS).:!/path/to/file.js evalúa el código JavaScript en el navegador. :!% evalúa el amortiguador actual.:e tutor .arg= parámetros de consulta (por ejemplo ?arg=~%2f.vim%2fvimrc&arg=hello.txt ) para agregar argumentos de línea de comandos vim .AVISO
SharedArrayBuffer y Atomics . En Firefox o Safari, los indicadores de características ( javascript.options.shared_memory para Firefox) deben habilitarse por ahora.keydown . Deshabilite las extensiones de su navegador que interceptan eventos clave (el modo de incógnito sería el mejor).:quit , pero no cierra una pestaña del navegador. Por favor, cierre manualmente :) Este proyecto está empaquetado como vim-wasm NPM Pacakge para ser utilizado fácilmente en la aplicación web. Lea la documentación para obtener más detalles.
La versión VIM portada actual es 8.2.0055 con conjuntos de características 'normales' y 'pequeñas'. Consulte el historial de actualización de ChangeLog.
Los siguientes proyectos están relacionados con este paquete NPM y pueden ser más adecuados para su caso de uso.

En el hilo de trabajadores, VIM se ejecuta compilado en WASM. El hilo del trabajador se genera como trabajador web dedicado del hilo principal al abrir la página.
Digamos que ingresa algo con el teclado. Browser lo toma como KeyboardEvent en el evento keydown . JavaScript en el hilo principal atrapa el evento y almacena información de llave en un búfer de memoria compartida.
El búfer se comparte con el hilo del trabajador. Vim espera y obtiene la información de llave al sondear el búfer de memoria compartida a través de la API Atomics de JavaScript. Cuando se encuentra información clave en el búfer, carga la información y calcula la secuencia clave. A través de JS a WASM API gracias a Emscripten, la secuencia se agrega al búfer de entrada de VIM en WASM.
La secuencia en el búfer de entrada es procesada por Core Editor Logic (Buffer de actualización, pantalla, ...). Debido a las actualizaciones, se producen algunos eventos de dibujo, como texto de dibujo, dibujar rects, regiones de desplazamiento, ...
Estos eventos de sorteo se envían a JavaScript en Worker Thread de WASM gracias a la API JS a C de Emscripten. Teniendo en cuenta la relación de píxeles del dispositivo y la API <canvas/> , cómo se calcula los eventos y estos eventos de representación calculados se pasan de un hilo de trabajo a un hilo principal a través del paso de mensajes con postMessage() .
El hilo principal JavaScript recibe y enqueora estos eventos de representación. En el marco de animación, los convierte en <canvas/> .
Finalmente puede ver la pantalla renderizada en la página.

WebAssembly Frontend for VIM se implementa como una nueva interfaz de GUI de VIM como otra GUI, como GTK Frontend. Las fuentes C se compilan en cada archivos de código de bits LLVM y luego están vinculados a un archivo de código de bits vim.bc por emcc . emcc finalmente compilará el vim.bc en vim.wasm binary usando binaryen y genera tiempo de ejecución HTML/javaScript.
La diferencia que enfrenté al principio fue la falta de biblioteca terminal, como NCurses. Modifiqué configure script para ignorar la verificación de la biblioteca del terminal. Está bien ya que la interfaz de GUI para WASM siempre se usa en lugar de Cui Frontend. Necesitaba muchas soluciones para pasar las verificaciones configure .
Emscripten proporciona un entorno similar a UNIX. Entonces os_unix.c puede admitir WASM. Sin embargo, algunas características no son compatibles con Emscripten. Agregué muchos guardias #ifdef FEAT_GUI_WASM para deshabilitar las características que no pueden ser compatibles con el soporte de WASM (es decir, fork (2) , el soporte PTY, los controladores de señales se roban, ... etc.).
Creé gui_wasm.c referir en gran medida gui_mac.c y gui_w32.c . Event Loop ( gui_mch_update() y gui_mch_wait_for_chars() ) simplemente se implementa con Bloqueo de espera. Y casi todos los eventos de representación de la interfaz de usuario se pasan a JavaScript Layer llamando a las funciones de JavaScript de C gracias a Emscripten.
Las fuentes C se compilan (con muchas optimizaciones) en el código de bits LLVM con Clang, que está integrado a Emscripten. Luego, todos los archivos de código de bits ( .o ) están vinculados a un archivo de código de bits vim.bc con llvm-link Linker (también integrado a Emscripten).
Y creé el tiempo de ejecución de JavaScript en TypeScript para dibujar los eventos de representación enviados desde C. JavaScript El tiempo de ejecución está separado en dos partes; hilo principal y hilo de trabajadores. wasm/main.ts es para el hilo principal. Comienza VIM en el hilo de trabajadores y dibuja la pantalla VIM a <canvas> recibiendo eventos de dibujo de VIM. wasm/runtime.ts y wasm/pre.ts son para hilo de trabajadores. Están escritos usando la API Emscripten.
emcc (compilador C de Emscripten) compila vim.bc y runtime.js en vim.wasm , vim.js y vim.data con archivos de tiempo de ejecución Vim precargados (es decir, ColorsCheme) usando binaryen. Los archivos de tiempo de ejecución se cargan en un sistema de archivos virtual proporcionado en un navegador por Emscripten. Aquí, estos archivos se compilan para el hilo de trabajadores. wasm/main.js comienza un trabajador web dedicado que carga vim.js
Finalmente, creé un pequeño wasm/index.html que contiene <canvas/> para representar la pantalla VIM y cargar wasm/main.js .
Ahora alojar wasm/index.html con un servidor web y acceder a él con el navegador abre VIM. Funciona.
sleep() en JavaScript La parte más difícil para este portador fue cómo implementar la espera de bloqueo (generalmente realizada con sleep() ).
Dado que bloquear el hilo principal en la página web significa bloquear la interacción del usuario, básicamente está prohibido. Casi todas las operaciones que toman el tiempo se implementan como API asincrónica en JavaScript. WASM que se ejecuta en el hilo principal no puede bloquear el hilo, excepto el bucle ocupado.
Pero los programas C usan casualmente la función sleep() por lo que es un problema al portar los programas. También se espera que el frontend de la GUI de VIM espere la entrada del usuario con la espera de bloqueo.
Emscripten proporciona solución para este problema, Emterpreter. Con Emterpreter, Emscripten proporciona funciones de espera de bloqueo (pseudo) como emscripten_sleep() . Cuando se usan en la función C, emcc compila la función en el código de byte Emterpreter en lugar de WASM. Y en tiempo de ejecución, el código de byte se ejecuta en un intérprete (en WASM). Cuando el intérprete alcanza el punto llamando emscripten_sleep() , suspende la ejecución del código de byte y establece el temporizador (con la función setTimeout js). Después de que expire el tiempo, el intérprete reanuda el estado y continúa la ejecución.
Según este mecanismo, la espera asíncrona de JavaScript parece una espera sincrónica de C World. Al principio usé Emterpreter y funcionó. Sin embargo, hubo varios problemas.
Busqué una alternativa y encontré Atomics.wait() . Atomics.wait() es una función primitiva sincrónica de bajo nivel. Espera hasta que se actualiza un byte específico en el búfer de memoria compartida. Está bloqueando la espera . Por supuesto, no está disponible en el hilo principal. Debe usarse en un hilo de trabajadores.
Moví la base de código WASM a Web Worker ejecutándose en Worker Thread, aunque la representación <canvas/> todavía se realiza en el hilo principal.

VIM usa Atomics.wait() para la entrada de los usuarios de espera al ver un búfer de memoria compartida. Cuando ocurre un evento clave, el hilo principal almacena datos de evento clave para el búfer de memoria compartida y notifica que un nuevo evento clave vino por Atomics.notify() . Worker Thread detecta que el búfer fue actualizado por Atomics.wait() y carga los datos clave del evento del búfer. VIM calcula una secuencia clave de los datos y la agregue al búfer de entrada. Finalmente, VIM maneja el evento y envía eventos de dibujo al hilo principal a través de JavaScript.
Como beneficio adicional, la interacción del usuario ya no se evita ya que casi toda la lógica, incluida la VIM completa, se ejecutan en el subproceso de trabajadores.
Asegúrese de que Emscripten (estoy usando 1.38.37) y Binaryen (estoy usando V84). Si usa macOS, se pueden instalar con brew install emscripten binaryen .
Utilice el script build.sh para hackear este proyecto. Justo después de clonar este repositorio, simplemente ejecute ./build.sh . Construye vim.wasm en wasm/ Directorio. Toma mucho tiempo y potencia de la CPU.
Finalmente, aloje el wasm/ directamente en localhost con un servidor web como python -m http.server 1234 . Acceso a localhost:1234?debug iniciará VIM con registros de depuración. Tenga en cuenta que es mucho más lento que la construcción de lanzamiento, ya que muchas características de depuración están habilitadas. Lea Wasm/Readme.md para obtener más detalles.
Tenga en cuenta que la rama wasm de este repositorio con frecuencia fusiona la última rama VIM/VIM Master. Si desea piratear este proyecto, asegúrese de crear su propia rama y fusionar la rama wasm en su rama por git merge .
sleep() . Por defecto, Emscripten compila sleep() en un bucle ocupado. Entonces Vim.wasm está usando Emterpreter que proporciona emscripten_sleep() . Algunas funciones de la lista blanca se ejecutan con Emterpreter. Pero esta característica no es tan estable. Hace que los binarios construidos sean más grandes y compilaciones más largas.string no funciona.SharedArrayBuffer está deshabilitado debido a la vulnerabilidad de seguridad de Spectre. Esto se puede solucionar con Asyncify. El trabajo está en progreso y rastreado en PR #35. El desarrollo se gestiona en proyectos de GitHub.
<canvas/> en el hilo de trabajadores usando lienzo fuera de la pantallaEste proyecto fue fuertemente inspirado en el impresionante Proyecto Vim.js por Lu Wang.
Todos los archivos adicionales en este repositorio tienen licencia bajo la misma licencia que VIM (licencia VIM). Consulte :help license para obtener más detalles.
ReadMe original está siguiendo.

Para las traducciones de este readme ver el final.
VIM es una versión muy mejorada del buen editor de Unix VI. Se han agregado muchas características nuevas: deshacer de nivel múltiple, resaltado de sintaxis, historial de línea de comandos, ayuda en línea, control de hechizos, finalización del nombre de archivo, operaciones de bloque, lenguaje de script, etc. También hay una interfaz gráfica de usuario (GUI) disponible. Aún así, se mantiene la compatibilidad de VI, aquellos que tienen VI "en los dedos" se sentirán como en casa. Consulte runtime/doc/vi_diff.txt para las diferencias con VI.
Este editor es muy útil para editar programas y otros archivos de texto sin formato. Todos los comandos se dan con caracteres normales de teclado, por lo que aquellos que pueden escribir con diez dedos pueden funcionar muy rápido. Además, el usuario se puede asignar las teclas de funciones a los comandos, y se puede usar el mouse.
Vim se ejecuta bajo MS-Windows (NT, 2000, XP, Vista, 7, 8, 10), Macintosh, VMS y casi todos los sabores de Unix. El transporte a otros sistemas no debería ser muy difícil. Las versiones más antiguas de VIM se ejecutan en MS-DOS, MS-Windows 95/98/ME, Amiga DOS, Atari Mint, Beos, RISC OS y OS/2. Estos ya no se mantienen.
A menudo puede usar su administrador de paquetes favorito para instalar VIM. En Mac y Linux, una pequeña versión de VIM está preinstalada, aún necesita instalar VIM si desea más funciones.
Hay distribuciones separadas para UNIX, PC, AMIGA y algunos otros sistemas. Este archivo README.md viene con el archivo de tiempo de ejecución. Incluye la documentación, los archivos de sintaxis y otros archivos que se usan en tiempo de ejecución. Para ejecutar VIM, debe obtener uno de los archivos binarios o un archivo de origen. El cual necesita depende del sistema en el que desee ejecutarlo y si lo desea o debe compilarlo usted mismo. Consulte http://www.vim.org/download.php para obtener una descripción general de las distribuciones disponibles actualmente.
Algunos lugares populares para obtener el último Vim:
Si obtuvo una distribución binaria, no necesita compilar VIM. Si obtuvo una distribución de fuente, todas las cosas para compilar VIM están en el directorio src . Consulte src/INSTALL para obtener instrucciones.
Consulte uno de estos archivos para obtener instrucciones específicas del sistema. Ya sea en el directorio ReadMedir (en el repositorio) o en el directorio superior (si desempaquete un archivo):
README_ami.txt Amiga
README_unix.txt Unix
README_dos.txt MS-DOS and MS-Windows
README_mac.txt Macintosh
README_vms.txt VMS
Hay otros archivos README_*.txt , dependiendo de la distribución que usó.
El Tutor VIM es un curso de entrenamiento de una hora para principiantes. A menudo se puede iniciar como vimtutor . Ver :help tutor para obtener más información.
Lo mejor es usar :help en VIM. Si aún no tiene un ejecutable, lea runtime/doc/help.txt . Contiene consejos para los otros archivos de documentación. El manual del usuario se lee como un libro y se recomienda aprender a usar VIM. Ver :help user-manual .
VIM es Caridad de Charity. Puede usarlo y copiarlo tanto como desee, pero se le recomienda hacer una donación para ayudar a los huérfanos en Uganda. Lea el archivo runtime/doc/uganda.txt para más detalles (hacer :help uganda dentro de VIM).
Resumen de la licencia: no hay restricciones para usar o distribuir una copia no modificada de VIM. También se pueden distribuir partes de VIM, pero el texto de la licencia siempre debe incluirse. Para las versiones modificadas se aplican algunas restricciones. La licencia es compatible con GPL, puede compilar VIM con las bibliotecas GPL y distribuirla.
Arreglar errores y agregar nuevas funciones requiere mucho tiempo y esfuerzo. Para mostrar su agradecimiento por el trabajo y motivar a Bram y a otros a continuar trabajando en VIM, envíe una donación.
Dado que Bram ha vuelto a un trabajo pagado, el dinero ahora se usará para ayudar a los niños en Uganda. Ver runtime/doc/uganda.txt . ¡Pero al mismo tiempo, las donaciones aumentan la motivación de Bram para seguir trabajando en VIM!
Para obtener la información más reciente sobre el patrocinio en el sitio web de VIM: http://www.vim.org/sonsor/
Si desea ayudar a mejorar VIM, consulte el archivo contribuyente.md.
Las últimas noticias sobre VIM se pueden encontrar en la página de inicio de VIM: http://www.vim.org/
Si tiene problemas, eche un vistazo a la documentación VIM o consejos: http://www.vim.org/docs.php http://vim.wikia.com/wiki/vim_tips_wiki
Si aún tiene problemas o cualquier otra pregunta, use una de las listas de correo para discutirlas con usuarios y desarrolladores de VIM: http://www.vim.org/maillist.php
Si nada más funciona, informe a los errores directamente: Bram Moolenaar [email protected]
Envíe cualquier otro comentario, parches, flores y sugerencias a: Bram Moolenaar [email protected]
Este es README.md para la versión 8.2 de VIM: VI mejorado.
coreano