Как сохранить отступ после нажатия Esc в Vim

Я set autoindent
Я иду к линии, нажимаю A и <CR> что приводит меня к следующей строке и вставляет отступ. Однако, если я нажму Esc, курсор перейдет к началу строки, и отступ исчезнет.
Я должен идти и нажимать вкладки, чтобы снова попасть в нужное место.

Я знаю, что помочь говорит:

If you do not type anything on the new line except <BS> or CTRL-D and then type
<Esc>, CTRL-O or <CR>, the indent is deleted again.

есть ли способ отключить это, или по крайней мере обходной путь?

7 ответов


у меня была эта точная проблема до двух дней назад.

здесь нет способ отключить это, но, к счастью, вам не нужно, потому что вместо этого:

введите режим вставки с S или cc. Вход в режим вставки снова с S войдет в режим вставки с соответствующим уровнем отступа, что делает тот факт, что Vim удалил отступы неважными.

Примечание: я обнаружил, что этот трюк работает для меня в большинстве мест. Но по какой-то причине это произошло не работа с файлами Python. Я предполагаю, что это связано с типом файла Python, который возится со своими собственными функциями отступов или что-то в этом роде.

Edit:

другой трюк, вы можете определить cpoptions таким образом, что, если вы находитесь на линии с отступом и переместить курсор, он сохранит отступ. Это не решите свою проблему удара Esc сразу, но это связанный вопрос, который также может беспокоить вас.


хорошо, я понял это.

основываясь на ответе Эдана Маора,S или cc должен войти в режим вставки с соответствующим уровнем отступа.
...за исключением случаев, когда это не так:)

это работает при двух обстоятельствах.

  • , когда cindent установлен, он будет вставлять отступ на основе правил форматирования C
    Это может оказаться раздражающим при редактировании не C-подобных файлов.
  • , когда indentexpr is набор.

я обнаружил, что лучшим решением является то, что это мой .vimrc

set autoindent
set indentexpr=GetIndent()

function GetIndent()
   let lnum = prevnonblank(v:lnum - 1)
   let ind = indent(lnum)
   return ind
endfunction

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


рассмотрим, что я использую 'o' для запуска новой строки. Я добавляю ниже config в _vimrc (обратите внимание, что у меня есть ':set autoindent')

" ugly hack to start newline and keep indent
nnoremap o ox<BS>
nnoremap O Ox<BS>

простой способ-нажать '.'(или любой символ), escape, затем нажмите x, чтобы удалить символ. Отступ должен быть сохранен.


введите текст, нажмите клавишу == в нормальном режиме в этой строке


возможно, стоит отметить, что с правильными плагинами S и cc Кажется, снова работает корректно. Скорее всего, это python-mode, который исправляет это.

https://github.com/klen/python-mode


Я хотел бы достичь того же эффекта, но потому, что я хочу плагин показывает отступ для правильной работы. Это мой обходной путь: я нашел, что <enter> в обычном режиме практически бесполезно. Он перемещает курсор только на одну строку вниз, что может быть достигнуто с помощью j.

поэтому я добавил Это в мой .vimrc:

nmap <cr> o.<c-h><esc>

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