是否存在在/
或\
之间捕获文字的动议?我知道有其他符号的动作---
ci"
- 在"text"
vi(
- int var
foo(int var)
di[
- 将字词[word]
删除到[]
我能找到的唯一解决方法是使用Vim Surround,并使用它将周围的\
更改为"
(cs\"
),然后从那里开始工作。然而,这不仅是那种乏味,而且插件只支持反斜杠,而不是前进。
答案 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>
标签)更好的方法可能是使用寄存器来记住分隔符,因此您可以快速和/或重复使用此映射。换句话说,您可以将/
或\
或<\?p>
存储在注册表中,并使用它在您存储的分隔符之间快速捕获文本。
答案 2 :(得分:2)
没有slash
的内置文字对象。但是有插件支持自定义文本对象,如:
targets
答案 3 :(得分:2)
最近提出的Vim补丁为任意匹配对添加了一个文本对象:
https://groups.google.com/d/topic/vim_dev/pZxLAAXxk0M/discussion