Vi 实用技巧 Top 11

无论您是 vi 新手还是希望温故知新,这些快捷方式都将帮助您快速成为高级用户。
434 位读者喜欢这篇文章。
How do we fix the state of technical documentation?

Victor 通过 Flickr 拍摄。CC BY 2.0

vi 编辑器 (vi editor) 是 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 -- 将 '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) 获取您当前在最底行处的行/字符位置
"[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。

行号的乐趣! :-)

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

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

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

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

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

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