【问题标题】:Vim: match qualified identifier under cursorVim:匹配光标下的限定标识符
【发布时间】:2015-04-17 14:02:10
【问题描述】:

如何匹配光标下的完全限定标识符?

我正在寻找一种从脚本中收集类似 ::std::unique_ptrMyNamespace::MyClassName 的方法,具体取决于编辑行 ::std::unique_ptr<MyNamespace::MyClassName> 时光标所在的位置

谢谢!

【问题讨论】:

    标签: vim match


    【解决方案1】:

    在光标下/之前/之后查找任意内容的最灵活方法之一是使用匹配当前光标位置的 VIM 正则表达式 \%# 标记。例如:

    [a-z]*\%#[a-z]*
    

    (我在这里使用[a-z] 仅作为示例。)

    正则表达式将匹配光标前后的字母。

    由于* 匹配0 or more,这也将匹配空白空间,这有时是不可取的。为了解决这个问题,我使用了 brute force

    [a-z]*\%#[a-z]\+\|[a-z]\+\%#[a-z]*
    

    虽然该方法比expand(<cword>) 更冗长,但它的优点是独立于iskeyword 选项。

    【讨论】:

      【解决方案2】:

      内置于 Vim 中的只有 :echo expand('<cWORD>')(匹配任何以空格分隔的内容)和 :echo expand('<cword>')(可能匹配太少)。您可以通过在 'iskeyword' 中包含更多字符来修复后者,但这会影响移动,甚至可能会影响语法突出显示。

      或者,您可以使用我的ingo-library plugin 中的一个函数来实现您自己的基于正则表达式的提取器:

      if search('[:_[:alnum:]]\+', 'bcW') | echo ingo#text#frompattern#GetHere('[:_[:alnum:]]\+') | endif
      

      【讨论】:

        【解决方案3】:

        也许你可以在iskeyword 中添加:,比如

        nnoremap * :set iskeyword+=:<CR>*:set iskeyword-=:<CR>
        nnoremap # :set iskeyword+=:<CR>#:set iskeyword-=:<CR>
        

        把它放在你的vimrc文件中,然后当触发#/*时,它也会包含::作为单词的一部分。一个陷阱是它会将True:False 视为一个单词。

        另见Set iskeyword selectively

        【讨论】:

          猜你喜欢
          • 2012-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-06
          相关资源
          最近更新 更多