发布于 2026-01-06 6 阅读
0

使用 Vim 运算符进行神奇的编辑 DEV 全球展示挑战赛,由 Mux 呈现:展示你的项目!

使用 Vim 运算符进行神奇的编辑

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

这是《使用 VSCode 和 Vim 提升你的编码能力》一书中的“使用 Vim 运算符进行神奇编辑”一章。

动作不仅仅用于移动。它们可以与一系列称为运算符的命令结合使用,以闪电般的速度编辑代码。

你可以按照以下任意一种模式将运算符和动作结合使用:

{operator}{count}{motion}
{count}{operator}{motion}
Enter fullscreen mode Exit fullscreen mode

  • 操作决定要执行的操作:删除、更改、复制、格式化等。
  • 计数功能允许你通过执行操作计数来倍增运算符的效果。
  • 动作表示要对操作符定义的操作应用的文本段。

例如,该d2w组合允许您删除两个单词 1

d对应于删除运算符。由于d是一个运算符,您可以按照{operator}{count}{motion}公式将其与您目前为止学到的所有操作结合起来:

  • 用于d5j向下删除 5 行
  • 输入此字符df'可删除当前行中从光标位置到第一个'指定字符位置之间的所有内容(包括该字符本身)。
  • 或者输入dt'类似上面例子的内容,但排除该字符(即直到该'字符之前或之前的部分)。
  • 用于d/hello删除直到第一次出现以下内容为止的所有内容:hello
  • 输入ggdG以删除整个文档

常用运算符

除此之外d,还有一些其他方便的操作符:

  • c更改):更改运算符会删除一段文本,然后进入插入模式,以便您可以继续输入,将原始文本更改为其他内容。更改运算符类似于将 ` dand`i命令合并为一个运算符。这种双重性使其成为最有用的运算符。
  • yy ank):Vim 术语中的复制
  • pp put):粘贴 Vim 术语
  • g~(switch case): 将字母从小写改为大写,反之亦然。或者,使用 `switch case`gu将字母转换为小写,使用 `switch gUcase` 将字母转换为大写。
  • >(向右移动):增加缩进
  • <(向左移动):移除缩进
  • =(格式代码):格式代码

你可以像使用删除运算符一样使用这些运算符,例如:

  • 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}
Enter fullscreen mode Exit fullscreen mode

内置文本对象包括:

  • w对于w
  • s对于句子
  • ',,"获取`报价
  • p段落
  • b(或())表示被包围的块()
  • B(或{})表示被包围的块{}
  • <对于>一个被包围的街区<>
  • [对于]一个被包围的街区[]
  • t用于标签。

因此,要删除不同的文本片段,您可以使用以下任一命令:

  • daw删除 w ”开头的单词(以及后面的空格)
  • ciw改变内心独白
  • das删除句子删除内部句子 dis
  • da"删除双引号内的内容,包括引号本身(仅删除引号di"的内容,保留引号)。
  • ci"修改双引号内的内容
  • dap删除一段
  • dab da(或者da)删除一个被包围的块(
  • daB da{或者da}删除一个被包围的块{
  • dat删除 HTML 标签
  • cit更改 HTML 标签的内容

将文本对象与运算符结合使用非常强大,你会发现自己经常用到它们。像 `&` cit、` &`ci"和 `& cib` 这样的用法简直太棒了。

假设我们想把下面这个字符串的内容改成其他内容:

const salute = 'I salute you oh Mighty Warrior'
Enter fullscreen mode Exit fullscreen mode

你输入ci'Hi!<ESC>后,它就变成了:

const salute = 'Hi!'
Enter fullscreen mode Exit fullscreen mode

就这么简单。你不需要拿起鼠标,选中文字,然后再输入其他内容。你只需输入三个字母,搞定!

你有没有注意到 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


  1. 更准确地说,d2w它可以删除光标所在位置到第二个单词开头之间的所有文本。目前,我们暂且认为它会删除两个单词,稍后会进行更精确的描述 。↩

  2. 一条命令就能发出两条指令?听起来不错! 

文章来源:https://dev.to/vintharas/editing-like-magic-with-vim-operators-3jo6