🥑

neovimのプラグインを作る第一歩

2 min read

はじめに

vimはたまたneovimを使ってる人たちは、自分の時間を際限なく犠牲にし血眼になってvimの設定をカスタマイズしていることでしょう。しかし、そんな人でもプラグインを作り始めるのはハードルが少し高いと思います。なので、そこの二の足を踏んでいるあなたを新たな沼にいざなうためにこの記事を贈ります。

兎にも角にもコード

$XDG_CONFIG_HOME(設定してなければ~/.config)にnvimディレクトリがあると思います。
init.vimが置いてある場所です。
そこにrplugin/python3/test/__init__.pyを作成します。
(~/.config/nvim/rplugin/python3/test/__init__.py)

__init__.py
import pynvim

@pynvim.plugin
class TestPlugin(object):
    def __init__(self, nvim):
        self.nvim = nvim

    @pynvim.command('TestCommand', nargs='*', range='')
    def testcommand(self, args, range):
        self.nvim.current.line = ('Command with args: {}, range: {}'.format(args, range))

    @pynvim.function('TestFunction', sync=True)
    def testfunction(self, args):
        self.nvim.out_write(self.nvim.current.line + "\n")

neovimを開いて:UpdateRemotePluginsを実行すると:TestCommand:call TestFunction()が使用できるようになっています。
:TestCommandは現在行に引数と範囲を記した文字列を書き込みます。

:call TestFunction()は現在行をメッセージとして表示します。

定義

コマンド

以下のように、vimscriptで定義すると同じようにpythonで定義できます。

@pynvim.command(name, nargs=0, complete=None, range=None, count=None, bang=False, register=False, sync=False, allow_nested=False, eval=None)

https://vim-jp.org/vimdoc-ja/usr_40.html#40.2

関数

関数もコマンドと同様です。

@pynvim.function(name, range=False, sync=False, allow_nested=False, eval=None)

https://vim-jp.org/vimdoc-ja/usr_41.html#41.7

書き方

self.nvimを通してvimのapiが使えます。
下記に使用できるメソッドが記載されています。

https://pynvim.readthedocs.io/en/latest/api/nvim.html

プラグインマネージャーで管理する

自作のプラグインをdeinで管理したい場合は、githubにあげれば他のプラグイン同様に管理できます。

[[plugins]]
repo = 'john/test.vim'

ローカルのpathも指定できるのでプラグインを配置する場所は下記でなくても大丈夫です。
~/.config/nvim/rplugin/python3/test/__init__.py
~/workspace/develop/neovim/test.nvim/rplugin/python3/test/__init__.py に記載されてる場合

[[plugins]]
repo = '~/workspace/develop/neovim/test.nvim'

最後に

これを機に便利なneovimのプラグインを世に生み出し生産性を武器にして、vimを使っているだけで白い目で見てくる輩に目にもの見せてやりましょう。便利そうだったら僕に紹介してください。お願いします。
一応、これから皆さんが世に放つ新進気鋭なプラグインには遠く及ばない私が作ったしょうもないプラグインを置いておきます。

https://github.com/atsuya0/surround.nvim

Discussion

ログインするとコメントできます