Jak mogę używać --servername i --remote w neovim?

15

w vimie mogę robić vim --servername fooi vim --servername foo --remote-silent bar.txtotwierać pliki w jednym wystąpieniu vima z kilku okien terminala (przez tmux lub cokolwiek innego). Jak to samo osiąga się w NeoVim?

Rafael Vega
źródło

Odpowiedzi:

8

O ile wiem, vim ma tę funkcję, ponieważ GUI vim (gvim) korzysta z graficznego serwera X. Wiem, że Vim inny niż GUI może również używać --servernameargumentu, ale tylko wtedy, gdy X11 jest uruchomiony, a także uzyskując do niego dostęp . Z drugiej strony neovim nie ma wsparcia graficznego; z tego powodu nie sądzę, że --servernameopcja może działać (chyba że opcja zostałaby w pełni przepisana w inny sposób), ponieważ dziwne byłoby, że program konsoli uzyskiwałby dostęp do serwera X11 tylko w tym celu.

Thomas Baruchel
źródło
Na początku myślałem, że ta odpowiedź jest błędna, ponieważ IPC bez X jest nie tylko możliwe, ale także bardzo powszechne (np. Gniazda). Ale :help x11-clientserverwydaje się to potwierdzać: „Komunikacja między klientem a serwerem odbywa się przez serwer X. […] Vim bez GUI z dostępem do wyświetlacza X11 (| włączono schowek | xterm) może również działać jako serwer poleceń, jeśli nazwa serwera jest wyraźnie podana „...
Martin Tournoij
8

Neovim remote to skrypt w języku Python do kontrolowania procesów neovim. Ma styl vim --servername i --remote opcje. Tego właśnie używam w moim środowisku pracy z wieloma terminalami.

Rafael Vega
źródło
1
Warto wspomnieć, że ta wtyczka nie działa na platformie Windows.
jdhao
5

Jak wspomniano, wszystkie funkcje serwera klienta zostały usunięte w Neovim. Wynika to z faktu, że używają pamięci współdzielonej X11, a Neovim usunął obsługę X11.

Jeśli jednak :help --servernameużyję w Neovimie, skończę w dokumentacji serverstart()funkcji:

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

Spowoduje to utworzenie gniazda /tmp/; sprawdź :echo v:servernameścieżkę. Prawdopodobnie bardziej użyteczne jest użycie bardziej deterministycznego adresu (np. serverstart('/tmp/nvim-remote')Chociaż prawdopodobnie będziesz chciał zawinąć to w funkcję, ponieważ nie doda ona liczby takiej jak Vim, --serverstartjeśli już istnieje).

Możesz wysyłać polecenia za pomocą interfejsu RPC API. O ile mi wiadomo, nie ma sposobu, aby wysyłać do tego polecenia tylko za pomocą Neovim (meh). Musisz zainstalować jednego z klientów interfejsu API . Na przykład z referencyjnym klientem API Python (który jest również tym, którego używa zdalny Neovim):

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

Prawdopodobnie możesz wysłać te same bajty za pomocą echo ... >> /tmp/nvim-removepolecenia powłoki, ale interfejs API RPC używa nieco nietrywialnego protokołu nietekstowego („MessagePack RPC”) i ustalenie, które bajty do wysłania było zbyt dużym wysiłkiem dla tego postu; -)

Zobacz :help rpcpełne informacje na temat interfejsu RPC API Neovim.


NB, :help remote.txtjak również wiele innych przedmiotów pomocy (takich jak help server2client()i wiele innych) wciąż istnieje w Neovim, ale żaden z nich nie działa. Wygląda na to, że ktokolwiek usunął tę funkcję, wykonał dość niechlujną robotę.

Martin Tournoij
źródło
To doskonała odpowiedź. Umożliwiło mi to napisanie własnej, prostej, zgodnej z Windows wersji neovim-remote do uruchamiania :terminal. Biorąc pod uwagę te informacje, było to cudownie łatwe.
David