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 (如上所示)来保存并退出,这实际上没有任何区别。

替换

如果你想用另一个词替换每个出现的词,这是一个很棒的技巧。例如,如果你想在一个大文件中用“laptop”替换“desktop”,那么搜索每个“desktop”的出现,删除它,然后键入“laptop”将是单调乏味且浪费时间的。

  1. 命令 :%s/desktop/laptop/g 将在整个文件中用“laptop”替换每个出现的“desktop”;它的工作方式就像 Linux sed 命令一样。

在这个例子中,我用“user”替换了“root”

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”,它允许你撤消任何编辑...例如删除 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.