顶级 11 个 vi 技巧和窍门

无论您是 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+q(或大写的 Q)来访问 Ex 模式,而不是在键盘上按 Shift+:,但是如果您只想通过键入 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 粘贴缓冲区中的行数,但如果使用数字,缓冲区行将被多次粘贴。

vi 编辑器在我从 Unix 开始的 IT 职业生涯中一直是一个常数。无论我使用的是哪个 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- 表示撤消列表中的较旧更改。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
...
...
...

~
~

inj 命令模式,^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。总是在面试中节省我的时间。

vi 非常强大,但有时我搞砸了我正在编辑的文件,以至于我只想重新开始

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

感谢您的分享。其中一些技巧多次挽救了我的生命 :)

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

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.