This is my attempt on writing a remote plugin framework without :UpdateRemotePlugins
.
has('python3')
g:python3_host_prog
pointed to your python3 executable, or echo exepath('python3')
is not empty.pip3 install pynvim
)" Required for vim 8 Plug 'roxma/vim-hug-neovim-rpc' " Install this plugin Plug 'roxma/nvim-yarp', { 'do': 'pip install -r requirements.txt' }
pythonx/hello.py
import vim, time def greet(): time.sleep(3) vim.command('echo "Hello world"')
plugin/hello.vim
" Create a python3 process running the hello module. The process is lazy load. let s:hello = yarp#py3('hello') com HelloSync call s:hello.request('greet') com HelloAsync call s:hello.notify('greet') " You could type :Hello greet com -nargs=1 Hello call s:hello.request(<f-args>)
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"
let s:yarp.on_load = function('your_handler')
A handler that is called after your python module is loaded. It is not considered ready for request or notification from vimscript during loading stage. s:yarp.request
and s:yarp.notify
internally wait until on_load
before sending actual request and notification.
call s:yarp.reqeust({event}, [, {args}...])
Similiar to :help rpcrequest
. It sends a request to the rpc channel and returns the result of your python method.
call s:yarp.rpcnotify({event}, [, {args}...])
Similiar to :help rpcnotify
. It sends a notification to the rpc channel and returns immediately.
call s:yarp.error(msg)
Print error message.
call s:yarp.warn(msg)
Print warning message.
Example for existing neovim rplugin porting to Vim 8More realistic examples could be found at nvim-typescript#84, deoplete#553, callmekohei/quickdebug.
Now let's consider the following simple rplugin.
After UpdateRemotePlugins
and restarting neovim, you get foobar
by :echo Bar()
.
# rplugin/python3/foo.py import pynvim @pynvim.plugin class Foo(object): def __init__(self, vim): self._vim = vim @pynvim.function("Bar", sync=True) def bar(self, args): return 'hello' + str(args)
For working on Vim 8, you need to add these two files:
" plugin/foo.vim if has('nvim') finish endif let s:foo = yarp#py3('foo_wrap') func! Bar(v) return s:foo.call('bar',a:v) endfunc
# pythonx/foo_wrap.py from foo import Foo as _Foo import vim _obj = _Foo(vim) def bar(*args): return _obj.bar(args)
How to use
$ vim
: echo bar('world')
hello('world',)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4