Найти тему
Блокнот математика

Рубрика "Секреты Вим". Типы файлов и отступы

Привет, коллеги. Продолжаем тему распознавания Вимом типа редактируемого файла. Мы обсудили, как Вим распознает тип, при этом он может выполнить скрипт (файловый плагин), настраиваясь на данный тип (привязки, переменные, опции). Можно добавить к встроенному поведению свое, или создать новый тип. Вим может также раскрашивать синтаксис для данного типа.

А еще Вим может настроить правила расстановки отступов в программном коде для данного типа файлов (то есть, для данного языка программирования), и это отдельно от файлового плагина: можно одно, или другое, или оба вместе (или ничего). В ТеХ, например, мне удобнее без отступов, но с любимыми привязками.

Отступы в Фортране.
Отступы в Фортране.

Вообще, тему базовых автоматических отступов мы тоже уже обсуждали. Эти, заданные для конкретного типа правила более изощренны. С другой стороны, создание собственных правил расстановки отступов довольно сложно, так что либо вы это и без меня умеете, либо вам это просто не нужно. Разве что модифицировать по мелочи... Поэтому сосредоточимся именно на предусмотренных в поставке "индент-плагинах": скриптах, настраивающих правила отступов для различных языков программирования.

Свои индент-плагины должны лежать в подпапке 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.

Удачи, коллеги!

Оглавление рубрики

Путеводитель по каналу