如何匹配光标下的完全限定标识符?
我正在寻找一种方法来收集脚本,例如::std::unique_ptr
或MyNamespace::MyClassName
,具体取决于编辑行::std::unique_ptr<MyNamespace::MyClassName>
时光标所在的位置
谢谢!
答案 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
视为一个单词。