Зачем это нужно
При командной разработке важным является соблюдение определенного кодинг стандарта. Речь не всегда идет об именовании переменных, функций и т.д. Перечисленное выше во многом вопрос опыта и умения формулировать мысли в тексте. Кодинг стандарт часто начинается с определения следующих вещей:
- Пробелы или табуляция
- Длина строки
Несоблюдение приведенных выше параметров стиля разными людьми в пределах одного файла ведет с следующим проблемам:
- Изрезанность кода
- Необходимость горизонтального скроллинга
Часто такие проблемы возникают из-за того, что новый человек, вошедший в проект, не настроил редактор корректно, и это остается незамеченным вплоть до того момента, как становится нужно сравнить разные версии одного и того же файла.

Чтобы сразу при открытии файла видеть подобные проблемы, я написал небольшой плагин.
Почему именно плагин
На это было несколько причин:
- Я уже почти 2 года на постоянной основе пользуюсь Vim для редактирования кода, и мне давно хотелось написать какой-нибудь плагин
- Использование стандартных настроек вроде
listcharsне дает подсветки в случае использования пробелов для отступов при опцииnoexpandtab - Задание зависимости от настроек в
ftplugin
Функционал
- Подсветка пробельных символов в соответствии с опцией
expandtab: если опция включена, то символы табуляции подсвечиваются красным, в противном случае пробелы в начале строки подсвечиваются желтым - Подсветка пробельных символов в конце строки
- Подсветка части строки превышающей длину, заданную опцией
textwidth
Плагин изнутри
В основе плагина лежит функция
matchadd(). Эта функция ищет в открытом буфере совпадения с заданным паттерном и подсвечивает его в соответствии с указанной схемой подсветки.Например, мы хотим подсветить все пробелы в буфере желтым:
:highligh Spaces ctermbg=Yellow guibg=Yellow :call matchadd('Spaces', '\s\+')
Общая функция подсветки выглядит следующим образом:
function FileStyleHighlightPattern(highlight) call matchadd(a:highlight['highlight'], a:highlight['pattern']) endfunction
На вход принимается словарь с именем схемы подсветки и паттерном для сравнения.
Для того, чтобы плагин автоматически запускал проверку паттернов, необходимо было добавить автоматические команды при инициализации плагина:
augroup filestyle_auto_commands autocmd! autocmd BufReadPost,BufNewFile * call FileStyleActivate() autocmd FileType * call FileStyleCheckFiletype() autocmd WinEnter * call FileStyleCheck() augroup end
Стоит отдельно оговорить, для чего нужен обработчик события
FileType. Его пришлось добави��ь для того, чтобы плагин не отрабатывал на help файлах, так как их содержимое может быть произвольным и никак не согласовываться с текущими настройками, а так же не может быть отредактировано из окна помощи.Обработчик
WinEnter нужен для того, чтобы при делении окна (:split) в открытом окне так же была подсветка.Так выглядит конечный результат:

Скачать можно по ссылкам: vim.org | GitHub
UPD: Починена ошибка
undefined variable filestyle_active. Изменения залиты на GitHub и Vim.org