В vim я могу делать vim --servername foo
и vim --servername foo --remote-silent bar.txt
открывать файлы в одном экземпляре vim из нескольких окон терминала (через tmux или что-то еще). Как то же самое достигается в NeoVim?
В vim я могу делать vim --servername foo
и vim --servername foo --remote-silent bar.txt
открывать файлы в одном экземпляре vim из нескольких окон терминала (через tmux или что-то еще). Как то же самое достигается в NeoVim?
Ответы:
Насколько я знаю, vim имеет эту функцию, потому что графический интерфейс vim (gvim) использует графический X-сервер. Я знаю, что не GUI Vim также может использовать --servername
аргумент, но только когда X11 работает, а также путем доступа к нему . С другой стороны, у neovim нет графической поддержки; по этой причине я не думаю, что эта --servername
опция может работать (если только эта опция не была бы полностью переписана другим способом), поскольку мне было бы странно иметь консольную программу, обращающуюся к серверу X11 только для этой цели.
Neovim remote - это скрипт на python для управления процессами neovim. У него есть параметры vim в стиле --servername и --remote. Это то, что я сейчас использую для своей рабочей среды с несколькими терминалами.
Как уже упоминалось, все функции клиент-сервера были удалены в 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, но ничего из этого не работает. Похоже, тот, кто удалил эту функцию, сделал довольно небрежную работу.
:terminal
. Учитывая эту информацию, это было удивительно легко.
:help x11-clientserver
похоже, это подтверждает: «Связь между клиентом и сервером происходит через X-сервер. [..] Vim без графического интерфейса пользователя с доступом к дисплею X11 (| xterm-clipboard | enabled) также может выступать в качестве командного сервера, если имя сервера явно задано "...