是否可以在vim中定义将作用于矩形区域的文本对象?

例如,假设我具有垂直对齐的文本列,例如:

column 1 co    column 2 col
lumn 1 colu    umn 2 column
mn 1 column    2 column 2 c
1 column 1     olumn 2 colu


是否可以为列,例如c会删除列,dac会删除列,yac会更改列,依此类推?以此类推?然后使用cacd等删除,拉动所选区域。但是我特别想知道使用文本对象的可能性。)

评论

可能吗?绝对!大小写:textobj-word-column.vim

@PeterRincker很好,但是我想知道是否可以利用Kana的textobj-user简化它。

谢谢,彼得,那正是我要找的例子。

@PeterRincker将此作为答案:)

#1 楼

是的,这是可能的。 @PeterRincker建议使用插件textobj-word-column,该插件为基于单词的列定义了四个文本对象(icaciCaC)。

该功能背后的想法是创建一个函数定义基于列的运动,然后将该功能适当地映射到可视/选择模式映射和操作员待定映射。以上面提到的插件为例,它创建以下映射:和TextObjWordBasedColumn(...)的操作员待定模式。请注意,该函数稍微复杂一些,以处理各种倾向并找到合适的运动边界。

#2 楼

可能吗?绝对!案例和要点:textobj-word-column.vim。

如何制作自己的文本对象

通常情况下,可视模式用于创建新的文本对象。可视模式可以是逐行,逐字符(通常)或可视块。以下是您所需的基础知识:


未使用的组合键,通常是a{char}i{char},其中{char}既是描述性的又是未使用的。例如i/作为/之间的文本对象示例。
需要一种方法来找到文本对象的开始。例如T/

需要找到文本对象结尾的方法。例如t/

选择视觉模式。例如v

通过xnoremap创建可视模式(仅)映射。
创建操作员待定模式映射,通过onoremap:normal使用可视模式映射。

现在以我们简单的i/为例,它在/之间创建了一个文本对象:各种各样的事情。

使用vim-textobj-user创建高级文本对象

vim-textobj-user插件提供了一种通用的方法来定义自定义文本对象。一种更具说明性的方式。例如,这是一个php标签文本对象:

xnoremap i/ :<c-u>normal! T/vt/<cr>
onoremap i/ :normal vi/<cr>


有关vim-textobj-user的更多帮助,请参见其帮助文档::h textobj-user-introduction

以获取更多帮助

call textobj#user#plugin('php', {
\   'code': {
\     'pattern': ['<?php\>', '?>'],
\     'select-a': 'aP',
\     'select-i': 'iP',
\   },
\ })


以及“创建新的文本对象Vim Wiki”页面。