2013-07-24 6 views
4

Итак, я пытаюсь иметь привязку, которая запускает lvimgrep в текущем выделенном тексте.vimscript: Получить текст выбора визуального режима при сопоставлении

fun! s:get_visual_selection() 
     let l=getline("'<") 
     let [line1,col1] = getpos("'<")[1:2] 
     let [line2,col2] = getpos("'>")[1:2] 
     return l[col1 - 1: col2 - 1] 
endfun 

vnoremap <expr> <script><leader>* ":lvimgrep /" . <SID>get_visual_selection() . "/j **/*." . expand("%:e") . " \|lopen" 

Функция от комментария на вопрос: How to get visually selected text in VimScript

Дело в том, что он ведет себя очень странно: В большинстве случаев текст, возвращаемый функцией не соответствует визуальный отбор и чаще чем нет, это текст последнего визуального выбора, а не текущий.

Прошли тонны сообщений вокруг получения визуального текста выбора в vimscript, но не могут заставить его работать.

Я также пробовал https://stackoverflow.com/a/1534347/287085 без успеха (копирование выбора для регистрации) - получить сообщение об ошибке при вызове из моей привязки.

ответ

4

Проблема заключается в том, что '<,'> знаки не установлены до после тока выбора не осталось (либо выполнив команду на нем, или через <Esc>). Здесь, ваше выражение отображениеделает его более сложным предварять в <Esc> покинуть визуальный режим первым, так что легче вставить выражение с :help i_CTRL-R и выражением регистра =:

:vnoremap <script> <leader>* <Esc>:lvimgrep /<C-R><C-R>=<SID>get_visual_selection()<CR>/j **/*.<C-R><C-R>=expand("%:e")<CR>\|lopen 

Если вы не против затирания регистр по умолчанию, вы также можете просто дергать выбор:

:vnoremap <leader>* y:lvimgrep /<C-R><C-R>"/j **/*.<C-R><C-R>=expand("%:e")<CR>\|lopen 
+0

это вторая vimscript тайна ты решил для меня в день ... :) спасибо! – Raghu

+0

@ Raghu: Рад, что я мог бы помочь. Ваши вопросы хорошо сформулированы и понятны ... продолжайте! –

+1

Приятно, но не могли бы вы отвлечь часть «получить визуальный отбор» от другой части, для ясности? И что означает 'expand ("%: e ")' означает? –

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