Remote_plugin
Nvim の :help
ページは、生成 されており、ソース を tree-sitter-vimdoc パーサーを使って解析しています。
リモートプラグインに対する Nvim のサポート
拡張性は Nvim の主要な目標です。Nvim 自体を変更することなく、あらゆるプログラミング言語を使用して Nvim を拡張できます。これは、Nvim プロセスと直接通信チャネル(
RPC 経由)を持つコプロセスであるリモートプラグインによって実現されます。
これらのプラグインは別のプロセスで実行されますが、プラグインのコードがメインプロセスで実行されるかのように、呼び出し、呼び出され、イベントを受信できます。
プラグインは、高レベルの Nvim API と直接通信し、
rpcrequest() および
rpcnotify() を介して呼び出される任意のプログラムとして実装できますが、それが最善のアプローチではありません。代わりに、開発者はまず、選択したプログラミング言語でプラグインホストが利用可能かどうかを確認する必要があります。
プラグインホストは、プラグインの高レベル環境を提供し、
RPC 接続を介して実装されるコマンド、autocmd、および関数の定義に必要なボイラープレートのほとんどを処理するプログラムです。ホストは、登録されたプラグインのいずれかが必要とする場合にのみロードされるため、多数のプラグイン/ホストがインストールされていても、Nvim の起動を可能な限り高速に保ちます。
リモートプラグインについて学ぶ最良の方法は、例を見ることです。Python プラグインがどのようなものかを見てみましょう。このプラグインは、コマンド、関数、および autocmd をエクスポートします。プラグインは 'Limit' と呼ばれ、実行されるリクエストの数を制限するだけです。以下はプラグインのソースコードです。
import pynvim
@pynvim.plugin
class Limit(object):
def __init__(self, vim):
self.vim = vim
self.calls = 0
@pynvim.command('Cmd', range='', nargs='*', sync=True)
def command_handler(self, args, range):
self._increment_calls()
self.vim.current.line = (
'Command: Called %d times, args: %s, range: %s' % (self.calls,
args,
range))
@pynvim.autocmd('BufEnter', pattern='*.py', eval='expand("<afile>")',
sync=True)
def autocmd_handler(self, filename):
self._increment_calls()
self.vim.current.line = (
'Autocmd: Called %s times, file: %s' % (self.calls, filename))
@pynvim.function('Func')
def function_handler(self, args):
self._increment_calls()
self.vim.current.line = (
'Function: Called %d times, args: %s' % (self.calls, args))
def _increment_calls(self):
if self.calls == 5:
raise Exception('Too many calls!')
self.calls += 1
ご覧のとおり、プラグインは慣用的な Python(クラス、メソッド、およびデコレーター)を使用して実装されています。これらの言語固有のイディオムから Vimscript への変換は、プラグインマニフェストの生成中に行われます(次のセクションを参照)。
エクスポートされたコマンドと autocmd は "sync" フラグで定義されていることに注意してください。これは Nvim がプラグインを呼び出す方法に影響します。"sync" を指定すると、
rpcrequest() 関数が使用され、ハンドラー関数が値を返すまで Nvim がブロックされます。"sync" フラグがない場合、呼び出しは
rpcnotify() を使用した fire and forget アプローチで行われます。つまり、ハンドラー関数で発生した戻り値や例外は無視されます。
上記のプラグインをテストするには、
'runtimepath' ディレクトリの "rplugin/python" に保存する必要があります(たとえば、~/.config/nvim/rplugin/python/limit.py)。次に、リモートプラグインマニフェストを
:UpdateRemotePlugins で生成する必要があります。
"rplugin/{host}" にリモートプラグインをインストールするだけでは、必要なときに自動的にロードされるのに十分ではありません。
:UpdateRemotePlugins は、リモートプラグインがインストール、更新、または削除されるたびに実行する必要があります。
:UpdateRemotePlugins は、リモートプラグインマニフェストを生成します。これは、すべてのリモートプラグインで定義されたすべての Vimscript エンティティ(コマンド/自動コマンド/関数)の宣言を含む特別な Vimscript ファイルであり、各エンティティはホストとプラグインパスに関連付けられています。
マニフェスト宣言は、remote#host#RegisterPlugin
関数の呼び出しにすぎません。これは、宣言されたコマンド、自動コマンド、または関数が初めて使用されるとすぐにホストをブートストラップします。
マニフェスト生成ステップは、ユーザーが異なるホストを持つリモートプラグインを持っている場合に、Nvim の起動を高速に保つために必要です。たとえば、ユーザーが Python、Java、.NET ホスト用にそれぞれ 3 つのプラグインを持っているとします。3 つのプラグインすべてを起動時にロードすると、3 つの言語ランタイムも起動し、数秒かかる可能性があります。
マニフェストを使用すると、各ホストは必要なときにのみロードされます。例を続けると、Java プラグインが Java コードのセマンティック補完エンジンであるとします。autocommand BufEnter *.java
を定義すると、Nvim が "*.java" に一致するバッファーをロードしたときにのみ Java ホストが起動されます。
Unix
$XDG_DATA_HOME/nvim/ または ~/.local/share/nvim/
Windows
$LOCALAPPDATA/nvim/ または ~/AppData/Local/nvim/