Vim — Визуальный режим — Улучшение выбора слов

Vim — Визуальный режим — Улучшение выбора слов

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

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

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

введите описание изображения здесь

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

введите описание изображения здесь

(*)

vmap <C-LEFT> $

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

введите описание изображения здесь

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

введите описание изображения здесь

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

Спасибо!

решение1

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

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

:'<,'>

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

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

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

решение2

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

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

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

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

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

function! Test() range

решение3

Я «решил» эту проблему, применив следующий подход:

" 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

Связанный контент