Почему курсор перейти на начало строки после <Esc>?

12

Я заметил, при редактировании вдоль строки в текстовом файле в режиме вставки курсор переместится в начало строки следующего за записи с помощью последовательности клавиш:

<esc>:w

Я хотел бы изменить это поведение так , что курсор будет оставаться на месте после: напиши. Это возможно? Мне не нужно, чтобы курсор оставался в режиме вставки, я просто хотел бы, чтобы он сохранял свою последнюю позицию после записи.

Я использую gVim 7.4 на Windows. Мой .vimrc очень простой, я не верю, что какие-либо мои настройки мешают этому поведению. Я также удалил сорсинг mswin.vim и example.vim из моей .vimrc (в комплекте с официальным установщиком vim.org окна).

После прочтения комментариев ниже, я снова посмотрел на проблему и понял, что курсор только скользит в крайнее левое положение после строк записи, которые полностью состоят из конечного пробела. Другими словами, курсор перемещается в крайнее левое положение только после esc-: w, когда строка представляет собой висячий отступ без других символов, кроме пробелов . .Vimrc обрабатывает поведение отступа с этими настройками:

set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent 

Итак, новая строка, созданная ниже строки с отступом, будет содержать 4 пробела в качестве первых 4 пробелов строки (которые я хочу сохранить). После нажатия клавиши «esc» курсор перемещается в крайнее левое положение буфера.

Есть ли способ сохранить положение курсора при нажатии «esc» для возврата в нормальный режим на линии, состоящей из конечных пробелов (как отступ)?

Джим
источник
3
Я никогда не замечал такого поведения в Vim на любой платформе ... Что произойдет, если вы запустите gVim как: gvim -u NONE -U NONE(вы можете использовать cmd.exe или создать ярлык)? Это предотвратит загрузку ваших (g) vimrc файлов.
Мартин Турной
1
Это ваш полный файл vimrc? Моим первым подозрением будет то, что autocmd в вашем файле vimrc удаляет конечные пробелы. Меняется ли поведение при запуске gVim без файла vimrc (см. Комментарий выше)?
Мартин Турной
Выше не мой полный .vimrc, есть и другие настройки. Запуск gVim без .vimrc (: в имени сценария не указывается .vimrc или .gvimrc) решает мою проблему. Вы абсолютно правы, мне нужно просмотреть мой .vimrc или что-то еще, что может быть причиной этого.
Джим
Очевидно, что устранение пробелов на новых строках является желательным поведением, и я читаю здесь , чтобы сохранить файл чистым от пробелов.
Джим
Это об открытии новых строк ... Не о записи в файл?
Мартин Турной

Ответы:

11

Просмотр документации для autoindent дает ответ о том, почему и как обойти это. :help 'autoindent':

Копировать отступ из текущей строки при запуске новой строки (ввод <CR> в режиме вставки или при использовании команды «o» или «O»). Если вы не введете ничего в новой строке, кроме <BS>или, CTRL-Dа затем введите <Esc>, CTRL-Oили <CR>, отступ снова будет удален. Перемещение курсора на другую строку имеет тот же эффект, если только флаг «I» не включен в «cpoptions».

Другими словами, если вы хотите, чтобы он не терял отступ, наберите что-нибудь, а затем нажмите клавишу «Назад» перед ударом Esc, и пробел останется.

В качестве альтернативы, если вы просто хотите вернуться на уровень отступа, когда вернетесь в режим вставки и также используете 'cindent', используйте Shift-Sвместо i, чтобы очистить (уже пустую) строку и начать с соответствующего уровня отступа. Это не такое общее решение, как приведенное выше, но я предпочитаю это, когда пишу код на C, чтобы мои файлы на самом деле не сохранялись с пустыми строками.

Джон ОМ.
источник
Это окончательный ответ на мой вопрос из оригинальной документации. Спасибо за краткое изложение и повествование - я бы не подумал разобраться: h autoindent для этой информации. Спасибо также @Carpetsmoker за обсуждение, ведущее к решению.
Джим
Это решило проблему, связанную с переназначением o и O, чтобы не выходить из режима вставки, а сохранять отступы. Это может быть сделано nnoremap o o <BS><Esc><DEL>, иnnoremap O O <BS><Esc><DEL>
Макс Коплан
Спасибо!
Макс Коплан