矩形区域作为文本对象?


11

是否可以在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

是否有可能定义一个textobject c为列,这样dac会删除列,yac将对其进行粘贴,cac要改变它,等等?

(我知道控制-V选择一个矩形区域,我知道,你可以用dy等删除,抽出等选定的区域。但我特别好奇,什么是可能使用文本对象。)


6
可能吗?绝对!案例和重点:textobj-word-column.vim
Peter Rincker

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

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

2
@PeterRincker回答这个问题:)
Vitor

Answers:


5

是的,这是可能的。@PeterRincker表明插件textobj字列,其限定四个文本对象(icaciC,和aC用于基于单词的列)。

该功能背后的思想是创建一个定义基于列的运动的功能,然后将该功能适当地映射到可视/选择模式映射和操作员挂起的映射。以上述插件为例,它创建以下映射:

xnoremap <silent> ac :<C-u>call TextObjWordBasedColumn("aw")<cr>
xnoremap <silent> aC :<C-u>call TextObjWordBasedColumn("aW")<cr>
xnoremap <silent> ic :<C-u>call TextObjWordBasedColumn("iw")<cr>
xnoremap <silent> iC :<C-u>call TextObjWordBasedColumn("iW")<cr>
onoremap <silent> ac :call TextObjWordBasedColumn("aw")<cr>
onoremap <silent> aC :call TextObjWordBasedColumn("aW")<cr>
onoremap <silent> ic :call TextObjWordBasedColumn("iw")<cr>
onoremap <silent> iC :call TextObjWordBasedColumn("iW")<cr>

此处TextObjWordBasedColumn(...)定义列的运动,并使用映射到可视/选择模式xnoremap和使用的操作员待定模式onoremap。请注意,该函数稍微复杂些,以便处理指令并找到适当的运动边界。


4

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

如何制作自己的文字对象

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

  • 一个未使用的组合键通常a{char}i{char}其中{char}是描述性的和未使用。例如,i/作为之间/的文本对象的示例。
  • 需要一种找到文本对象开始的方法。例如T/
  • 需要一种找到文本对象结尾的方法。例如t/
  • 选择一种视觉模式。例如v
  • 通过创建可视模式(仅)映射xnoremap
  • 创建一个操作员待定模式映射,该映射通过onoremap和使用可视模式映射:normal

现在以我们的简单示例为例,该示例在i/之间创建一个文本对象/

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

只要遵循基本要素,就可以为各种事物创建文本对象。

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

VIM-textobj用户插件提供了常见的方式更声明的方式来定义自定义文本的对象。例如,这是一个php标签text-object:

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

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

寻求更多帮助

:h map-overview
:h visual-start
:h :norm

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.