Vim - 在斜杠之间捕捉?

时间:2014-05-14 22:22:42

标签: vim vi yank vim-registers

是否存在在/\之间捕获文字的动议?我知道有其他符号的动作---

ci" - 在"text"

中捕获'文字'

vi( - int var

中的视觉捕捉foo(int var)

di[ - 将字词[word]删除到[]

我能找到的唯一解决方法是使用Vim Surround,并使用它将周围的\更改为"cs\"),然后从那里开始工作。然而,这不仅是那种乏味,而且插件只支持反斜杠,而不是前进。

4 个答案:

答案 0 :(得分:7)

你可以很容易地编写自己的文本对象。

onoremap <silent> i/ :<C-U>normal! T/vt/<CR> " inside /
onoremap <silent> a/ :<C-U>normal! F/vf/<CR> " around /

让它与视觉模式一起使用:

xnoremap <silent> i/ :<C-U>normal! T/vt/<CR> " inside /
xnoremap <silent> a/ :<C-U>normal! F/vf/<CR> " around /

同样,你也可以为\

编辑:添加了信息评论。

答案 1 :(得分:3)

以下是映射的一种方法:

  nnoremap H mal??e+1<Enter>mb//<Enter>y`b`a

此映射将在最后一次搜索模式的两次出现之间抽取所有内容。

将其放在.vimrc文件中以使其永久保存。

您问题的用法:

  • 搜索正斜杠:/\/ (注意反斜杠转义字符)
  • 将光标定位在两个斜杠(或第二个斜杠)
  • 之间
  • H

上一个/和下一个/之间的所有内容都会被拉扯。

<强>解释

  nnoremap H mal??e+1<Enter>mb//<Enter>y`b`a

 - nnoremap H      map H in normal mode, ignoring other mappings    
 - ma              place a mark (named a) at the current cursor location
 - l               move the cursor one char to the right
 - ??e+1<Enter>    move to 1 character after END of prev occurrence of last search pattern
 - mb              place a mark (named b) at the current cursor location
 - //<Enter>       go to the beginning of the next occurrence of the last search pattern
 - y`b             yank to the location of the mark named x (note: ` = "back tick")
 - `a              go to the mark named `a`

示例输入:

This is a *funky* string
  • 搜索*
  • 将光标放在两个星号之间(或在第二个星号上)
  • H

funky 这个词将在yank缓冲区中。

您可以使用单词作为分隔符!

示例输入:

<br>
Capture all this text.
<br>
  • 搜索<br>
  • H s (或第二次<br>
  • 之间的正常模式下按<br>

您也可以使用正则表达式!

示例输入:

<p>
Capture this paragraph.
</p>
  • 搜索<.\?p> <\/\{,1}p> 更正确
  • 在段落(或关闭<p>标签)
  • 内的正常模式下按H

...

更好的方法可能是使用寄存器来记住分隔符,因此您可以快速和/或重复使用此映射。换句话说,您可以将/\<\?p>存储在注册表中,并使用它在您存储的分隔符之间快速捕获文本。

答案 2 :(得分:2)

没有slash的内置文字对象。但是有插件支持自定义文本对象,如: targets

答案 3 :(得分:2)

最近提出的Vim补丁为任意匹配对添加了一个文本对象:

https://groups.google.com/d/topic/vim_dev/pZxLAAXxk0M/discussion