提供器

Nvim 的 :help 頁面,是使用 tree-sitter-vimdoc 解析器,從 來源 產生 而來的。


提供器
Nvim 將某些功能委派給動態的「提供器」。本文檔描述這些提供器以及如何安裝它們。E319
使用需要遺失提供器的功能會產生錯誤
E319: No "foo" provider found. Run ":checkhealth provider"
執行 :checkhealth 命令,並檢查以下各節。

Python 整合 provider-python

Nvim 支援 Python 遠端外掛 和 Vim 傳統的 python3pythonx 介面(它們是以遠端外掛的形式實現的)。
注意: 僅支援 Vim 7.3 傳統介面,不支援較後期的功能,例如 python-bindeval (Vim 7.4);請改用 Nvim API。不支援 Python 2。
PYTHON 快速入門
要使用 Python 外掛,您需要「pynvim」模組。執行 :checkhealth 以查看您是否已安裝它(某些套件管理器會將該模組與 Nvim 一起安裝)。
對於 Python 3 外掛: 1. 請確保您的 $PATH 中有 Python 3.4+。 2. 安裝模組(如果缺少「python3」,請嘗試「python」)。
python3 -m pip install --user --upgrade pynvim
pip 的 --upgrade 標誌確保即使已安裝先前版本,您也能取得最新版本。
另請參閱 python-virtualenv
注意: 舊的「neovim」模組已重新命名為「pynvim」。 https://github.com/neovim/neovim/wiki/Following-HEAD#20181118 如果您遇到問題,請先解除安裝 _兩者_,然後再次安裝「pynvim」。
python -m pip uninstall neovim pynvim
python -m pip install --user --upgrade pynvim
PYTHON 提供器配置
g:python3_host_prog
啟動 Python 3 的命令(可執行檔,而非目錄)。設定此選項可加快啟動速度。適用於使用虛擬環境。必須在檢查 has("python3") 之前設定。
let g:python3_host_prog = '/path/to/python3'
g:loaded_python3_provider
用於停用 Python 3 支援
let g:loaded_python3_provider = 0
PYTHON 虛擬環境
python-virtualenv
如果您計畫經常使用每個專案的虛擬環境,您應該為 Nvim 指派一個虛擬環境,並透過 g:python3_host_prog 硬式編碼解譯器路徑,以便每個虛擬環境都不需要「pynvim」套件。
使用 pyenv 的範例
pyenv install 3.4.4
pyenv virtualenv 3.4.4 py3nvim
pyenv activate py3nvim
python3 -m pip install pynvim
pyenv which python  # Note the path
最後一個命令會報告解譯器路徑,請將其新增至您的 init.vim 中
let g:python3_host_prog = '/path/to/py3nvim/bin/python'
另請參閱: https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim

Ruby 整合 provider-ruby

Nvim 支援 Ruby 遠端外掛 和 Vim 傳統的 ruby-vim 介面(它本身是以 Nvim 遠端外掛的形式實現的)。
RUBY 快速入門
若要將 Ruby 外掛與 Nvim 搭配使用,請安裝最新的「neovim」RubyGem
gem install neovim
執行 :checkhealth 以查看您的系統是否為最新狀態。
RUBY 提供器配置
g:loaded_ruby_provider
用於停用 Ruby 支援
let g:loaded_ruby_provider = 0
g:ruby_host_prog
啟動 Ruby 主機的命令。預設為「neovim-ruby-host」。使用專案本機 Ruby 版本(透過 RVM 或 rbenv 等工具)設定此選項可以避免在每個專案中安裝「neovim」gem 的需求。
若要使用絕對路徑(例如,指向 rbenv 安裝),請執行下列操作
let g:ruby_host_prog = '~/.rbenv/versions/2.4.1/bin/neovim-ruby-host'
若要使用 RVM 「系統」Ruby 安裝,請執行下列操作
let g:ruby_host_prog = 'rvm system do neovim-ruby-host'

Perl 整合 provider-perl

Nvim 在 Unix 平台上支援 Perl 遠端外掛。目前所有已知的事件迴圈實作都缺少在 MS-Windows 上輪詢 STDIN 的支援。也支援 Vim 傳統的 perl-vim 介面(它本身是以 Nvim 遠端外掛的形式實現的)。https://github.com/jacquesg/p5-Neovim-Ext
注意: 僅支援 5.22 或更新版本的 perl。
PERL 快速入門
若要將 perl 遠端外掛與 Nvim 搭配使用,請安裝「Neovim::Ext」cpan 套件
cpanm -n Neovim::Ext
執行 :checkhealth 以查看您的系統是否為最新狀態。
PERL 提供器配置
g:loaded_perl_provider
用於停用 Perl 支援
:let g:loaded_perl_provider = 0
g:perl_host_prog
啟動 Perl 可執行檔的命令。必須在檢查 has("perl") 之前設定。
let g:perl_host_prog = '/path/to/perl'

Node.js 整合 provider-nodejs

NODEJS 快速入門
若要將 javascript 遠端外掛與 Nvim 搭配使用,請安裝「neovim」npm 套件
npm install -g neovim
執行 :checkhealth 以查看您的系統是否為最新狀態。
NODEJS 提供器配置
g:loaded_node_provider
用於停用 Node.js 支援
:let g:loaded_node_provider = 0
g:node_host_prog
啟動 Node.js 主機的命令。設定此選項可加快啟動速度。
預設情況下,Nvim 會使用「npm root -g」搜尋「neovim-node-host」,這可能會很慢。若要避免這種情況,請將 g:node_host_prog 設定為主機路徑
let g:node_host_prog = '/usr/local/bin/neovim-node-host'

剪貼簿整合 provider-clipboard clipboard

Nvim 沒有直接連線到系統剪貼簿。而是依賴於一個 提供器,該提供器會透明地使用 Shell 命令與系統剪貼簿或任何其他剪貼簿「後端」通訊。
若要始終將剪貼簿用於所有操作(而不是明確地與「+」和/或「*」暫存器互動)
set clipboard+=unnamedplus
請參閱 'clipboard' 以取得詳細資訊和選項。
clipboard-tool
工作中的剪貼簿工具的存在會隱式啟用「+」和「*」暫存器。Nvim 會依優先順序搜尋這些剪貼簿工具
g:clipboard (除非取消設定或 false)
pbcopy、pbpaste (macOS)
wl-copy、wl-paste (如果設定了 $WAYLAND_DISPLAY)
waycopy、waypaste (如果設定了 $WAYLAND_DISPLAY)
xsel (如果設定了 $DISPLAY)
xclip (如果設定了 $DISPLAY)
lemonade (適用於 SSH) https://github.com/pocke/lemonade
win32yank (Windows)
termux (透過 termux-clipboard-set、termux-clipboard-set)
tmux (如果設定了 $TMUX)
g:clipboard
若要配置自訂剪貼簿工具,請將 g:clipboard 設定為字典。例如,此配置整合了 tmux 剪貼簿
let g:clipboard = {
      \   'name': 'myClipboard',
      \   'copy': {
      \      '+': ['tmux', 'load-buffer', '-'],
      \      '*': ['tmux', 'load-buffer', '-'],
      \    },
      \   'paste': {
      \      '+': ['tmux', 'save-buffer', '-'],
      \      '*': ['tmux', 'save-buffer', '-'],
      \   },
      \   'cache_enabled': 1,
      \ }
如果 "cache_enabled" 為 TRUE,則當複製選取範圍時,Nvim 會快取選取範圍,直到複製命令處理程序終止。貼上時,如果複製處理程序尚未終止,則會套用快取的選取範圍。
g:clipboard 也可以使用函數(請參閱 lambda)而不是字串。例如,此配置使用 g:foo 變數作為虛假的剪貼簿
let g:clipboard = {
      \   'name': 'myClipboard',
      \   'copy': {
      \      '+': {lines, regtype -> extend(g:, {'foo': [lines, regtype]}) },
      \      '*': {lines, regtype -> extend(g:, {'foo': [lines, regtype]}) },
      \    },
      \   'paste': {
      \      '+': {-> get(g:, 'foo', [])},
      \      '*': {-> get(g:, 'foo', [])},
      \   },
      \ }
「copy」函數會儲存行清單和暫存器類型。「paste」函數會傳回剪貼簿作為 [lines, regtype] 清單,其中 lines 是行清單,regtype 是符合 setreg() 的暫存器類型。
clipboard-wsl
對於 Windows WSL,請嘗試此 g:clipboard 定義
let g:clipboard = {
            \   'name': 'WslClipboard',
            \   'copy': {
            \      '+': 'clip.exe',
            \      '*': 'clip.exe',
            \    },
            \   'paste': {
            \      '+': 'powershell.exe -NoLogo -NoProfile -c [Console]::Out.Write($(Get-Clipboard -Raw).tostring().replace("`r", ""))',
            \      '*': 'powershell.exe -NoLogo -NoProfile -c [Console]::Out.Write($(Get-Clipboard -Raw).tostring().replace("`r", ""))',
            \   },
            \   'cache_enabled': 0,
            \ }
clipboard-osc52
Nvim 捆綁了一個剪貼簿提供器,允許使用 OSC 52 複製到系統剪貼簿。OSC 52 是一種作業系統命令控制序列,會將複製的文字寫入終端機模擬器。如果終端機模擬器支援 OSC 52,它會將複製的文字寫入系統剪貼簿。
如果符合以下所有條件,Nvim 將會嘗試自動判斷主機終端機模擬器是否支援 OSC 52 序列,並啟用 OSC 52 剪貼簿提供器
Nvim 正在 TUI 中執行
g:clipboard 未設定
'clipboard' 未設定為 "unnamed" 或 "unnamedplus"
設定了 $SSH_TTY
如果未符合上述任何條件,則預設不會使用 OSC 52 剪貼簿提供器,而 Nvim 將會回復為透過一般處理程序探索 剪貼簿工具
若要強制 Nvim 使用 OSC 52 提供器,您可以使用以下 g:clipboard 定義
vim.g.clipboard = {
  name = 'OSC 52',
  copy = {
    ['+'] = require('vim.ui.clipboard.osc52').copy('+'),
    ['*'] = require('vim.ui.clipboard.osc52').copy('*'),
  },
  paste = {
    ['+'] = require('vim.ui.clipboard.osc52').paste('+'),
    ['*'] = require('vim.ui.clipboard.osc52').paste('*'),
  },
}
請注意,並非所有終端機模擬器都支援從系統剪貼簿讀取(即使對於那些支援的終端機模擬器,使用者也應該注意安全性影響),因此可能無法使用 OSC 52 進行貼上(而且沒有必要,因為您可以使用系統貼上功能進行 貼上)。使用者可能需要配置他們的終端機模擬器以允許從剪貼簿讀取。
「貼上」是與 剪貼簿 分開的概念:貼上是指「將一堆文字傾印到編輯器」,而剪貼簿提供諸如 quote+ 等功能,以直接取得和設定作業系統剪貼簿。例如,在您的終端機中按一下中鍵或 CTRL-SHIFT-v (macOS:CMD-v) 是「貼上」,而不是「剪貼簿」:終端機應用程式 (Nvim) 僅取得文字串流,它不會直接與剪貼簿互動。
bracketed-paste-mode
TUI 中貼上取決於「帶括號貼上」終端機功能,這允許終端機應用程式區分使用者輸入和貼上的文字。 https://cirw.in/blog/bracketed-paste 如果您的終端機支援,這會自動運作。
ui-paste
GUI 可以透過呼叫 nvim_paste() 貼上。
貼上行為
貼上會在游標之後插入文字。行會在 <NL><CR><CR><NL> 處中斷。當貼上大量文字時,螢幕更新會受到限制,訊息區域會顯示「...」脈衝。
在 cmdline 模式中,只會貼上第一行,以避免意外執行許多命令。如果您真的想將多行貼到 cmdline,請使用 cmdline-window
您可以透過重新定義 vim.paste() 來實作自訂貼上處理常式。範例
vim.paste = (function(lines, phase)
  vim.api.nvim_put(lines, 'c', true, true)
end)

X11 選取機制 clipboard-x11 x11-selection

X11 剪貼簿供應器會將文字儲存在「選取區」中。「選取區」由應用程式擁有,因此當應用程式關閉時,選取區文字會遺失。選取區的內容由原始應用程式持有(例如,在複製時),並且只有在其他應用程式請求時(例如,在貼上時)才會傳遞給其他應用程式。
有三個有文檔記錄的 X11 選取區:PRIMARY、SECONDARY 和 CLIPBOARD。CLIPBOARD 通常在 X11 應用程式中用於複製/貼上操作 (CTRL-c/CTRL-v),而 PRIMARY 用於最後選取的文字,通常使用滑鼠中鍵插入。
Nvim 的 X11 剪貼簿供應器僅使用 PRIMARY 和 CLIPBOARD 選取區,分別對應「*」和「+」暫存器。
主要
指令索引
快速參考