探索 Vim 插件:使用 targets.vim 改进和扩展文本对象
本文最初发布于barbarianmeetscoding.com。😊
欢迎回到Vim 插件探索系列!在本系列中,你将学习如何通过发现并精通优秀的 Vim 插件,每天提高一点效率。今天,我们将介绍我最喜欢的插件之一:targets.vim。
Targets.vim是一款真正能增强你的工作方式的插件,它通过强化 Vim 最基本的功能之一:文本对象来实现这一点。
Vim 中的文本对象
Vim 最棒的功能之一就是它能让你高精度地编辑文本。你输入内容daw,Vim 就会执行你的命令并删除一个单词。你输入内容ci',Vim 还会帮你修改单引号内的文本。Vim 之所以能实现这种精准度,是因为它结合了各种实用的操作符(删除、更改、复制等)和一系列手势,其中最强大的就是文本对象。
文本对象描述文档的各个组成部分:单词、句子、段落、引号内的文本、代码块、HTML 标签等等。在前面的示例中,`and`aw和`in`i'中的粒子都是文本对象:dawci'
aw代表一个词i'代表单引号内
Vim 将运算符与文本对象结合使用,可以让你精细地控制文本文件和代码的编辑,并赋予你强大的功能。
既然文本对象这么棒,我们为什么还需要插件呢?嗯,还有什么比文本对象更棒的呢?当然是更多的文本对象啦!
更多文本对象!!!!
你是否曾经想过更改逗号之间的文本?现在可以了!假设我们有这样一句话:
I think, most of the time, therefore I am.
输入ci,后跟all of the timeand <ESC>,瞧!
I think, all of the time, therefore I am.
你是否曾经想过编辑函数的参数和实参?现在你也可以做到了!
想象一下,如果我们拥有这样obliterate一种功能,可以让我们给敌人带来巨大的痛苦:
function obliterate(target, mana) {
const damage = mana*1d20() + 1d100();
target.hp -= damage;
console.log(`${target} is obliterated with a ray of dark energy`);
}
我们希望该mana参数是可选的,并具有默认值。使用targets.vim 参数文本对象,我们可以直接编辑该mana参数,如下所示:
c2ina更改第二个参数内部{mana=20}={}<ESC>将此参数设为可选参数,并提供默认值。20
是不是很棒?!
Targets.vim包含许多新的文本对象,让您在使用 Vim 时获得全新的精确度、控制力、可重复性和速度:
- 分隔符
,.;:+-=~_*#/|\&$ - 函数中的参数和论证
- 可以同时处理多个文本对的多文本对象:
b可以对任何文本块({([)进行操作,也q可以对任何文本引用进行操作。
等等,还有更多!统一和改善寻求行为
Targets.vim 的功能不仅限于添加新的运算符,它还提升了所有文本对象的用户体验和实用性。
在使用文本对象运算符时,您可能会注意到一个不一致之处:引用文本对象与其他文本对象的行为略有不同。与其他文本对象不同,引用支持向前查找,因此光标无需位于文本对象上方即可对其进行操作。举个例子可以更好地说明这一点,假设您有一个如下的字符串:
const greeting = "Hello Oh Mighty Wizard! I salute you!"
^
光标位于第一个字母上,并用该^符号表示。使用ci"when 函数可以更改字符串的内容,即使光标不在引号内。
这种定位功能非常棒,因为它意味着我们可以省去将光标定位到引号上方所需的击键次数。可惜的是,其他文本对象没有这种定位功能。
检查以下函数:
const salute = (name) => `Hello Oh Mighty ${name}! I salute you`
^
现在假设我们想更改该name参数的名称。你可能认为输入命令ci(就能name立即更改参数,但事实并非如此。
文本(对象不支持向前查找,因此您需要分两个步骤执行转换。
首先,你需要用以下方式移动光标f(:
const salute = (name) => `Hello Oh Mighty ${name}! I salute you`
^
然后,由于文本对象位于光标下方,你就可以name通过更改它来改变它。ci((
这种查找行为之所以更胜一筹,是因为它能让你用更少的按键完成更多操作,而且还能更轻松地使用.命令重复更改。可惜的是,原生 Vim 只支持对引用文本对象使用这种行为。
如果我告诉你targets.vim将这种查找行为统一并扩展到所有文本对象呢?扩展它,以便我们可以ci(在前面的例子中使用它,并能够一次性更改该参数?
没错!光这一点就足以令人振奋了。但targets.vim 的功能远不止于此。Targets.vim还支持跨多行的前进和后退查找。
以下是搜索功能工作原理的简化版本:
- 如果光标位于文本对象上方,则该运算符应用于该文本对象。
- 否则它会沿着一条线向前寻找。
- 如果没有指向前方的文本对象,它会在当前行内向后查找。
- 如果该行中没有文本对象,则向前查找。
- 如果该行或文档中的任何位置都没有文本对象,则会向后查找。
太棒了吧?这意味着你可以节省更多击键次数,更快地编辑文本。耶!
但如果您不想更改下一个文本对象呢?如果您想更改上一个文本对象呢?这是否意味着您需要先将光标移动到那里?不。targets.vimn的开发者极具远见,允许您使用` n ext` 和l`last`命令显式指定要操作的文本对象。输入:
cin[这样你就能改变下一对方括号的内容(这与以下代码的行为完全相同ci[):cil[您将更改前一对方括号的内容。
这些命令还可以与计数结合使用,以对远处的文本对象进行操作:
c2in[允许您更改第二对方括号的内容,依此类推。
这一切是不是棒极了?
等等!还有更多!A、In、Around 和 Inside
使用原版 Vim,您可以在操作文本对象时使用两个修饰符:a和i。
a"指带引号的字符串,它包括带引号字符串中的所有字符,包括引号本身。i"指带引号的字符串,包括带引号字符串中的所有字符,但不包括引号本身。
Targets.vim提供了两个新的修饰符,让您可以更加精确地进行操作:A和I。
A"指围绕引号字符串的整个字符串,除了引号之外,还包括一个尾随空格。I"指的是在引号内的内容,包括引号内的内容,但不包括引号本身和任何尾随的空格。如果您想保留引号、代码块等内部的空格,这将非常有用。
targets.vim 入门
- 使用您喜欢的插件管理器安装插件。您可以在这篇文章中找到更多关于插件管理器以及如何安装插件的信息。
- 按以下方式练习
Targets.vim是一款学习和使用都非常便捷的插件,因为它与 Vim 的设计理念完美契合。它扩展了 Vim 的核心功能——文本对象,因此对于经验丰富的 Vim 用户来说,使用新的分隔符或参数文本对象会感觉非常自然。事实上,这种自然感甚至会让你疑惑,为什么 Vim 一开始没有内置这些文本对象。
根据我的个人经验,有些事情需要额外的刻意练习,例如在原生 Vim 体验中不存在的显式搜索行为:
- 开始使用新的分隔符(这会自然而然地发生,所以我认为你不需要刻意练习)。
- 利用查找功能,直接从光标所在位置使用文本对象,而不是移动到文本对象上方。这样可以提高速度,并使你的更改更易于重复(使用运算
.符)。 - 练习使用显式修饰语
n和l寻求修饰语。 - 练习使用
A“instead of”a和I“instead of”i,并注意不同的结果。
了解更多
这款 Vim 插件的文档确实非常出色,内容详尽,并包含大量有用的图表。您可以在 GitHub 上查看,也可以通过 Vim命令直接查看。:help targets
此外,targets.vim 速查表也是一个非常有用的概要参考,并提供了许多视觉辅助工具。
文章来源:https://dev.to/vintharas/exploring-vim-plugins-improve-and-extend-your-text-objects-with-targets-vim-30i7您想了解更多关于 Vim 的信息吗?
不妨看看“探索 Vim”系列的其他文章。祝您 Vim 使用愉快!
