Какой параметр в vim противодействует отказу smartindent отступать # комментарии в сценариях оболочки? - PullRequest
25 голосов
/ 22 декабря 2008

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

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

(я также не заинтересован в идеях smartindent относительно отступа then после if.)

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

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

Ответы [ 7 ]

11 голосов
/ 22 декабря 2008

Найдите файл отступа (например, /usr/share/vim/vim71/indent/sh.vim в моей системе)

Эта строка выглядит как проблема:

setlocal indentkeys-=:,0#

Возможно, вы можете исправить это в вашем .vimrc или загрузить файл отступа вручную.

edit: Это выглядит сложнее, чем я думал, но, возможно, в файле отступа есть что-то определенное, что вам нужно исправить.

2-е редактирование: похоже, я был совершенно не прав, проверить:

Восстановление отступа после ввода хеша

или

МЕТОДИЧЕСКИЕ-Configure-ВИМ-к-не-Пут-комментарии-на-в-начале-оф-линии-в то время редактирования

3 голосов
/ 22 декабря 2008

Что ж, после изучения некоторых опций, в том числе использования ':set cindent' вместо ':set smartindent', я вернулся к использованию только ':set autoindent'. Вероятно, есть способы заставить этот материал работать именно так, как я хочу, но он достаточно грязный и достаточно сложный, чтобы меня не беспокоили. Я отлично работал с autoindent в течение предыдущих 20 с лишним лет, и выгоды от дополнительных наворотов, предоставляемых smartindent, перевешиваются тем, что я считаю его неправильным поведением.

Спасибо, Хуан, за вашу помощь. Верьте или нет, это помогло - довольно много.

Я также обнаружил пару других аккуратных команд, продолжая это:

>i}
>a}

Они сдвигают вправо блок кода, в котором вы находитесь. Версия 'i' делает отступ в теле, а не закрывающие скобки (мой предпочтительный стиль), а версия 'a' делает отступ в закрывающих скобках (( версия, которая требуется на работе).

Также вы можете применять квалификаторы к '%' в командах, выполняемых в оболочке:

:make %:r.o

Это запустит make в корневом каталоге текущего имени файла (это %:r), а затем .o. Или, другими словами, если я редактирую somefile.c, это выполняет make somefile.o.

2 голосов
/ 22 апреля 2009

У меня была одна и та же проблема в течение долгого времени, пока я не понял, что autoindent и smartindent не нужны, если в вашем vimrc установлено «filetype indent on» - «filetype indent on» использует отступ / sh.vim (или что language) в вашем каталоге vim, чтобы выяснить правила отступов, и autoindent и smartindent могут мешать ему.

Я не проверял это с sh, но perl неожиданно начал вести себя правильно, когда я переключился.

Sidenote: перенаправление Хуана, «Восстановление отступа после ввода хэша», не является хорошим решением - хотя оно и исправляет проблему в одной ситуации (ввод кода), оно не меняет того, как его считает редактор должен быть отступ , поэтому повторный отступ (визуальный = или нормальный ==) сдвинет его обратно влево.

2 голосов
/ 12 января 2009

Добавьте строку ниже в вашем .vimrc

отступ типа файла для

(будет установлен правильный режим отступа в зависимости от типа файла)

1 голос
/ 24 февраля 2010

Предыдущий ответ, предлагающий:

: 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.
1 голос
/ 25 января 2009

Да, это очень раздражает. smartindent действительно только для языков, подобных Си. Посмотрите, как я включаю соответствующие отступы, основанные на языке: http://www.pixelbeat.org/settings/.vimrc

1 голос
/ 22 декабря 2008

У меня есть следующие строки в моем .vimrc, и я не вижу проблемы.

set smartindent
inoremap # X^H#

Раньше устанавливал autoindent после этих двух строк, но, похоже, это не имеет никакого эффекта.

...