2015-05-06 2 views
1

Я ищу способ скопировать результат сопоставления в локальную переменную в скрипте vim.VIm: скопировать совпадение с атомом курсора в локальную переменную

Вопрос заключается в том, что я хочу, чтобы соответствовать текст, который включает в себя атом положения курсора \%#, то есть, например: [A-Za-z:]*\%#[A-Za-z:]\+, который соответствует идентификаторы как ::namespace::ParentClass::SubClass текст под курсором (так <cword> не работает для меня).

Я хотел бы использовать это позже в сценарии, но чем больше я копаю, тем больше я начинаю задаваться вопросом, возможно ли это (или: если я должен делать это по-другому, собирая текущую строку, позицию курсора, а затем просто извлеките идентификатор под курсором вручную).

Если это невозможно из-за сценария vim - какова была бы идея атома \%#? каково его использование?

ответ

1

У вас есть два варианта:

  • отдельный шаблон на часть до и после курсора, получить текущую строку, разделиться на перед/после курсора, и совпадает друг с разделенными узорами; это использует getline(), strpart() и matchstr(), и точно так же, как вы намекали в своем вопросе.
  • использования search() дважды с текущей позиции после того, как найти конец матча после курсора один раз, чтобы найти начало матча до/от курсора, а затем использовать getline() и strpart() для извлечения текста соответствия:
function! GetMatch(pattern) 
    let start = searchpos(a:pattern, 'bcnW')[1] 
    if start == 0 
     return '' 
    endif 
    let end = searchpos(a:pattern, 'cenW')[1] 
    if end == 0 
     return '' 
    endif 
    return strpart(getline('.'), start - 1, end - start + 1) 
endfunction 
+0

я боялся, что может быть единственным вариантом. есть ли у вас какие-либо мысли о том, что будет использовать атом '\% #? –

+0

Ну, это по-прежнему имеет решающее значение в функции 'GetMatch()' (чтобы избежать чего-то еще снаружи). И вы можете использовать его в командах ': substitute' или': match'. Это бесполезно! –

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