vim-hug-neovim-rpc
This is an experimental project, trying to build a compatibility layer for neovim rpc client working on vim8. I started this project because I want to fix the vim8 support issue for nvim-completion-manager.
Since this is a general purpose module, other plugins needing rpc support may benefit from this project. However, there're many neovim rpc methods I haven't implemented yet, which make this an experimental plugin. Please fork and open a PR if you get any idea on improving it.
Tip: for porting neovim rplugin to vim8, you might need roxma/nvim-yarp
Requirements
- vim8
- If
has('pythonx')
andset pyxversion=3
- same requirements as
4. has('python3')
- same requirements as
- Else if
has('pythonx')
andset pyxversion=2
- same requirements as
5. has('python')
- same requirements as
- Else if
has('python3')
- pynvim
- Pynvim is normally installed by
:py3 import pip; pip.main(['install', '--user', 'pynvim'])
orpython3 -m pip install pynvim
. If you are a win32 user, be careful that your python install and your vim install should both the same architecture (both 64bit or both 32). - There should be no error for at least one of
:python3 import pynvim
and:python3 import neovim
- Else if
has('python')
- pynvim
- Pynvim is normally installed by
:py import pip; pip.main(['install', '--user', 'pynvim'])
orpython2 -m pip install pynvim
. - There should be no error for at least one of
:python3 import pynvim
and:python3 import neovim
set encoding=utf-8
in your vimrc.
Use :echo neovim_rpc#serveraddr()
to test the installation. It should print
something like 127.0.0.1:51359
or /tmp/vmrUX9X/2
.
API
Function | Similar to neovim's |
---|---|
neovim_rpc#serveraddr() |
v:servername |
neovim_rpc#jobstart(cmd,...) |
jobstart({cmd}[, {opts}]) |
neovim_rpc#jobstop(jobid) |
jobstop({job}) |
neovim_rpc#rpcnotify(channel,event,...) |
rpcnotify({channel}, {event}[, {args}...]) |
neovim_rpc#rpcrequest(channel, event, ...) |
rpcrequest({channel}, {method}[, {args}...]) |
Note that neovim_rpc#jobstart
only support these options:
on_stdout
on_stderr
on_exit
detach
Incompatibility issues
- Cannot pass
Funcref
object to python client. Pass function name instead. - Python
None
will be converted to''
instead ofv:null
into vimscript. See vim#2246 - The following neovim-only API will be ignored quietly:
nvim_buf_add_highlight
nvim_buf_clear_highlight
Overall Implementation
"vim-hug-neovim-rpc - Sequence Diagram"
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
βββββ ββββββββββββ βββββββββββββ ββββββββ
βVIMβ βVIM Serverβ βNVIM Serverβ βClientβ
βββ¬ββ ββββββ¬ββββββ βββββββ¬ββββββ ββββ¬ββββ
β Launch thread β β β
ββββββββββββββββββββ> β β
β β β β
β Launch thread β β
ββββββββββββββββββββββββββββββββββββββββββββββββββ>β β
β β β β
β `ch_open` connect β β β
ββββββββββββββββββββ> β β
β β β β
β ββββββ β β
β β β Launch VimHandler threadβ β
β β<ββββ β β
β β β β
β β β Connect β
β β β<βββββββββββββββββββββββββββββ
β β β β
β β βββββ
β β β Launch NvimHandler thread
β β <ββββ
β β β β
β β β Request (msgpack rpc) β
β β β<βββββββββββββββββββββββββββββ
β β β β
β β βββββ β
β β β Request enqueue β
β β <ββββ β
β β β β
β β notify (method call) β β
β β <βββββββββββββββββββββββββββββ β
β β β β
β notify (json rpc) β β β
β<βββββββββββββββββββ β β
β β β β
βββββ β β
β Request dequeue β β
<ββββ β β
β β β β
βββββ β β β
β Process β β β
<ββββ β β β
β β β β
β β Send response (msgpack rpc) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ>
βββ΄ββ ββββββ΄ββββββ βββββββ΄ββββββ ββββ΄ββββ
βVIMβ βVIM Serverβ βNVIM Serverβ βClientβ
βββββ ββββββββββββ βββββββββββββ ββββββββ
Debugging
Add logging settigns to your vimrc. Log files will be generated with prefix
/tmp/nvim_log
. An alternative is to export environment variables before
starting vim/nvim.
let $NVIM_PYTHON_LOG_FILE="/tmp/nvim_log"
let $NVIM_PYTHON_LOG_LEVEL="DEBUG"