Vim:匹配光标下的合格标识符

Vim: match qualified identifier under cursor

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

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

谢谢!

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

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

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

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

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

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

另见 Set iskeyword selectively

查找任意 under/before/after 游标的最灵活的方法之一是使用匹配当前游标位置的 VIM 正则表达式 \%# 标记。例如:

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

(我这里用[a-z]只是举例。)

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

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

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

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