提供者

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 的 "system" 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 会通过通常的流程回退到发现 clipboard-tool
要强制 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 进行粘贴可能不可行(也并非必要,因为您可以 paste 使用您的系统粘贴功能来代替)。用户可能需要配置其终端模拟器以允许从剪贴板读取。
"粘贴" 是一个与 clipboard 不同的概念:"粘贴" 意味着“将一大块文本转储到编辑器”,而剪贴板提供诸如 quote+ 等功能,以直接获取和设置 OS 剪贴板。例如,在您的终端中点击鼠标中键或 CTRL-SHIFT-v(macOS:CMD-v)是“粘贴”,而不是“剪贴板”:终端应用程序(Nvim)只是获取文本流,它不会直接与剪贴板交互。
bracketed-paste-mode
TUI 中粘贴取决于 "bracketed paste" 终端功能,该功能允许终端应用程序区分用户输入和粘贴文本。 https://cirw.in/blog/bracketed-paste 如果您的终端支持此功能,则可以自动工作。
ui-paste
GUI 可以通过调用 nvim_paste() 进行粘贴。
粘贴行为
粘贴在光标之后插入文本。行在 <NL><CR><CR><NL> 处换行。粘贴大量文本时,屏幕更新会被节流,消息区域会显示 "..." 脉冲。
在 cmdline-mode 中,只粘贴第一行,以避免意外执行多个命令。如果您确实需要将多行粘贴到 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 选择,分别用于 "*" 和 "+" 寄存器。
命令索引
快速参考