Wie kann ich --servername und --remote in neovim verwenden?

15

in vim kann ich tun , vim --servername foound vim --servername foo --remote-silent bar.txtzum Öffnen von Dateien in einer Instanz von Vim von mehreren Terminalfenstern (über tmux oder was auch immer). Wie wird dasselbe in NeoVim erreicht?

Rafael Vega
quelle

Antworten:

8

Soweit ich weiß, verfügt vim über diese Funktion, da die grafische Benutzeroberfläche vim (gvim) den grafischen X-Server verwendet. Mir ist bekannt, dass Vim, das keine grafische Benutzeroberfläche ist, das --servernameArgument auch verwenden kann, jedoch nur, wenn X11 ausgeführt wird und auch, wenn darauf zugegriffen wird . Auf der anderen Seite hat Neovim keine grafische Unterstützung; Aus diesem Grund glaube ich nicht, dass die --servernameOption funktionieren kann (es sei denn, die Option wäre auf andere Weise vollständig umgeschrieben worden), da ich es seltsam finde, wenn ein Konsolenprogramm nur zu diesem Zweck auf den X11-Server zugreift.

Thomas Baruchel
quelle
Anfangs dachte ich, diese Antwort sei falsch, da IPC ohne X nicht nur möglich, sondern auch sehr verbreitet ist (zB Sockets). Aber :help x11-clientserverscheint es zu bestätigen: "Die Kommunikation zwischen Client und Server läuft über den X-Server. [..] Ein Vim ohne GUI mit Zugriff auf das X11-Display (| xterm-clipboard | enabled) kann auch als Befehlsserver fungieren, wenn ein Servername wird explizit vergeben "...
Martin Tournoij
7

Neovim Remote ist ein Python-Skript zur Steuerung von Neovim-Prozessen. Es verfügt über die Optionen --servername und --remote im Vim-Stil. Dies ist, was ich jetzt für meine Arbeitsumgebung mit mehreren Terminals verwende.

Rafael Vega
quelle
Erwähnenswert ist, dass dieses Plugin für die Windows-Plattform nicht funktioniert.
JDHAO
4

Wie bereits erwähnt, wurden alle Clientserver-Funktionen in Neovim entfernt. Dies liegt daran, dass sie den gemeinsam genutzten X11-Speicher verwenden und Neovim die X11-Unterstützung entfernt hat.

Wenn ich jedoch :help --servernamein Neovim verwende, lande ich in der Dokumentation für die serverstart()Funktion:

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

Dies wird einen Socket in machen /tmp/; suche :echo v:servernamenach dem Weg. Es ist wahrscheinlich sinnvoller, eine deterministischere Adresse zu verwenden (z serverstart('/tmp/nvim-remote'). B. , obwohl Sie diese wahrscheinlich in eine Funktion einschließen möchten, da keine Zahl angehängt wird, wie dies bei Vim der --serverstartFall ist, wenn diese bereits vorhanden ist).

Sie können Befehle mit der RPC-API senden. Soweit ich weiß, gibt es keine Möglichkeit, mit nur Neovim (meh) Befehle an diese zu senden. Sie müssen einen der API-Clients installieren . Zum Beispiel mit dem Referenz-Python-API-Client (der auch von Neovim Remote verwendet wird):

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

Sie können wahrscheinlich die gleichen Bytes mit einem echo ... >> /tmp/nvim-removeShell-Befehl senden , aber die RPC-API verwendet ein nicht triviales Nicht-Text-Protokoll ("MessagePack RPC"). -)

Sehen Sie :help rpcfür die vollständigen Angaben über Neovim RPC - API.


NB :help remote.txtsowie viele andere help server2client()Hilfethemen (wie und viele mehr) gibt es in Neovim immer noch, aber nichts davon funktioniert. Es sieht so aus, als hätte jeder, der diese Funktion entfernt hat, einen ziemlich schlampigen Job gemacht.

Martin Tournoij
quelle
Dies ist eine hervorragende Antwort. Es ermöglichte mir, meine eigene, einfache, Windows-kompatible Version von neovim-remote zum Einspielen zu schreiben :terminal. Angesichts dieser Informationen war es wunderbar einfach.
David