Usr_21

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


VIM 用户手册 - 作者 Bram Moolenaar
离开并返回
本章将介绍如何在 Vim 中使用其他程序。无论是从 Vim 内部执行程序,还是离开 Vim 并在稍后返回。此外,本章还介绍了如何记住 Vim 的状态并在以后恢复它。
21.1 挂起和恢复 21.2 执行 shell 命令 21.3 记住信息;ShaDa 21.4 会话 21.5 视图 21.6 Modelines
下一章:usr_22.txt 查找要编辑的文件 上一章:usr_20.txt 快速输入命令行命令 目录:usr_toc.txt

挂起和恢复

像大多数 Unix 程序一样,Vim 可以通过按下 CTRL-Z 来挂起。这将停止 Vim 并将您带回到启动它的 shell 中。然后,您可以执行任何其他命令,直到您对它们感到厌烦为止。然后,使用 "fg" 命令将 Vim 恢复回来。
CTRL-Z
{any sequence of shell commands}
fg
您将回到离开 Vim 的位置,没有任何改变。如果按下 CTRL-Z 不起作用,您也可以使用 ":suspend"。不要忘记将 Vim 恢复到前台,否则您所做的任何更改都会丢失!
只有 Unix 支持此功能。在其他系统上,Vim 将为您启动一个 shell。这也有执行 shell 命令的功能。但这只是一个新的 shell,而不是您从其启动 Vim 的那个 shell。当您运行 GUI 时,您无法返回到启动 Vim 的 shell。CTRL-Z 将改为最小化 Vim 窗口。

21.2 执行 shell 命令

要从 Vim 执行单个 shell 命令,请使用 ":!{command}"。例如,要查看目录列表
:!ls
:!dir
第一个是用于 Unix 的,第二个是用于 MS-Windows 的。Vim 将执行该程序。当它结束时,您将收到一个提示,要求您按 <Enter>。这允许您在返回到正在编辑的文本之前查看命令的输出。"!" 也用于在运行程序的其他地方使用。让我们看一下概述
:!{program} 执行 {program} :r !{program} 执行 {program} 并读取其输出 :w !{program} 执行 {program} 并将其文本发送到其输入 :[range]!{program} 通过 {program} 过滤文本
请注意,"!{program}" 前面是否存在范围会导致很大的区别。如果没有它,程序将正常执行,如果有范围,则将过滤一定数量的文本行。
以这种方式执行整行程序是可能的。但 shell 在这方面要好得多。您可以使用 :terminal 启动一个新的 shell。
这类似于使用 CTRL-Z 挂起 Vim。不同之处在于启动了一个新的 shell。

21.3 记住信息;ShaDa

在编辑了一段时间后,您将有寄存器中的文本、不同文件中的标记、一个充满精心设计的命令的命令行历史记录。当您退出 Vim 时,所有这些都会丢失。但您可以找回它们!
ShaDa 文件(SHAred DAta 的缩写)旨在存储状态信息
命令行和搜索模式历史记录寄存器中的文本不同文件的标记缓冲区列表全局变量
每次您退出 Vim 时,它都会将此信息存储在一个文件中,即 ShaDa 文件。当 Vim 再次启动时,会读取 ShaDa 文件并恢复信息。
默认情况下,'shada' 选项设置为恢复有限数量的项目。您可能希望将其设置为记住更多信息。这可以通过以下命令完成
:set shada=string
该字符串指定要保存的内容。此字符串的语法是选项字符后跟一个参数。选项/参数对用逗号隔开。看看如何构建自己的 shada 字符串。首先,' 选项用于指定保存标记的文件数量(az)。为该选项选择一个不错的偶数(例如 1000)。您的命令现在看起来像这样
:set shada='1000
f 选项控制是否存储全局标记(AZ 和 0-9)。如果此选项为 0,则不存储任何标记。如果它为 1 或您没有指定 f 选项,则会存储标记。您需要此功能,因此您现在拥有以下内容
:set shada='1000,f1
< 选项控制为每个寄存器保存多少行。默认情况下,会保存所有行。如果为 0,则不保存任何内容。为了避免向 ShaDa 文件添加数千行(这些行可能永远不会被使用,并且会使 Vim 启动速度变慢),您最多使用 500 行
:set shada='1000,f1,<500
您可能想要使用的其他选项:: 要保存的命令行历史记录行数 @ 要保存的输入行历史记录行数 / 要保存的搜索历史记录行数 r 可移动介质,不会为其保存标记(可以多次使用) ! 以大写字母开头且不包含小写字母的全局变量 h 启动时禁用 'hlsearch' 高亮显示 % 缓冲区列表(仅在没有文件参数启动 Vim 时恢复) c 使用 'encoding' 转换文本 n 用于 ShaDa 文件的名称(必须是最后一个选项)
有关更多信息,请参见 'shada' 选项和 shada-file
当您多次运行 Vim 时,最后一个退出的 Vim 将存储其信息。这可能会导致以前退出的 Vim 存储的信息丢失。每个项目只能记住一次。

返回到您停止 VIM 的位置

您正在编辑文件,现在要离开度假。您退出 Vim 并享受假期,忘记了您的工作。几周后,您启动 Vim,并输入
'0
您将回到离开 Vim 的位置。因此您可以继续工作。每次您退出 Vim 时,Vim 都会创建一个标记。最后一个是 '0。'0 指向的位置将变成 '1。'1 将变成 '2,依此类推。标记 '9 将丢失。:marks 命令对于找出 '0 到 '9 将带您到哪里很有用。

返回到某个文件

如果您想返回到最近编辑过的文件,但不是在退出 Vim 时,则有一种稍微复杂的方法。您可以通过键入以下命令来查看文件列表
:oldfiles
1: ~/.config/nvim/init.vim
2: ~/text/resume.txt
3: /tmp/draft
现在您想编辑第二个文件,该文件在列表中由 "2:" 标识。您键入
:e #<2
除了 ":e" 之外,您还可以使用任何具有文件名参数的命令,"#<2" 项目可以在与 "%"(当前文件名)和 "#"(备用文件名)相同的位置使用。因此您也可以分割窗口以编辑第三个文件
:split #<3
当您只想编辑一个文件时,#<123 这样的东西有点复杂。幸运的是,有一种更简单的方法
:browse oldfiles
1: ~/.config/nvim/init.vim
2: ~/text/resume.txt
3: /tmp/draft
-- 更多 --
您将获得与 :oldfiles 相同的文件列表。如果您想先编辑 "resume.txt",请按 "q" 停止列表。您将获得一个提示
键入数字和 <Enter>(空表示取消)
键入 "2" 并按 <Enter> 编辑第二个文件。
有关更多信息,请参见 :oldfilesv:oldfilesc_#<

将信息从一个 VIM 移动到另一个 VIM

您可以使用 ":wshada" 和 ":rshada" 命令在仍然运行 Vim 时保存和恢复信息。这对于在两个 Vim 实例之间交换寄存器内容很有用。例如,在第一个 Vim 中执行
:wshada! ~/tmp/shada
并在第二个 Vim 中执行
:rshada! ~/tmp/shada
显然,"w" 代表 "写入","r" 代表 "读取"。"! 字符由 ":wshada" 用于强制覆盖现有文件。当它被省略并且文件存在时,信息将合并到文件中。用于 ":rshada" 的 "!" 字符意味着 ShaDa 文件中的所有信息都优先于现有信息,这可能会覆盖它。如果没有 "!",则仅使用未设置的信息。这些命令还可以用于存储信息并在以后再次使用它。您可以创建一个包含 ShaDa 文件的目录,每个文件都包含用于不同目的的信息。

21.4 会话

假设您正在编辑,现在是下班时间。您想停止工作并在第二天继续。您可以通过保存编辑会话并在第二天恢复它来实现。Vim 会话包含有关您正在编辑的所有信息。这包括文件列表、窗口布局、全局变量、选项和其他信息等内容。(确切记住的内容由 'sessionoptions' 选项控制,下面将介绍)。以下命令创建了一个会话文件
:mksession vimbook.vim
稍后,如果您想恢复此会话,可以使用以下命令
:source vimbook.vim
如果您想启动 Vim 并恢复特定会话,可以使用以下命令
vim -S vimbook.vim
这告诉 Vim 在启动时读取特定文件。"S" 代表会话(实际上,您可以使用 -S 源任何 Vim 脚本,因此它也可以代表 "source")。
打开的窗口将恢复,与之前的位置和大小相同。映射和选项值与之前一样。确切恢复的内容取决于 'sessionoptions' 选项。默认值为:"blank,buffers,curdir,folds,help,options,tabpages,winsize,terminal"。
blank 保留空窗口 buffers 所有缓冲区,而不仅仅是窗口中的缓冲区 curdir 当前目录 folds 折叠,包括手动创建的折叠 help 帮助窗口 options 所有选项和映射 tabpages 所有标签页 winsize 窗口大小 terminal 包含终端窗口
根据您的喜好进行更改。例如,要恢复 Vim 窗口的大小,请使用
:set sessionoptions+=resize
这里有会话,那里有会话
使用会话的明显方法是在处理不同的项目时。假设您将会话文件存储在 "~/.config/nvim" 目录中。您目前正在处理 "secret" 项目,并且必须切换到 "boring" 项目
:wall
:mksession! ~/.config/nvim/secret.vim
:source ~/.config/nvim/boring.vim
首先使用 ":wall" 写入所有已修改的文件。然后,使用 ":mksession!" 保存当前会话。这将覆盖以前的会话。下次您加载 secret 会话时,您可以从该位置继续。最后,您加载新的 "boring" 会话。
如果您打开了帮助窗口,分割并关闭了各种窗口,并通常弄乱了窗口布局,则可以返回到上次保存的会话
:source ~/.config/nvim/boring.vim
因此,您可以完全控制是否要通过在会话中保存当前设置在下次继续工作,或者将会话文件用作起点。使用会话的另一种方法是创建您喜欢使用的窗口布局,并在会话中保存它。然后,您可以随时返回到此布局。例如,这是一个不错的布局
+----------------------------------------+
|                  VIM - main help file  |
|                                        |
|Move around:  Use the cursor keys, or "h|
|help.txt================================|
|explorer   |                            |
|dir        |~                           |
|dir        |~                           |
|file       |~                           |
|file       |~                           |
|file       |~                           |
|file       |~                           |
|~/=========|[No File]===================|
|                                        |
+----------------------------------------+
这在顶部有一个帮助窗口,这样您就可以阅读此文本。左侧的窄垂直窗口包含一个文件资源管理器。这是一个列出目录内容的 Vim 插件。您可以在其中选择要编辑的文件。有关更多信息,请参见下一章。从刚启动的 Vim 中创建以下内容
:help
CTRL-W w
:vertical split ~/
您可以根据自己的喜好调整窗口的大小。然后使用以下命令保存会话
:mksession ~/.config/nvim/mine.vim
现在,您可以使用此布局启动 Vim
vim -S ~/.config/nvim/mine.vim
提示:要打开资源管理器窗口中列出的文件,请将光标移动到文件名并按 "O"。双击鼠标也会执行此操作。

会话和 SHADA

会话存储了许多东西,但并不包括标记位置、寄存器内容和命令行历史记录。你需要使用 shada 功能来存储这些信息。在大多数情况下,你希望将会话与 shada 分开使用。这可以用于切换到另一个会话,但保持命令行历史记录。并且在一个会话中将文本剪切到寄存器,并在另一个会话中粘贴回来。你可能更喜欢将这些信息与会话一起保存。那么你将不得不自己动手。示例
:mksession! ~/.config/nvim/secret.vim
:wshada! ~/.local/state/nvim/shada/secret.shada
以及恢复此信息
:source ~/.config/nvim/secret.vim
:rshada! ~/.local/state/nvim/shada/secret.shada

21.5 视图

会话存储整个 Vim 的外观。当你想只存储一个窗口的属性时,使用视图。使用视图是为了当你想要以特定方式编辑文件时。例如,你启用了 'number' 选项并定义了一些折叠。就像会话一样,你可以记住文件上的这个视图并在以后恢复它。实际上,当你存储一个会话时,它会存储每个窗口的视图。使用视图有两种基本方法。第一种是让 Vim 为视图文件选择一个名称。你可以在以后编辑同一个文件时恢复视图。要存储当前窗口的视图
:mkview
Vim 会决定将视图存储在何处。当你在以后编辑同一个文件时,你将使用此命令恢复视图
:loadview
很简单,不是吗?现在你想在没有 'number' 选项的情况下查看文件,或者所有折叠都打开,你可以设置选项以使窗口看起来像那样。然后使用以下命令存储此视图
:mkview 1
显然,你可以用以下命令恢复它
:loadview 1
现在你可以通过在 ":loadview" 命令中使用和不使用 "1" 参数来在文件的两个视图之间切换。你可以通过这种方式为同一个文件存储最多十个视图,一个没有编号,九个编号为 1 到 9。
命名视图
使用视图的第二种基本方法是将视图存储在你自己选择的名称的文件中。此视图可以在编辑另一个文件时加载。Vim 然后将切换到编辑视图中指定的文件。因此,你可以用它快速切换到编辑另一个文件,并设置所有选项,就像你保存它们一样。例如,要保存当前文件的视图
:mkview ~/.config/nvim/main.vim
你可以用以下命令恢复它
:source ~/.config/nvim/main.vim

21.6 模型行

在编辑特定文件时,你可能专门为此文件设置了选项。每次都输入这些命令很无聊。在多人共享文件时,使用会话或视图来编辑文件也不起作用。在这种情况下,解决方案是向文件中添加一个模型行。这是一行文本,它告诉 Vim 选项的值,仅在该文件中使用。一个典型的例子是 C 程序,其中你通过 4 个空格的倍数进行缩进。这需要将 'shiftwidth' 选项设置为 4。此模型行将执行此操作
/* vim:set shiftwidth=4: */ ~
将此行放在文件的前五个行或后五个行中的任何一行。在编辑文件时,你会注意到 'shiftwidth' 已经设置为 4。在编辑另一个文件时,它会恢复到默认值 8。对于某些文件,模型行很适合放在头部,因此可以将其放在文件的顶部。对于文本文件和其他模型行会妨碍正常内容的文件,将其放在文件的末尾。
选项 'modelines' 指定了检查文件开头和结尾的多少行是否包含模型行。要检查十行
:set modelines=10
选项 'modeline' 可用于关闭此功能。当你以 Unix 上的 root 身份或 MS-Windows 上的管理员身份工作时,或者你不信任你正在编辑的文件时,请执行此操作
:set nomodeline
使用以下格式作为模型行
any-text vim:set {option}={value} ... : any-text
"any-text" 表示你可以在 Vim 将要使用的部分之前和之后放置任何文本。这允许使其看起来像注释,就像上面使用 "/*" 和 "*/" 所做的那样。" vim:" 部分是 Vim 用来识别此行的部分。在 "vim" 之前必须有空格,或者 "vim" 必须位于行的开头。因此,使用诸如 "gvim:" 之类的东西将不起作用。冒号之间的部分是一个 ":set" 命令。它的作用与键入 ":set" 命令相同,只是你需要在冒号之前插入一个反斜杠(否则它会被视为模型行的结尾)。
另一个例子
// vim:set textwidth=72 dir=c\:\tmp:  use c:\tmp here
第一个冒号之前有一个额外的反斜杠,因此它包含在 ":set" 命令中。第二个冒号之后的文本被忽略,因此可以在那里放置备注。
有关更多详细信息,请参阅 modeline
下一章:usr_22.txt 查找要编辑的文件
版权:参见 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
命令索引
快速参考