Contents

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*、ao等几个字符中的一个,我们可以转换到插入模式。最后,返回可视模式最常见的方法是通过*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设置标记,后跟一个小写字母。设置好后,我们可以结合标记的字母使用两个命令:

  • (撇号)– 转到标记行的开头
  • `(反引号)——转到标记的位置

这些组合代表动作,因此它们可以用于其他命令。例如,通过分别用maMB标记自定义文本段的开始和结束,我们可以*avb来选择它或adb*来删除它**。

实际上,标记的用途更为广泛,因此我们可以使用*:help mark-motions*命令深入查看它们。