【问题标题】:Vim - capture in between slashes?Vim - 在斜线之间捕获?
【发布时间】:2014-07-03 04:31:20
【问题描述】:

/\ 之间是否有捕捉文本的动作?我知道有其他符号的动作---

ci" - 在"text" 中捕获“文本”

vi( - int var 内部 foo(int var) 的视觉捕获

di[ - 将单词[word] 删除为[]

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

【问题讨论】:

  • 我可能已经编辑了我的答案 100 次,但它目前适用于任何模式(例如单个字符、单词、正则表达式等......)并且适用于多行(之后适度测试)。好问题!

标签: vim vi yank vim-registers


【解决方案1】:

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

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 /

同样你也可以为\

编辑:添加信息 cmets。

【讨论】:

  • 我认为这个答案绝对是最干净的,尽管我有点难以理解它在做什么。没有什么是一点 google-fu 无法清除的。 :) 非常感谢!
  • 只是对此的跟进,我想要相同的东西来匹配正则表达式。对于“环绕”的味道,我真的想更进一步来匹配正则表达式标志,所以我想出了这个版本xnoremap &lt;silent&gt; a/ :&lt;C-U&gt;normal! F/vf/h&lt;CR&gt;/\/[gim]*/e&lt;CR&gt; 到目前为止似乎工作!
  • 另一个更新,添加“y”标志并在完成后清除搜索高亮:xnoremap &lt;silent&gt; a/ :&lt;C-U&gt;normal! F/vf/h&lt;CR&gt;/\/[gimy]*/e&lt;CR&gt;:&lt;C-U&gt;noh&lt;CR&gt;gv
【解决方案2】:

这是使用映射的一种方法:

  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>
  • 搜索&lt;br&gt;
  • &lt;br&gt;s 之间按H 在正常模式下(或在第二个&lt;br&gt;

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

输入示例:

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

...

更好的方法可能是使用寄存器来记住分隔符,这样您就可以快速和/或重复使用此映射。换句话说,您可以将/\&lt;\?p&gt; 存储在一个寄存器中,并使用它在您存储的分隔符之间快速捕获文本。

【讨论】:

  • 这是相当广泛的答案!它远远超出了我所要求的范围,但我喜欢它如何在任何可搜索的表达之间捕捉。我将来肯定会使用它。 :)
  • @bark - 很高兴我能帮上忙!我在写它的时候学到了很多,所以谢谢你提出这个问题!
  • 是否可以将映射与现有的 Vim 约定对齐? ci/ - 应该在斜杠 di 内更改, - 应该在逗号内删除 va% - 应该在 % 之间进行视觉选择,包括 %
【解决方案3】:

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

【讨论】:

  • 这可能没有完全回答我的问题,但感谢您提供插件链接。我试过了,玩起来很有趣。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-29
    • 2010-10-02
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多