![Vim — Визуальный режим — Улучшение выбора слов](https://rvso.com/image/1399997/Vim%20%E2%80%94%20%D0%92%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9%20%D1%80%D0%B5%D0%B6%D0%B8%D0%BC%20%E2%80%94%20%D0%A3%D0%BB%D1%83%D1%87%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0%20%D1%81%D0%BB%D0%BE%D0%B2.png)
Господа/Дамы,
Я не понимаю, почему 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