Como posso usar --servername e --remote no neovim?

15

no vim eu posso fazer vim --servername fooe vim --servername foo --remote-silent bar.txtabrir arquivos em uma instância do vim de várias janelas de terminal (via tmux ou o que for). Como a mesma coisa é alcançada no NeoVim?

Rafael Vega
fonte

Respostas:

8

Tanto quanto eu sei, o vim tem esse recurso porque a GUI vim (gvim) usa o servidor X gráfico. Estou ciente de que o não GUI Vim também pode usar o --servernameargumento, mas apenas quando o X11 está em execução e também acessando-o . Por outro lado, o neovim não tem suporte gráfico; por esse motivo, não acho que a --servernameopção possa funcionar (a menos que a opção tenha sido totalmente reescrita de outra maneira), pois seria estranho ter um programa de console acessando o servidor X11 apenas para esse fim.

Thomas Baruchel
fonte
No começo, pensei que essa resposta estava errada, pois o IPC sem X não é apenas possível, mas também muito comum (por exemplo, soquetes). Mas :help x11-clientserverparece confirmar: "A comunicação entre cliente e servidor passa pelo servidor X. [..] Um não GUI Vim com acesso ao monitor X11 (| xterm-clipboard | enabled), também pode atuar como um servidor de comando se um nome de servidor é fornecido explicitamente "...
Martin Tournoij 14/11/2015
7

O Neovim remote é um script python para controlar processos neovim. Possui o estilo vim --servername e --remote. É isso que uso agora no meu ambiente de trabalho com vários terminais.

Rafael Vega
fonte
Vale ressaltar que este plugin não funciona para a plataforma Windows.
Jdhao 26/03/19
4

Como mencionado, todos os recursos do servidor de clientes foram removidos no Neovim. Isso ocorre porque eles usam a memória compartilhada X11 e o Neovim removeu o suporte ao X11.

No entanto, se eu usar o :help --servernameNeovim, acabo na documentação da serverstart()função:

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')"

Isso fará um soquete /tmp/; veja :echo v:servernameo caminho. Provavelmente é mais útil usar um endereço mais determinístico (por exemplo serverstart('/tmp/nvim-remote'), embora você provavelmente deseje agrupar isso em uma função, pois ele não acrescentará um número como o do Vim, --serverstartse isso já existir).

Você pode enviar comandos com a API RPC. Até onde eu sei, não há como enviar comandos para isso apenas com Neovim (meh). Você precisará instalar um dos clientes da API . Por exemplo, com o cliente de API Python de referência (que também é o que o Neovim usa remotamente):

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

Provavelmente você pode enviar os mesmos bytes com um echo ... >> /tmp/nvim-removecomando shell, mas a API RPC usa um protocolo não-trivial de texto não-trivial ("MessagePack RPC") e descobrir quais bytes enviar exatamente foi um esforço demais para esta postagem; -)

Veja :help rpcos detalhes completos sobre a API RPC da Neovim.


Nota :help remote.txt: assim como muitos outros itens de ajuda (como help server2client()muitos outros) ainda existem no Neovim, mas nada disso funciona. Parece que quem removeu esse recurso fez um trabalho bastante desleixado.

Martin Tournoij
fonte
Esta é uma excelente resposta. Ele me permitiu escrever minha própria versão simples e compatível com o Windows do neovim-remote para rodar :terminal. Dada essa informação, foi maravilhosamente fácil.
David