Vim A 到 Z - 字面意思
TL;DR(大概):这篇文章列出了 Vim 中的选项和快捷键。如果你是第一次接触 Vim,请慢慢来,先阅读一些内容,记住一些,等你感觉比较熟悉之后再回来学习更多。Vim 对新手来说可能有点复杂,但学习之后也会更有成就感!
Vim 是我近几年学习过程中接触到的最佳工具之一。我写过不少关于 Vim 的文章,包括读完精彩的《Practical Vim》之后的一篇入门文章,以及一些高级功能介绍。 我还收集了大量开源的技巧和笔记。 但最近我感觉 Vim 的教育意义被忽略了:Vim 的每一个按键都遵循语音逻辑,理解这些逻辑及其背后的原理,就能更容易地克服陡峭的学习曲线。
以下列表既包含 Vim 作者的原始意图,也包含我为了帮助自己记住刚开始使用 Vim 时的操作而添加的一些内容。Vim 对每个字符都有其特殊且不同的含义,包括大小写以及与之组合的操作。列表将按字母顺序逐一介绍每个字符,并提供一些实用技巧。
约定:Vim 的按键序列位于 `<in>` 标签内code blocks,有时会跟有 `<in>`<CTRL>或 `<in>`标签,这些标签的标记方式不同,因为它们在不同的键盘上映射不同。序列的起始位置<ESC>也很重要;例如,当光标位于 `<in>` 标签之前时,需要标记 `<in>` 标签。[start: x]
那么,废话不多说,以下是我的Vim A-->Z 列表……
A - 附录、修改
小写字母a会将光标切换到插入模式,插入到当前位置右侧的字符。
例如:[start: W]在WRD("W") 处:使用以下序列:aO<ESC>,光标最终会回到正常模式并WORD写入;a开始编辑到右侧W,O插入,然后<ESC>返回正常模式。
大写字母的A效果与大写字母相同,但位于行尾。例如,如果我的文本是“” TWO WORD,运行后AS.<ESC>会得到“” TWO WORDS.。
提示:它的对应字母是I“”,效果与A大写字母相同,但位于行首。
B - 向后,开始
小写字母b会移动到当前单词的开头;如果光标已在当前单词的开头,则会移动到上一个单词的首字母。`\`` 的B作用相同,但会移动到行首(开始明白了吗?)。我喜欢把 Vim 的按键和重键对应起来。
提示:对应的按键是e`\`(结束)或w`\`(下一个单词的开头)。
C - 变更
c通常情况下,`\`` 后面会跟一个移动命令;c结合上面列出的命令b,`\`` 会将你带入插入模式,并将当前位置到单词开头的所有内容都替换掉。
例如:[start: R]在 ` \` 中WORD,按下 `\` cbX,你会得到`\` XRD。
由于任何 Vim 移动命令都与此相关,因此它可以与一些强大的组合使用;例如,`\`ciw表示“更改单词”,`\` 会删除该单词并切换到普通模式。C在 `\` 的情况下,`\` 会将当前位置到行尾的整行都替换掉。
提示:` D\` 会执行相同的操作(我们稍后会看到),但不进入插入模式。
D - 删除
d会删除后续的任何动作,因此diw相当于“删除单词”,这与类似ciw,但最终结果仍然是普通模式。
常用组合:
dip“删除段落中的内容”dgg- “从这里往上删除”dG- “从这里往下删除”dd“删除当前行”提示:有一个类似的命令x,效果大致相同,但只能作用于单个字符。
E - 结束
e:你猜对了——带你到e单词的结尾或E一行的结尾。
F - 找到!
这是一个非常实用的移动指令;f它可以找到与其组合的字符;例如,fX它可以找到该X字符在句子中的下一个出现位置。使用 ` (night result)`F也能达到同样的效果,但方向相反。
技巧 1:结合;`(night result)`,`find` 在 Vim 中成为一个非常强大的移动指令,可以快速找到一个字符,而无需像以前那样缓慢地或通过更多按键来移动。`find`;既可以向前也可以向后使用——具体取决于原始移动指令(`( fnight result )` 和 `(night result F)`)。
技巧 2:` ffind` 可以与其他移动指令结合使用,例如,标记一个视觉块直到某个特定点(包括该点),可以使用`((night result)` 来标记目标字符所在的vfx位置。让我们举一个更具体的例子;考虑一行“Here sleeps the hairy brown fox” ,目标是在视觉上标记“Here sleeps the hairy”,可以使用 `((night result))` 来标记直到字符 y(包括该字符)。小技巧:如果最终结果相同,但不包括最后一个字符,可以使用`((night result))`来标记到y。x[start: H]vfytvty
我们已经完成了f——让我们来看一张展示其中部分内容的图片:
G - Go
这其实是我个人的理解,g虽然功能有所不同,但 Vim 的作者并没有赋予它特定的意义。一些常用的组合:`\n`gg可以跳转到文件开头,而 `\ Gn` 则可以跳转到文件末尾。
提示:可以使用 `\n` 查看所有选项的完整列表:help *g*。
H - 箭头替换
hhjkl是Vim 中四个基本方向键(左右、上下)之一,其中h表示向左移动。Giuseppe Caruso
建议添加:会将光标移动到页面顶部。H
我 - 插入
i是 Vim 中最有用的快捷键之一,可能仅次于<ESC>。i它用于从普通模式切换到插入模式。同样,I它的作用是修改行首。
实用(且高级)技巧:
由于I它编辑的是行首,这并非用户的常规需求,因此我发现自己需要为代码块或多行添加前缀。使用可视代码块(我们将在下文中介绍V),可以使用标记来标记一个可视代码块<CTRL>v,然后在标记后使用I开始编辑。编辑完成后,按<ESC>返回
普通模式,但整个代码块都会带有修改后的前缀。
例如:[start: L]命中<CTRL>vjjI*<SPACE><ESC>:
Line one
Line two
Line twenty-two
你能猜到结果吗?
让我们回顾一下动议:
- 启动一个可视化模块(
<CTRL>-v) - 向下跳两次(
jj) - 在行首插入一个星号,后跟一个空格。
- 回到正常模式,瞧:奇迹发生了😮
* Line one
* Line two
* Line twenty-two
J - 箭头替换
jhjkl是Vim 中四个基本方向键(左右、上下)之一,其中j代表向下方向。
提示 1:j是一个不常用的英文字母,而且键盘上的 键位置比较远,考虑到它在切换回正常模式时经常使用,
所以有一个约定,就是将 映射jj到<ESC>,并使用已读的 键进行切换。
为了方便起见,这里列出映射关系:imap jj <Esc>。和其他任何改变一样(尤其是在 Vim 中),这需要一段时间来适应,但绝对值得等待。
提示 2(读者建议@argon2008aiti):J(大写) 会将光标所在行的下一行连接到光标所在位置,这在光标位于行尾,需要将下一行连接到同一位置时非常有用。通常,用户会向下移动一行,找到句子的开头,然后向后删除到前面的位置。
K - 箭头替换
Khjkl是Vim 中四个基本箭头(左右、上下)之一,其中k用于向上。
L - 箭头替换
Lhjkl是Vim 中四个基本方向键(左右、上下)之一,其中l表示向右。(考虑到这篇文章的主题,这种想法有点荒谬,人们通常会认为“l”表示向左 :+1)…… :trollface:
M - 马克
Vim 支持强大的标记功能。它使用寄存器(Register)来保存文档中的位置,例如m:` \save_location`ma会将当前位置保存到寄存器中a,使用 `\save_location` 可以从其他位置返回到该位置'a(` a\save_location` 可以替换为任何其他可以表示寄存器的字符)。
相关提示:如果您忘记标记位置(在工作流程中我们通常会忘记),`\save_location`''将始终跳转到上一个位置。Giuseppe Caruso
建议的补充:`\save_location` 会将光标移动到页面中间(与 `\save_location` 相同)。Mzz
N - 下一个
n这将跳转到n搜索结果的最后一个结果。由于这是一个循环移动(最后一个结果之后的下一个结果就是第一个),因此n可以使用 `\` 和 `\` 来前进和N后退。
相关信息:对于不熟悉 Vim 的用户,搜索是通过 `\`/后跟搜索文本来触发的。除了搜索外观或特定结果这种显而易见的用途之外,即使您已经知道并看到了目标的位置,这也是一个很有用的移动方式。移动光标有时比直接搜索单词(可能还要结合 `\` n)需要更多的按键操作。
O - 开路
不确定这是否真的是作者的本意,但o它的确会这样做:在光标下方另起一行。使用O会做同样的事情,但会在光标上方打开。
这里有个问题我还没找到满意的解决方案:
o在插入新行时,我经常需要在光标上方或下方新建一行,而不是添加新文本。我尝试过不同的映射和组合,但最终还是回到了最初的问题,即使用 `\` 键o。<ECS>我想借此机会请教一下——有没有人找到更好的方法来解决这个问题?
P - 粘贴,段落
p`\s` 最常见的用法是粘贴已剪切y或已删除的内容(请记住,Vimd也将删除视为剪切)。`\s`p粘贴操作发生在光标之后P,而 `\s` 粘贴操作发生在光标之前。
提示:寄存器再次派上用场;要从寄存器粘贴内容,请在移动操作之前将其组合起来:如果文本已保存到寄存器中a,"adiw则 `\s` 会“在 Word 中删除内容并保存到寄存器 a”。使用寄存器的内容,并使用 `\s` 粘贴"ap(即“从寄存器 a 粘贴到光标之后”)。
Q - 退出(以及所需的宏)
这个拼写错误的单词是我最初记住宏起源的地方的方式 :)q它用于退出 Vim,可以用于退出并继续编辑,也可以用于即使工作尚未保存也退出等等。:q此外 ,作为一种操作,它用于记录一系列操作并重复执行,或者用 Vim 术语来说就是“宏”。关于宏(内容非常丰富),我会在下一篇博文中详细介绍。 现在,这里有一个小技巧:记录操作就像剪切和复制一样,需要写入寄存器;使用 `\n`记录到寄存器 `\n` ,然后执行一系列命令。再次按下 `\n`会停止记录,使其可以再次使用 `\n` 执行。:qwq!qqqqq@q
R - 替换
虽然r`\n` 只是简单地将当前字符替换为另一个字符(例如,`\n`ra会将当前位置替换为 `\n` a),R但 `\n` 却是一个功能强大但很少见的选项;R它会切换到特殊的替换模式,这本质上是一种会覆盖现有字符的插入模式。当块宽度很重要或存在对齐顺序时,这个小功能就非常有用。
S - 替代物
说实话,s这个组合键是我唯一没记住的,因此我从来没用过。我觉得用组合键c切换到插入模式s完全没必要。在“原地”编辑时,它也能做到同样的效果:替换当前字符并从那里继续编辑。当最终结果只是替换单个字符时,这个组合键很有用,但这也可以用x`&`i或 ` r&`来实现<ESC>。
使用`&`S会在保持插入模式的同时替换当前代码块。
提示:我个人将 `&` 映射<leader>ss到了切换 Vim 的拼写检查器(是的,它有拼写检查器),映射如下:
nnoremap <leader>ss :setlocal spell spelllang=en_us<CR>
我还有另一个“s”映射,用于ss在搜索某个单词后禁用所有搜索结果的高亮显示,以下是我的 .vimrc文件中的映射:
nnoremap ss :noh<CR>
T - 到
如前文F部分所述,t表示“执行某事直至(或到)”;vtx表示“视觉上标记为x”(不带x)。或者dtf(这只是一个随机示例……)可以是“删除字符f”。
U - 撤销
就这么简单,u它可以撤销更改。它的高级版本U则会产生一种奇怪的结果——撤销自光标上次移动到同一行以来对该行所做的更改。
V - 视觉
v是你在 Vim 中标记字符/单词/行/块以便对其进行某些操作的方式;d删除、y标记或缩进(>>)。
W - 词
e前面多次提到过这个动作,因为它与`nd` 和 ` ack`密切相关b;`and`w是一个跳转到下一个单词开头的动作。`and`W非常有趣:`and`w是当前单词,而W`and` 是“单词块”,这意味着它包含两个空格之间的所有字符。
例如:“some-name,still-no-space”不是一个w单词,但如果 Vim 将其视为一个单词,则 Vim 会将其视为一个单词W。
这有什么用呢?当然是配合动作使用:` viWand` 是“在单词中(两个相邻空格之间)标记一个块”。显然,它可以与 Vim 中的任何其他动作结合使用。
X - 划掉?
英文字母中有一个字母我找不到对应的音标;x它会删除光标下的单个字符。(记住:s也会进入插入模式,x但不会。)X结果相同,只是方向相反。
Y - 扬克
Vim 中最实用、最基本的操作之一就是y复制文本,默认情况下会复制到未命名的寄存器中,以便p稍后粘贴到另一个位置。它的高级版本Y可以一笔复制整行(我习惯用 `\` 来做同样的事情yy)。
Z——欢迎!最后一个,也是它本身几乎没什么用的东西:“Z”
虽然它本身z没有任何作用(:help z),但它负责 Vim 的一个实用功能“折叠”,用户可以将文本换行并折叠成可折叠和可展开的块,在我的 Vim 笔记本中可以了解更多信息。ZZ是快速保存和退出的方法——是的,你那复杂且费力的:wq!操作对 Vim 和你的身体来说都太过了。
朱塞佩·卡鲁索提出的补充建议:
zz将该行放置在缓冲区中间。zt窗口顶部的光标线zb窗口底部的光标线
好了!列表已完整。
尚未涵盖(但将在即将发表的文章中介绍):键盘上所有其他可用的符号,包括强大的.命令、宏@@、正则表达式系列$^...、小巧但功能强大的%等等。
如何使用这份列表?阅读之后,我建议尝试按字母顺序记住每个字母的发音,甚至可以把它们做成单词卡片!理解了这些字母之后,将它们组合起来,并运用 Vim 中最少按键次数的理念,就能将其变成一套强大的工具,而不是一场脑力斗争。
感谢您阅读至此!
我叫奥默,是 ProdOps 的一名工程师。ProdOps 是一家全球咨询公司,我们通过采用 DevOps 文化,以可靠、安全且简便的方式交付软件。欢迎在下方评论区留言,或直接在 Twitter 上关注我 @omergsr。如果您喜欢这篇文章,请点赞,这将有助于我更好地创作未来的文章。
