Препятствуйте тому, чтобы курсор пятился один символ на выходе режима вставки

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

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

33
задан mtk 4 June 2013 в 10:28
поделиться

4 ответа

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

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

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

В отличие от некоторых других обходных путей, этот не требует, чтобы Vim был скомпилирован с функцией +ex_extra.

21
ответ дан 27 November 2019 в 18:26
поделиться

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

  • Если вы нажмете i, местоположение режима вставки будет между c и D. Обычное ESC установит курсор на c; :stopinsert (или метод обратного клика) установит курсор на D.

  • Если нажать a, то местоположение режима вставки будет между D и e. Обычный ESC установит курсор на D; :stopinsert установит курсор на 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 OR логическим для a. Если вы измените значение по умолчанию на логическое для i за счет логического для a, вы просто запутаетесь при использовании стандартной установки vi/vim.

17
ответ дан 27 November 2019 в 18:26
поделиться

А как насчет:

:imap <Esc> <Esc><Right>
0
ответ дан 27 November 2019 в 18:26
поделиться
inoremap <silent> <Esc> <C-O>:stopinsert<CR>

в вашем .vimrc

7
ответ дан 27 November 2019 в 18:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: