使用 Vim 运算符进行神奇的编辑
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
动作不仅仅用于移动。它们可以与一系列称为运算符的命令结合使用,以闪电般的速度编辑代码。
你可以按照以下任意一种模式将运算符和动作结合使用:
{operator}{count}{motion}
{count}{operator}{motion}
- 操作员决定要执行的操作:删除、更改、复制、格式化等。
- 计数功能允许你通过执行操作计数次来倍增运算符的效果。
- 该动作表示要对操作符定义的操作应用的文本段。
例如,该d2w组合允许您删除两个单词 1。
d对应于删除运算符。由于d是一个运算符,您可以按照{operator}{count}{motion}公式将其与您目前为止学到的所有操作结合起来:
- 用于
d5j向下删除 5 行 - 输入此字符
df'可删除当前行中从光标位置到第一个'指定字符位置之间的所有内容(包括该字符本身)。 - 或者输入
dt'类似上面例子的内容,但排除该字符(即直到该'字符之前或之前的部分)。 - 用于
d/hello删除直到第一次出现以下内容为止的所有内容:hello - 输入
ggdG以删除整个文档
常用运算符
除此之外d,还有一些其他方便的操作符:
c(更改):更改运算符会删除一段文本,然后进入插入模式,以便您可以继续输入,将原始文本更改为其他内容。更改运算符类似于将 `dand`i命令合并为一个运算符。这种双重性使其成为最有用的运算符。y(y ank):Vim 术语中的复制p(p put):粘贴 Vim 术语g~(switch case): 将字母从小写改为大写,反之亦然。或者,使用 `switch case`gu将字母转换为小写,使用 `switchgUcase` 将字母转换为大写。>(向右移动):增加缩进<(向左移动):移除缩进=(格式代码):格式代码
你可以像使用删除运算符一样使用这些运算符,例如:
c/hello改变一切,直到第一次出现hello。ggyG复制整个文档gUw将单词首字母大写
运算符简写语法
所有这些运算符都提供了额外的简写语法,旨在减少您的打字量并提高您执行常见编辑任务的速度:
- 双写运算符可使其作用于整行:
dd删除整行、cc更改整行等。 - 将运算符大写,使其执行比默认行为更强大的(或替代的)版本:
D从光标处删除到行尾,C将内容更改为行尾,Y例如yy复制整行,P将内容粘贴到光标之前等等。
你有没有注意到命令键的设计非常合理?
Vim 中的运算符、移动和其他命令通常很容易学习,因为它们符合逻辑且易于理解。想要修改某些内容?你可能需要使用
c`( change )` 运算符。想要逐字移动?试试w`( word )`。想要删除某些内容?试试d`( delete )` 运算符,以此类推。
当我们将运算符与一种称为文本对象的特殊动作类别结合使用时,运算符就能真正发挥作用。
利用文本对象提升编辑体验
文本对象是结构化的文本片段,或者说,是文档域模型中的实体。文档由什么组成呢?单词、句子、引用文本、段落、代码块、(HTML)标签等等。这些都是文本对象。
在命令中指定文本对象的方法是将字母a(文本对象加空格)或i(不带空格的内部对象)与代表文本对象本身的字符组合起来:
{operator}{a|i}{text-object}
内置文本对象包括:
w对于w字s对于句子',,"获取`报价p段落b(或(,))表示被包围的块(),B(或{,})表示被包围的块{}<对于>一个被包围的街区<>[对于]一个被包围的街区[]t用于标签。
因此,要删除不同的文本片段,您可以使用以下任一命令:
daw删除以“ w ”开头的单词(以及后面的空格)ciw改变内心独白das删除句子(删除内部句子 )disda"删除双引号内的内容,包括引号本身(仅删除引号内di"的内容,保留引号)。ci"修改双引号内的内容dap删除一段dabda(或者da)删除一个被包围的块(daBda{或者da}删除一个被包围的块{dat删除 HTML 标签cit更改 HTML 标签的内容
将文本对象与运算符结合使用非常强大,你会发现自己经常用到它们。像 `&` cit、` &`ci"和 `& cib` 这样的用法简直太棒了。
假设我们想把下面这个字符串的内容改成其他内容:
const salute = 'I salute you oh Mighty Warrior'
你输入ci'Hi!<ESC>后,它就变成了:
const salute = 'Hi!'
就这么简单。你不需要拿起鼠标,选中文字,然后再输入其他内容。你只需输入三个字母,搞定!
你有没有注意到 Vim 的大多数按键都位于手指附近?
Vim 的模式功能允许在每种模式下重复使用主键行附近的按键。这种设计最大限度地减少了缓慢且复杂的组合键操作,提高了你的输入速度,并延长了手指和手腕的使用寿命。这真是太棒了!
使用点运算符重复上次更改
Vim 还有另一个技巧可以帮助你节省更多击键次数:神奇的.(点)命令。
该.命令允许您重复上次所做的更改。假设您运行dd命令删除了一行代码。现在假设您已经习惯了删除代码。删除代码是好事,代码越少,需要维护的代码就越少。那么,让我们再删除一行代码。您会怎么做呢?您可以dd再次输入,但更好的方法是使用该.命令,它只需要按一次键。
好吧,你省了一次击键。那又怎样?(看来这里有些人比较挑剔。)其实,你可以用这个.命令重复任何类型的更改,而不仅仅是像 `\` 这样简单的单个快捷命令dd。例如,你可以Awesome像这样把一个单词改成 ` cawAwesome<Enter>\`,然后只需输入一个点,就能重复执行整个命令,完成所有击键。想想这其中的可能性!
如果您养成使用文本对象的习惯,该.命令将更加实用。文本对象比其他移动方式更可靠,因为您无需过多关注光标位置。因此,使用文本对象的命令更易于重复执行,从而与该.命令完美配合。
该命令与重复搜索命令( `\n`、`\ n` 或`\n`).配合使用效果极佳。假设你想删除所有出现的“ cucumber” 。一种方法是搜索“cucumber” ,使用 `\n` 删除它,然后使用 `\n`跳转到下一个匹配项,并使用 `\n` 删除它!只需两次按键!想想这其中的无限可能吧!;,nNcucumber/cucumberdawn.
更多速记文本编辑命令
除了本章介绍的运算符之外,Vim 还提供了一系列用于操作单个字符的快捷键,这些快捷键在某些情况下非常有用。它们是:
x等效于dl删除光标下的字符。X等效于dh删除光标前的字符。s相当于ch删除光标下的字符并进入插入模式~切换单个字符的大小写
与往常一样,以上所有支持都适用于同时操作多个字符。
撤销和重做
迟早你会犯错。承认吧!你并不完美。没有人是完美的。这没关系。不过你不用担心,因为 Vim 会为你保驾护航:
- 输入
u即可撤销上次更改。 - 输入
CTRL-R后你就可以重做了。
呼……
概括
动作不仅仅用于移动。与运算符结合使用,它们能让您轻松快速地对文本进行操作。您可以通过使用关键旋律将运算符应用于动作{operator}{motion}。
一些最常用且最有用的运算符包括:d`for d`(删除)、c`for c` (更改) 、y`for y`(复制)和p`for put`(粘贴)。正如你从这些运算符和目前为止学到的操作中可以体会到的,Vim 命令通常很容易学习,因为它们逻辑清晰,易于理解。
双写运算符会使其作用于整行。例如,你可以使用 ` dd\d` 删除整行。类似地,将命令首字母大写会执行更强大的(或替代的)版本。例如,D`\d` 会从光标位置删除到行尾的内容。这些快捷键非常实用,可以节省大量时间。学习使用它们,而不是使用更冗长的替代命令。
计数也可以与运算符一起使用。你可以使用计数来倍增运算符动作组合的效果,例如:{operator}{count}{motion}。
文本对象是描述文档组成部分(例如单词、句子、段落等)的特殊操作符。它们与 Vim 运算符结合使用非常有效。将运算符与文本对象结合使用,您可以非常精确地命令 Vim 删除单词,或更改字符串或代码块的内容。
文本对象提供了两种变体:`--require` a(类似于`a`或` all`)和`--inner` i(类似于`inner`),分别允许您对文本对象及其周围的空白字符进行操作,或者仅对文本对象的内部部分进行操作。例如,`--require` 会da"删除整个引号及其末尾的空白字符,而 ` di"--inner` 只会删除引号内的内容。
点号命令.可以重复执行上次更改,因此它是最有用的重复命令之一。对文本对象进行的操作非常适合使用点号运算符,因为这些操作更易于重复执行。
充分利用点号命令的一个好方法是将其与搜索结合使用。这样,您只需按两次键即可应用连续搜索的更改:n按 `--`;查找下一个匹配项,然后.按 `--` 重复上次更改。
有时候你会犯错。遇到这种情况,你可以使用命令撤销最后一次更改u。如果你改变主意或撤销得太远,请键入CTRL-Rr edo。
文章来源:https://dev.to/vintharas/editing-like-magic-with-vim-operators-3jo6





