¿Cómo puedo usar --servername y --remote en neovim?


15

en vim puedo hacer vim --servername fooy vim --servername foo --remote-silent bar.txtabrir archivos en una instancia de vim desde varias ventanas de terminal (a través de tmux o lo que sea). ¿Cómo se logra lo mismo en NeoVim?

Respuestas:


8

Hasta donde yo sé, vim tiene esta característica porque la GUI vim (gvim) usa el servidor gráfico X. Soy consciente de que no GUI Vim también puede usar el --servernameargumento, pero solo cuando X11 se está ejecutando y también accediendo a él . Por otro lado, neovim no tiene soporte gráfico; por esa razón, no creo que la --servernameopción pueda funcionar (a menos que la opción se hubiera reescrito completamente de otra manera) ya que me parecería extraño que un programa de consola acceda al servidor X11 solo para ese propósito.


Al principio pensé que esta respuesta era incorrecta, ya que IPC sin X no solo es posible, sino también muy común (por ejemplo, sockets). Pero :help x11-clientserverparece confirmarlo: "La comunicación entre el cliente y el servidor pasa por el servidor X. [..] Un Vim sin GUI con acceso a la pantalla X11 (| xterm-clipboard | habilitado), también puede actuar como un servidor de comandos si se da explícitamente un nombre de servidor "...
Martin Tournoij

7

Neovim Remote es un script de Python para controlar los procesos de Neovim. Tiene las opciones de estilo vim --servername y --remote. Esto es lo que uso ahora para mi entorno de trabajo de múltiples terminales.


Vale la pena mencionar que este complemento no funciona para la plataforma Windows.
jdhao

4

Como se mencionó, todas las características del servidor del cliente se eliminaron en Neovim. Esto se debe a que usan la memoria compartida X11 y Neovim eliminó el soporte X11.

Sin embargo, si lo uso :help --servernameen Neovim termino en la documentación de la serverstart()función:

serverstart([{address}])                                serverstart()
                Opens a named pipe or TCP socket at {address} for clients to
                connect to and returns {address}. If no address is given, it
                is equivalent to:
                        :call serverstart(tempname())
                $NVIM_LISTEN_ADDRESS is set to {address} if not already set.
                                                        --servername
                The Vim command-line option --servername can be imitated:
                        nvim --cmd "let g:server_addr = serverstart('foo')"

Esto hará un socket en /tmp/; mira :echo v:servernamepor el camino. Probablemente sea más útil usar una dirección más determinista (p serverstart('/tmp/nvim-remote'). Ej ., Aunque probablemente querrá incluir esto en una función, ya que no agregará un número como el de Vim --serverstartsi ya existe).

Puede enviar comandos con la API RPC. Por lo que puedo encontrar, no hay forma de enviar comandos a esto con solo Neovim (meh). Deberá instalar uno de los clientes API . Por ejemplo, con el cliente de API Python de referencia (que también es lo que usa el control remoto de Neovim):

import neovim
nvim = neovim.attach('socket', path='/tmp/nvim-remote')
try:
    nvim.command(':e foo')
finally:
    nvim.quit()

Probablemente pueda enviar los mismos bytes con un echo ... >> /tmp/nvim-removecomando de shell, pero la API RPC utiliza un protocolo sin texto no trivial ("MessagePack RPC") y averiguar qué bytes enviar exactamente fue un esfuerzo demasiado grande para esta publicación; -)

Consulte :help rpclos detalles completos sobre la API RPC de Neovim.


NB :help remote.txt, así como muchos otros elementos de ayuda (como help server2client()y muchos más) todavía existen en Neovim, pero nada de eso funciona. Parece que quien quitó esta característica hizo un trabajo bastante descuidado.


Esta es una excelente respuesta. Me permitió escribir mi propia versión simple y compatible con Windows de neovim-remote para ejecutar :terminal. Dada esta información, fue maravillosamente fácil.
David
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.