Я столкнулся с такой же проблемой на ноутбуке HP с Fedora. В моем случае я обнаружил, что могу свести к минимуму вероятность того, что ноутбук снова включится, отключив адаптер переменного тока за несколько минут или секунд до его выключения (, чтобы в момент отключения питания он работал от батарей ).
Оператор={motion}
может быть определен рядом настроек ('equalprg'
, 'indentexpr'
, 'lisp'
), но когда все они не установлены, он возвращается к использованию отступа C . Вот что здесь происходит.
Отступ C предназначен для языка C и в основном основан на фигурных скобках C {... }
и идентификаторах, таких как if
, else
, while
и т. д.
Оказывается, многое из этого хорошо знакомо bash (и многим другим языкам ), поэтому в большинстве случаев это работает хорошо.
Однако в C круглые скобки используются для заключения логических выражений, в присваиваниях переменных или операторах if
или while
. Vim хочет отформатировать эти (, чтобы отслеживать наборы совпадающих парных скобок ), но хочет наложить некоторые ограничения на то, насколько глубоко они выглядят.
Так как в C скобки используются в выражениях, и они обычно короткие, ограничение по умолчанию для их отслеживания составляет 20 строк.
[ 'cinoptions'
] может управлять большим количеством отступов C, и оказывается, что у него есть возможность управлять только этим. Опцию)N
можно использовать для настройки ограничения строки для выражений в скобках.
Например, увеличить его до 100 строк:
:set cinoptions=)100
(Или, чтобы уменьшить его до 10, используйте :set cinoptions=)10
.)
Это может объяснить, что происходит, и, возможно, это быстрый хак, который можно превратить в полезный обходной путь... Но правильным решением здесь будет установка'indentexpr'
в соответствии с языком, на котором вы пишете. (Помните, что отступ C срабатывает только тогда, когда 'indentexpr'
не установлен.)
Vim фактически поставляет подключаемый модуль -для создания отступов в сценариях оболочки, возможно, вы просто не включили его. Убедитесь, что эта команда есть в вашем.vimrc
:
filetype indent on
Затем убедитесь, что ваш сценарий оболочки распознается как типsh
:
:set filetype?
filetype=sh
Если это не так,установите его (, возможно, вам придется разобраться, почему этого не происходит):
:setf sh
Вы можете дважды проверить, что 'indentexpr'
установлено:
:set indentexpr?
indentexpr=GetShIndent()
С этими настройками =
будет работать так, как вы ожидаете, в сценарии оболочки.