Vi 编辑器 11 个实用技巧

无论你是 vi 新手还是想要复习一下,这些快捷方式都将帮助你快速成为高级用户。
434 位读者喜欢这篇文章。
How do we fix the state of technical documentation?

Victor 通过 Flickr 网站发布。CC BY 2.0 许可

vi 编辑器 是 Unix 和类 Unix 系统(如 Linux)上最流行的文本编辑器之一。无论你是 vi 新手还是仅仅想要复习一下,这 11 个技巧都将提升你使用它的效率。

编辑

编辑长脚本可能很乏味,尤其是当你需要编辑很下面的某一行时,滚动到那里可能要花费数小时。这里有一个更快的方法。

  1. :set number 命令会在左侧为每一行编号。

the :set number command

opensource.com

你可以通过打开文件并在命令行界面 (CLI) 中输入以下命令直接跳转到第 26 行:vi +26 sample.txt。要编辑第 26 行(例如),命令 :26 将直接带你到那里。

using the :set number command

opensource.com

快速导航

如果你注意到错误或错别字,能够快速修复非常重要。幸运的是,vi 已经考虑到了这一点。

  1. i 将你的模式从“命令”模式更改为“插入”模式,并在当前光标位置开始插入文本。
  2. a 的作用相同,只是它从当前光标位置之后开始插入。
  3. o 从当前光标位置的下一行开始插入。

删除

理解 vi 的删除功能至关重要,这样你就不会意外地按下某个键并永久删除一行、一段或更多内容。

  1. x 删除光标下的字符。
  2. dd 删除当前行。(是的,整行!)

这是令人紧张的部分:30dd 将删除从当前行开始的 30 行!使用此命令时请务必小心。

搜索

你可以从“命令”模式搜索关键字,而不是手动导航并在大量文本中查找特定单词。

  1. :/<keyword> 搜索 < > 空间中提到的单词,并将光标移到第一个匹配项。
  2. 要导航到该单词的下一个实例,请键入 n,并持续按它直到找到你要查找的匹配项。

例如,在下面的图片中,我搜索了 ssh,vi 高亮显示了第一个结果的开头。

Searching for "ssh"

opensource.com

在我按下 n 后,vi 高亮显示了下一个实例。

using the 'n' command to find the next instance of "ssh"

opensource.com

保存并退出

开发者(和其他人)可能会觉得下一个命令很有用。

  1. :x 保存你的工作并退出 vi。

the :x command

opensource.com

  1. 如果你认为每一纳秒都值得节省,这里有一个更快的方法来切换到 vi 的终端模式。与其在键盘上按 Shift+:,你可以按 Shift+q (或大写的 Q) 来访问 Ex 模式,但如果你只想通过键入 x(如上所示)来保存并退出,这实际上没有任何区别。

替换

如果你想将一个单词的所有出现都替换为另一个单词,这里有一个巧妙的技巧。例如,如果你想在一个大文件中将 “desktop” 替换为 “laptop”,那么搜索 “desktop” 的每次出现、删除它并键入 “laptop” 将会非常单调且浪费时间。

  1. :%s/desktop/laptop/g 命令会将文件中所有出现的 “desktop” 替换为 “laptop”;它的工作方式就像 Linux sed 命令一样。

在这个例子中,我将 “root” 替换为 “user”

typing the substitute command

opensource.com

the substitute command result

opensource.com

这些技巧应该可以帮助任何人开始使用 vi。还有其他我遗漏的实用技巧吗?请在评论中分享。

标签

42 条评论

FYI:ZZ 也是 :x 和 :wq 的别名

不用鼠标进行复制粘贴(或者如果你在没有鼠标的终端/ssh 中)

按 v,使用方向键或 h、j、k、l 移动以选择文本。按 y 进行 “yank”(复制),然后将光标移动到新位置并按 p 进行 “pull”(粘贴)。
也可以按 d 来改为删除。

我之前没有太多 vi 的经验,但它总是因其简洁性而吸引我。感谢你的文章,我与 vi 的关系将会更加友好了)):x

很高兴听到这个!我尝试包含了我使用的所有命令,希望这足以让你开始使用 vi :-)

回复 ,作者:Tom

我以前能够通过 ssh 复制粘贴到 vi 中,但现在它会更改为可视化模式,并且不接受粘贴。

嗨,
它确实会更改为可视化模式,尽管我可以通过键入 p 来粘贴。我不确定不同的 Linux 发行版在这种情况下是否表现不同。

回复 ,作者:cybernard (未验证)

嗨,要不保存更改退出
:q!

或许值得一提的是,l 向右移动,j 向下移动,k 向上移动,h 向左移动。这些键中的任何一个都可以加上一个数字前缀,例如 26j 将向下移动 26 行。此外,$ 移动到行尾,0 移动到行首。我认为了解这些键对于能够在 vi 中导航至关重要。

你提到了替换,但你也可以使用正则表达式进行搜索。:/ 将你带到包含文本行的开头,n 依次跳转到文本出现的每个位置。

当使用 :q 退出时,如果你更改了某些内容,vi 不会让你退出。使用 :q! 强制退出而不保存。

我也经常使用 yy。它将行复制到缓冲区,然后可以使用 p 粘贴。与许多其他命令一样,它可以带一个可选的数字前缀,例如 6yy 复制 60 行。p 也接受数字。当你使用 dd 删除行时,它们也会进入缓冲区,并且可以使用 p 粘贴。p 粘贴缓冲区中的行数,但如果使用数字,缓冲区行将被多次粘贴。

自从我在 Unix 上开始我的 IT 职业生涯以来,vi 编辑器一直是一个常量。无论我使用的是哪个 Unix 或 Linux 变体,它都是我可以确信可用的编辑器。以下是我经常使用(并且已经使用了近 30 年)的一些有用的 vi 命令:-

要快速保存并退出 vi,请使用
Shift + ZZ

要从当前光标位置删除到行尾
Shift + D

要删除特定行数,例如 5 行,请使用
5dd

要删除一个单词
dw

要在行尾追加内容
Shift + A

要复制行(yank 和 put),请将光标定位在要复制的行上,然后使用
yyp

要复制 5 行,请使用
5yyp

注意,复制行时,在你 y(yank)行之后,你可以在 p(put)之前将光标定位到文件中你需要的位置。

要转到文件末尾
Shift + G

要转到特定行号,例如第 22 行
22 Shift+G

vi 中还有无数其他功能,但你通常会找到最有用的功能并坚持使用它们。然而,有时你会遇到需要特殊功能的场景,而 vi 似乎总能找到解决方案。现在,我喜欢使用 vim (Vi Improved),因为它添加了一些不错的功能,包括文本高亮显示

我没有看到提到的一件事,并且在删除部分中会是一个额外的奖励是 “u”,它允许你撤消任何编辑...例如,删除 6 行而不是一行...每次 “u” 都会一次删除最近的编辑,一直回到上次保存的状态。话虽如此,复习 VI 是件好事,但在多年使用相同的旧选项后,当一个有用的选项被公开时,真的很好。可能已经提到过的一个选项是 “:set list”,这在调试文件中嵌入了一些虚假的隐藏字符,而 'cat' 或 'grep' 无法暴露这些字符时,非常有用。

运行 'vimtutor' 以学习更多关于 vi/vim 的有用技巧。

使用 g+ 在较新的更改之间移动,使用 g- 在 undolist 中较旧的更改之间移动。Vim 的集成时间机器 ;)
并且不要忘记 :h g+ 和 :h g- 以及 :h undolist

啊,vi 的技巧真多。你还可以使用锚点/标签来控制特定的内容。例如:
:10,90 d -- 删除第 10 行到第 90 行
:5,90 s/this/that/g -- 将 'this' 替换为 'that',但仅在某些行上。
点 (.) 是当前行的别名,$ 是文件末尾
:.,$ s/argh/grah/g -- 从本行到文件末尾进行替换。

如果你在空白行并且处于命令模式,请键入 ! 和一些命令,输出将作为文本插入(在编写关于命令如何工作的文档时非常方便)

~
~
~
:.,$!ifconfig -a

enp0s3: flags=4163 mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
...
...
...

~
~

在命令模式下,使用 ^g (control g) 获取你当前在最底行的行/字符位置
"[无名称]" [已修改] 30 行 --10%--

哦,在命令模式下使用 ~ 可以将大写字母转换为小写字母,反之亦然

句点 (.) 是我最喜欢的、鲜为人知的 vi 命令之一。它重复上一个操作,例如更改单词、删除行或放置段落。它非常适合你想选择性地执行的重复性任务。例如,要将每个 “the” 实例更改为 “THE”,请执行以下操作
/the
cwTHE
n
.
n
.
这将一次查找并更改 “the” 的每个实例。如果你不想更改某个实例,只需再次点击 n 以继续到下一个。

:set nu 与 :set number 相同
:set nonu “取消设置” 数字(恢复正常边距)

有一个名为 VIM Adventures 的游戏,它提供了一种有趣的方式来学习 VIM。
前几个级别是免费的。

是的,它让人上瘾,我玩到了第 2 级结束(最后一个免费级别):D

回复 ,作者:Chris Hiner (未验证)

Control + g 将显示文件名、光标所在行的行号、文件中的总行数以及比例(例如,27%)。

除了在替换命令中使用 %,你还可以使用行号。:1,5s/Foo/Bar/g 将把文件的前 5 行中的 Foo 替换为 Bar。你可以使用 . 作为包含光标的行号,$ 作为文件中的最后一行,因此 :.,$s/Foo/Bar/g 将从当前行到文件末尾将 Foo 替换为 Bar。

正如你所提到的,:35 会将你带到第 35 行。也支持数学运算,因此 :.+5 会将你向下移动 5 行,而 :.-24 会向上移动 24 行。:.,.+20s/Foo/Bar/g 将在接下来的 21 行中将 Foo 替换为 Bar。

行号的乐趣!:-)

我最喜欢的是 '%s' 全局搜索和替换。
有趣的故事,当我还是个 IT 小伙子的时候,我的经理让我面试一个人。我两分钟后回来了,他问我发生了什么事?
我只是说,“他不懂 Unix”,尽管这是他简历上写的。
我让他坐在 shell 前,向我展示如何执行一些 vi 命令。我认为如果你说你懂 Unix,你就应该懂 VI。这总是为我节省了面试时间。

致所有潜在的求职者:这是一个免费的建议 ^^ :-D

回复 ,作者:Johnny R (未验证)

vi 非常强大,但有时我把正在编辑的文件搞得一团糟,只想重新开始

:e! 丢弃自上次保存以来的所有更改

感谢你的分享。其中一些技巧多次拯救了我的性命 :)

很棒的文章。Vim,我最喜欢的编辑器之一,我在 Linux 上使用过

© . All rights reserved.