Come posso usare --servername e --remote in neovim?


15

in vim posso fare vim --servername fooe vim --servername foo --remote-silent bar.txtaprire i file in un'istanza di vim da più finestre di terminale (via tmux o altro). Come si ottiene la stessa cosa in NeoVim?

Risposte:


8

Per quanto ne so vim ha questa funzione perché la GUI vim (gvim) utilizza il server X grafico. Sono consapevole che anche Vim non GUI può utilizzare l' --servernameargomento, ma solo quando X11 è in esecuzione e accedendo ad esso . D'altra parte, neovim non ha supporto grafico; per questo motivo, non penso che l' --servernameopzione possa funzionare (a meno che l'opzione non sarebbe stata completamente riscritta in un altro modo) poiché troverei strano avere un programma console che accedesse al server X11 solo a tale scopo.


All'inizio ho pensato che questa risposta fosse sbagliata, poiché IPC senza X non è solo possibile, ma anche molto comune (es. Socket). Ma :help x11-clientserversembra confermarlo: "La comunicazione tra client e server passa attraverso il server X. [..] Un Vim non GUI con accesso al display X11 (| xterm-clipboard | abilitato), può anche fungere da server di comando se un nome server viene esplicitamente assegnato "...
Martin Tournoij

7

Neovim Remote è uno script Python per il controllo dei processi Neovim. Ha lo stile vim --servername e --remote opzioni. Questo è quello che uso ora per il mio ambiente di lavoro multi-terminale.


Vale la pena ricordare che questo plugin non funziona per la piattaforma Windows.
jdhao,

4

Come accennato, tutte le funzionalità del server dei client sono state rimosse in Neovim. Questo perché usano la memoria condivisa X11 e Neovim ha rimosso il supporto X11.

Tuttavia, se uso :help --servernamein Neovim finisco nella documentazione per la serverstart()funzione:

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

Questo renderà un socket in /tmp/; vedere :echo v:servernameper il percorso. Probabilmente è più utile usare un indirizzo più deterministico (ad esempio serverstart('/tmp/nvim-remote'); anche se probabilmente vorrai racchiuderlo in una funzione, poiché non aggiungerà un numero come quello di Vim --serverstartse esiste già).

È possibile inviare comandi con l'API RPC. Per quanto posso trovare non c'è modo di inviare comandi a questo solo con Neovim (meh). Devi installare uno dei client API . Ad esempio con il client API Python di riferimento (che è anche ciò che utilizza Neovim Remote):

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

Probabilmente puoi inviare gli stessi byte con un echo ... >> /tmp/nvim-removecomando shell, ma l'API RPC utilizza un protocollo non testuale non banale ("MessagePack RPC") e capire quali byte inviare esattamente è stato un po 'troppo sforzo per questo post; -)

Per :help rpci dettagli completi sull'API RPC di Neovim.


NB :help remote.txtcosì come molti altri articoli di aiuto (come help server2client()e molti altri) esistono ancora in Neovim, ma nessuno di questi funziona. Sembra che chiunque abbia rimosso questa funzione abbia fatto un lavoro piuttosto sciatto.


Questa è una risposta eccellente Mi ha permesso di scrivere la mia versione semplice, compatibile con Windows di Neovim-Remote per l'esecuzione :terminal. Date queste informazioni è stato meravigliosamente facile.
David,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.