Какая настройка в vim противодействует отказу smartindent отступов # комментариев в сценариях оболочки?
Недавно я начал использовать vim 7 (ранее vim 6) и настройку smartindent
. По большей части, он работает хорошо, хотя я так привык печатать вкладку после открытой скобки, что она почти контрпродуктивна.
Тем не менее, есть одна часть маниакального поведения. При редактировании оболочки script я пытаюсь создать комментарий на текущем уровне отступа, но smartindent
не будет иметь к этому никакого отношения. Он настаивает на том, что комментарий должен быть на уровне 0 (без отступа). Что еще хуже, он перерывает shift-right ( ">>
" и друзей), чтобы они не работали. Это прямое неповиновение, и я хотел бы знать, как лучше всего это исправить?
(Я также не увлекаюсь идеями smartindent
об отстуке then
после if
.)
Предпочтительные решения избавят меня от ручного избиения - я ленив. Одним из вариантов было бы "отключить smartindent
при редактировании сценариев оболочки (оставьте это для остальных)". Другим вариантом будет руководство по поиску элемента управления script для smartindent
и что нужно изменить для изменения характеристик, которые мне не нравятся. Окончательный вариант (которому мне не нужен совет о том, как это сделать - просто намек на то, что это лучший или единственный способ восстановить здравомыслие) - оставить smartindent
unset.
Я видел неопределенный вопрос о (PHP и) раздражающих правилах vim unindent"; он не дает мне прямого ответа, хотя, возможно, cindent
и связанные с ним элементы, упомянутые в нем, фактически являются частью ответа.
Ответы
Ответ 1
Найдите файл с отступом (например,/usr/share/vim/vim71/indent/sh.vim в моей системе)
Эта строка выглядит как проблема:
setlocal indentkeys-=:,0#
Возможно, вы можете исправить это в своем .vimrc или загрузить собственный файл отступов вручную.
edit: он выглядит более сложным, чем я думал, но, возможно, в отступы есть что-то, что вам нужно исправить.
2nd edit: Похоже, я был совершенно неправ, Отъезд:
Восстановление отступа после ввода хеша
или
howto-configure-vim-to-not-put-comments-at-the-beginning-of-lines-while-editing
Ответ 2
Ну, после изучения некоторых опций, в том числе с использованием ':set cindent
' вместо ':set smartindent
', я вернусь к использованию только :set autoindent
. Вероятно, есть способы заставить этот материал работать точно так, как я хочу, но он достаточно грязный и довольно пугающий, что меня не беспокоит. Я отлично справился с autoindent
за предыдущие 20 с лишним лет, а преимущества от дополнительных колоколов и свистков, предоставляемых smartindent
, перевешиваются тем, что я считаю его неправильным поведением.
Спасибо, Хуан, за вашу помощь. Верьте или нет, это помогло - довольно много.
Я также обнаружил пару других опрятных команд, хотя, следуя этому:
>i}
>a}
Эти права сдвигают блок кода, в котором вы находитесь. Версия "i
" отбрасывает тело, а не закрывающие фигурные скобки (мой предпочтительный стиль), а версия "a
" отбрасывает закрывающие фигурные скобки ( версия, которая требуется на работе).
Кроме того, вы можете применять квалификаторы к '%
' в командах, выполняемых в оболочке:
:make %:r.o
Это запустит make в "корне" текущего имени файла ( "%:r
" ), а затем ".o
". Или, другими словами, если я редактирую somefile.c
, это выполняется make somefile.o
.
Ответ 3
Добавьте строку ниже в свой .vimrc
отступ по типу файла
(он будет устанавливать правый режим отступа в зависимости от типа файла)
Ответ 4
У меня была такая же проблема в течение долгого времени, пока я не понял, что autoindent и smartindent не нужны, если в вашем vimrc файле "indty on file" установлен параметр "filetype indent on", который использует indent/sh.vim(или что-то другое) language) в вашем каталоге vim, чтобы выяснить правила отступов, и автоинденты и smartindent могут помешать ему.
Я не тестировал это с помощью sh, но perl внезапно начал нормально себя вести, когда я переключился.
Sidenote: перенаправление Juan, "Восстановление отступа после ввода хэша", не является хорошим решением - хотя оно исправляет проблему в одной ситуации (ввод кода), он не меняет того, как редактор считает, что он должен быть отступом, поэтому повторный отступ (visual =, или normal ==) перетащит его обратно влево.
Ответ 5
У меня есть следующие строки в моем .vimrc, и я не вижу проблемы.
set smartindent
inoremap # X^H#
Раньше я использовал автоинденент после этих двух строк, но кажется, что он не действует.
Ответ 6
Да, это очень раздражает. smartindent действительно только для C-подобных языков.
Посмотрите, как я могу включить соответствующий отступ на основе языка:
http://www.pixelbeat.org/settings/.vimrc
Ответ 7
Предыдущий ответ, предлагающий:
: inoremap # X ^ H #
отлично. Это ответ, предложенный документацией VIM на странице ": help smartindent". Обратите внимание, что ^ H вводится с помощью CTRL-V CTRL-H. Ниже приведен соответствующий раздел из документации.
When typing '#' as the first character in a new line, the indent for
that line is removed, the '#' is put in the first column. The indent
is restored for the next line. If you don't want this, use this
mapping: ":inoremap # X^H#", where ^H is entered with CTRL-V CTRL-H.
When using the ">>" command, lines starting with '#' are not shifted
right.