191

GitHub - roxma/nvim-yarp: Yet Another Remote Plugin Framework for Neovim

 6 years ago
source link: https://github.com/roxma/nvim-yarp
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

README.md

Yet Another Remote Plugin Framework for Neovim

This is my attempt on writing a remote plugin framework without :UpdateRemotePlugins.

Requirements

  • has('python3')
  • For Vim 8:
    • roxma/vim-hug-neovim-rpc
    • g:python3_host_prog pointed to your python3 executable, or echo exepath('python3') is not empty.
    • pynvim (pip3 install pynvim)

Use case

Usage

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>)

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"

Options

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.

Methods

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 8

More 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',)

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK