Vim:匹配光标下的合格标识符
Vim: match qualified identifier under cursor
如何匹配光标下的完全限定标识符?
我正在寻找一种方法来从脚本中收集类似 ::std::unique_ptr
或 MyNamespace::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
选项。
如何匹配光标下的完全限定标识符?
我正在寻找一种方法来从脚本中收集类似 ::std::unique_ptr
或 MyNamespace::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
选项。