Вам нужно, чтобы ваша функция обрабатывала диапазон. Одним из способов достижения этого было бы так:
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. Когда вы узнаете больше, вы видите много возможностей для достижения чего-то.
Аналогичным образом вы можете использовать ':' вместо ': ' как в другом примере. Я, наверное, слишком сложное! :) –
Conner
Отлично, спасибо большое. Это работает хорошо. – Simon