Господа / дамы,

Я не понимаю, почему vim демонстрирует следующее поведение, когда я запускаю ярлык ниже в визуальном режиме (.vimrc):

vmap <script> <C-LEFT> :call Test()<CR>
function! Test()
     "empty
endfunction

Vim переходит к первому столбцу строки над строкой, в которой я запускаю ярлык, и показывает строку «: '<,'> call Test ()» в строке состояния. Но это происходит только тогда, когда я вызываю функцию, когда я использую команду типа «$» (см. *), Поведение является ожидаемым.

(*)

vmap <C-LEFT> $

Моя цель - заставить Vim рассматривать "табуляцию" как слово, когда я использую комбинацию «Ctrl +Left», потому что, когда первый символ строки является "табуляцией", Vim выбирает первое слово в верхней строке.

Это желаемое поведение:

Если у вас есть альтернативное решение или обходной путь, я также был бы признателен.

Спасибо!

3 ответа3

1

vmap применяется, когда vim находится в режиме Visual или Select. Вы не сказали, какой текст был выбран при запуске карты.

Удивительное поведение может быть результатом

:'<,'>

диапазон, который предоставляется автоматически при переключении из визуального режима в режим Ex с помощью :. Также способ, которым пользовательские функции обрабатывают диапазоны по умолчанию.

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

:help :call
:help '<
:help v_:
1

Это связано с тем, что :call: вызывается с автоматически добавляемым визуальным диапазоном '<,'> . :help :call объясняет:

Когда задан диапазон, а функция не обрабатывает его сама, функция выполняется для каждой строки в диапазоне с курсором в первом столбце этой строки. Курсор остается в последней строке (возможно, перемещен последним вызовом функции).

Так что вам либо нужно очистить диапазон

vmap <script> <C-LEFT> :<C-u>call Test()<CR>

или заставьте функцию обработать это:

function! Test() range
0

Я "решил" эту проблему, используя следующий подход:

" Note: "Normal" movement with "Ctrl+Right"! By Questor
nmap <silent> <C-Right> e
imap <silent> <C-Right> <C-o>e<Right>
vmap <silent> <C-Right> e

" Note: "Normal" movement with "Ctrl+Left"! By Questor
nmap <silent> <C-Left> b
imap <silent> <C-Left> <C-o>b
vmap <silent> <C-Left> b

Обратите внимание, что я не использую функцию. Если бы использовалась функция, мне нужно было бы продолжить, как объясняет Инго Каркат в своем ответе (используя : <C-u>).

С помощью этого простого подхода я "исправляю" нежелательное поведение Vim, описанное выше.

Смотрите пример использования в https://github.com/eduardolucioac/groovim/blob/master/.vimrc

[] 'S

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .