掌握 Vim 语法 学习 Vimish Vim 名词(动作) 整合资源

2025-05-28

掌握 Vim 语法

学习 Vimish

Vim 名词(动作)

整合起来

资源

关注@learnvim获取更多 Vim 技巧和窍门!

对很多人来说,使用Vim文本编辑器可能会让人不知所措。如果你像我一样,第一次接触 Vim 的时候,就是不小心打开它之后就无法退出。甚至有句俗话:

“Vim 很难掌握,但放弃更难”

好吧,那是四年前的事了。现在 Vim 是我的主要文本编辑器。我想分享一些技巧,教你如何提高 Vim 的使用效率,避免被它繁多的组合键弄得不知所措。

为了有效地使用 Vim,我们必须学习它的语言(不要与Vim 脚本混淆)。当我们理解了如何使用 Vim 语言(在本文中我将其称为Vimish)后,它会变得更加直观。不妨尝试一下,谁知道呢,也许你最终会转向 Vim!

归根结底,使用任何能让你最高效的编辑器,因为这才是最重要的

学习 Vimish

我的母语并非英语。刚搬到美国时,沟通对我来说很困难。为了提高英语流利程度,我做了三件事:

  1. 增加词汇量
  2. 学习语法规则
  3. 练习,练习,再练习。

这需要一些前期工作,但我认为任何人都可以做到。

要学习 Vimish,我们也需要这样做。我会分享一些词汇和语法规则。然而,就像任何语言习得一样,掌握它需要反复练习。

让我们从语法开始:

verb + noun
Enter fullscreen mode Exit fullscreen mode

就这样。接下来我们需要学习一些名词和动词。我会介绍以下内容:

  1. 基本名词(动作)
  2. 动词
  3. 更多名词(文本对象)
  4. 把它们放在一起

让我们开始吧。

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
Enter fullscreen mode Exit fullscreen mode
  • 删除一个单词,请执行dw。动词 ( d) + 名词 ( w)。

  • 要将所有内容从当前位置拉到行尾,请执行y$ (paste withpP)。动词 ( y) + 名词 ( $)。

  • 更改前面的整个段落,请执行c}。动词 ( c) + 名词 ( {)。

顺便说一下,我们可以在语法中添加量词。例如:

  • 删除接下来的两个单词,请执行d2w

  • 更改接下来的两行,请执行c2j

  • 提取最后两个字母,请执行y2h

附注:虽然 的结果2dw与 相同d2w,但它们在技术上是不同的。2dw表示执行两次“删除一个单词” d2w表示 *删除接下来的两个单词一次。两者的区别在于 Vim 认为的“更改”,如果你使用点命令,这一点很重要。所以请谨慎使用量词。你可以在这里阅读关于 Vim 点命令的文章。

关于 Vim 操作符的另一个补充说明是,您可以输入两次它们来对整行执行操作。ddyy,并对整行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;
}
Enter fullscreen mode Exit fullscreen mode
  • 要删除整个“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
Enter fullscreen mode Exit fullscreen mode

我们学习了一些 Vim 动词和名词:操作符和动作。操作符(dyc)构成了基本动词。动作、文本对象、搜索和标记构成了我们大部分的名词。还有很多动词和名词,我只是提到了其中的一小部分。与语言习得类似,学习 Vim 需要时间才能自然流利。但是,一旦我们学会了如何使用 Vimish,我们就可以发出强大的命令。

你会注意到,这条规则可以应用于许多命令。我最激动人心的 Vim 时刻之一,就是当我开始自己将这条语法规则应用于新的运算符时。例如,gugU分别是将字母转换为小写和大写的运算符。因为它们是运算符,所以它们可以用于名词。guiw将单词转换为小写。gU$将当前位置到行末的单词转换为大写。我只是凭直觉做了这件事,而且它确实有效——因为它们遵循相同的语法规则。我希望你很快就会拥有你的“AHA”时刻,即使还没有。

将这些知识转化为肌肉记忆并非一个周末就能完成的。这需要更长的时间。我已经把我的知识传授给大家,现在就看你怎么运用了。感谢你读到这里,我深表感谢。

编码愉快!

资源

文章来源:https://dev.to/iggredible/mastering-vim-grammar-1dfi
PREV
通过每周评论实现智能时间管理和生产力指南。
NEXT
编写良好的单元测试:循序渐进教程 正面案例 极端案例 负面案例 ExampleUnitTests 教程总结