Vim_diff
Nvim :help
页面,生成 自 来源 使用 tree-sitter-vimdoc 解析器。
Nvim 和 Vim 之间的区别
Nvim 在许多方面不同于 Vim,尽管编辑器和 Vimscript(不是 Vim9script)功能基本相同。本文档是差异的完整集中参考。
使用
$XDG_CONFIG_HOME/nvim/init.vim
而不是
.vimrc
作为您的
配置。
使用 $XDG_CONFIG_HOME/nvim
而不是 .vim
来存储配置文件。
使用
$XDG_STATE_HOME/nvim/shada/main.shada
而不是
.viminfo
来保存持久会话信息。
shada
文件类型检测默认情况下启用。这可以通过在
init.vim 中添加 ":filetype off" 来禁用。
语法高亮默认情况下启用。这可以通过在
init.vim 中添加 ":syntax off" 来禁用。
默认颜色方案已更新。这可能导致颜色方案看起来不同,因为它们依赖于默认情况下高亮组的定义方式。在
init.vim 中添加 ":colorscheme vim" 或在颜色方案文件中添加 ":source $VIMRUNTIME/colors/vim.lua" 以恢复旧的默认链接和颜色。
'define' 默认值为 ""。C ftplugin 将其设置为 "^\s*#\s*define"
'grepprg' 对普通 grep 使用 -H 和 -I 标志,如果可用,默认使用 ripgrep
'include' 默认值为 ""。C ftplugin 将其设置为 "^\s*#\s*include"
'isfname' 不包括 ":"(在 Windows 上)。驱动器字母在没有它的情况下被正确处理。(使用
gF 对于以 ":line:col" 为后缀的文件路径)。
'path' 默认值为 ".,,"。C ftplugin 如果存在,则添加 "/usr/include"。
matchit 插件已启用。要在您的配置中禁用它
:let loaded_matchit = 1
鼠标在
命令行模式 或
more 提示 中未启用,因此您可以通过简单地输入 ":" 来暂时禁用它。或者,如果您想部分或完全禁用鼠标或弹出菜单,请执行以下任一操作
更改
'mousemodel',以便
<RightMouse>
扩展选择而不是显示弹出菜单
set mousemodel=extend
映射
<A-LeftMouse>
,以便它暂时禁用鼠标,直到光标移动
nnoremap <A-LeftMouse> <Cmd>
\ set mouse=<Bar>
\ echo 'mouse OFF until next cursor-move'<Bar>
\ autocmd CursorMoved * ++once set mouse&<Bar>
\ echo 'mouse ON'<CR>
要在不禁用鼠标的情况下删除默认弹出菜单
aunmenu PopUp
autocmd! nvim_popupmenu
要仅删除 "如何禁用鼠标" 菜单项(及其分隔符)
aunmenu PopUp.How-to\ disable\ mouse
aunmenu PopUp.-2-
默认映射
default-mappingsNvim 在
启动 时创建以下默认映射。您可以在您的配置中通过简单地删除映射来禁用这些映射中的任何一个,例如 ":unmap Y"。
默认自动命令
default-autocmds默认自动命令存在于以下组中。使用 ":autocmd!
{group}
" 来删除它们,并使用 ":autocmd
{group}
" 来查看它们的定义方式。
nvim_terminal
TermClose:使用无参数启动的
终端 缓冲区(因此使用
'shell')并且在没有错误的情况下退出将自动关闭。
TermRequest:终端模拟器响应 OSC 背景和前景请求,指示 (1) 当 Nvim 选项
'background' 为 "dark" 时为黑色背景和白色前景,或 (2) 当
'background' 为 "light" 时为白色背景和黑色前景。虽然这可能不反映实际的前景/背景颜色,但它允许
'background' 保留在终端模拟器中运行的嵌套 Nvim 实例中。
nvim_cmdwin
CmdwinEnter:将语法同步限制为 maxlines=1 在
cmdwin 中。
nvim_swapfile
SwapExists:当交换文件由正在运行的 Nvim 进程拥有时,跳过交换文件提示(将
v:swapchoice 设置为 "e")。显示
W325 "忽略交换文件…" 消息。
主要组件
用户体验
直观一致的操作是 Nvim 的主要目标之一。
功能编译
与 Vim(它提供 100 多个可选功能的不同组合)不同,Nvim 始终包含所有功能。
feature-compile 可以将其视为 Vim 的“HUGE”构建的精简版本。 这减少了错误的表面积,并消除了用户常见的困惑和摩擦来源。
Vim 的内部测试函数 (test_autochdir()、test_settime() 等) 未公开(也未实现); 相反,Nvim 具有强大的 API。
如果行为、选项、文档花费用户的时间多于节省的时间,则会将其删除。
在收益超过任何向后兼容性成本的情况下,已改进可用性细节。 以下是一些示例
一些功能内置在其中,否则需要外部插件
架构
Nvim UI 与核心编辑器“分离”:所有 UI(包括内置
TUI)都只是连接到 Nvim 服务器(通过
--server 或
--embed)的插件。 多个 Nvim UI 客户端可以连接到同一个 Nvim 编辑器服务器。
平台和 I/O 功能建立在 libuv 之上。 Nvim 得益于 libuv 的功能和错误修复,其他项目则得益于 Nvim 开发人员对 libuv 的改进。
功能
命令
:Man 默认情况下可用,并进行了许多改进,例如完成
输入/映射
ALT (
META) 和弦始终有效(即使在
TUI 中)。 使用任何键映射
<M-:
<M-1>
、
<M-BS>
、
<M-Del>
、
<M-Ins>
、
<M-/>
、
<M-\>
、
<M-Space>
、
<M-Enter>
等。
区分大小写:<M-a>
和 <M-A>
是两个不同的键码。
普通命令
Q 重新播放最后一个录制的宏,而不是切换到 Ex 模式 (
gQ)。
选项
:set {option}<
删除所有
全局-局部 选项的局部值。
:setlocal {option}<
将全局值复制到所有选项的局部值。
'exrc' 搜索“.nvim.lua”、“.nvimrc”或“.exrc”文件。 系统会提示用户是否信任该文件。
'fillchars' 标志:“msgsep”、“horiz”、“horizup”、“horizdown”、“vertleft”、“vertright”、“verthoriz”
"view" 尝试在通过跳转列表移动时恢复
标记视图。
"clean" 从跳转列表中删除未加载的缓冲区。
"F" 标志不影响来自 autocommand 的输出。
"q" 标志完全隐藏宏录制消息。
'tabline' 中间单击选项卡页面标签会关闭选项卡页面,%@Func@foo%X 可以通过鼠标单击调用任何函数
Shell
Shell 输出 (
:!、
:make 等) 始终通过 UI 路由,因此它不会“弄乱”屏幕。(如果您想弄乱屏幕,仍然可以使用“chansend(v:stderr,…)” :)
:! 不支持“交互式”命令。 请改用
:terminal。(GUI Vim 有类似的限制,请参阅 Vim 中的“:help gui-pty”。)
:!start 在 Windows 上没有特殊情况。
标记
如果关联行被删除,则会删除标记。
在同一组中使用相同标识符放置两次的标记将被移动。
启动
-e 和
-es 调用与 -E 和 -Es 相同的“改进的 Ex 模式”。
-E 和
-Es 将 stdin 作为文本读取(到缓冲区 1 中)。
自动退出,不需要“-c qa!”。
跳过交换文件对话框。
-s 如果脚本名称为“-”,则从 stdin 读取普通命令。
默认情况下有效:“-” 文件是可选的
'term' E529 E530 E531 'term' 反映从
$TERM 和其他环境检查中获得的终端类型。 仅供调试使用; 在启动期间不可靠。
:echo &term
"builtin_x" 表示选择了其中一个
内置终端,因为系统上没有找到预期的 terminfo 文件。
Nvim 将在 Linux 虚拟终端上使用 256 色功能。 Vim 在 Linux VT 上仅使用 8 种颜色加上亮色前景。
Vim 将其
内置终端 中的内容与其从 terminfo 中读取的内容结合起来,并具有一个
'ttybuiltin' 设置来控制这种组合的工作方式。 Nvim 使用其中之一,它不会尝试合并两者。
这些 Nvim 功能后来被集成到 Vim 中。
本节记录各种低级行为更改。
mkdir() 行为已更改
1. 假设 /tmp/foo 不存在且 /tmp 可写,mkdir('/tmp/foo/bar', 'p', 0700) 将创建 /tmp/foo 和 /tmp/foo/bar,权限为 0700。Vim mkdir 将创建 /tmp/foo,权限为 0755。
2. 如果你尝试使用 'p'
创建一个已存在的目录(例如 mkdir('/', 'p')),mkdir() 将静默退出。在 Vim 中,这会导致错误。
3. mkdir() 错误消息现在在 mkdir 失败时包含 strerror() 文本。
它不使用 "[...]"(以前: "[[], [...]]",现在: "[[], []]")。"..." 仅用于递归容器。
6. (内部)尝试在 Vim 中打印或字符串化 VAR_UNKNOWN 将导致什么都没有,E908,在 Nvim 中,它是一个内部错误。
Viminfo 文本文件已被二进制(messagepack)
shada 文件替换。其他差异
printf() 在使用
%p
参数时返回有意义的值:在 Vim 中,它以前返回字符串的无用地址(字符串在整个过程中被复制到新分配的内存中)并且对无法强制转换为字符串的类型失败。有关更多详细信息,请参阅
id(),目前它在内部使用
printf("%p", {expr})
。
:lua print("a\0b")
将打印 a^@b
,就像 :echomsg "a\nb"
一样。在 Vim 中,它在单独的行上打印 a
和 b
,与 :lua print("a\nb")
完全相同。
:lua error('TEST')
发出错误
E5108: Error executing lua: [string "<Vimscript compiled string>"]:1: TEST
而 Vim 仅发出 "TEST"。
Lua 通过
vim.api
直接访问 Nvim
API。
命令
:write!
如果文件在外部更新,不会显示提示。
突出显示组
高亮组名称允许包含 @
字符。
使用与正则表达式
[a-zA-Z0-9_.@-]*
不匹配的名称定义高亮组会导致错误(请参阅
group-name)。
宏 (
录制) 行为
在 :lmap 期间录制的宏的回放会产生与录制时相同的动作。在 Vim 中,如果在使用 :lmap'ped 键时录制宏,则录制和回放的行为不同。
映射
为可简化的键创建映射(例如 <C-I>
)不会替换其简化形式的现有映射(例如 <Tab>
)。
"#" 后跟一个数字在映射的 lhs 开头不代表功能键。
工作目录(Vim 在 Nvim 之后实现了其中的一些)
getcwd(-1)
等效于 getcwd(-1, 0)
,而不是返回全局工作目录。使用 getcwd(-1, -1)
获取全局工作目录。
这些遗留的 Vim 功能尚未实现
这些 Vim 功能已从 Nvim 中有意删除。
别名
ex("nvim -e" 的别名)
exim("nvim -E" 的别名)
gex(GUI)
gview(GUI)
gvim(GUI)
gvimdiff(GUI)
rgview(GUI)
rgvim(GUI)
rview
rvim
view("nvim -R" 的别名)
命令
:behave
:fixdel
hardcopy :hardcopy
已被移除。请使用
:TOhtml
并使用网页浏览器或其他 HTML 查看器打印生成的 HTML 文件。
:helpfind
:mode(不再接受参数)
:open
:Print
:promptfind
:promptrepl
:scriptversion(始终为版本 1)
:shell
:sleep!(不会隐藏光标;与:sleep 相同)
:smile
:tearoff
:cstag
:cscope
:lcscope
:scscope
:Vimuntar
:TOhtml
已被 Lua 版本替换(存在一些差异)
选项
antialias
对于 backspace=0
,请设置 backspace=
(空)
对于 backspace=1
,请设置 backspace=indent,eol
对于 backspace=2
,请设置 backspace=indent,eol,start
(Nvim 中的默认行为)
对于 backspace=3
,请设置 backspace=indent,eol,nostop
bioskey(MS-DOS)
conskey(MS-DOS)
cscopepathcomp
cscopeprg
cscopequickfix
cscoperelative
cscopetag
cscopetagorder
cscopeverbose
esckeys
keyprotocol
'insertmode' 'im' 使用以下脚本模拟
'insertmode'autocmd BufWinEnter * startinsert
inoremap <Esc> <C-X><C-Z><C-]>
inoremap <C-C> <C-X><C-Z>
inoremap <C-L> <C-X><C-Z><C-]><Esc>
inoremap <C-Z> <C-X><C-Z><Cmd>suspend<CR>
noremap <C-C> <Esc>
snoremap <C-C> <Esc>
noremap <C-\><C-G> <C-\><C-N><Cmd>startinsert<CR>
cnoremap <C-\><C-G> <C-\><C-N><Cmd>startinsert<CR>
inoremap <C-\><C-G> <C-X><C-Z>
autocmd CmdWinEnter * noremap <buffer> <C-C> <C-C>
autocmd CmdWinEnter * inoremap <buffer> <C-C> <C-C>
lua << EOF
vim.on_key(function(c)
if c == '\27' then
local mode = vim.api.nvim_get_mode().mode
if mode:find('^[nvV\22sS\19]') and vim.fn.getcmdtype() == '' then
vim.schedule(function()
vim.cmd('startinsert')
end)
end
end
end)
EOF
注意:rexexp 引擎仍然有硬编码限制,最多只能考虑 6 个组合字符。
printoptions
textauto
textmode
weirdinvert
插件
logiPat
rrhelper
macmap.vim
tools/check_colors.vim
macros/{justify,matchit,shellmenu,swapmous}.vim:请直接使用 packadd! justify
等。
提供者
启动
--literal
:文件参数始终是文字;要在 Windows 上扩展通配符,请使用
:n,例如
nvim +"n *"
简单模式:eview、evim、nvim -y
受限模式:rview、rvim、nvim -Z
Vi 模式:nvim -v
测试函数
test_alloc_fail()
test_autochdir()
test_disable_char_avail()
test_feedinput()
test_garbagecollect_soon
test_getvalue()
test_ignore_error()
test_null_blob()
test_null_channel()
test_null_dict()
test_null_function()
test_null_job()
test_null_list()
test_null_partial()
test_null_string()
test_option_not_set()
test_override()
test_refcount()
test_scrollbar()
test_setmouse()
test_settime()
test_srand_seed()
xterm-8bit xterm-8-bitXterm 可以运行在使用真正的 8 位 CSI 的模式下。支持此功能需要自动检测终端是否处于 UTF-8 模式或非 UTF-8 模式,因为 8 位 CSI 字符在每种情况下都需要以不同的方式写入。Vim 在启动时向终端发出“请求版本”序列,并查看终端如何发送 CSI。Nvim 不会发出此类序列,并且始终使用 7 位控制序列。