启动
Nvim :help
页面,由 生成 于 源代码,使用 tree-sitter-vimdoc 解析器。
启动 Vim
大多数情况下,Nvim 是通过以下命令启动来编辑单个文件
nvim filename
更一般地,Nvim 是通过以下命令启动
nvim [option | filename] ..
选项参数和文件名参数可以混合使用,并且可以给出任意数量的参数。但是,要注意那些需要参数的选项。
以下项目决定如何开始编辑
-file --- filename 一个或多个文件名。第一个将是当前文件,并被读入缓冲区。光标将被定位在缓冲区的首行。为了避免以 '-' 开头的文件名被解释为选项,请在参数列表之前加上 "--",例如
nvim -- -filename
所有 "--" 后的参数都会被解释为文件名,后面不能再跟其他选项或 "+command" 参数。
--
-
stdin(标准输入)的别名。示例
echo text | nvim - file
"text" 被读入缓冲区 1,"file" 被打开为缓冲区 2。在大多数情况下(除了 -s、-es、
--embed、--headless),如果 stdin 不是 TTY,则将其读入文本,因此 "-" 是隐含的。
echo text | nvim file
该缓冲区将被标记为已修改,因为它包含需要保存的文本(除了只读
-R 模式)。如果你不喜欢这样,请在你的 init.vim 中添加以下几行
" Don't set 'modified' when reading from stdin
au StdinReadPost * set nomodified
要将 stdin 作为普通命令读取,请使用带有 "-" 的
-secho "ifoo" | nvim -s -
要将 stdin 作为 Ex 命令读取,请使用
-es 或
-eecho "echo getpid()" | nvim -e - -V1
要打开一个名为 "-" 的文件,请将其放在 "--" 之后。
echo foo | nvim -- -
-t -tag -t
{tag}
一个标签。"tag" 在标签文件中被查找,关联的文件将成为当前文件,关联的命令将被执行。这主要用于 C 程序,在这种情况下,"tag" 通常是函数名。其效果是包含该函数的文件将成为当前文件,并且光标将被定位在函数的开头(参见
tags)。
(无) 如果没有上述四项中的任何一项,Vim 将开始编辑一个新的缓冲区。它为空,并且没有文件名。
启动选项 选项参数可以以任何顺序给出。单个字母的选项可以在一个破折号之后组合。在 "--" 参数之后不能有任何选项参数。
--clean --clean 模仿 Nvim 的全新安装
跳过来自文件和环境变量的初始化。
加载内置插件,与 "-u NONE -i NONE" 不同。
--noplugin --noplugin 跳过加载插件。重置
'loadplugins' 选项。请注意,
-u 参数也可能禁用加载插件。
参数 加载 vimrc 文件 加载插件
(无) yes yes -u NONE no no -u NORC no yes --noplugin yes no
--startuptime
{fname}
--startuptime在启动期间将计时消息写入文件
{fname}
。这可以用来找出在加载你的
配置、插件和打开第一个文件时花费的时间。当
{fname}
已经存在时,新的消息将被追加。
-+ +[num] 光标将被定位在要编辑的第一个文件的第 "num" 行。如果 "num" 缺失,光标将被定位在最后一行。
-+/ +/{pat} 光标将被定位在要编辑的第一个文件中包含 "pat" 的第一行(有关可用的搜索模式,请参见
pattern)。搜索从光标位置开始,光标位置可能是第一行或从
shada 中最后使用的光标位置。要强制从第一行开始搜索,请使用 "+1 +/pat"。
+{command}
-+c -c -c
{command}
{command}
将在第一个文件被读取之后(以及在该文件自动命令和模型行被处理之后)被执行。"command" 被解释为一个 Ex 命令。如果 "command" 包含空格,它必须用双引号括起来(这取决于所使用的 shell)。示例
vim "+set si" main.c
vim "+find stdio.h"
vim -c "set ff=dos" -c wq mine.mak
注意: 你可以在一个 Vim 命令中使用多达 10 个 "+" 或 "-c" 参数。它们将按给定的顺序执行。"-S" 参数也计为 "-c" 参数。
--cmd
{command}
--cmd
{command}
将在处理任何 vimrc 文件之前被执行。否则,它就像 -c
{command}
一样。你可以使用多达 10 个这样的命令,与 "-c" 命令无关。
-S -S [file] 在第一个文件被读取之后执行 Vimscript 或 Lua(".lua")[file]。另请参见
:source。如果未给出 [file],则默认为 "Session.vim"。等同于
-c "source {file}"
可以像 "-c" 一样重复,但受相同的 10 个 "-c" 参数限制。{file}
不能以 "-" 开头。
-R -R 只读模式。将为所有正在编辑的文件设置
'readonly' 选项。你仍然可以编辑缓冲区,但将被阻止意外覆盖文件。如果你忘记了你在查看模式下,并且做了一些更改,你可以通过在 Ex 命令中添加一个感叹号来覆盖文件,例如 ":w!"。可以使用 ":set noro" 重置
'readonly' 选项(参见选项章节,
options)。后续的编辑将不会在只读模式下完成。调用可执行文件 "view" 与 -R 参数具有相同的效果。
'updatecount' 选项将被设置为 10000,这意味着交换文件不会经常自动更新。有关禁止修改,请参见
-M。
如果 stdin 不是 TTY:-e 读取/执行 stdin 作为 Ex 命令。-E 将 stdin 作为文本读取(到缓冲区 1)。
-es 读取/执行 stdin 作为 Ex 命令。
printf "put ='foo'\n%%print\n" | nvim -es
-Es 将 stdin 作为文本读取(到缓冲区 1)。使用
-c 或 "+" 发送命令。
printf "foo\n" | nvim -Es +"%print"
这些命令显示在 stdout 上::list :number :print :set 使用
:verbose 或
'verbose' 时,其他命令显示在 stderr 上。
nvim -es +":verbose echo 'foo'"
nvim -V1 -es +foo
除非给出了
-u,否则将跳过用户
配置。交换文件将被跳过(就像
-n)。用户
shada 将被加载(除非给出了 "-i NONE")。
-l -l
{script}
[args] 非交互式地执行 Lua
{script}
(没有 UI),并在处理任何前面的 Nvim
cli-arguments 之后,可选地带有 [args],然后退出。在 Lua 错误时退出 1。参见
-S 以在有 UI 的情况下运行多个没有 args 的 Lua 脚本。
lua-args所有 [args] 都被视为
{script}
参数,并存储在 Lua
_G.arg
全局表中,因此 "-l" 结束对 Nvim 参数的处理。
{script}
名称存储在
_G.arg[0]
中。
将
'verbose' 设置为 1(就像 "-V1" 一样),因此 Lua
print()
写入输出。如果
{script}
打印消息,并且没有导致 Nvim 退出,则 Nvim 确保输出以换行符结尾。
在 "-l" 之前的参数将在执行
{script}
之前被处理。以下示例在执行 "foo.lua" 之前退出
nvim +q -l foo.lua
这在执行 "foo.lua" 之前加载 Lua 模块 "bar"
nvim +"lua require('bar')" -l foo.lua
与 -l
不同,不允许使用之前的参数。
-V verbose -V[N] 冗长模式。将
'verbose' 选项设置为 [N](默认值:10)。将为每个 ":source" 的文件以及读取或写入 ShaDa 文件提供消息。可用于了解启动和退出时发生了什么。示例
nvim -V8
-V[N]{file} 与 -V 相似,并将
'verbosefile' 设置为
{file}
(不能以数字开头)。不会显示消息,而是写入
{file}
。示例
nvim -V20vimlog
-n -n 不会使用
交换文件。崩溃后无法恢复。如果您想查看或编辑非常慢的介质(例如,软盘)上的文件,则此选项非常有用。也可以使用 ":set updatecount=0" 来实现。您可以通过将
'updatecount' 选项设置为某个值(例如,":set uc=100")再次启用它。在执行 vimrc 文件中的命令后,但在 GUI 初始化之前,
'updatecount' 会设置为 0。因此,它会覆盖 vimrc 文件中
'updatecount' 的设置,但不覆盖 gvimrc 文件中的设置。请参阅
启动。当您想减少对磁盘的访问次数(例如,对于笔记本电脑)时,不要使用 "-n",而是将
'updatetime' 和
'updatecount' 设置为非常大的数字,并在想要保存工作时键入 ":preserve"。这样,您就保留了崩溃恢复的可能性。
-o -o[N] 打开 N 个窗口,水平分割。如果未提供 [N],则为每个作为参数给出的文件打开一个窗口。如果没有足够的空闲空间,则只会为前几个文件打开窗口。如果有比参数更多的窗口,则最后几个窗口将编辑空文件。
-O -O[N] 打开 N 个窗口,垂直分割。否则,与 -o 相似。如果同时给出了 -o 和 -O 选项,则命令行上的最后一个选项决定窗口的分割方式。
-p -p[N] 打开 N 个标签页。如果未提供 [N],则为每个作为参数给出的文件打开一个标签页。最大值由
'tabpagemax' 选项设置(默认值为 50)。如果有比参数更多的标签页,则最后几个标签页将编辑空文件。另请参阅
标签页。
-d-d 在
diff 模式 下启动。
-u E282 -u
{vimrc}
读取文件
{vimrc}
以进行初始化。大多数其他初始化将被跳过;请参阅
初始化。
这可用于在特殊模式下启动 Vim,使用特殊的映射和设置。可以使用 shell 别名来简化操作。例如,在 C shell 后代中
alias vimc 'nvim -u ~/.config/nvim/c_init.vim \!*'
以及在 Bash shell 中
alias vimc='nvim -u ~/.config/nvim/c_init.vim'
当 {vimrc}
为 "NONE"(全部大写)时,将跳过所有来自文件和环境变量的初始化。插件和语法高亮也会被跳过。
当 {vimrc}
为 "NORC"(全部大写)时,这与 "NONE" 的效果相同,但插件和语法高亮不会被跳过。
-i -i
{shada}
使用文件
{shada}
而不是默认的 ShaDa 文件。如果使用名称 "NONE"(全部大写),则即使设置了
'shada' 或使用 ":rsh" 或 ":wsh",也不会读取或写入 ShaDa 文件。另请参阅
shada 文件。
-s -s
{scriptin}
读取脚本文件
{scriptin}
,将字符解释为普通模式输入。使用 ":source!" 也可以实现相同的功能。
:source! {scriptin}
如果
{scriptin}
为 "-",则从 stdin 读取。
echo "ifoo" | nvim -s -
如果在 Nvim 退出之前到达文件末尾,则将从键盘读取更多字符。
-w -w
{scriptout}
记录您键入的所有键,直到您退出 Vim 为止,记录到文件 "scriptout" 中。可用于创建要与 "vim -s" 或 ":source!" 一起使用的脚本文件。如果 "scriptout" 文件已存在,则追加到该文件中。
{scriptout}
不能以数字开头。另请参阅
vim.on_key()。另请参阅
复杂重复。
-W -W
{scriptout}
与 -w 相似,但不会追加,而是覆盖现有文件。
--embed --embed 使用 stdin/stdout 作为 msgpack-RPC 通道,以便应用程序可以通过 RPC
API 嵌入和控制 Nvim。
等待客户端(“嵌入程序”)调用
nvim_ui_attach(),然后再加载启动文件和读取缓冲区,以便 UI 可以确定性地处理(显示)早期消息、对话框等。客户端可以在
nvim_ui_attach
之前执行其他请求(例如,
nvim_get_api_info
用于功能检测)。在此预启动阶段,用户配置当然不可用(类似于
--cmd
)。
不使用 UI 协议的嵌入程序必须传递
--headlessnvim --embed --headless
然后启动将继续进行,而不会等待
nvim_ui_attach
。这等同于
nvim --headless --cmd "call stdioopen({'rpc': v:true})"
对于脚本(测试)也很有用,可以查看
-es 不会打印的消息。
要将 stdin 作为文本读取,必须显式给出 "-":--headless 不能假设 stdin 只是文本。
echo foo | nvim --headless +"%print" +"q!" -
要使用 systemd 按需启动服务器,请使用 systemd 套接字单元和关联的服务单元运行
systemd-socket-proxyd --exit-idle-time
在启动时,Nvim 会检查环境变量和文件并相应地设置值,并按以下步骤进行
2. 处理参数 检查启动 Vim 的命令中的选项和文件名。可以使用
-V 参数来显示或记录接下来会发生的事情,这对于调试初始化非常有用。执行
--cmd 参数。为所有文件创建缓冲区(但尚未加载)。
4. 等待 UI 连接。使用
--embed 启动的 Nvim 会等待 UI 连接,然后才能继续加载用户配置。
6. 启用文件类型和缩进插件。这与以下命令的效果相同
:runtime! ftplugin.vim indent.vim
如果给出了 "-u NONE" 命令行参数,则会跳过此步骤。
配置文件位于:Unix ~/.config/nvim/init.vim(或 init.lua)Windows ~/AppData/Local/nvim/init.vim(或 init.lua)
$XDG_CONFIG_HOME $XDG_CONFIG_HOME/nvim/init.vim(或 init.lua)
如果 Nvim 使用 "-u
{file}
" 启动,则
{file}
将用作配置文件,并且会跳过所有直到 8. 的初始化。不会设置 $MYVIMRC。"nvim -u NORC" 可用于跳过这些初始化,而不读取文件。"nvim -u NONE" 也会跳过插件和语法高亮。
-u
如果 Nvim 使用
-es 或
-Es 或
-l 启动,则会跳过所有直到 8. 的初始化。
system-vimrc sysinit.vim a. 读取系统 vimrc 文件以进行初始化。如果在 $XDG_CONFIG_DIRS 中的任何目录中存在 nvim/sysinit.vim 文件,则将使用该文件。否则,将使用系统 vimrc 文件。此文件的路径由
:version 命令给出。通常是 "$VIM/sysinit.vim"。
VIMINIT EXINIT $MYVIMRC b. 按优先级顺序搜索初始化的位置
$VIMINIT 环境变量(Ex 命令行)。
用户
配置: $XDG_CONFIG_HOME/nvim/init.vim(或 init.lua)。
其他配置:{dir}
/nvim/init.vim(或 init.lua),其中 {dir}
是 $XDG_CONFIG_DIRS 中的任何目录。
$EXINIT 环境变量(Ex 命令行)。
$MYVIMRC 会设置为第一个有效位置,除非它已被设置或使用 $VIMINIT。
c. 如果
'exrc' 选项处于打开状态(这不是默认值),则会按优先级顺序搜索当前目录以查找以下文件
".nvim.lua"
".nvimrc"
".exrc" 找到第一个文件即使用,其他文件将被忽略。
8. 启用文件类型检测。这与以下命令的效果相同
:runtime! filetype.lua
如果调用了 ":filetype off" 或给出了 "-u NONE" 命令行参数,则会跳过此步骤。
9. 启用语法高亮。这与以下命令的效果相同
:runtime! syntax/syntax.vim
如果调用了 ":syntax off" 或给出了 "-u NONE" 命令行参数,则会跳过此步骤。
10. 加载插件脚本。
load-plugins这与以下命令的效果相同
:runtime! plugin/**/*.{vim,lua}
结果是,
'runtimepath' 中的所有目录都会被搜索以查找 "plugin" 子目录,并且所有以 ".vim" 或 ".lua" 结尾的文件都会被加载(按目录按字母顺序排序),子目录也是如此。首先加载 "*.vim",然后加载 "*.lua" 文件(按目录)。
但是,以 "after" 结尾的
'runtimepath' 中的目录在此处会被跳过,并且仅在加载软件包后才会被加载,见下文。如果以下情况发生,则不会加载插件
使用了 "-u NONE" 命令行参数
-u。注意,使用
-c 'set noloadplugins'
不起作用,因为命令行中的命令尚未执行。可以使用
--cmd 'set noloadplugins'
或
--cmd 'set loadplugins'
--cmd。
加载插件脚本,如上所述,但现在仅使用以“after”结尾的目录。注意,如果找到了包,
'runtimepath' 会发生更改,但这不应添加以“after”结尾的目录。
15. 如果给出
-q 标志,则读取快速修复文件,否则在失败时退出。
16. 打开所有窗口 如果给出
-o 标志,则将打开窗口(但尚未显示)。如果给出
-p 标志,则将创建标签页(但尚未显示)。切换屏幕时,现在就会发生。重新绘制开始。如果给出
-q 标志,则跳转到第一个错误。将加载所有窗口的缓冲区,而不会触发
BufAdd 自动命令。
无论何时更改选项的值或创建映射,您可能希望将它们保存在 vimrc 文件中以供日后使用。有关将当前设置状态保存到文件的详细信息,请参阅
save-settings。
避免特洛伊木马
trojan-horse 在读取当前目录中的“vimrc”或“exrc”文件时,出于安全原因,可以通过设置
'secure' 选项来禁用某些命令。从标签文件执行命令时,始终这样做。否则,您可能会意外使用其他人创建的包含恶意命令的 vimrc 或标签文件。被禁用的命令是启动 shell 的命令、写入文件的命令和“:autocmd”。“:map”命令将被回显,因此您可以看到正在映射哪些键。如果您希望 Vim 执行本地 vimrc 文件中的所有命令,您可以在 EXINIT 或 VIMINIT 环境变量中或在全局 exrc 或 vimrc 文件中重置
'secure' 选项。出于显而易见的原因,这在当前目录中的 vimrc 或 exrc 中是不可能的。在 Unix 系统上,只有在您不是 vimrc 文件的所有者的情况下才会发生这种情况。
警告:如果解压缩包含 vimrc 或 exrc 文件的存档,则该存档将归您所有。您将不会获得安全保护。在您在该目录中启动 Vim 之前检查 vimrc 文件,或重置
'exrc' 选项。一些 Unix 系统允许用户对文件进行“chown”。这使得另一个用户可以创建一个恶意的 vimrc 并让您成为所有者。小心!在使用标签搜索命令时,始终以安全模式执行搜索命令(标签文件中的最后一行)。这与从当前目录中的 vimrc 执行命令的方式相同。
如果您启用了
'shada',加载 ShaDa 文件可能需要一段时间。您可以通过暂时禁用 ShaDa 来确定问题是否出在这里(使用 Vim 参数 "-i NONE",
-i)。尝试减少寄存器中存储的行数,使用“:set shada='20,<50,s10'”。
shada-file。
排查损坏的配置
bisect 像 Vim 和 Emacs 这样的编辑器的极端灵活性意味着任何插件或设置都可能以最初不明显的方式影响整个编辑器。
要找出配置中问题的根源,您必须对其进行“二分搜索”:1. 删除或禁用一半的
config。2. 重新启动 Nvim。3. 如果问题仍然存在,请转到步骤 1。4. 如果问题消失了,请恢复一半被删除的行。5. 以这种方式继续缩小配置范围,直到找到导致问题的设置或插件。
介绍消息
:intro 当 Vim 在没有文件名的情况下启动时,会显示一条介绍性消息。它会在显示重新绘制后立即消失。要再次查看消息,请使用“:intro”命令。要在启动时避免介绍性消息,请在
'shortmess' 中添加“I”标志。
Nvim 将尝试按以下顺序获取 $VIM 的值
1. 环境变量 $VIM,如果已设置。2. 从
'helpfile' 选项派生的路径,除非它也包含一些环境变量(默认值为“$VIMRUNTIME/doc/help.txt”)。删除文件名(“help.txt”等)。按以下顺序删除尾随目录名:“doc”、“runtime”。3. 从
nvim
可执行文件的位置派生的路径。4. 编译时定义的安装目录(参见“:version”的输出)。
执行此操作一次后,Nvim 会设置 $VIM 环境变量。
$VIMRUNTIME 环境变量“$VIMRUNTIME”用于定位各种支持文件,例如文档和语法高亮文件。例如,主帮助文件通常是“$VIMRUNTIME/doc/help.txt”。
Nvim 将尝试按以下顺序获取 $VIMRUNTIME 的值
1. 环境变量 $VIMRUNTIME,如果已设置。2. 目录路径“$VIM/vim{version}”,如果存在,其中
{version}
是没有“-”或“.”的 Vim 版本号。例如:“$VIM/vim82”。3. 目录路径“$VIM/runtime”,如果存在。4. $VIM 环境变量的值。这是为了与旧版本的 Vim 向后兼容。5. 如果相对于
v:progpath 存在“../share/nvim/runtime”,则使用它。6. 从
'helpfile' 选项派生的路径(如果它不包含“$”),从末尾删除“doc/help.txt”。
执行此操作一次后,Nvim 会设置 $VIMRUNTIME 环境变量。
如果您需要在 shell 中使用 $VIMRUNTIME 的值(例如,用于在帮助文件中进行 grep 的脚本),您可能可以使用以下方法
VIMRUNTIME="$(nvim --clean --headless --cmd 'echo $VIMRUNTIME|q')"
CTRL-Z v_CTRL-Z CTRL-Z 挂起 Nvim,就像“:stop”一样。在普通模式和可视模式下有效。在插入模式和命令行模式下,
CTRL-Z
将插入为普通字符。在可视模式下,Nvim 会返回到普通模式。
在 GUI 中,挂起是实现定义的。
有几种方法可以退出 Vim
使用 :quit
关闭最后一个窗口。仅当没有更改时才有效。
使用 :quit!
关闭最后一个窗口。即使有更改也有效。
使用 :qall
关闭所有窗口。仅当没有更改时才有效。
使用 :qall!
关闭所有窗口。即使有更改也有效。
使用 :cquit
。即使有更改也有效。
在使用 :cquit
或出现错误消息时,Vim 会退出并返回退出代码 1。可以使用 :silent!
或 :catch
避免错误。
大多数情况下,您会手动编辑 vimrc 文件。这为您提供了最大的灵活性。有一些命令可以自动生成 vimrc 文件。您可以按原样使用这些文件,或复制/粘贴行以包含在另一个 vimrc 文件中。
:mk :mkexrc :mk[exrc] [file] 将当前键映射和已更改的选项写入 [file](默认情况下为当前目录中的“.exrc”),除非它已存在。
:mk[exrc]! [file] 始终将当前键映射和已更改的选项写入 [file](默认情况下为当前目录中的“.exrc”)。
:mkv :mkvi :mkvimrc :mkv[imrc][!] [file] 与“:mkexrc”类似,但默认情况下为当前目录中的“.nvimrc”。“:version”命令也将写入文件。
当映射中使用特殊键时,
'cpoptions' 选项将临时设置为 Vim 默认值,以避免映射被误解。这会使文件与 Vi 不兼容,但可以确保它可以在不同的终端上使用。
只存储全局映射,不存储缓冲区局部映射。
一种常见的方法是使用默认的
配置 文件,使用 ":map" 和 ":set" 命令进行一些修改,然后写入修改后的文件。首先使用类似 ":source ~piet/.vimrc.Cprogs" 的命令读取默认 vimrc,更改设置,然后使用 ":mkvimrc!" 将它们保存在当前目录中。如果你想将此文件设置为你的默认
配置,将其移动到 $XDG_CONFIG_HOME/nvim。你也可以使用自动命令
自动命令 和/或模型行
模型行。
vimrc-选项-示例 如果你只想在你的 vimrc 中添加一个选项设置,你可以使用以下步骤:1. 使用 Vim 编辑你的 vimrc 文件。2. 试用选项,直到它正确为止。例如,尝试使用
'guifont' 的不同值。3. 添加一行来设置选项的值,使用表达式寄存器 '=' 输入值。例如,对于
'guifont' 选项
o:set guifont=<C-R>=&guifont<CR><Esc>
[<C-R>
是 CTRL-R
,<CR>
是回车键,<Esc>
是 ESC 键] 你需要转义特殊字符,尤其是空格。
View view-file 视图是一组适用于一个窗口的设置。你可以保存一个视图,当你稍后恢复它时,文本将以相同的方式显示。此窗口中的选项和映射也将被恢复,以便你可以继续编辑,就像保存视图时一样。
Session session-file 会话保留所有窗口的视图,以及全局设置。你可以保存一个会话,当你稍后恢复它时,窗口布局看起来相同。你可以使用会话快速在不同的项目之间切换,自动加载你上次在该项目中工作的文件。
视图和会话是对 ShaDa 文件的补充,ShaDa 文件用于记住所有视图和会话的共享信息
shada-file。
你可以使用
-S 参数快速开始使用之前保存的视图或会话进行编辑
vim -S Session.vim
:mks :mksession :mks[ession][!] [file] 写入一个 Vim 脚本,它将恢复当前的编辑会话。当包含 [!] 时,将覆盖现有文件。当省略 [file] 时,将使用 "Session.vim"。
恢复会话后,当前会话的完整文件名将在内部变量
v:this_session 中可用。一个映射示例
:nmap <F2> :wa<Bar>exe "mksession! " .. v:this_session<CR>:so ~/sessions/
这将保存当前会话,并启动加载另一个会话的命令。
:mkvie :mkview :mkvie[w][!] [file] 写入一个 Vim 脚本,它将恢复当前窗口的内容。当包含 [!] 时,将覆盖现有文件。当省略 [file] 或是一个从 1 到 9 的数字时,会生成一个名称,并添加
'viewdir' 前缀。当
'viewdir' 的最后一个路径部分不存在时,将创建此目录。例如,当
'viewdir' 是 "$VIM/vimfiles/view" 时,将在 "$VIM/vimfiles" 中创建 "view"。然后会始终覆盖现有文件。使用
:loadview 再次加载此视图。当 [file] 是一个文件的名称时(不使用
'viewdir'),将向生成的脚本添加一个编辑文件的命令。
":mkview" 的输出包含以下项目:1. 窗口中使用的参数列表。当使用全局参数列表时,它将被重置为全局列表。参数列表中的索引也将被恢复。2. 在窗口中编辑的文件。如果没有文件,则使窗口为空。3. 恢复映射、缩写和窗口局部的选项,如果
'viewoptions' 包含 "options" 或 "localoptions"。只有当前缓冲区和当前窗口局部的选项值会被恢复。当将视图存储为会话的一部分,并且 "options" 位于
'sessionoptions' 中时,局部选项的全局值也会被存储。4. 恢复折叠,当使用手动折叠并且
'viewoptions' 包含 "folds" 时。恢复手动打开和关闭的折叠。5. 文件中的滚动位置和光标位置。当存在关闭的折叠时,效果不太好。6. 本地当前目录,如果它与全局当前目录不同,并且
'viewoptions' 包含 "curdir"。
请注意,视图和会话并不完美
它们不会恢复所有内容。例如,定义的函数、自动命令和 ":syntax on" 不包括在内。寄存器内容和命令行历史记录之类的东西在 ShaDa 中,不在会话或视图中。
只有当全局选项值与默认值不同时,才会设置它们。当当前值不是默认值时,加载会话不会将其恢复为默认值。但是,局部选项将恢复为默认值。
现有的映射将在没有警告的情况下被覆盖。现有映射可能会导致歧义错误。
当存储手动折叠和手动打开/关闭的折叠时,在保存和加载视图之间对文件进行的更改将导致混乱。
Vim 脚本效率不高。但仍然比自己输入命令快!
:lo :loadview :lo[adview] [nr] 加载当前文件的视图。当省略 [nr] 时,将加载使用 ":mkview" 存储的视图。当指定 [nr] 时,将加载使用 ":mkview [nr]" 存储的视图。
":mkview" 和 ":loadview" 的组合可以用来存储多达十个不同的文件视图。这些视图将保存在使用
'viewdir' 选项指定的目录中。视图使用文件名进行存储。如果文件被重命名或通过(符号)链接访问,则找不到视图。
要自动保存和恢复
*.c
文件的视图
au BufWinLeave *.c mkview
au BufWinEnter *.c silent! loadview
如果你退出 Vim,然后再次启动它,通常会丢失很多信息。ShaDa 文件可以用来记住这些信息,这使你能够继续你上次离开的地方。它的名称是 SHAred DAta 的缩写,因为它用于在 Nvim 会话之间共享数据。
ShaDa 文件用于存储
命令行历史记录。
搜索字符串历史记录。
输入行历史记录。
非空寄存器的内容。
多个文件的标记。
文件标记,指向文件中的位置。
最后一次搜索/替换模式(用于 'n' 和 '&')。
缓冲区列表。
全局变量。
你也可以使用会话文件。不同之处在于 ShaDa 文件不依赖于你正在处理的内容。通常只有一个 ShaDa 文件。会话文件用于保存特定编辑会话的状态。你可能拥有多个会话文件,每个项目一个。ShaDa 和会话文件可以一起使用,让你有效地进入 Vim 并直接开始在所需的设置中工作。
session-file
Unix 的注意事项
ShaDa 文件的文件保护将被设置为阻止其他用户读取它,因为它可能包含你使用过的任何文本或命令。
如果您想与其他用户共享 ShaDa 文件(例如,当您“su”到另一个用户时),您可以使该文件对组或所有人可写。Vim 在写入新的 ShaDa 文件时会保留此设置。请注意,不要允许任何人读取和写入您的 ShaDa 文件!
Vim 不会覆盖当前“真实”用户无法写入的 ShaDa 文件。这在您“su”成为 root 用户,但您的 $HOME 仍然设置为普通用户的家目录时很有帮助。否则,Vim 将创建一个由 root 拥有的 ShaDa 文件,其他任何人都无法读取。
ShaDa 文件不能是符号链接。这是为了避免安全问题。
每个文件分别存储标记。当读取文件并且
'shada' 不为空时,该文件的标记将从 ShaDa 文件中读取。
注意: 标记仅在退出 Vim 时写入,因为标记会记住您在当前编辑会话中打开的所有文件的标记,除非使用“:bdel”。如果您想保存您要使用“:bdel”放弃的文件的标记,请使用“:wsh”。'[' 和 ']' 标记不会被存储,但 '"' 标记会存储。'"' 标记对于在文件上次退出时跳转到光标位置非常有用。对于以
'shada' 中的“r”标志给出的任何字符串开头的文件,不会保存任何标记。这可用于避免保存可移动介质上的文件的标记(对于 MS-Windows,您将使用“ra:,rb:”)。
v:oldfiles 变量将填充 ShaDa 文件具有标记的文件名。
shada-文件-标记 写入 ShaDa 文件时,会存储大写标记('A 到 'Z)。编号标记('0 到 '9)有点特殊。当写入 ShaDa 文件(在退出时或使用
:wshada 命令时),'0 设置为当前光标位置和文件。旧的 '0 将移动到 '1,'1 移动到 '2,依此类推。这类似于“1 到”9 删除寄存器发生的情况。如果当前光标位置已经存在于 '0 到 '9 中,它将移动到 '0,以避免两次出现相同的位置。结果是,使用 "'0",您可以跳转回您退出 Vim 的文件和行。要立即执行此操作,请尝试使用以下命令
vim -c "normal '0"
在 C shell 的后代中,您可以为此创建一个别名
alias lvim vim -c '"'normal "'"0'"'
对于类似 Bash 的 shell
alias lvim='vim -c "normal '\''0"'
在
'shada' 中使用“r”标志指定哪些文件不应记住标记。
使用
:wshada 写入 ShaDa 文件时,没有感叹号或在正常退出时,现有 ShaDa 文件中的信息将与当前 Nvim 实例的信息合并。为此,ShaDa 文件存储与 ShaDa 条目关联的时间戳。具体来说,正在执行以下操作
1. 历史行按时间戳排序合并。ShaDa 文件中的最大项目数量由
'shada' 选项定义(
shada-/,
shada-:,
shada-@,等等:每个代表历史名称的字符都对应一个子选项(
:history))。2. 将 Nvim 未打开的文件的本地标记和更改复制到新的 ShaDa 文件。合并打开 Nvim 文件的标记,忽略打开 Nvim 文件的更改。
shada-' 3. 合并跳转列表:按时间戳排序跳转,相同跳转(相同位置和时间戳)将被压缩。4. 搜索模式和替换字符串不合并:具有最大时间戳的搜索模式或替换字符串将是唯一复制到 ShaDa 文件的字符串。5. 对于每个具有最大时间戳的寄存器实体,仅保存一个。
shada-< 6. 所有保存的变量都将从当前 Nvim 实例保存。此外,还将复制现有的变量值,这意味着从 ShaDa 文件中删除变量的唯一方法是手动删除它或完全禁用写入变量。
shada-! 7. 对于每个具有最大时间戳的全局标记实体,仅保存一个。8. 缓冲区列表和标题是唯一不会以任何方式合并的条目:存在的唯一标题和缓冲区列表是最后写入文件的 Nvim 实例的标题和缓冲区列表。
shada-%
ShaDa 文件向前和向后兼容。这意味着
1. 当读取时忽略具有未知类型的条目(即包含未识别数据的条目),并在写入时盲目复制。2. 当读取时忽略具有未知寄存器名称的寄存器条目,并在写入时盲目复制。限制:仅支持使用 [1, 255] 区间内的代码的寄存器名称。
registers 3. 当读取时忽略具有未知寄存器类型的寄存器条目,并在写入时像往常一样合并。
getregtype() 4. 当读取时忽略具有未知标记名称的本地和全局标记条目。当写入时,全局标记条目将被盲目复制,本地标记条目也将被盲目复制,但前提是它们附加到的文件适合
shada-' 限制。计算应包含哪些文件时,也会考虑未知本地标记条目的时间戳。限制:仅支持使用 [1, 255] 区间内的代码的标记名称。
mark-motions 5. 当读取时忽略具有未知历史类型的历史条目,并在写入时盲目复制。限制:历史类型最多可以有 256 种。
history 6. 在寄存器、本地标记、全局标记、更改、跳转和搜索模式条目中找到的未知键将在内部保存,并在写入时转储。在 Nvim 会话期间创建的条目永远不会有这样的添加。7. 在替换字符串和历史条目中找到的附加元素将在内部保存并转储。在 Nvim 会话期间创建的条目永远不会有这样的添加。8. 在变量条目中找到的附加元素在读取时将被简单地忽略。当写入新变量时,它们将在合并期间保留,但仅此而已。从当前 Nvim 会话转储的变量值永远不会有附加元素,即使变量本身是从读取 ShaDa 文件获得的。
shada 文件的默认名称为:Unix: “$XDG_STATE_HOME/nvim/shada/main.shada” Windows: “$XDG_STATE_HOME/nvim-data/shada/main.shada” 另请参见
base-directories.
要选择不同的文件名,您可以使用
启动参数
-i。“NONE”表示永远不会读取或写入 shada 文件。以下命令也不适用!
对于以下命令,可以指定另一个文件名,覆盖默认文件名和使用
'shada' 或 "-i" 指定的名称(除非它是 NONE)。
可以使用两个命令来手动读取和写入 ShaDa 文件。这可以用于在两个正在运行的 Vim 程序之间交换寄存器:首先在一个程序中键入“:wsh”,然后在另一个程序中键入“:rsh”。请注意,如果寄存器已经包含了内容,则需要“:rsh!”。但是,还要注意,这意味着所有内容都将被第一个 Vim 中的信息覆盖,包括命令行历史记录等。
ShaDa 文件本身也可以手动编辑,尽管我们建议您从现有文件中开始,以确保格式正确。您需要了解 MessagePack(或更可能是找到能够使用它的软件)格式才能执行此操作。这对于创建第二个文件(例如“~/.my.shada”)很有用,该文件可以包含您在首次启动 Nvim 时始终需要的某些设置。例如,您可以使用特定数据预加载寄存器,或者将某些命令放入命令行历史记录中。您的
config 文件中的一行,例如
:rshada! ~/.my.shada
可用于加载这些信息。您甚至可以为不同类型的文件(例如 C 代码)创建不同的 ShaDa 文件,并使用“:autocmd”命令(参见
:autocmd)根据文件名加载它们。有关 ShaDa 文件格式的更多信息,请参见
shada-format 部分。
E136 E929 shada-error-handling 某些错误会导致 Nvim 留下名为“{basename}.tmp.X”(X 是“a”到“z”之间的任何可用字母)的临时文件,而通常情况下,它会创建此文件,写入它,然后将“{basename}.tmp.X”重命名为“{basename}”。此类错误包括
使 Nvim 认为正在读取的文件根本不是 ShaDa 文件的错误:出于安全原因,不会覆盖非 ShaDa 文件,以避免意外破坏无关文件。例如,在键入“nvim -i file”而不是“nvim -R file”时(是的,至少有人在使用 Vim 时这样做过)可能会发生这种情况。此类错误列在
shada-critical-contents-errors 中。
如果写入临时文件失败:例如,由于剩余空间不足。
如果重命名文件失败:例如,由于权限不足。
如果目标 ShaDa 文件与 Nvim 实例的拥有者(用户和组)不同,并且更改它们失败。Unix 特定,仅在从 root 启动 Nvim 时适用。
请勿忘记在遇到上述错误后删除临时文件或将目标文件替换为临时文件,否则所有创建 ShaDa 文件的尝试都可能因
E929 失败。如果您在使用
:wshada 时(而不是在退出 Nvim 时:即 Nvim 会话正在运行时)遇到其中一个错误,则您有其他选择
如果您遇到任何错误(除了无法写入临时文件之外),您应该考虑的第一件事是:删除现有文件并用临时文件替换它。即使您有正在运行的 Nvim 实例,也要这样做。
修复权限和/或文件所有权,释放一些空间并尝试再次写入。不要删除现有文件。
使用带有感叹号的
:wshada。在权限错误的情况下无济于事。如果目标文件实际上是 ShaDa 文件,则在这种情况下可能会丢失一些信息。为了使情况稍微好一些,请在写入之前使用
:rshada,但这仍然会丢失当前 Nvim 实例中未打开的任何文件的缓冲区本地标记和更改列表条目。
从 shell 中删除目标文件并使用
:wshada。结果与使用带有感叹号的
:wshada 相同,但“rm -f”在您没有写入权限的情况下适用。
:wsh :wshada E137 :wsh[ada][!] [file] 写入 ShaDa 文件 [file](默认:见上文)。文件中的信息首先被读入以合并旧信息和新信息。当使用 [!] 时,不会先读入旧信息,只会写入内部信息(还会禁用在
shada-error-handling 中描述的安全检查)。如果
'shada' 为空,最多会写入 100 个文件的标记。当你遇到错误 “E929: All .tmp.X files exist, cannot write ShaDa file!” 时,请检查是否遗留了旧的临时文件(例如 ~/.local/state/nvim/shada/main.shada.tmp*)。
过滤作用于文件名。
:bro[wse] o[ldfiles][!] 列出文件名称,如同使用
:oldfiles,然后提示输入一个数字。如果该数字有效,则从列表中编辑该文件。如果收到
按回车键 提示,你可以按“q”并仍然收到输入文件编号的提示。使用 [!] 放弃已修改的缓冲区。
放弃
ShaDa 文件是 MessagePack 条目的串联。每个条目都是恰好四个 MessagePack 对象的串联。
1. 首先是条目的类型。对象类型必须是无符号整数。对象类型不能等于零。2. 第二个是条目的时间戳。它也必须是无符号整数。3. 第三个是第四个条目的长度。也是无符号整数,用于快速跳过而不进行解析。4. 第四个是实际的条目数据。所有当前使用的 ShaDa 条目都使用容器来保存数据:要么是映射,要么是数组。这些容器中的所有字符串值要么是二进制的(适用于文件名),要么是 UTF-8,但解析器需要预期 UTF-8 字符串中可能存在无效字节。
确切的格式取决于条目类型。
映射中包含的数据
键类型默认值描述
l 无符号整数 1 位置行号。必须大于零。c 无符号整数 0 位置列号。n 无符号整数 34 ('"') 标记名称。仅对 GlobalMark 和 LocalMark 条目有效。f 二进制 N/A 文件名。必填。
*
任何 无 其他键允许出于兼容性原因存在,见
shada-compatibility。 9(缓冲区列表)包含映射的数组。数组中的每个映射都表示一个缓冲区。可能的键
键类型默认值描述
l 无符号整数 1 位置行号。必须大于零。c 无符号整数 0 位置列号。f 二进制 N/A 文件名。必填。
*
任何 无 其他键允许出于兼容性原因存在,见
shada-compatibility。
*
(未知)出于兼容性原因,允许存在任何其他条目类型,见
shada-compatibility。
E575 E576 ShaDa 文件中的错误可能有两种类型:1. “逻辑”错误的 E575。2. “严重”错误的 E576。写入时,严重错误会触发在
shada-error-handling 中描述的行为。读取时,严重错误会导致跳过文件的其余部分。严重错误包括:
shada-critical-contents-errors
前三个 MessagePack 对象中的任何一个不是无符号整数。
第三个对象请求的字节数大于 ShaDa 文件中剩余的字节数。
类型为零的条目。即第一个对象等于零。
MessagePack 解析器无法解析条目数据。
MessagePack 解析器消耗的字节数少于或请求的字节数大于用于解析第四个对象的第三个对象中描述的字节数。即当第四个对象包含多个 MessagePack 对象或它不包含完整的 MessagePack 对象时。
Nvim 在标准位置存储配置、数据和日志。强烈建议插件也遵循此模式。使用
stdpath() 获取路径。
在整个帮助页面中,这些默认值用作占位符,例如,“~/.config” 被理解为 “$XDG_CONFIG_HOME 或 ~/.config”。
配置目录(默认)
$XDG_CONFIG_HOME Nvim: stdpath("config") Unix: ~/.config ~/.config/nvim Windows: ~/AppData/Local ~/AppData/Local/nvim
数据目录(默认)
$XDG_DATA_HOME Nvim: stdpath("data") Unix: ~/.local/share ~/.local/share/nvim Windows: ~/AppData/Local ~/AppData/Local/nvim-data
运行目录(默认)
$XDG_RUNTIME_DIR Nvim: stdpath("run") Unix: /tmp/nvim.user/xxx /tmp/nvim.user/xxx Windows: $TMP/nvim.user/xxx $TMP/nvim.user/xxx
状态目录(默认)
$XDG_STATE_HOME Nvim: stdpath("state") Unix: ~/.local/state ~/.local/state/nvim Windows: ~/AppData/Local ~/AppData/Local/nvim-data
缓存目录(默认)
$XDG_CACHE_HOME Nvim: stdpath("cache") Unix: ~/.cache ~/.cache/nvim Windows: ~/AppData/Local/Temp ~/AppData/Local/Temp/nvim-data
日志文件(默认)
$NVIM_LOG_FILE
Nvim: stdpath("log")/log Unix: ~/.local/state/nvim ~/.local/state/nvim/log Windows: ~/AppData/Local/nvim-data ~/AppData/Local/nvim-data/log
请注意,stdpath("log") 目前是 stdpath("state") 的别名。
附加配置目录(默认)
$XDG_CONFIG_DIRS Nvim: stdpath("config_dirs") Unix: /etc/xdg/ /etc/xdg/nvim Windows: 不适用 不适用
附加数据目录(默认)
$XDG_DATA_DIRS Nvim: stdpath("data_dirs") Unix: /usr/local/share /usr/local/share/nvim /usr/share /usr/share/nvim Windows: 不适用 不适用
可以通过
$NVIM_APPNAME
环境变量进一步配置标准目录。此变量控制 Nvim 将从中读取(并自动创建)的每个基本目录中的子目录。例如,在启动之前将
$NVIM_APPNAME
设置为 “foo” 将导致 Nvim 在
$XDG_CONFIG_HOME/foo
而不是
$XDG_CONFIG_HOME/nvim
中查找配置文件。
$NVIM_APPNAME
必须是名称,例如 “foo”,或者相对路径,例如 “foo/bar”。
使用 $NVIM_APPNAME 的一个用例是“隔离” Nvim 应用程序。或者,为了真正隔离,在 Linux 上可以使用 cgroups 命名空间。
systemd-run --user -qt -p PrivateUsers=yes -p BindPaths=/home/user/profile_xy:/home/user/.config/nvim nvim
注意:在整个帮助页面中,无论何时提到
$XDG_CONFIG_…/nvim
,都应理解为
$XDG_CONFIG_…/$NVIM_APPNAME
。
除了
'debug' 和
'verbose' 之外,Nvim 还保留一个用于内部调试、插件和 RPC 客户端的通用日志文件。
:echo $NVIM_LOG_FILE
默认情况下,该文件位于 stdpath("log")/log ($XDG_STATE_HOME/nvim/log) 中,除非该路径不可访问,或者在
启动 之前设置了 $NVIM_LOG_FILE。