Запретить перемещение курсора назад на один символ при выходе из режима вставки - PullRequest
33 голосов
/ 19 февраля 2010

... как бы вы это сделали?

задача для дополнительного кредита: выяснить способ заставить vim обновить позицию курсора сразу после выхода из режима вставки

Ответы [ 6 ]

21 голосов
/ 19 февраля 2010

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

:inoremap <silent> <Esc> <Esc>`^

Здесь клавиша Esc перегружен в режиме вставки для дополнительного запуска команды `` ^ `, которая перемещает курсор в положение, в котором он был в последний раз, когда режим вставки был остановлен.Поскольку в этом отображении он выполняется сразу после выхода из режима вставки с помощью Esc , курсор остается на один символ вправо по сравнению с его положением с поведением по умолчанию.для этого не требуется компилировать Vim с помощью функции +ex_extra.

17 голосов
/ 19 февраля 2010

Хотя есть хитрости для решения этой проблемы (например, сопоставления ESC , упомянутые в предыдущих двух постах), последовательного способа сделать это не существует. Причина в том, что нет способа определить метод, который использовался для входа в режим вставки. В частности, с учетом строки abcDefg с курсором на D:

  • Если вы нажмете i , положение режима вставки будет между c и D. Обычный ESC поместит курсор на c; <C-O>:stopinsert<CR> (или метод backtick) установит курсор на D.

  • Если вы нажмете a , положение режима вставки будет между D и e. Обычный ESC поместит курсор на D; <C-O>:stopinsert<CR> поместит курсор на e.

Если вы ДЕЙСТВИТЕЛЬНО хотите это сделать, вы можете выдумать что-то вроде этого:

let insert_command = "inoremap <ESC> <C-O>:stopinsert<CR>"
let append_command = "iunmap <ESC>"
nnoremap i :exe insert_command<CR>i
nnoremap a :exe append_command<CR>a

НО: помните, что это будет иметь дело только с i и a в качестве методов ввода: если вы используете режим визуального блока, I или A или что-то еще, вам нужно будет придумать новые команды для соответствия (и их много). Поэтому я настоятельно рекомендую вам не делать этого.

Лично я бы порекомендовал привыкнуть к поведению по умолчанию. Вы можете легко сделать это логичным для i ИЛИ логическим для a. Если вы измените значение по умолчанию на логическое для i за счет логического для a, вы просто запутаетесь, когда используете стандартную установку vi / vim.

7 голосов
/ 19 февраля 2010
inoremap <silent> <Esc> <C-O>:stopinsert<CR>

в вашем .vimrc

3 голосов
/ 12 июня 2013

Я верю, что правильный способ сделать это -

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
2 голосов
/ 26 ноября 2018

На основе комментария Натана Неффа лучший подход, который я нашел, это

autocmd InsertLeave * :normal `^
set virtualedit=onemore

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

virtualedit заставляет его действовать последовательно в конце строки (так что это может быть один вперед от последнего символа в строке).

0 голосов
/ 19 февраля 2010

А как же:

:imap <Esc> <Esc><Right>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...