Autoindent in vim всегда пуст строку, если в ней есть только пробелы, могу ли я это изменить?

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

....{
....█
....}

Но vim автоматически удаляет вторую строку, поскольку в ней есть только пробельные символы, поэтому результат выходит следующим образом:

....{
█
....}

Как это исправить?

(Точки для пробелов, а █ - расположение моего курсора.)

Ответ 1

Не беспокойтесь о том, что Vim прокладывает пробелы из пустой строки, когда вы покидаете режим вставки. Как прокомментировали другие, это хорошо. Вместо этого найдите способ автоматического восстановления уровня отступов при вызове режима вставки в этой строке.

Команды i, i, a и a сохраняют позицию курсора при вставке в режим вставки. Но проверьте документацию :help cc:

["x]cc    Delete [count] lines [into register x] and start
          insert linewise. If 'autoindent' is on, preserve
          the indent of the first line.

Если параметр autoindent включен, то запуск cc в пустой строке переключится в режим вставки и восстановит соответствующий уровень отступов, настроив его так, как вы хотите:

....{
    |
....}

Обратите внимание, что клавиша S является синонимом cc (:help S).

Ответ 2

Если вы действительно этого хотите (хотя я согласен с @ThiefMaster), это просто вопрос изменения способа его ввода.

Вот два решения:

Решение 1. Если вам нравятся клавиши со стрелками

Шаг 1 Курсор - "|". Введите {

{|

Шаг 2 Тип Возврат

{
    |

Шаг 3 Тип }

{
}|

Шаг 4 Нажмите стрелку вверх

{|
}

Шаг 5 Тип Возврат

{
    |
}

Решение 2

Шаг 1 Введите {

{|

Шаг 2 Тип Возврат

{
    |

Шаг 3 Тип }

{
}|

Шаг 4 Выход из режима вставки

{
}█

Шаг 5 Тип O

{
    |
}

Ответ 3

Вот два других решения: http://vim.wikia.com/wiki/Get_the_correct_indent_for_new_lines_despite_blank_lines

Первый может быть полезен. Это просто и эффективно:

:inoremap <CR> <CR>x<BS>

Однако это делает использование Vim auto-complete (< C-n > ) более сложным в использовании. Он также сталкивается с плагинами, которые полагаются на поведение по умолчанию, например. supertab.

Второй, добавив пользовательскую функцию (см. ссылку для кода) к вашим плагинам или .vimrc, кажется ненужным, поскольку использование o (как описано @sidyll выше) или o делает отступ для вас: {<Return>}<Esc>O

Другим было бы создание шаблона фрагмента. Таким образом, вы могли бы {<Tab>, а затем вам не придется вводить другие нажатия клавиш. Есть различные плагины отрывков. (Извиняюсь, если я рассказываю то, что вы уже знаете.)