Remote_plugin

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/
主目錄
命令索引
快速參考