如何在Vim中创建具有起始和结束模式的文本对象/运动
我想定义一个文本对象,如如何在Vim中创建具有起始和结束模式的文本对象/运动,vim,Vim,我想定义一个文本对象,如iw,aB,以及:help text objects中列出的其他对象,它们定义了一个以某种模式开始,以另一种模式结束的区域。更准确地说,我想定义一个文本对象,它以一些{pattern1}开始,以一些{pattern2}结束。这些模式包括。重要的是,它可以延伸到多行(如aB,但不同于a“) 我想到的例子是选择LaTeX中的内联方程,即一个$和下一个$(包括$)之间的一切,以及选择LaTeX环境,如\begin{*}和以下\end{*},这里的*只是任何字符串(但与Vim r
iw
,aB
,以及:help text objects
中列出的其他对象,它们定义了一个以某种模式开始,以另一种模式结束的区域。更准确地说,我想定义一个文本对象,它以一些{pattern1}
开始,以一些{pattern2}
结束。这些模式包括。重要的是,它可以延伸到多行(如aB
,但不同于a“
)
我想到的例子是选择LaTeX中的内联方程,即一个$
和下一个$
(包括$
)之间的一切,以及选择LaTeX环境,如\begin{*}
和以下\end{*}
,这里的*
只是任何字符串(但与Vim regex中的\{-}
类似,是非贪婪的)
我曾尝试查看Vim Tips Wiki,但我不知道如何将[z
和]z
替换为分别向后搜索某些模式和向前搜索某些模式的内容,以使其按我希望的方式工作
因此,为了给出内联公式的示例(假设文本obejct被称为ad
),那么,如果光标位于下一行的$
之间的某个位置:
it follows that $ \sum_{n=0}^\infty 2^{-n} $ is two
在正常模式下,按下
vad
,然后$\sum{n=0}^\infty 2^{-n}$
应该是可视的,或者如果按下dad
,它应该被删除。提到的Vim Tips Wiki页面列出了两个插件(在“相关脚本”下),它们使得定义新的文本对象非常容易:
- 是非常灵活和通用的
- (由我编写)是专门为由开始和结束模式定义的文本对象编写的
$…$
中的文本定义了一个ad
文本对象:
call CountJump#TextObject#MakeWithCountSearch('', 'd', 'a', 'v', '\$', '\$')
你的意思是什么?用@PeterRincker的列表创建你自己的文本对象。是的,它做了一些我想要的事情,尽管它并不像我希望的那样与
\begin{*}…\end{*}
匹配。在你提到的插件中,它们不必匹配,所以它会匹配所有\begin{equation}A=\begin matrix}1&2\\3&4\end{矩阵}
如果您使用环境文本对象并将光标放在A
上,那就不好了。我有一种感觉,这项工作需要大量的工作,并且超出了SO帖子的范围。这可能值得在上创建一个新问题。感谢您的回答。是的,我可以看到CountJump插件如何在o为$…$
添加文本对象,但它也可以执行类似\begin{-}…\end{-}
的操作。问题是它不应该与\begin{center}\end{equation}匹配
,比如说。我试过查看textobj用户,但我发现很难理解它是如何工作的。CountJump还不支持反向引用,但我认为这是一个增强请求。