Skip to main content

Control nvim processes using "nvr" commandline tool

Project description

neovim-remote
=============

.. image:: https://travis-ci.org/mhinz/neovim-remote.svg?branch=master
:target: https://travis-ci.org/mhinz/neovim-remote

.. image:: https://img.shields.io/pypi/wheel/neovim-remote.svg
:target: https://pypi.python.org/pypi/neovim-remote

.. image:: https://img.shields.io/pypi/v/neovim-remote.svg
:target: https://pypi.python.org/pypi/neovim-remote

.. image:: https://img.shields.io/pypi/pyversions/neovim-remote.svg
:target: https://pypi.python.org/pypi/neovim-remote

.. image:: https://img.shields.io/pypi/l/neovim-remote.svg
:target: https://pypi.python.org/pypi/neovim-remote
|
- `Intro <#intro>`__
- `Use case <#use-case>`__
- `Installation <#installation>`__
- `Usage <#usage>`__
- `Demos <#demos>`__
- `FAQ <#faq>`__

Intro
-----

**nvr** is a tool that helps controlling nvim processes.

It does two things:

1. adds back the ``--remote`` family of options (see ``man vim``)
2. helps controlling the current nvim from within ``:terminal``

To target a specific nvim process, use either the ``--servername``
option or set the environment variable ``$NVIM_LISTEN_ADDRESS``.

If the targeted address does not exist, nvr starts a new process on its
own by running "nvim". You can change the command by setting
``$NVR_CMD``.

Since ``$NVIM_LISTEN_ADDRESS`` is implicitely set by each nvim process,
you can call **nvr** from within Neovim (``:terminal``) without
specifying ``--servername``.

Use case
--------

Imagine Neovim is set as your default editor: ``EDITOR=nvim``.

Now run ``git commit``. In a regular shell, a new nvim process starts. In a
terminal buffer (``:terminal``), a new nvim process starts as well. Now you
have one nvim nested within another. You don't want that. Put this in your
vimrc:

.. code:: vim

if has('nvim')
let $VISUAL = 'nvr -cc split --remote-wait'
endif

That way, you get a new window for entering the commit message instead of a
nested nvim process.

Alternatively, you can make git always using nvr. In a regular shell, nvr will
create a new nvim process. In a terminal buffer, nvr will open a new buffer.

::

$ git config --global core.editor 'nvr --remote-wait-silent'

Installation
------------

::

$ pip3 install neovim-remote

On most systems this will be good enough.

If you get a "permission denied" error, don't use ``sudo`` to force it! Use
this instead:

::

$ pip3 install --user neovim-remote

..and make sure that ``~/.local/bin`` is in $PATH.

Usage
-----

Start a nvim process (which acts as a server) in one shell:

::

$ NVIM_LISTEN_ADDRESS=/tmp/nvimsocket nvim

And do this in another shell:

.. code:: 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

See ``nvr -h`` for all options.

Demos
-----

*(Click on the GIFs to watch them full-size.)*

Using nvr from another shell: |Demo 1|

Using nvr from within ``:terminal``: |Demo 2|

.. |Demo 1| image:: https://github.com/mhinz/neovim-remote/raw/master/images/demo1.gif
.. |Demo 2| image:: https://github.com/mhinz/neovim-remote/raw/master/images/demo2.gif

FAQ
---

**How to open directories?**

``:e /tmp`` opens a directory view via netrw. Netrw works by hooking
into certain events, ``BufEnter`` in this case (see ``:au FileExplorer``
for all of them).

Unfortunately Neovim's API doesn't trigger any autocmds on its own, so
simply ``nvr /tmp`` won't work. Meanwhile you can work around it like
this:

::

$ nvr /tmp -c 'doautocmd BufEnter'

**Reading from stdin?**

Yes! E.g. ``echo "foo\nbar" | nvr -o -`` and ``cat file | nvr --remote -`` work
just as you would expect them to work.

**Exit code?**

If you use a `recent enough Neovim
<https://github.com/neovim/neovim/commit/d2e8c76dc22460ddfde80477dd93aab3d5866506>`__,
nvr will use the same exit code as the linked nvim.

E.g. ``nvr --remote-wait <file>`` and then ``:cquit`` in the linked nvim will
make nvr return with 1.

**Talking to nvr from Neovim?**

Imagine ``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
nvr process.

If we wanted to create a command that disconnects all nvr processes with exit
code 1:

.. code:: vim

command! Cquit
\ if exists('b:nvr')
\| for chanid in b:nvr
\| silent! call rpcnotify(chanid, 'Exit', 1)
\| endfor
\| endif

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

neovim-remote-1.8.2.tar.gz (8.3 kB view details)

Uploaded Source

Built Distribution

neovim_remote-1.8.2-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file neovim-remote-1.8.2.tar.gz.

File metadata

  • Download URL: neovim-remote-1.8.2.tar.gz
  • Upload date:
  • Size: 8.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for neovim-remote-1.8.2.tar.gz
Algorithm Hash digest
SHA256 ea28bad2b92e3b6d2bd586efd220ab6188f912c515093797777a23533a9f0a8a
MD5 b574d5a0c8e7a66548135811806d747b
BLAKE2b-256 5c4bcb0d4f3bee81c92fa719cb6304ea93aa5959119c51021f6057b6d4ac4794

See more details on using hashes here.

File details

Details for the file neovim_remote-1.8.2-py3-none-any.whl.

File metadata

File hashes

Hashes for neovim_remote-1.8.2-py3-none-any.whl
Algorithm Hash digest
SHA256 04056b13c8ee2a98ff0e74d7f4240e084babfc84e0ee10900a36065af0fd2102
MD5 40cb20033a593f27703c12ab5e92b4bf
BLAKE2b-256 fa35cf6cb96609d5e9efcc9bc5f6013aa37fe5c3df49947e3816cecc0596124b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page