常见问题解答

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


常见问题解答

一般问题 faq-general

我应该把我的配置 (VIMRC) 放到哪里?
参见 config;你可以复制(或创建符号链接)你现有的 vimrc。 nvim-from-vim
开发(预发布)版本稳定吗?
不稳定的(预发布)https://github.com/neovim/neovim/releases/tag/nightly 版本的 Nvim(“HEAD”,即 master 分支)用于积极地准备新功能和更改。它通常是稳定的,但偶尔会破坏你的工作流程。我们依赖 HEAD 用户来报告自动化测试没有捕获的“盲点”。
使用稳定的(发布)https://github.com/neovim/neovim/releases/latest 版本来获得更可预测的体验。
我可以用基于 Lua 的 Vim 插件(例如 NEOCOMPLETE)吗?
不行。从 Nvim 0.2 PR #4411 https://github.com/neovim/neovim/pull/4411 开始,Lua 是内置的,但旧的 Vim if_lua 接口不受支持。
如何在终端中使用“真彩色”?
如果检测到支持的终端,则默认情况下会启用真彩色(24 位颜色)。如果你的终端没有被检测到,但你确信它支持真彩色,请将此添加到你的 init.vim
set termguicolors
NVIM 在更改模式时显示奇怪的符号 (�[2 q)
这是你的终端模拟器中的一个错误。这种情况发生是因为 Nvim 默认情况下会发送光标形状的终端代码,如果终端看起来与 xterm 兼容 (TERM=xterm-256color)。
要解决这个问题,你可以
使用不同的终端模拟器
在你的 Nvim 配置中禁用 'guicursor'
:set guicursor=
" Workaround some broken plugins which set guicursor indiscriminately.
:autocmd OptionSet guicursor noautocmd set guicursor=
另见 $TERM 以获取推荐的 $TERM 值。
如何在终端中更改光标形状?
对于 Nvim 0.1.7 或更旧版本:请参阅 man nvim 中有关 NVIM_TUI_ENABLE_CURSOR_SHAPE 的说明。
对于 Nvim 0.2 或更新版本:光标样式由 'guicursor' 选项控制。
要_禁用_ 光标样式,请将 'guicursor' 设置为空
:set guicursor=
" Workaround some broken plugins which set guicursor indiscriminately.
:autocmd OptionSet guicursor noautocmd set guicursor=
如果你想要一个不闪烁的光标,请使用 blinkon0。参见 'guicursor'.
'guicursor' 默认情况下是启用的,除非 Nvim 认为你的终端不支持它。如果你确定你的终端支持光标形状,请在你的 init.vim 中设置 'guicursor',如 'guicursor' 中所述。
Vim 终端选项 t_SIt_EI 被忽略,就像所有其他 t_xx 选项一样。
旧版本的 libvte(gnome-terminal、roxterm、terminator 等)不支持光标样式控制代码。#2537 https://github.com/neovim/neovim/issues/2537
如何在终端中更改光标颜色?
光标样式(形状、颜色、行为)由 'guicursor' 控制,即使在终端中也是如此。光标颜色(与形状相反)仅在设置 'termguicolors' 时才有效。
'guicursor' 提供了一个示例,但这里有一个更复杂的示例,它在插入模式和普通模式下设置不同的颜色
:set termguicolors
:hi Cursor guifg=green guibg=green
:hi Cursor2 guifg=red guibg=red
:set guicursor=n-v-c:block-Cursor/lCursor,i-ci-ve:ver25-Cursor2/lCursor2,r-cr:hor20,o:hor50
退出或挂起和恢复 NVIM 后光标样式没有恢复
终端没有提供查询光标样式的方法。使用自动命令来管理光标样式
au VimEnter,VimResume * set guicursor=n-v-c:block,i-ci-ve:ver25,r-cr:hor20,o:hor50
  \,a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor
  \,sm:block-blinkwait175-blinkoff150-blinkon175
au VimLeave,VimSuspend * set guicursor=a:block-blinkon0
光标形状在 TMUX 中没有改变
tmux 决定了这一点,而不是 Nvim。参见 tui-cursor-shape 以了解解决方法。
参见 #3165 https://github.com/neovim/neovim/pull/3165 以了解讨论。
光标在 TMUX 中闪烁?
如果在 tmux 中打开 nvim 时没有文档,光标 _ 出现和消失非常快,并且你在 EndOfBufferNormal 中设置了 ctermbg,请尝试将它们设置为 NONE
hi EndOfBuffer ctermbg=NONE ctermfg=200 cterm=NONE
hi Normal ctermbg=NONE ctermfg=200 cterm=NONE
--remote 和朋友发生了什么?
--remote 部分支持。 clientserver
如果你需要 Vim 中在 Nvim 中缺少的标志,你可以使用 https://github.com/mhinz/neovim-remote 来代替。

运行时问题 faq-runtime

使用鼠标复制到 X11 主选择区不起作用
clipboard=autoselect 尚未实现 https://github.com/neovim/neovim/issues/2325。你可能会发现这个解决方法有用
vnoremap <LeftRelease> "*ygv
vnoremap <2-LeftRelease> "*ygv
我的 CTRL-H 映射不起作用
这在 Nvim 0.2 中已修复。如果你正在运行 Nvim 0.1.7 或更旧版本,请调整你的终端的“kbs”(key_backspace)terminfo 条目
infocmp $TERM | sed 's/kbs=^[hH]/kbs=\\177/' > $TERM.ti
tic $TERM.ti
(你可以随意删除在运行上述命令后创建的临时 *.ti 文件)。
<HOME> 或其他一些“特殊”键不起作用
确保 $TERM 设置正确。
对于 screen 或 tmux,$TERM 应该是 screen-256color(而不是 xterm-256color!)
在其他情况下,如果字符串中没有出现“256”,它可能不正确。尝试 TERM=xterm-256color
:! 和 SYSTEM() 对交互式进程做了一些奇怪的事情
交互式命令由 Nvim 中的 :terminal 支持。但是 :!system() 不支持交互式命令,主要是因为 Nvim UI 使用 stdio 进行 msgpack 通信,但也为了性能、可靠性和跨平台的一致性(参见 https://vimhelp.org/gui_x11.txt.html#gui-pty)。
PYTHON 支持不起作用
在 Nvim 中运行 :checkhealth 以进行自动诊断。
其他提示
python neovim 模块已更名为 pynvim(很久以前了)。
如果你正在使用 pyenv 或 virtualenv 为 pynvim 模块 https://pypi.ac.cn/project/pynvim/,,你必须将 g:python3_host_prog 设置为 virtualenv 的解释器路径。
确保你有最新版本的 pynvim Python 模块
python -m pip install setuptools
python -m pip install --upgrade pynvim
python3 -m pip install --upgrade pynvim
尝试使用 nvim -u NORC 来确保你的配置 (init.vim) 不会导致问题。如果你得到 E117: Unknown function,这意味着存在运行时问题: faq-runtime.
:CHECKHEALTH 报告 E5009:无效的 $VIMRUNTIME
这意味着 health#check() 无法加载,这表明 $VIMRUNTIME'runtimepath' 已损坏。
$VIMRUNTIME 必须指向 Nvim 的运行时文件,而不是 Vim 的。
$VIMRUNTIME 目录内容应可由当前用户读取。
验证 :echo &runtimepath 是否包含 $VIMRUNTIME 路径。
检查以下内容的输出
:call health#check()
:verbose func health#check
NEOVIM 找不到它的运行时
如果 :help nvim 显示 E149: Sorry, no help for nvim,则会出现这种情况。
确保 $VIM$VIMRUNTIME 指向 Nvim 的(而不是 Vim 的)运行时,方法是检查 :echo $VIM:echo $VIMRUNTIME。这应该给出类似于 /usr/share/nvim 以及 /usr/share/nvim/runtime 的内容。
还要确保你不会意外地覆盖你的 runtimepath (:set runtimepath?),它默认情况下包含上述 $VIMRUNTIME(参见 'runtimepath')。
NEOVIM 很慢
使用快速的终端模拟器
使用优化的构建
:checkhealth nvim 应该报告以下“构建类型”之一
Build type: RelWithDebInfo
Build type: MinSizeRel
Build type: Release
如果它报告 Build type: Debug 并且你正在从源代码构建 Nvim,请参见 https://github.com/neovim/neovim/blob/master/BUILD.md.
颜色显示不正确
确保 $TERM 设置正确。
从 shell 中运行 TERM=xterm-256color nvim。如果颜色显示正确,那么在你的用户配置文件(通常是 ~/.profile)中导出 TERM 的该值
export TERM=xterm-256color
如果你正在使用 tmux,请将此添加到你的 tmux.conf
set -g default-terminal "tmux-256color"
对于 GNU screen,配置你的 .screenrc <https://wiki.archlinux.org/index.php/GNU_Screen#Use_256_colors>
term screen-256color
注意:Nvim 忽略 t_Co 和其他 t_xx 终端代码。
NEOVIM 无法读取 UTF-8 字符
从命令行运行以下命令
locale | grep -E '(LANG|LC_CTYPE|LC_ALL)=(.*\.)?(UTF|utf)-?8'
在 TMUX 或 GNU SCREEN 中 ESC 延迟
这是 tmux / screen 中的一个常见问题 https://www.google.com/?q=tmux%20vim%20escape%20delay(另见 https://github.com/tmux/tmux/issues/131#issuecomment-145853211)。相应的超时需要调整为较低的值(10-20 毫秒)。
.tmux.conf:
set -g escape-time 10
# Or for tmux >= 2.6
set -sg escape-time 10
.screenrc:
maptimeout 10
“为什么这不会在 VIM 中发生?”
它确实会发生(尝试 vim -N -u NONE),但如果你在 ESC 后快速按下键,则 Vim 将 ESC 解释为 ESC 而不是 ALT(META)。除非你仔细观察光标,否则你不会注意到延迟。权衡是 Vim 不会理解 ALT(META)键码,因此例如 nnoremap <M-a> 不会起作用。ALT(META)键码始终在 Nvim 中起作用。另见 Vim 中的 :help xterm-cursor-keys
Nvim 0.3 模仿 Vim 的行为,同时仍然完全支持 ALT 映射。参见 i_ALT.
在 GNU SCREEN 中,当启用鼠标模式时,ESC 会丢失
发生这种情况是因为 screen 中存在一个错误 https://savannah.gnu.org/bugs/?60196:在鼠标模式下,screen 假设 ESC 是鼠标序列的一部分,并且无论 maptimeout 如何,它都会无限期地等待序列的其余部分。在 screen 中修复它之前,除了双击 escape 之外,没有已知的解决方法,这会导致将单个 escape 传递到 Nvim。
在文件类型插件和自动命令中调用 INPUTLIST()、ECHOMSG 等不起作用
这是因为 Nvim 默认情况下设置了 shortmess+=F。Vim 在 set shortmes+=F 时表现相同。有计划要改进这一点,但在 meantime,作为解决方法,请使用 set shortmess-=F 或使用 unsilent,如下所示。
unsilent let var = inputlist(['1. item1', '2. item2'])
autocmd BufNewFile * unsilent echomsg 'The autocmd has been fired.'
G:CLIPBOARD 设置没有使用。
如果剪贴板提供者已加载,则需要在配置后重新加载它。使用以下配置。
let g:clipboard = { 'name' : ... }
if exists('g:loaded_clipboard_provider')
  unlet g:loaded_clipboard_provider
  runtime autoload/provider/clipboard.vim
endif
或者,如果你想要在分配给 g:clipboard 时自动重新加载,请将 init.vim 设置如下。
function! s:clipboard_changed(...) abort
  if exists('g:loaded_clipboard_provider')
    unlet g:loaded_clipboard_provider
  endif
  runtime autoload/provider/clipboard.vim
endfunction
if !exists('s:loaded")
  call dictwatcheradd(g:, 'clipboard', function('s:clipboard_changed'))
endif
let s:loaded = v:true

构建问题 faq-build

一般构建问题
运行 make distclean && make 来排除过时的构建环境导致故障。
LOCAL.MK 中的设置没有生效
CMake 缓存构建设置,因此在修改 local.mk 后,您可能需要运行 rm -r build && make
CMAKE 错误
configure_file 配置文件问题
这可能是权限问题,如果您以 root 用户身份运行 make,然后以非特权用户运行 make,就会发生这种情况。要解决此问题,请运行 rm -rf build 并重试。
生成 HELPTAGS 失败
如果重新安装失败并显示“生成帮助标签失败”,请尝试删除之前安装的运行时目录(如果在构建期间未设置 CMAKE_INSTALL_PREFIX,则默认值为 /usr/local/share/nvim)。
rm -r /usr/local/share/nvim

设计 faq-design

为什么不使用 JSON 用于 RPC?
JSON 无法轻松/高效地处理二进制数据
JSON 规范含糊不清:https://seriot.ch/parsing_json.php
为什么嵌入 Lua 而不是 X?
Lua 是一种非常小的语言,非常适合嵌入。Python/Ruby/等的最大优势在于它们拥有庞大的库集合,但这对于 Nvim 来说并不重要,因为 Nvim 本身就是“自带电池”的库:引入另一个标准库将是多余的。
Lua 5.1 是一种完整的语言:语法是固定的。这对向后兼容性非常有利。
Nvim 还将 Lua 内部用作 C 的替代方案。额外的性能在那里很有用,与像 Python 或 Vim9script 这样的缓慢语言相比。
LuaJIT 是地球上运行速度最快的运行时之一,比 Python 和“Vim9script”快 10 倍 https://vimhelp.org/vim9.txt.html ,比 Vimscript 快 100 倍。
Python/JS 在大小和可移植性方面比 Lua 成本更高,并且已经存在大量基于 Python/JS 的编辑器。因此,Python/JS 将使 Nvim 变得更大,更不可移植,以换取一项非差异化功能。
另请参阅
为什么选择 Lua 5.1 而不是 Lua 5.3+?
Lua 5.1 与 5.3 是一种不同的语言。Lua 组织在每个新版本中都会进行重大更改,因此即使我们切换(不是升级,而是切换)到 5.3,当他们在 5.4、5.5 等版本中创建下一个新语言时,我们也不会获得任何收益。并且我们会失去 LuaJIT,它比 Lua 5.3+ 有价值得多。
Lua 5.1 是一种完整的语言。要“升级”它,请添加库,而不是语法。Nvim 本身已经是一个相当不错的 Lua “标准库”,我们将在未来继续发展和改进它。在这种情况下,更改 Lua 的规则不会带来任何好处。
NEOVIM 会将 VIMSCRIPT 翻译成 LUA,而不是直接执行 VIMSCRIPT 吗?
我们正在尝试使用 vim9jit https://github.com/tjdevries/vim9jit 将 Vim9script(Vim9 的 Vimscript 变体)转换为 Lua,并使用它将 Vim9 插件 https://github.com/neovim/neovim/pull/21662 移植到 Nvim Lua。
我们没有计划将传统的 Vimscript 移植。
是否鼓励插件作者将他们的插件从 VIMSCRIPT 移植到 LUA?您是否计划无限期地支持 VIMSCRIPT?(#1152)
我们预计没有理由弃用 Vimscript,它是一种有价值的 DSL https://en.wikipedia.org/wiki/Domain-specific_language ,用于文本编辑任务。维护 Vimscript 兼容性的成本低于对现有 Vim 插件的大规模迁移。
为了好玩而将 Vimscript 移植到 Lua 不会带来任何收益。Nvim 明确地是 Vim 的一个分支,目的是利用已经在数千个 Vim 插件上花费的工作,同时支持新型插件和集成。
主要内容
命令索引
快速参考