Vim:匹配光标下的限定标识符

时间:2015-04-17 14:02:11

标签: vim match

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

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

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

(我这里仅以[a-z]为例。)

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

由于*匹配0 or more,这也会匹配空格,这有时是不受欢迎的。为了解决这个问题,我使用了 brute 强制

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

虽然该方法比expand(<cword>)更详细,但它具有独立于iskeyword选项的优势。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

也许您可以在:中添加iskeyword,例如

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

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

另见Set iskeyword selectively