【发布时间】:2015-04-17 14:02:10
【问题描述】:
如何匹配光标下的完全限定标识符?
我正在寻找一种从脚本中收集类似 ::std::unique_ptr 或 MyNamespace::MyClassName 的方法,具体取决于编辑行 ::std::unique_ptr<MyNamespace::MyClassName> 时光标所在的位置
谢谢!
【问题讨论】:
如何匹配光标下的完全限定标识符?
我正在寻找一种从脚本中收集类似 ::std::unique_ptr 或 MyNamespace::MyClassName 的方法,具体取决于编辑行 ::std::unique_ptr<MyNamespace::MyClassName> 时光标所在的位置
谢谢!
【问题讨论】:
在光标下/之前/之后查找任意内容的最灵活方法之一是使用匹配当前光标位置的 VIM 正则表达式 \%# 标记。例如:
[a-z]*\%#[a-z]*
(我在这里使用[a-z] 仅作为示例。)
正则表达式将匹配光标前后的字母。
由于* 匹配0 or more,这也将匹配空白空间,这有时是不可取的。为了解决这个问题,我使用了 brute force:
[a-z]*\%#[a-z]\+\|[a-z]\+\%#[a-z]*
虽然该方法比expand(<cword>) 更冗长,但它的优点是独立于iskeyword 选项。
【讨论】:
内置于 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 视为一个单词。
【讨论】: