Подтвердить что ты не робот

Какая настройка в vim противодействует отказу smartindent отступов # комментариев в сценариях оболочки?

Недавно я начал использовать vim 7 (ранее vim 6) и настройку smartindent. По большей части, он работает хорошо, хотя я так привык печатать вкладку после открытой скобки, что она почти контрпродуктивна.

Тем не менее, есть одна часть маниакального поведения. При редактировании оболочки script я пытаюсь создать комментарий на текущем уровне отступа, но smartindent не будет иметь к этому никакого отношения. Он настаивает на том, что комментарий должен быть на уровне 0 (без отступа). Что еще хуже, он перерывает shift-right ( ">>" и друзей), чтобы они не работали. Это прямое неповиновение, и я хотел бы знать, как лучше всего это исправить?

(Я также не увлекаюсь идеями smartindent об отстуке then после if.)

Предпочтительные решения избавят меня от ручного избиения - я ленив. Одним из вариантов было бы "отключить smartindent при редактировании сценариев оболочки (оставьте это для остальных)". Другим вариантом будет руководство по поиску элемента управления script для smartindent и что нужно изменить для изменения характеристик, которые мне не нравятся. Окончательный вариант (которому мне не нужен совет о том, как это сделать - просто намек на то, что это лучший или единственный способ восстановить здравомыслие) - оставить smartindent unset.

Я видел неопределенный вопрос о (PHP и) раздражающих правилах vim unindent"; он не дает мне прямого ответа, хотя, возможно, cindent и связанные с ним элементы, упомянутые в нем, фактически являются частью ответа.

4b9b3361

Ответ 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.