2016-06-23 4 views
0

Я написал команду vim, чтобы помочь мне найти определения методов в ruby-коде. Он берет слово под курсором и ищет определение метода с этим именем.Vim map не работает

:silent execute "normal! /\\v\\s*def (self.)?".expand('<cword>')."\<cr>" 

Это прекрасно работает, но теперь я хочу сопоставить его с ключевой командой.

:nnoremap \m :silent execute "normal! /\\v\\s*def (self.)?".expand('<cword>')."\<cr>" 

По какой-то причине это не работает. Когда я поместите курсор на название метода и типа \m я получаю следующее сообщение об ошибке

E114: Missing quote: "\ 
E15: Invalid expression: "normal! /\\v\\s*def (self.)?".expand('<cword>')."\ 

Как я могу это исправить?

+0

Вы пробовали без '\ ' – SibiCoder

+0

Как насчет '[D'? – romainl

ответ

2

Проблемы заключается в том, что сам по себе map расширяет <cr>, поэтому команда он пытается запустить в

:silent execute "normal! /\\v\\s*def (self.)?".expand('<cword>')."\ 
" 

Первая строка вызывает ошибку из-за несогласованную строку в конце.

Чтобы исправить это, попробуйте

nnoremap <silent> \m :silent execute "normal! /\\v\\s*def (self.)?".expand('<cword>')."\n"<cr> 
  • Я добавил <silent>, чтобы сделать все картирование молчать (иначе ВЬЕТ отзовется командой он расширяется, когда работает \m)
  • вместо \<cr> вас может просто написать \n в строке, поэтому карта оставит ее в покое
  • вам нужно <cr> в конце отображения или команда не будет работать (она просто сидит t здесь ждут нажатия клавиши ввода)
1

@melpomene правильно отладил это сопоставление и указал на необходимость избежать <cr> в вашем картографировании. Вы можете также использовать <lt> исправить отображение:

nnoremap \m :silent execute 'normal! /\v\s*def (self.)?'.expand('<cword>')."\<lt>cr>"<cr> 

Я также использовал одиночные кавычки, чтобы уменьшить спасаясь в части отображения.

Однако это сопоставление может быть значительно упрощено с использованием <c-r><c-w>, чтобы получить текущее слово под курсором. Это означает, что мы можем избежать использования :execute, :normal и expand(). Это значит, что нам вообще не нужно бежать.

nnoremap <silent> \m /\v\s*def (self.)?<c-r><c-w><cr> 

Вы можете принять это дальше, используя \zs, чтобы начать матч на слово под курсором вместо в начале строки:

nnoremap <silent> \m /\v\s*def (self.)?\zs<c-r><c-w><cr> 

Для получения дополнительной справки обратитесь к разделу:

:h <> 
:h literal-string 
:h c_CTRL-R_CTRL-W 
:h /\zs