All Projects → mhinz → Neovim Remote

mhinz / Neovim Remote

Licence: mit
👌 Support for --remote and friends.

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Neovim Remote

Far.vim
Find And Replace Vim plugin
Stars: ✭ 717 (-23.32%)
Mutual labels:  neovim
Fzf.vim
fzf ❤️ vim
Stars: ✭ 7,435 (+695.19%)
Mutual labels:  neovim
Git Messenger.vim
Vim and Neovim plugin to reveal the commit messages under the cursor
Stars: ✭ 904 (-3.32%)
Mutual labels:  neovim
Coc Explorer
📁 Explorer for coc.nvim
Stars: ✭ 722 (-22.78%)
Mutual labels:  neovim
Markdown Preview.vim
⚠️ PLEASE USE https://github.com/iamcco/markdown-preview.nvim INSTEAD
Stars: ✭ 764 (-18.29%)
Mutual labels:  neovim
Deoplete Phpactor
Phpactor integration for deoplete.nvim
Stars: ✭ 17 (-98.18%)
Mutual labels:  neovim
Context.vim
Vim plugin that shows the context of the currently visible buffer contents
Stars: ✭ 688 (-26.42%)
Mutual labels:  neovim
Tmux Navigate
🥂 Seamless tmux/vim navigation (over SSH too!)
Stars: ✭ 23 (-97.54%)
Mutual labels:  remote-control
Aspia
Remote desktop and file transfer tool.
Stars: ✭ 784 (-16.15%)
Mutual labels:  remote-control
Crease.vim
Easy foldtext customization for [neo]vim.
Stars: ✭ 19 (-97.97%)
Mutual labels:  neovim
Nvim Lua Guide
A guide to using Lua in Neovim
Stars: ✭ 750 (-19.79%)
Mutual labels:  neovim
Semshi
🌈 Semantic Highlighting for Python in Neovim
Stars: ✭ 758 (-18.93%)
Mutual labels:  neovim
Dotfiles
Configurations for the tools I use every day
Stars: ✭ 898 (-3.96%)
Mutual labels:  neovim
Vim Illuminate
illuminate.vim - Vim plugin for automatically highlighting other uses of the word under the cursor. Integrates with Neovim's LSP client for intelligent highlighting.
Stars: ✭ 721 (-22.89%)
Mutual labels:  neovim
Pythonadvancedhttpreverseshell
Advanced python HTTP reverse shell made for Hacking Competition purpose. I am not responsible of what you do with this tool.
Stars: ✭ 22 (-97.65%)
Mutual labels:  remote-control
Vim Quickui
The missing UI extensions for Vim 8.2 (and NeoVim 0.4) !! 😎
Stars: ✭ 714 (-23.64%)
Mutual labels:  neovim
Thinkvim
Vim configuration in the 21st century
Stars: ✭ 832 (-11.02%)
Mutual labels:  neovim
Vim Dirvish
Directory viewer for Vim ⚡️
Stars: ✭ 929 (-0.64%)
Mutual labels:  neovim
Defx.nvim
📁 The dark powered file explorer implementation
Stars: ✭ 917 (-1.93%)
Mutual labels:  neovim
Tmuxdir.nvim
📂 ⚡️ tmux session workspace plugin for nvim and vim
Stars: ✭ 18 (-98.07%)
Mutual labels:  neovim

Build status Supported Python versions

neovim-remote


This package provides an executable called nvr which solves these cases:

  • Controlling nvim processes from the shell. E.g. opening files in another terminal window.
  • Opening files from within :terminal without starting a nested nvim process.


Installation

pip3 install neovim-remote

If you encounter any issues, e.g. permission denied errors or you can't find the nvr executable, read INSTALLATION.md.

Theory

Nvim always starts a server. Get its address via :echo $NVIM_LISTEN_ADDRESS or :echo v:servername. Or specify an address at startup: NVIM_LISTEN_ADDRESS=/tmp/nvimsocket nvim.

nvr will use $NVIM_LISTEN_ADDRESS or any address given to it via --servername.

If the targeted address does not exist, nvr starts a new process by running "nvim". You can change the command by setting $NVR_CMD. (This requires forking, so it won't work on Windows.)

First steps

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

NVIM_LISTEN_ADDRESS=/tmp/nvimsocket nvim

And do this in another shell:

# nvr uses /tmp/nvimsocket by default, so we're good.

# 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 the current buffer:
nvr --remote-expr 'bufname("")'
README.md
click here to see all nvr options
$ nvr -h
usage: nvr [arguments]

Remote control Neovim processes.

If no process is found, a new one will be started.

    $ nvr --remote-send 'iabc<cr><esc>'
    $ nvr --remote-expr 'map([1,2,3], "v:val + 1")'

Any arguments not consumed by options will be fed to --remote-silent:

    $ nvr --remote-silent file1 file2
    $ nvr file1 file2

All --remote options take optional commands.
Exception: --remote-expr, --remote-send.

    $ nvr +10 file
    $ nvr +'echomsg "foo" | echomsg "bar"' file
    $ nvr --remote-tab-wait +'set bufhidden=delete' file

Open files in a new window from a terminal buffer:

    $ nvr -cc split file1 file2

Use nvr from git to edit commit messages:

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

optional arguments:
  -h, --help            show this help message and exit
  --remote [<file> [<file> ...]]
                        Use :edit to open files. If no process is found, throw
                        an error and start a new one.
  --remote-wait [<file> [<file> ...]]
                        Like --remote, but block until all buffers opened by
                        this option get deleted or the process exits.
  --remote-silent [<file> [<file> ...]]
                        Like --remote, but throw no error if no process is
                        found.
  --remote-wait-silent [<file> [<file> ...]]
                        Combines --remote-wait and --remote-silent.
  --remote-tab [<file> [<file> ...]]
                        Like --remote, but use :tabedit.
  --remote-tab-wait [<file> [<file> ...]]
                        Like --remote-wait, but use :tabedit.
  --remote-tab-silent [<file> [<file> ...]]
                        Like --remote-silent, but use :tabedit.
  --remote-tab-wait-silent [<file> [<file> ...]]
                        Like --remote-wait-silent, but use :tabedit.
  --remote-send <keys>  Send key presses.
  --remote-expr <expr>  Evaluate expression and print result in shell.
  --servername <addr>   Set the address to be used. This overrides the default
                        "/tmp/nvimsocket" and $NVIM_LISTEN_ADDRESS.
  --serverlist          Print the TCPv4 and Unix domain socket addresses of
                        all nvim processes.
  -cc <cmd>             Execute a command before every other option.
  -c <cmd>              Execute a command after every other option.
  -d                    Diff mode. Use :diffthis on all to be opened buffers.
  -l                    Change to previous window via ":wincmd p".
  -o <file> [<file> ...]
                        Open files via ":split".
  -O <file> [<file> ...]
                        Open files via ":vsplit".
  -p <file> [<file> ...]
                        Open files via ":tabedit".
  -q <errorfile>        Read errorfile into quickfix list and display first
                        error.
  -s                    Silence "no server found" message.
  -t <tag>              Jump to file and position of given tag.
  --nostart             If no process is found, do not start a new one.
  --version             Show the nvr version.

Development: https://github.com/mhinz/neovim-remote

Happy hacking!

Typical use cases

  • Open files from within :terminal without starting a nested nvim process.

    Easy-peasy! Just nvr file.

    This works without any prior setup, because $NVIM_LISTEN_ADDRESS is always set within Nvim. And nvr will default to that address.

    I often work with two windows next to each other. If one contains the terminal, I can use nvr -l foo to open the file in the other window.

  • Open files always in the same nvim process no matter which terminal you're in.

    If you just run nvr -s, a new nvim process will start and set its address to /tmp/nvimsocket automatically.

    Now, no matter in which terminal you are, nvr file will always work on that nvim process. That is akin to emacsclient from Emacs.

  • Use nvr in plugins.

    Some plugins rely on the --remote family of options from Vim. Nvim had to remove those when they switched to outsource a lot of manual code to libuv. These options are planned to be added back, though.

    In these cases nvr can be used as a drop-in replacement. E.g. vimtex can be configured to use nvr to jump to a certain file and line: read.

  • Use nvr as git editor.

    Imagine Neovim is set as your default editor via $VISUAL or $EDITOR.

    Running git commit in a regular shell starts a nvim process. But in a terminal buffer (:terminal), a new nvim process starts as well. Now you have one nvim nested within another.

    If you do not want this, put this in your vimrc:

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

    That way, you get a new window for inserting the commit message instead of a nested nvim process. But git still waits for nvr to finish, so make sure to delete the buffer after saving the commit message: :w | bd.

    If you don't like using :w | bd and prefer the good old :wq (or :x), put the following in your vimrc:

    autocmd FileType gitcommit,gitrebase,gitconfig set bufhidden=delete
    

    To use nvr from a regular shell as well:

      $ git config --global core.editor 'nvr --remote-wait-silent'
    
  • Use nvr as git mergetool.

    If you want to use nvr for git difftool and git mergetool, put this in your gitconfig:

    [diff]
        tool = nvr
    [difftool "nvr"]
        cmd = nvr -s -d $LOCAL $REMOTE
    [merge]
        tool = nvr
    [mergetool "nvr"]
        cmd = nvr -s -d $LOCAL $BASE $REMOTE $MERGED -c 'wincmd J | wincmd ='
    

    nvr -d is a shortcut for nvr -d -O and acts like vim -d, thus it uses :vsplit to open the buffers. If you want them to be opened via :split instead, use nvr -d -o.

    When used as mergetool and all four buffers got opened, the cursor is in the window containing the $MERGED buffer. We move it to the bottom via :wincmd J and then equalize the size of all windows via :wincmd =.

  • Use nvr for scripting.

    You might draw some inspiration from this Reddit thread.

Demos

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

Using nvr from another shell: Demo 1

Using nvr from within :terminal: Demo 2

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, 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.

  • How to send a message to all waiting clients?

    If you open a buffer with any of the wait options, that buffer will get a variable b:nvr. The variable contains a list of channels wheres each channel is a waiting nvr client.

    Currently nvr only understands the Exit message. You could use it to disconnect all waiting nvr clients at once:

    command! DisconnectClients
        \  if exists('b:nvr')
        \|   for client in b:nvr
        \|     silent! call rpcnotify(client, 'Exit', 1)
        \|   endfor
        \| endif
    
  • Can I have auto-completion for bash?

    If you want basic auto-completion for bash, you can source this script in your .bashrc.

    This also completes server names with the --servername option.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].