nvr is a tool that helps controlling nvim processes.
It basically does two things:
- adds back the
--remotefamily of options (see
- helps controlling the current nvim from within
To target a certain nvim process, you either use the
option or set the environment variable
$NVIM_LISTEN_ADDRESS is implicitely set by each nvim process,
you can call nvr from within Neovim (
$ pip3 install neovim-remote
Start a nvim process (which acts as a server) in one shell:
$ NVIM_LISTEN_ADDRESS=/tmp/nvimsocket nvim
And do this in another shell:
$ # Spares us from using --servername all the time: $ export NVIM_LISTEN_ADDRESS=/tmp/nvimsocket $ # This is optional, since nvr assumes /tmp/nvimsocket by default. $ # Open two files: $ nvr --remote file1 file2 $ # Send keys to the current buffer: $ nvr --remote-send 'iabc<esc>' $ # Enter insert mode, insert 'abc', and go back to normal mode again. $ # Evaluate any VimL expression, e.g. get all listed buffers: $ nvr --remote-expr "join(sort(map(filter(range(bufnr('$')), 'buflisted(v:val)'), 'bufname(v:val)')), "\""\n"\"")" .config/git/config vim/vimrc zsh/.zprofile
nvr -h for all options.
How to open directories?
:e /tmp opens a directory view via netrw. Netrw works by hooking
into certain events,
BufEnter in this case (see
for all of them).
Unfortunately Neovim's API doesn't trigger any autocmds on its own, so
nvr /tmp won't work. Meanwhile you can work around it like
$ nvr /tmp -c 'doautocmd BufEnter'
Reading from stdin?
echo "foo\nbar" | nvr -o - and
cat file | nvr --remote - work
just as you would expect them to work.
If you use a recent enough Neovim, nvr will use the same exit code as the linked nvim.
nvr --remote-wait <file> and then
:cquit in the linked nvim will
make nvr return with 1.
Talking to nvr from Neovim?
nvr --remote-wait file. The buffer that represents "file" in Neovim
now has a local variable
b:nvr. It's a list of channels for each connected
If we wanted to create a command that disconnects all nvr processes with exit code 1:
command! Cquit \ if exists('b:nvr') \| for chanid in b:nvr \| silent! call rpcnotify(chanid, 'Exit', 1) \| endfor \| endif
(Click on the GIFs to watch them full-size.)