2012-09-19 2 views

ответ

2

Попробуйте это:

vnoremap <leader>rl :<C-u>call VisAddRefLink()<CR> 

function! VisAddRefLink() 
    execute "normal! gvdi[\<esc>pa]" 
endfunction 

<C-u> перед call исключает, что отображение вставляет '<,'> визуальный ряд перед ним; мы хотим, чтобы функция вызывалась только один раз, а не один раз для каждой строки в диапазоне.

Внутри функции нам необходимо сначала установить визуальный выбор перед его работой; gv делает это.

+0

Аналогичным образом вы можете использовать ':' вместо ': ' как в другом примере. Я, наверное, слишком сложное! :) – Conner

+0

Отлично, спасибо большое. Это работает хорошо. – Simon

2

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

vnoremap <leader>rl :call VisAddRefLink()<CR> 

function! VisAddRefLink() range 
    exe a:firstline . "normal! ^i[" 
    exe a:lastline . "normal! $a]" 
endfunction 

Причина ваш пример не работает потому, что ехе не работает на визуальном отборе на слово. Например, попробуйте визуально выбрать что-то, а затем сделайте :norm d. Вы заметите, что это не удалит. Если вы добавили диапазон к вашей функции, например :help function-range-example, это помогает с визуальным выбором, работая аналогичным образом (по строкам). Однако он по-прежнему не является истинным визуальным выбором. Добавление диапазона позволяет вам использовать переменные a:firstline и a:lastline, которые могут быть использованы для этого. Вы также можете сделать это с одним, как таким образом:

vnoremap <leader>rl <esc>:norm! '<^x2Phr['>$x2pr]<cr> 

Это первый использует <esc> для завершения визуального выбора. Затем он выполняет обычную команду, которая будет запускаться только один раз. Если визуальный выбор был оставлен, он будет запускаться один раз для каждой строки в визуальном выборе. Как только он запускается после этого

'<^ переходит к первой строке визуального выделения и к первому непустому пространству на этой линии.

x2Phr[ удаляет этот символ, вставляет его в два раза впереди, движется влево, таким образом, мы над новым персонажем, и заменяет его с открытием [

'>$ переход к последнему символу на последней строке визуальный выбор

x2pr] же, как и раньше, но в противоположном направлении

Как обычно, есть больше чем один способ кожи кошки, особенно с vimscript. Когда вы узнаете больше, вы видите много возможностей для достижения чего-то.

+0

Большое спасибо за ваш вклад Conner, он работает, но я использовал решение Ingo, поскольку оно кажется немного проще. – Simon

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