Top 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”无法暴露出来。

这是一个非常有用的技巧,我肯定会使用它,谢谢!!:)

回复 ,作者:Laurie Baker (未验证)

运行 '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 -- 进行“that”替换“this”的操作,但仅在某些行上。
点 (.) 是当前行的别名,$ 是文件末尾
:.,$ 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) 获取您当前在最底行所处的行/字符位置
"[No Name]" [已修改] 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。

行号的乐趣!:-)

太棒了,感谢分享!!

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

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

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

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

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

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

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.