【问题标题】:How can I write a NeoVim plugin with JavaScript?如何使用 JavaScript 编写 NeoVim 插件?
【发布时间】:2018-11-10 01:37:28
【问题描述】:

听说 NeoVim 的优势之一是更灵活的插件架构。 有没有用JS写插件的API?

有一些项目似乎与此相关: neovim/node-host, neovim/node-client, fritzy/node-neovim, rhysd/promised-neovim-client 但我不确定如何使用它们。 我如何访问Vim functions 或命令或等效功能(以及这在哪里记录)?


promised-neovim-client 通过附加到它的标准输入和标准输出来与 NeoVim 进程交互。 因此,也许从 NeoVim 内部,我可以启动一个 promise-neovim-client 脚本并将正在运行的 NeoVim 进程的 pid 传递给它,并且该脚本可以附加到它的标准输入和标准输出?

【问题讨论】:

    标签: javascript node.js neovim


    【解决方案1】:
    1. Install 节点客户端
      • npm install -g neovim
      • 运行:checkhealth进行确认。
    2. quickstart,将示例代码(如下)粘贴到 Nvim runtimepath 上某处的rplugin/node/index.js(例如~/.config/nvim/rplugin/node/index.js)。
    3. 运行:UpdateRemotePlugins
    4. 重启 Nvim。
    5. 试试:SetMyLine 命令(在上面的代码示例中定义)。

    示例代码

    function onBufWrite() {
      console.log('Buffer written!');
    }
    
    module.exports = (plugin) => {
      function setLine() {
        plugin.nvim.setLine('A line, for your troubles');
      }
      plugin.registerCommand('SetMyLine', [plugin.nvim.buffer, setLine]);
      plugin.registerAutocmd('BufWritePre', onBufWrite, { pattern: '*' });
    };
    

    【讨论】:

    • node-host 中的 NeoVim API 是否与此相同:github.com/neovim/node-client/blob/master/index.d.ts
    • 当我运行:UpdateRemotePlugin 时,我得到function remote#host#UpdateRemotePlugins[6]..<SNR>47_RegistrationCommands[15]..remote#h ost#Require[13]..provider#pythonx#Require, line 14 Vim(let):E902: "" is not an executable function remote#host#UpdateRemotePlugins[6]..<SNR>47_RegistrationCommands[15]..remote#h ost#Require[13]..provider#pythonx#Require, line 21 Vim(for):E121: Undefined variable: channel_id
    【解决方案2】:

    你绝对可以用 javascript 编写 neovim 插件。来自https://github.com/neovim/neovim/blob/master/runtime/doc/remote_plugin.txt#L7

    可扩展性是 Nvim 的主要目标。可以使用任何编程语言
    扩展 Nvim 而不改变 Nvim 本身。这是通过远程实现的 与
    具有直接通信通道(通过|RPC|)的插件、协同进程 Nvim 进程。

    即使这些插件在单独的进程中运行,它们也可以调用、被调用,
    并接收事件,就像插件的代码在主程序中执行一样 过程。

    你只需要与远程 api 对话

    Neovim 远程插件 (rplugin) 是通过远程 API 与 nvim 对话的任何程序(可以通过任意传输机制访问:TCP 地址、命名管道、标准输入/标准输出等)。

    我也找不到远程 API 文档。 neovim/node-client中有一些例子。

    你也可以看看这个file

    【讨论】:

    • 在 master 上,远程 API 现在记录在 :help api-funcs
    • 在后来的 Nvim 版本中,帮助标签被改为简单的:help api
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多