Vi 编辑器 11 个实用技巧

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

Victor via 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. :/<关键字> 搜索 < > 空格中提到的单词,并将您的光标移动到第一个匹配项。
  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 (如上所示)来保存并退出,这实际上没有任何区别。

替换

如果您想用另一个词替换每个出现的词,这是一个简洁的技巧。例如,如果您 想在一个大文件中用“laptop”替换“desktop”,那么搜索“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 编辑器一直贯穿我的 IT 职业生涯,从 Unix 开始。无论我使用的是哪个 Unix 或 Linux 变体,它都是我可以确定可用的编辑器。以下是我经常使用的一些有用的 vi 命令(并且已经使用了近 30 年):-

要快速保存并退出 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”,它允许您 UNDO 任何编辑... 例如删除 6 行而不是一行... 每个 “u” 将一次删除最近的编辑,一直回到上次保存。也就是说,复习 VI 很好,但在使用相同的旧选项多年后,当一个有用的选项被公开时,真的很好。可能已经提到过一个,但再次提到的是 “:set list”,这在调试文件中嵌入了一些虚假的隐藏字符时非常有用,而 'cat' 或 'grep' 只是没有公开这些字符。

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

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

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

通过 g+ 在您的更改之间移动以查看较新的更改,通过 g- 在您的撤消列表中查看较旧的更改。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) 获取您当前在最底行处的行/字符位置
"[无名称]" [已修改] 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 编辑器之一

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