Привет, коллеги. Продолжаем тему распознавания Вимом типа редактируемого файла. Мы обсудили, как Вим распознает тип, при этом он может выполнить скрипт (файловый плагин), настраиваясь на данный тип (привязки, переменные, опции). Можно добавить к встроенному поведению свое, или создать новый тип. Вим может также раскрашивать синтаксис для данного типа.
А еще Вим может настроить правила расстановки отступов в программном коде для данного типа файлов (то есть, для данного языка программирования), и это отдельно от файлового плагина: можно одно, или другое, или оба вместе (или ничего). В ТеХ, например, мне удобнее без отступов, но с любимыми привязками.
Вообще, тему базовых автоматических отступов мы тоже уже обсуждали. Эти, заданные для конкретного типа правила более изощренны. С другой стороны, создание собственных правил расстановки отступов довольно сложно, так что либо вы это и без меня умеете, либо вам это просто не нужно. Разве что модифицировать по мелочи... Поэтому сосредоточимся именно на предусмотренных в поставке "индент-плагинах": скриптах, настраивающих правила отступов для различных языков программирования.
Свои индент-плагины должны лежать в подпапке indent папки, которая указана в переменной runtimepath (там через запятую может быть много папок). Например, ~/.vim . Те, то идут в поставке, ищите в той же подпапке, только папки, имя которой в переменной окружения $VIMRUNTIME.
Файл называется тип.vim, где "тип" — это распознанный тип. Например, tex.vim или c.vim или perl.vim
Вы можете взять тот плагин, что идет в поставке, и немного подправить его для того же или иного языка, положив свой вариант в свою папочку. Всем удобно.
Включается отработка индент-плагинов так: filetype indent on
В поставке идет их много, и можно скачать для языков, которые в поставку не вошли. Посмотрите папку $VIMRUNTIME/indent
Далее — переменные, которые позволяют влиять на правила отступов для некоторых языков (перевод справки Вим).
Фортран. По умолчанию нет отступов у циклов. Это связано со старой формой, когда вложенные циклы могли кончаться одним и тем же оператором с меткой. Структурные циклы do/enddo снабжаются отступами, но только если вы объявили о своей приверженности структурному стилю: let fortran_do_enddo=1
Структурные единицы кода (подпрограммы, функции, модули и т.п.) снабжаются отступами, но это можно подавить, чтобы экономить место: let fortran_indent_less=1
PHP. Необходимо включить подсветку синтаксиса. Без нее отступы не работают. Еще, если концы строк в стиле UNIX и присутствуют символы \r, то отступы сломаются. Надо эти символы удалить. Можно поручить это Виму: let PHP_removeCRwhenUnix=1
Можно отключить автоотступы в комментариях:
let g:PHP_autoformatcomment = 0
Или можно увеличить отступ у однострочных комментариев:
let g:PHP_outdentSLComments = N
где N означает число shiftwidth. Если эта переменная равна 4, то N это 4N пробелов.
А можно сдвинуть все PHP-строки: let g:PHP_default_indenting = N
Можно выравнивать скобки так же, как и код в них:
let g:PHP_BracesAtCodeLevel = 1
Можно выравнивать операторы case и default:
let g:PHP_vintage_case_default_indent = 1
PYTHON. Есть три переменные, которые по умолчанию содержат выражение, зависящее от переменной shiftwidth:
g:pyindent_open_paren = '&sw * 2'
g:pyindent_nested_paren = '&sw'
g:pyindent_continue = '&sw * 2'
Они задают отступы после открывающей скобки, вложенной скобки и строки продолжения. Указаны значения по умолчанию, но можно поставить туда что Вам будет угодно.
R. Аргументы функции на нескольких строках выравниваются. Можно это подавить: let r_indent_align_args = 0
Комментарии выравниваются все одинаково. Если вы предпочитаете стиль Emacs/ESS (строки с решеткой равняются по 40-му символу, с двумя решетками по коду, и с тремя не равняются), то let r_indent_ess_comments = 1
Если же при этом вы хотите изменить номер столбца с 40 на другой, это можно: let r_indent_comment_column = 30
Код после строки, которая окончилась на <-, выравнивается. По правилам того же Emacs/ESS, код не выравнивается, если это функция верхнего уровня. Это можно включить: let r_indent_ess_compatible = 1
BASH/SH. Предусмотрен словарь b:sh_indent_options, в котором можно задавать размер отступов в разных случаях. Ключи словаря в Вим в квадратных скобках и в одиночных кавычках. Варианты:
default: отступ по умолчанию
contunaton-line: для строки продолжения
case-labels, case-statements, case-breaks: для конструкции case
VIM. Есть одна переменная, для отступа строк продолжения:
let g:vim_indent_cont = &sw * 3
Указано ее значение по умолчанию: утроенное shiftwidth.
Удачи, коллеги!