vim中的文本对象
1. 简介
vi 编辑器无处不在,尤其是在 Linux 和 Unix 环境中。它对初学者和高级用户都很有用。
**在本教程中,我们讨论一个高级主题,即vi中的文本对象。**首先,我们回顾一下编辑器的基本模式和操作。接下来,我们探索字符组并简要解释vi的语法。之后,我们将看到基本的文本对象操作是如何执行的。最后,我们研究了创建我们自己的自定义文本对象的方法。
在这里,我们使用vi和 Vi(编辑器)作为 Vi 和 Vim 编辑器的别名。
我们使用 GNU Bash 5.1.4 在 Debian 11 (Bullseye) 上测试了本教程中的代码。它是 POSIX 兼容的,应该可以在任何这样的环境中工作。
2. 基础vi
重申一下,Vi 编辑器具有三种模式:
- 视觉的
- 命令
- 插入
启动后,vi立即处于可视模式。要进入命令模式,我们使用*:(冒号)。另一方面,使用i*、a和o等几个字符中的一个,我们可以转换到插入模式。最后,返回可视模式最常见的方法是通过*Esc (转义)。*
当然,由于其描述将其定义为文本编辑器,因此Vi 支持许多基本且易于访问的功能。
对于初学者,我们可以可视化、遍历、写入、删除。此外,我们可能还想选择、剪切、复制、粘贴、搜索和替换。
虽然第一组可以处理单个字符,就像普通编辑通常做的那样,但第二组会浪费在他们身上。例如,我们可以使用方向键将光标左右移动一个字符,但剪切和粘贴单个字符很少有帮助。
3. 字符分组
为了快速编辑,我们可能想要处理一组逻辑字符。例如,文本通常被分成段落。为此,一些常见操作将字符组识别为文本对象:
- 特点
- 单词
- 句子
- 线
- 段落
- 其他文本对象
我们已经讨论过将单个字符作为标准:它们很容易定义和隔离。但是,另一方面,高阶群的边界可能不明确。
我们是只使用空白字符 作为单词分隔符,还是任何非字母数字字符也可以?什么是行尾 ?
Vi 编辑器通过包含操作数 来为我们省去所有这些细节,这有助于区分这些对象。
4. 文本对象操作语法
除了我们已经讨论过的字符组之外,vi中的许多操作都对特定的预定义对象起作用:
- va” – 可视化选择双引号字符串中的所有内容,包括“”
- ya’ – Yank/copy 单引号字符串中的所有内容(包括”)
- ci( – 在 PARENTHESES 中更改字符串的内容 Inside 但不包括 ()
- di[ – 删除方括号中字符串的内容但不包括 []
这些示例演示了 Vi 编辑器对文本对象操作的语法。首先,我们有一个动作:这里v用于视觉选择,y用于复制/复制,c用于更改,d用于删除。
在动作之后,我们有一个文本对象或一个动作,它指定了我们的动作。让我们逐一探讨。
5. 文本对象和动作
事实上,到目前为止,所有示例都使用具体的周围字符来隔离部分数据。然而,Vi 编辑器有许多已定义的动作和文本对象 。
重要的是,我们可以使用编辑器中的*:help text-objects和:help object-motions*命令探索确切的描述。
5.1. 特点
虽然字符只是文本编辑和大多数操作的原子,但有些动作将它们用作更大动作的标记。例如,我们可以使用dt-(删除到破折号)删除下一个破折号之前的所有内容。
5.2. 字
我们用w指定单词:
- cw – 将内容从当前光标位置更改为下一个单词
- daw – 删除当前光标位置的Word及其周围的所有内容
请注意第一个示例如何将单词作为动作(指向方向或位置的指针)与第二个使用单词作为实际动作文本对象的示例区分开来。
5.3. 句子
句子使用字符s。此外,句子以句号、感叹号或问号结尾,后跟空格。
事实上,要选择整个句子,我们只需将光标放在其中一个单词上(从I到结尾)并使用vis获取所有内容,不包括尾随标点符号和空格。
此外,还有(和)动作,这让我们可以使用d(*这样的命令*来删除从当前光标位置到当前句子开头的所有内容。
5.4. 段落
我们通过p处理段落。它们被空行包围,通常从开始和结束标记中获益最多。
比如我们可以把光标放在这句话的逗号处,*d}*就会只留下“For example”。该段落中的所有后续文本(包括这句话)都将消失。
如果我们想定义一个新的文本对象怎么办?
6.自定义文本对象和动作
由于vi支持脚本,我们可以创建或模拟许多复杂的行为。此外,还有用于自定义选择的开箱即用机制。
6.1. 命令映射
在 Vi 编辑器中编写脚本通常是通过向vimrc配置文件添加行来完成的:
xnoremap il g_o^
onoremap il :normal vil
在此示例中,我们使用xnoremap将可视模式下的il映射到命令g_o^。后者指示vi:
- g_(转到并选择该行的最后一个非空格字符)
- o(将光标移动到选择的另一边,不改变它)
- ^(选择到行的 ^ 开头)
第二行将operator-pending 模式 下的il映射到正常模式下的vil(现在是vg_o^ )。因此,我们有il像任何其他内部命令一样使用。
或者,我们可以在每个会话的基础上定义对象。
6.2. 分数
Vi 编辑器有 26 个标记可用。每个标记保存当前光标位置以备将来参考。我们用m设置标记,后跟一个小写字母。设置好后,我们可以结合标记的字母使用两个命令:
- ’(撇号)– 转到标记行的开头
- `(反引号)——转到标记的位置
这些组合代表动作,因此它们可以用于其他命令。例如,通过分别用ma和MB标记自定义文本段的开始和结束,我们可以*av
b来选择它或ad
b*来删除它**。
实际上,标记的用途更为广泛,因此我们可以使用*:help mark-motions*命令深入查看它们。