Usr_07

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


VIM 用户手册 - 作者 Bram Moolenaar
编辑多个文件
无论你有多少个文件,你都可以不离开 Vim 就编辑它们。定义一个要处理的文件列表,并在它们之间跳转。从一个文件中复制文本并粘贴到另一个文件中。
07.1 编辑另一个文件 07.2 文件列表 07.3 在文件之间跳转 07.4 备份文件 07.5 在文件之间复制文本 07.6 查看文件 07.7 更改文件名
下一章:usr_08.txt 分割窗口 上一章:usr_06.txt 使用语法高亮 目录:usr_toc.txt

编辑另一个文件

到目前为止,你必须为每个要编辑的文件启动 Vim。有一个更简单的方法。要开始编辑另一个文件,请使用以下命令
:edit foo.txt
你可以使用任何文件名来代替 "foo.txt"。Vim 会关闭当前文件并打开新的文件。但是,如果当前文件有未保存的更改,Vim 会显示错误消息,并且不会打开新文件
E37: 自上次更改后未写入 (使用 ! 强制覆盖)
注意:Vim 在每个错误消息的开头放置一个错误 ID。如果你不理解消息或原因,请在帮助系统中查找此 ID。在这种情况下
:help E37
此时,你有几个选择。你可以使用以下命令写入文件
:write
或者你可以强制 Vim 丢弃你的更改并编辑新文件,使用强制 (!) 字符
:edit! foo.txt
如果你想编辑另一个文件,但不想立即写入当前文件中的更改,你可以将其隐藏
:hide edit foo.txt
带有更改的文本仍然存在,但你无法看到它。这在第 22.4 节中详细解释:缓冲区列表。

07.2 文件列表

你可以启动 Vim 来编辑一系列文件。例如
vim one.c two.c three.c
此命令启动 Vim 并告诉它你将编辑三个文件。Vim 仅显示第一个文件。在你完成此文件中的操作后,要编辑下一个文件,请使用以下命令
:next
如果你在当前文件中进行了未保存的更改,你将收到一条错误消息,并且 ":next" 将不起作用。这与上一节中提到的 ":edit" 相同的问题。要放弃更改
:next!
但大多数情况下,你希望保存更改并继续下一个文件。有一个专门的命令可以实现此目的
:wnext
这与使用两个单独的命令效果相同
:write
:next
我在哪里?
要查看你在参数列表中编辑的是哪个文件,请查看窗口标题。它应该显示类似 "(2 of 3)" 的内容。这意味着你正在编辑三个文件中的第二个文件。如果你想查看文件列表,请使用以下命令
:args
这是 "arguments" 的简写。输出可能如下所示
one.c [two.c] three.c
这些是你启动 Vim 时使用的文件。你当前正在编辑的文件 "two.c" 位于方括号中。

移动到其他参数

要后退一个文件
:previous
这与 ":next" 命令类似,只是它向另一个方向移动。同样,如果你想先写入文件,可以使用快捷命令
:wprevious
要移动到列表中的最后一个文件
:last
然后再次移动到第一个文件
:first
但是没有 ":wlast" 或 ":wfirst" 命令!
你可以为 ":next" 和 ":previous" 使用计数。要跳过两个文件
:2next

自动写入

在文件之间移动并进行更改时,你必须记住使用 ":write"。否则你会收到一条错误消息。如果你确定始终希望写入修改后的文件,你可以告诉 Vim 自动写入它们
:set autowrite
当你正在编辑一个你可能不想写入的文件时,请再次将其关闭
:set noautowrite

编辑另一个文件列表

你可以在不退出 Vim 并重新启动它的情况下重新定义文件列表。使用以下命令编辑另外三个文件
:args five.c six.c seven.h
或者使用通配符,就像在 shell 中使用的那样
:args *.txt
Vim 会带你到列表中的第一个文件。同样,如果当前文件有更改,你可以先写入文件,或者使用 ":args!"(添加 !)来放弃更改。
你是否编辑了最后一个文件? arglist-quit
当你使用文件列表时,Vim 假设你想要编辑所有文件。为了防止你过早退出,如果你还没有编辑列表中的最后一个文件,你会收到以下错误
E173: 还有 46 个文件要编辑
如果你真的想退出,只需再次执行此操作。然后它会起作用(但如果你在这两个命令之间执行了其他命令,它就不会起作用)。

07.3 在文件之间跳转

要快速在两个文件之间跳转,请按 CTRL-^(在美式键盘上,^ 位于数字 6 上方)。示例
:args one.c two.c three.c
你现在在 one.c 中。
:next
现在你在 two.c 中。现在使用 CTRL-^ 返回 one.c。再按一次 CTRL-^,你就会回到 two.c。再按一次 CTRL-^,你就会再次回到 one.c。如果你现在执行
:next
你就在 three.c 中。请注意,CTRL-^ 命令不会改变你在文件列表中的位置概念。只有像 ":next" 和 ":previous" 这样的命令才能做到这一点。
你之前编辑的文件被称为 "alternate" 文件。当你刚启动 Vim 时,CTRL-^ 不会起作用,因为没有之前文件。

预定义的标记

跳转到另一个文件后,你可以使用两个非常有用的预定义标记
`"
这会带你到离开文件时光标所在的位置。另一个记住的位置是最后一次更改的位置
`.
假设你正在编辑文件 "one.txt"。在文件中间某个位置,你使用 "x" 删除了一个字符。然后你使用 "G" 转到最后一行,并使用 ":w" 写入文件。你编辑了几个其他文件,然后使用 ":edit one.txt" 返回 "one.txt"。如果你现在使用 "Vim 会跳转到文件的最后一行。使用 . 会带你到删除字符的位置。即使你在文件中四处移动," 和 . 也会带你到记住的位置。至少在你进行另一次更改或离开文件之前是如此。

文件标记

在第 03.10 节中,解释了如何使用 "mx" 在文件中放置标记,并使用 "`x" 跳转到该位置。这在同一个文件中有效。如果你编辑另一个文件并在其中放置标记,这些标记特定于该文件。因此,每个文件都有自己的一组标记,它们是本地文件。到目前为止,我们一直在使用小写字母标记。还有大写字母标记。这些是全局的,可以在任何文件中使用。例如,假设我们正在编辑文件 "foo.txt"。转到文件的一半("50%")并在那里放置 F 标记(F 代表 foo)
50%mF
现在编辑文件 "bar.txt" 并将其最后的行放置 B 标记(B 代表 bar)
GmB
现在你可以使用 "'F" 命令跳转回 foo.txt 的一半。或者编辑另一个文件,输入 "'B",你就会跳转到 bar.txt 的末尾。
文件标记会一直记住,直到它们被放置在其他地方。因此,你可以放置标记,进行数小时的编辑,并且仍然可以跳转回该标记。通常将标记字母与放置位置之间建立简单的联系非常有用。例如,在头文件中使用 H 标记,在 Makefile 中使用 M 标记,在 C 代码文件中使用 C 标记。
要查看特定标记的位置,请为 ":marks" 命令提供一个参数
:marks M
你也可以提供多个参数
:marks MCP
不要忘记,你可以使用 CTRL-OCTRL-I 跳转到更早和更新的位置,而无需在这些位置放置标记。

07.4 备份文件

通常情况下,Vim 不会生成备份文件。如果你想拥有一个,你只需要执行以下命令
:set backup
备份文件的文件名是原始文件,在末尾添加了一个 ~。例如,如果你的文件名为 data.txt,则备份文件名是 data.txt~。如果你不喜欢备份文件以 ~ 结尾的事实,你可以更改扩展名
:set backupext=.bak
这将使用 data.txt.bak 而不是 data.txt~。这里另一个重要的选项是 'backupdir'。它指定了备份文件写入的位置。默认情况下,将备份写入与原始文件相同的目录,这通常是正确的做法。
注意:'backup' 选项未设置,但 'writebackup' 选项已设置时,Vim 仍然会创建备份文件。但是,只要写入文件成功完成,它就会被删除。这相当于一种安全机制,防止在写入失败时(磁盘已满是最常见的原因;被闪电击中可能是另一种原因,虽然不太常见)丢失原始文件。

保留原始文件

如果你正在编辑源文件,你可能希望在进行任何更改之前保留该文件。但是备份文件会在你每次写入文件时被覆盖。因此,它只包含上一个版本,而不是第一个版本。要使 Vim 保留原始文件,请设置 'patchmode' 选项。这指定了更改文件的第一个备份使用的扩展名。通常情况下,你会这样做
:set patchmode=.orig
当你第一次编辑文件 data.txt 并进行更改和写入文件时,Vim 会保留一个未更改文件的副本,名为 "data.txt.orig"。如果你对文件进行了进一步的更改,Vim 会注意到 "data.txt.orig" 已经存在,并将其保留。之后的备份文件将被称为 "data.txt~"(或者你使用 'backupext' 指定的任何扩展名)。如果你将 'patchmode' 保持为空(这是默认值),则不会保留原始文件。

07.5 在文件之间复制文本

这解释了如何将文本从一个文件复制到另一个文件。让我们从一个简单的例子开始。编辑包含要复制的文本的文件。将光标移动到文本的开头,然后按 "v"。这将启动 Visual 模式。现在将光标移动到文本的末尾,然后按 "y"。这将 yank(复制)选定的文本。要复制上面的段落,你会执行以下操作
:edit thisfile
/This
vjjjj$y
现在编辑要放置文本的文件。将光标移动到文本将要出现的位置之后。使用 "p" 将文本粘贴到那里。
:edit otherfile
/There
p
当然,您可以使用许多其他命令来剪切文本。例如,要选择整行,请使用“V”进入可视模式。或者使用CTRL-V选择矩形块。或者使用“yy”剪切单行,“yaw”剪切单词等。“p”命令在光标后粘贴文本。使用“P”在光标前粘贴文本。请注意,Vim会记住您是否剪切了整行或一个块,并以相同的方式粘贴回来。

使用寄存器

当您想从一个文件复制多个文本片段到另一个文件时,在文件之间切换并编写目标文件会花费大量时间。为了避免这种情况,将每个文本片段复制到它自己的寄存器。寄存器是 Vim 用于存储文本的地方。这里我们将使用名为 a 到 z 的寄存器(稍后您会发现还有其他寄存器)。让我们将一个句子复制到 f 寄存器(f 代表第一个)。
"fyas
“yas”命令与之前一样剪切一个句子。是“f”告诉 Vim 将文本放置到 f 寄存器中。它必须紧挨着剪切命令。现在将三行剪切到 l 寄存器(l 代表行)。
"l3yy
计数也可以放在“l”前面。要将文本块剪切到 b(代表块)寄存器。
CTRL-Vjjww"by
请注意,寄存器指定符“b”位于“y”命令之前。这是必须的。如果您将其放在“w”命令之前,它将无法正常工作。现在您在 f、l 和 b 寄存器中有三个文本片段。编辑另一个文件,移动光标并将文本放置在您想要的位置。
"fp
同样,寄存器指定符“f”位于“p”命令之前。您可以按任意顺序放置寄存器。文本会一直保留在寄存器中,直到您将其他内容剪切到其中。因此,您可以根据需要粘贴多次。
当您删除文本时,您也可以指定一个寄存器。使用它来移动多个文本片段。例如,要删除单词并将其写入 w 寄存器。
"wdaw
同样,寄存器指定符位于删除命令“d”之前。
附加到文件
当将文本行收集到一个文件中时,您可以使用以下命令。
:write >> logfile
这会将当前文件的文本写入“logfile”的末尾。因此,它被追加了。这避免了您必须复制行、编辑日志文件并将它们放在那里。因此,您节省了两个步骤。但是您只能追加到文件的末尾。要仅追加几行,请在键入“:write”之前在可视模式下选择它们。在第 10 章中,您将学习其他选择行范围的方法。

07.6 查看文件

有时您只想查看文件的内容,而不打算将其写回。您可能会在不经意间键入“:w”并覆盖原始文件。为了避免这种情况,以只读方式编辑文件。要以只读模式启动 Vim,请使用以下命令。
vim -R file
在 Unix 上,此命令应该执行相同的操作。
view file
您现在以只读模式编辑“file”。当您尝试使用“:w”时,您会收到一条错误消息,并且文件不会被写入。当您尝试更改文件时,Vim 会给您一个警告。
W10: 警告:更改只读文件
不过更改将会完成。这允许对文件进行格式化,例如,以便能够轻松地阅读它。如果您对文件进行了更改并且忘记了它是只读的,您仍然可以写入它。在写入命令中添加“!”以强制写入。
如果您真的想禁止对文件进行更改,请执行以下操作。
vim -M file
现在,任何尝试更改文本都会失败。例如,帮助文件就是这样。如果您尝试进行更改,您将收到以下错误消息。
E21: 无法进行更改,'modifiable' 已关闭
您可以使用“-M”参数将 Vim 设置为工作在查看器模式下。但这仅仅是自愿的,因为这些命令会取消保护。
:set modifiable
:set write

07.7 更改文件名

启动编辑新文件的聪明方法是使用包含您所需内容的大部分的现有文件。例如,您开始编写一个新的程序来移动文件。您知道您已经有一个复制文件的程序,因此您从以下内容开始。
:edit copy.c
您可以删除不需要的东西。现在您需要将文件保存在一个新名称下。可以使用“:saveas”命令来执行此操作。
:saveas move.c
Vim 会以给定名称写入文件,并编辑该文件。因此,下次您执行“:write”时,它将写入“move.c”。“copy.c”保持不变。当您想要更改正在编辑的文件的名称,但不想写入文件时,您可以使用以下命令。
:file move.c
Vim 会将文件标记为“未编辑”。这意味着 Vim 知道这不是您开始编辑的文件。当您尝试写入文件时,您可能会收到以下消息。
E13: 文件已存在(使用“!”覆盖)
这可以保护您免于意外覆盖其他文件。
下一章:usr_08.txt 拆分窗口
版权:请参阅 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
命令索引
快速参考