掌握 Vim 语法
学习 Vimish
Vim 名词(动作)
整合起来
资源
关注@learnvim获取更多 Vim 技巧和窍门!
对很多人来说,使用Vim文本编辑器可能会让人不知所措。如果你像我一样,第一次接触 Vim 的时候,就是不小心打开它之后就无法退出。甚至有句俗话:
“Vim 很难掌握,但放弃更难”
好吧,那是四年前的事了。现在 Vim 是我的主要文本编辑器。我想分享一些技巧,教你如何提高 Vim 的使用效率,避免被它繁多的组合键弄得不知所措。
为了有效地使用 Vim,我们必须学习它的语言(不要与Vim 脚本混淆)。当我们理解了如何使用 Vim 语言(在本文中我将其称为Vimish)后,它会变得更加直观。不妨尝试一下,谁知道呢,也许你最终会转向 Vim!
归根结底,使用任何能让你最高效的编辑器,因为这才是最重要的。
学习 Vimish
我的母语并非英语。刚搬到美国时,沟通对我来说很困难。为了提高英语流利程度,我做了三件事:
- 增加词汇量
- 学习语法规则
- 练习,练习,再练习。
这需要一些前期工作,但我认为任何人都可以做到。
要学习 Vimish,我们也需要这样做。我会分享一些词汇和语法规则。然而,就像任何语言习得一样,掌握它需要反复练习。
让我们从语法开始:
verb + noun
就这样。接下来我们需要学习一些名词和动词。我会介绍以下内容:
- 基本名词(动作)
- 动词
- 更多名词(文本对象)
- 把它们放在一起
让我们开始吧。
Vim 名词(动作)
你们中的一些人可能已经了解 Vim 的概念,因为它们是你在普通模式下导航时使用的。如果你需要复习一下,可以看看这篇文章。想了解更多关于动效的信息,请查看:h motion.txt
。
目前,这些应该足够了:
h/j/k/l
- 左/上/下/右w,W
- 单词/词b,B
- 回溯一个单词/单词e,E
- 单词结尾,Word{/}
- 段落前进/后退0/$
- 行首/行末
你可以给动作添加量词。例如,j
表示向下一行。打字10j
可以让我们向下移动 10 行,而不是jjjjjjjjjj
。尽量使用量词,而不是重复相同的动作。
我在这里提到动作,是因为在 Vimish 中,它们与动词结合时也可以用作名词。让我们来学习一些动词。
Vim 动词
Vim 有很多操作符(撰写本文时有 16 个。查看:h operator
更多。你还可以使用插件添加其他操作符)。但是,根据我的经验,学习这 3 个操作符足以完成 95% 的编辑工作。
y
- 猛拉(复制)d
- 删除c
- 改变
现在我们知道了动作和操作符,让我们根据语法来构造句子verb + noun
。假设你有以下内容:
const learn = "vim"; // cursor on c
-
要删除一个单词,请执行
dw
。动词 (d
) + 名词 (w
)。 -
要将所有内容从当前位置拉到行尾,请执行
y$
(paste withp
或P
)。动词 (y
) + 名词 ($
)。 -
要更改前面的整个段落,请执行
c}
。动词 (c
) + 名词 ({
)。
顺便说一下,我们可以在语法中添加量词。例如:
-
要删除接下来的两个单词,请执行
d2w
。 -
要更改接下来的两行,请执行
c2j
。 -
要提取最后两个字母,请执行
y2h
。
附注:虽然 的结果2dw
与 相同d2w
,但它们在技术上是不同的。2dw
表示执行两次“删除一个单词” d2w
表示 *删除接下来的两个单词一次。两者的区别在于 Vim 认为的“更改”,如果你使用点命令,这一点很重要。所以请谨慎使用量词。你可以在这里阅读关于 Vim 点命令的文章。
关于 Vim 操作符的另一个补充说明是,您可以输入两次它们来对整行执行操作。dd
,yy
,并对整行cc
执行删除,复制和更改。
一旦你掌握了基本的动词和名词,它就会变得直观。目标是练习足够多,这样你就不用再思考了。就像学习一门新语言一样,你希望能够毫不费力地说出来。
我认为这种组合性正是 Vim 的闪光点。通过学习这三个动词和一些名词,我们可以创建强大的指令。
我们还没有完成 - 让我们继续讨论 Vim 最强大的名词:文本对象。
Vim 名词(文本对象)
如果我正在删除一个单词,该怎么办?我是否必须回到该单词的开头(b
)并删除该单词dw
?
Vim 允许你删除当前所在的“组”。它适用于段落、括号对、引号对等等。任何围绕着你的对象都被称为文本对象。使用文本对象的方法如下:
- 内部:
i
+对象 - 外部:
a
+ 对象
假设我有这个功能:
const hello = function() {
console.log("Hello World"); // your cursor is on letter H in Hello World
return;
}
- 要删除整个“Hello World”,请执行
di(
。动词 (d
) + 名词 (i(
) - 要删除整个函数内容,请执行
di{
。动词 (d
) + 名词 (i{
) - 要删除整个“Hello”字符串但保留“World”字符串,请执行
diw
。动词 (d
) + 名词 (iw
)
以下是一些常见的文本对象:
w
- 单词p
- 段落( { [ <
- 括号t
- XML标签" '
- 引号
额外奖励:更多名词
Vim 名词不仅限于动作和文本对象。我们也可以使用搜索。例如:
f / F
- 包含向前/向后搜索,同一行t / T
- 独家向前/向后搜索,同一行/ / ?
- 向前/向后搜索
将其应用到我们的语法中:
- 要从当前位置删除到“z”的第一个实例,请执行
dfz
。动词 (d
) + 名词 (fz
-find z)。 - 要删除第三个“e”之前的所有内容,请执行
d3fe
。 - 要删除从当前位置向后到第一个“a”的所有内容,请执行
dFa
。 - 要删除除“x”之外的所有内容,
dtx
- 要删除当前所在的行,请转到“const hello”的下一个实例
d/hello
。
动词也可以用标记。标记示例:
ma
(在寄存器“a”上标记位置)
Mark 可以与字母表中的任意字母 (az) 一起使用,因此您最多可以设置 26 个标记(如果算上全局标记,严格来说是 52 个,但这是另一个话题)。回想一下,要跳转到标记,您可以:
'a
(跳至标记为 a 的行首)`a
(跳至标记为 a 的行和列)
要将标记用作名词,您可以标记一个位置,前往标记之前/之后,然后d'a
删除当前位置和a
标记之间的所有内容。
整合起来
我们刚刚学习了 Vim 语法基础:
Verb + noun
我们学习了一些 Vim 动词和名词:操作符和动作。操作符(d
、y
、c
)构成了基本动词。动作、文本对象、搜索和标记构成了我们大部分的名词。还有很多动词和名词,我只是提到了其中的一小部分。与语言习得类似,学习 Vim 需要时间才能自然流利。但是,一旦我们学会了如何使用 Vimish,我们就可以发出强大的命令。
你会注意到,这条规则可以应用于许多命令。我最激动人心的 Vim 时刻之一,就是当我开始自己将这条语法规则应用于新的运算符时。例如,gu
和gU
分别是将字母转换为小写和大写的运算符。因为它们是运算符,所以它们可以用于名词。guiw
将单词转换为小写。gU$
将当前位置到行末的单词转换为大写。我只是凭直觉做了这件事,而且它确实有效——因为它们遵循相同的语法规则。我希望你很快就会拥有你的“AHA”时刻,即使还没有。
将这些知识转化为肌肉记忆并非一个周末就能完成的。这需要更长的时间。我已经把我的知识传授给大家,现在就看你怎么运用了。感谢你读到这里,我深表感谢。
编码愉快!