2015-04-17 4 views
1

Как я могу сопоставить полный идентификатор под курсором?Vim: сопоставить квалифицированный идентификатор под курсором

Я ищу способ, чтобы собрать из сценария что-то вроде ::std::unique_ptr или MyNamespace::MyClassName в зависимости, где находится курсор при редактировании строки ::std::unique_ptr<MyNamespace::MyClassName>

спасибо!

ответ

2

Одним из наиболее гибких способов найти что-либо произвольное под/перед/после курсора использовать регулярное выражение \%# маркер ВИМ, которая соответствует текущей позиции курсора. Например:

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

(я использую здесь [a-z] только в качестве примера.)

Регулярное выражение будет соответствовать письма до и после курсора.

Поскольку * соответствует 0 or more, это также соответствует пустому пространству, что иногда нежелательно. Чтобы решить эту проблему, я использовал скотинаусилия:

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

Хотя подход более многословен, чем expand(<cword>), он имеет то преимущество, что независимо от варианта iskeyword.

0

Встраиваемый в Vim только :echo expand('<cWORD>') (соответствующий любому пробелу) и :echo expand('<cword>') (возможно, слишком мало подходит). Вы можете исправить последнее, добавив больше символов в 'iskeyword', но это влияет на движение и, возможно, даже подсветку синтаксиса.

В качестве альтернативы, вы можете использовать функцию из моего ingo-library plugin реализовать свой экстрактор, основанный на регулярном выражении:

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

Может быть, вы могли бы добавить : в iskeyword, как

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

Put это в вашем файле vimrc, затем, когда триггер #/*, он также будет содержать :: как часть слова. Одна ошибка заключается в том, что он рассмотрит True:False как одно слово.

Смотрите также Set iskeyword selectively

Смежные вопросы