远程插件

Nvim :help 页面,生成源代码,使用 tree-sitter-vimdoc 解析器。


Nvim 对远程插件的支持
可扩展性是 Nvim 的首要目标。任何编程语言都可以用于扩展 Nvim,而无需对 Nvim 本身进行更改。这是通过远程插件实现的,远程插件是具有与 Nvim 进程直接通信通道(通过 RPC)的协同进程。
即使这些插件在单独的进程中运行,它们也可以调用、被调用并接收事件,就像插件的代码在主进程中执行一样。

2. 插件主机 remote-plugin-hosts

虽然插件可以实现为任意程序,这些程序可以直接与高级 Nvim API 通信,并通过 rpcrequest()rpcnotify() 调用,但这并不是最佳方法。相反,开发人员应该首先检查他们选择的编程语言是否可以使用插件主机。
插件主机是提供插件高级环境的程序,它们负责处理定义通过 RPC 连接实现的命令、自动命令和函数的大部分样板。主机仅在其中一个注册的插件需要时加载,从而使 Nvim 的启动尽可能快,即使安装了许多插件/主机也是如此。
了解远程插件的最佳方法是通过示例,所以让我们看看 Python 插件是什么样的。此插件导出一个命令、一个函数和一个自动命令。该插件称为“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。
注意,导出的命令和自动命令使用“sync”标志定义,这会影响 Nvim 调用插件的方式:使用“sync”,rpcrequest() 函数将被使用,该函数将阻塞 Nvim 直到处理程序函数返回值。如果没有“sync”标志,则使用 rpcnotify() 以“即发即弃”方式进行调用,这意味着处理程序函数中返回的值或引发的异常将被忽略。
要测试上述插件,必须将其保存在 'runtimepath' 目录的“rplugin/python”中(例如 ~/.config/nvim/rplugin/python/limit.py)。然后,必须使用 :UpdateRemotePlugins 生成远程插件清单。
仅仅将远程插件安装到“rplugin/{host}”不足以使它们在需要时自动加载。每当安装、更新或删除远程插件时,都必须执行 :UpdateRemotePlugins
:UpdateRemotePlugins 会生成远程插件清单,这是一个特殊的 Vimscript 文件,其中包含所有远程插件定义的所有 Vimscript 实体(命令/自动命令/函数)的声明,每个实体都与主机和插件路径相关联。
清单声明只是对 remote#host#RegisterPlugin 函数的调用,该函数负责在第一次使用声明的命令、自动命令或函数时启动主机。
清单生成步骤对于在用户拥有使用不同主机的远程插件的情况下保持 Nvim 的启动速度至关重要。例如,假设用户分别拥有三个用于 Python、Java 和 .NET 主机的插件。如果我们在启动时加载所有三个插件,那么也会生成三个语言运行时,这可能需要几秒钟!
使用清单,每个主机仅在需要时加载。继续上面的例子,假设 Java 插件是 Java 代码的语义补全引擎。如果它定义了自动命令 BufEnter *.java,那么只有在 Nvim 加载与“*.java”匹配的缓冲区时才会生成 Java 主机。
如果对 :UpdateRemotePlugins 的显式调用似乎不方便,请尝试这样理解:这是一种在 Nvim 中提供 IDE 功能的方式,同时仍然保持其在一般用途下的快速和轻量级。它也类似于 :helptags 命令。
$NVIM_RPLUGIN_MANIFEST
除非设置了 $NVIM_RPLUGIN_MANIFEST,否则清单将写入位于以下位置的名为 rplugin.vim 的文件中
Unix
$XDG_DATA_HOME/nvim/ 或 ~/.local/share/nvim/
Windows
$LOCALAPPDATA/nvim/ 或 ~/AppData/Local/nvim/
命令索引
快速参考