Vim 编辑器就像大海——置身于其中美妙而快乐,但总会有你不知道的事情。
虽然您无法独自发现海洋,但您始终可以从他人的经验中学习。
我将在本文中分享一些技巧,它们将帮助您像专业人士一样使用 Vim。
我经常使用它们,并且我看到专业的 Vim 用户在各个社区分享它们。
您应该将它们添加到您的 vimrc
文件,只要适用。 使用万能的 Vim 编辑器,您将获得更好、更流畅的体验。 相信我。
1:始终使用内置帮助
我不能强调这一点。 最大和最少使用的技巧是“RTFM”(阅读 f**king 手册)。
显然,互联网是人类未开发知识的最大集体资源,但当 Stack Overflow 出现故障时会发生什么?
让自己习惯 Vim 的内置帮助是您可以为自己做的最大的帮助。
查看 Vim 内部帮助的语法如下:
字首 | 例子 | 语境 |
---|---|---|
: | :help :w | 关于 ‘:w’ 命令的帮助 |
没有任何 | :help j | 关于“j”键在正常模式下的帮助 |
v_ | :help v_J | 关于在可视模式上下文中使用“J”键的帮助 |
i_ | :help i_<Esc> | 关于在上下文中使用“Esc”键插入模式的帮助 |
/ | :help /n | 关于搜索模式“n”的帮助 |
2:以普通用户打开,另存为root用户
在我编辑系统文件的记忆中,你很容易忘记添加 sudo
在 Vim 中编辑文件之前。 这将以“只读”模式打开一个文件。 这意味着你不能写任何东西给它。
但是您可能已经进行了一些重大更改。 并且可能无法记住您所做的每一次编辑。 因此,退出未保存的工作不是一种选择。
在这些情况下,在 Vim 中键入以下命令:
:w !sudo tee %
键入此命令后,将要求您输入密码 sudo
命令。 Enter 那,您的更改将被保存。
?你应该使用 sudoedit
命令而不是 sudo vim
用于编辑需要超级用户权限的文件。
让我们分解一下,了解这里发生了什么……
:w
– 这是写命令。 由于没有给出参数,Vim 会将整个文件写入标准输出。!sudo
– 跑过 ‘sudo’ 命令作为 shell 命令,而不是作为 Vim 命令tee
– ‘tee’ 命令用于从标准输入读取并将其写入标准输出或文件%
– Vim 用您正在编辑的当前文件的名称替换它。
这 :w
命令将整个文件写入 STDOUT(标准输出)。 然后,我们使用 sudo
命令(毕竟我们编辑的是系统文件)来获取临时权限。
百分号 (%
) 代表我们的文件名和 tee
命令从 STDOUT 获取 Vim 的输出并将其写入 %
文件。
这基本上可以解决 <Vim's STDOUT> | sudo tee /etc/ssh/sshd_config
. 一开始有点复杂,但 Vim 也是;)
3:将所有空格转换为制表符,反之亦然
我们都喜欢使用制表符或空格。
但是,如果您正在编辑与您的偏好相矛盾的缩进文本文件怎么办?
3.1:将所有空格转换为制表符
如果当前文件打算使用空格,并且您希望将它们转换为制表符,则需要运行两个 Vim 命令。
这两个命令如下:
:set noexpandtab
:retab!
这样做会将所有空格转换为其等效的制表符。 如果文档使用两个空格作为缩进宽度,它们将被转换为 1 个制表符。 如果将四个空格用作单个缩进宽度,则这四个制表符将替换为一个制表符字符。
3.2:将所有制表符转换为空格
如果您正在编辑的文件打算使用制表符,并且您想将制表符转换为空格,则必须运行四个 Vim 命令。
:set expandtab
:set tabstop=4
:set shiftwidth=4
:retab
第一个命令(expandtab
) 告诉 Vim 用空格扩展制表符。 第二条命令(tabstop
) 命令使用多少个空格作为一个“缩进块”。
在我们的例子中,我们定义“1 tab = 4 个空格”。 这 shiftwidth
命令用于控制使用时的缩进 >>
运算符,这也设置为 4 个空格。
最后, retab
命令将所有制表符(用于缩进)转换为空格。
4:缩进所有行
错误的缩进行会对 Python 和 YAML 程序造成严重破坏。
缩进 全部 线条, 请按 gg
到达顶部的关键。 然后按 =
键表示“缩进”,最后按 G
表示“最后一行”的键。
跟我重复; 这是 gg=G
缩进的组合键 所有线路.
这将自动缩进(尽 Vim 的能力)从第一行到最后一行的所有行。
下面是我使用缩进 Rust 代码的演示 :gg=G
命令。
如您所见(从这个有限的预览中),所有行都正确缩进。
锦上添花的是,不必错误地缩进行就可以使用 Vim 的缩进。
5:粘贴代码时保留缩进
承认吧; 我们都至少有一次从互联网上复制粘贴的代码。 但是当你粘贴时缩进弄乱了怎么办?
为避免这种情况,将以下行添加到您的 .vimrc
文件:
set pastetoggle=<F2>
有了这个改变你 vimrc
文件,按 F2
粘贴代码之前的键。 这样做将确保您的代码粘贴正确的缩进。
6:以正确的缩进深度开始书写
这是我最近才学会的一个方便的技巧。 假设你在一行的第一列,但是你写的内容需要缩进。
你如何以聪明的方式做到这一点? 不按制表符/空格?
答案是使用 S
在普通模式下键入。
当您位于一行的第一列时,按 Esc 键进入 Normal 模式。 然后按 S
(大写)键。 这会将您的光标移动到适当的缩进深度并自动进入插入模式,以便您可以开始输入。

您可以看到,在这个演示中,我的光标位于第一列,然后按 S
键,光标移动到正确的缩进深度,Vim 从正常模式切换到插入模式。
挺整洁的!
7:保存文件前显示差异
我们都去过那儿。 “我修改了这个文件,但不知道我改变了什么,现在我担心这个改变会导致意想不到的问题。”
解决这个问题的方法是查看缓冲区和文件之间的差异。
为此,请在 Vim 本身中执行以下命令:
:w !diff % -
让我们分解一下,以便您了解正在发生的事情…
:w
是保存/写入的 Vim 命令。 在此特定场景中,命令中未指定文件名,输出将写入 STDIN(标准输入)文件。:!<command>
是执行 shell 命令的语法。 在我们的例子中,我们正在运行diff
在我们的 shell 中执行命令。%
表示当前未修改的文件的名称。 试试这个:!echo %
.-
是标准输入文件diff
命令。
所以,这个命令首先写入所有 [unsaved] 内容到 STDIN 文件。 然后 diff 命令读取当前文件 (%
) 并将其与 STDIN (-
) 文件。
这个命令大致相当于这个shell命令-> diff <original-file> <Vim's STDOUT>
.
8:显示拼写错误
如果你从一开始就只使用 Vim,那对你有好处! 但也有人介绍过微软之类的文字处理软件 Word.
它有一个特性(或诅咒,对于非英文名字的人),其中 MS 的拼写检查器 Word 在拼写错误的单词下方放置一条红色波浪线。
Vim 中似乎“缺少”了该功能。 嗯,不完全是。
Vim 内置了一个拼写检查器。 您可以使用以下命令启用它:
:set spell
执行此操作后,您可能会看到拼写错误的单词被突出显示。 它们突出显示的方式取决于您的 Vim 配色方案。 我在这里的拼写错误的单词下面有一个白色下划线。

您的里程可能会因突出显示单词的方法而异。
要使其成为默认的 Vim 行为,您可以将以下行添加到您的 .vimrc
文件:
set spell
9:显示行号
像许多 Vim 用户一样,您可能已经尝试在 Vim 中启用行号。
有两种方法来表示行号。 一是绝对行号。 在这里,您可以获得每一行的绝对编号,就像任何其他代码编辑器或 IDE 一样。
第二个是相对行号。 在这种情况下,当前行获得数字“0”,并且每隔一行获得一个相对于光标所在行的上下文的数字。
如果您两者都喜欢,但不得不做出艰难的选择,选择其中一个而不是另一个,那么您并不孤单。 但您也不必选择其中之一。 你可以两者兼得!
您可以在 Vim 中启用“混合行编号”,方法是将以下行添加到您的 .vimrc
:
set number relativenumber
这将显示光标所在行的绝对行号和其他行的相对行号。
下面是演示混合行编号如何工作的屏幕截图:

目前,我的光标位于第 44 行,因此该行具有绝对行号。 但是我的光标上方和下方的行相对于具有光标的行具有相对编号。
10:打开 Vim,光标位于特定行
您过去可能曾想打开 Vim 并将光标设置到特定行而不是第一行。
这可以通过使用 +linenum
选项。 下面是这样做的语法:
vim +linenum FILE
替换单词 linenum
有一个实际的数字。

在这里你可以看到我打开了 /etc/ssh/sshd_config
将光标放在第 20 行和第 50 行上。这是使用 +linenum
选项。
11:使用可读的配色方案
在使用配色方案时,人们通常会选择他们认为最有吸引力或最美观的配色方案。 但是,当您将 Vim 作为代码编辑器兼 IDE 时,最好放弃一些吸引眼球的东西,转而使用具有更好视觉指南的颜色方案。
好的配色方案只是看起来不错,但出色的配色方案可以帮助您在颜色的帮助下轻松识别关键字、变量和其他标识符。
我个人最喜欢的一些配色方案如下:
- 净化 [preview]
- 日晒 [preview]
- 一半 [preview]
- 摩洛凯岛 [preview]
- vim 代码黑暗 [preview]
- base16-gruvbox-暗硬 [preview] (从 base16)
如果您不确定如何在 Vim 中使用配色方案,我们在 Linux 手册中介绍了它:)
额外提示:即使您处于插入模式,也可以删除文本
我们都知道您可以使用 d
和 x
在普通模式下删除文本的键。 但是如果你想要类似的东西怎么办 dd
在插入模式?
在这种情况下,您可以使用以下几个键绑定:
Ctrl + w
: 删除前一个单词(相当于db
在普通模式下)Ctrl + h
: 删除前一个字符Ctrl + u
:删除所有前面的字符,直到行首(相当于d0
在普通模式下)Ctrl + k
:删除所有前导字符,直到行尾(相当于d$
在普通模式下)
结论
我分享了一些我最喜欢的 Vim 技巧。 它涉及诸如缩进整个文件,在保存之前获取文件差异,在特定行打开带有光标的文件等等……
有些是较小的生产力推动力,而另一些(保存为 root 用户)可能是关键的生产力助推器。
发表评论,让我知道您将使用哪些技巧。 还有其他你引以为豪的很酷的 Vim 技巧吗? 与我们其他人分享。