Как я могу использовать --servername и --remote в neovim?

15

В vim я могу делать vim --servername fooи vim --servername foo --remote-silent bar.txtоткрывать файлы в одном экземпляре vim из нескольких окон терминала (через tmux или что-то еще). Как то же самое достигается в NeoVim?

Рафаэль Вега
источник

Ответы:

8

Насколько я знаю, vim имеет эту функцию, потому что графический интерфейс vim (gvim) использует графический X-сервер. Я знаю, что не GUI Vim также может использовать --servernameаргумент, но только когда X11 работает, а также путем доступа к нему . С другой стороны, у neovim нет графической поддержки; по этой причине я не думаю, что эта --servernameопция может работать (если только эта опция не была бы полностью переписана другим способом), поскольку мне было бы странно иметь консольную программу, обращающуюся к серверу X11 только для этой цели.

Томас Барухель
источник
Сначала я думал, что этот ответ был неправильным, поскольку IPC без X не только возможен, но и очень распространен (например, сокеты). Но, :help x11-clientserverпохоже, это подтверждает: «Связь между клиентом и сервером происходит через X-сервер. [..] Vim без графического интерфейса пользователя с доступом к дисплею X11 (| xterm-clipboard | enabled) также может выступать в качестве командного сервера, если имя сервера явно задано "...
Мартин Турной
7

Neovim remote - это скрипт на python для управления процессами neovim. У него есть параметры vim в стиле --servername и --remote. Это то, что я сейчас использую для своей рабочей среды с несколькими терминалами.

Рафаэль Вега
источник
Стоит отметить, что этот плагин не работает для платформы Windows.
Jdhao
4

Как уже упоминалось, все функции клиент-сервера были удалены в Neovim. Это потому, что они используют общую память X11, а Neovim убрал поддержку X11.

Однако, если я использую :help --servernameв Neovim, я в конечном итоге в документации для serverstart()функции:

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

Это сделает сокет в /tmp/; смотрите :echo v:servernameна путь. Вероятно, более полезно использовать более детерминированный адрес (например serverstart('/tmp/nvim-remote'), хотя вы, вероятно, захотите обернуть его в функцию, поскольку он не будет добавлять число, как это --serverstartделает Vim, если он уже существует).

Вы можете отправлять команды с помощью RPC API. Насколько я могу найти, нет никакого способа послать команды этому только с Neovim (meh). Вам нужно будет установить один из клиентов API . Например, со ссылочным клиентом Python API (который также используется в удаленном Neovim):

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

Вероятно, вы можете отправить те же байты с помощью echo ... >> /tmp/nvim-removeкоманды оболочки, но API RPC использует несколько нетривиальный нетекстовый протокол («MessagePack RPC»), и выяснить, какие именно байты для отправки, было слишком много усилий для этого сообщения; -)

Смотрите :help rpcполную информацию о RPC API Neovim.


NB, :help remote.txtкак и многие другие элементы справки (такие как help server2client()и многие другие), все еще существует в Neovim, но ничего из этого не работает. Похоже, тот, кто удалил эту функцию, сделал довольно небрежную работу.

Мартин Турной
источник
Это отличный ответ. Это позволило мне написать собственную, простую, совместимую с Windows версию neovim-remote для запуска :terminal. Учитывая эту информацию, это было удивительно легко.
Дэвид