Vim文本对象ip和ap有什么区别?

5
Vim手册将它们都描述为完全相同的内容。ap表示“一个段落”,选择[count]个段落。例外情况:只包含空格的空行也是段落边界。在 Visual 模式下使用时,其操作将以行为单位进行。ip 表示“内部段落”,选择 [count] 个段落。例外情况:只包含空格的空行也是段落边界。在 Visual 模式下使用时,其操作将以行为单位进行。因此,这使得我不太清楚它们之间的区别。例如,假设你有命令 gqapgqip。它们的行为有何不同?

我同意这份文件不够清晰。你可以尝试使用 vapvip 来看看它们的区别。 - samabcde
1个回答

7

如果没有适当的背景知识,仅仅阅读:help ap链接中的内容是没有任何帮助的,只会更加混乱。

文本对象可以分为两种类型:包含其边界和不包含其边界。

按照惯例,包含其边界的文本对象以a开头,例如ap,而不包含其边界的文本对象以i开头,例如ip

“段落”的定义在:help paragraph中有解释,该页面链接在:help ip:help ap中都提供了。具体而言,“段落”的边界如下:

  • 一个空行后面紧跟着的非空行,将其视为零宽度匹配,
  • 下一个空行。

因此,您可以使用排除空行的ip或包含空行的ap命令来选择段落内容:

[...] end of paragraph above.

Beginning of paragraph in the middle    |       |
with some boring filler text so that    | ip    | ap
it covers a few lines.                  |       |
                                                |
Beginning of paragraph below [...]

在对段落执行 gq 操作时,使用 ipap 并没有什么区别,因为额外的空行不太可能改变所操作文本的内容。然而,ipap 有一些特殊之处,因为这两种类型的文本对象之间的差异通常非常重要:

             it
    ----------------------
<h2>One day I will be a H1</h2>
-------------------------------
             at

请查看:help text-objects获取主题的参考,以及:help 04.8获得更为温和的介绍。

如我在另一个回答中所提到的,适当的学习能够让你形成一种难以从随机、不相关的链接和推文等中建立的直觉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接