Зачем это нужно


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

  • Пробелы или табуляция
  • Длина строки

Несоблюдение приведенных выше параметров стиля разными людьми в пределах одного файла ведет с следующим проблемам:

  • Изрезанность кода
  • Необходимость горизонтального скроллинга

Часто такие проблемы возникают из-за того, что новый человек, вошедший в проект, не настроил редактор корректно, и это остается незамеченным вплоть до того момента, как становится нужно сравнить разные версии одного и того же файла.



Чтобы сразу при открытии файла видеть подобные проблемы, я написал небольшой плагин.

Почему именно плагин


На это было несколько причин:

  1. Я уже почти 2 года на постоянной основе пользуюсь Vim для редактирования кода, и мне давно хотелось написать какой-нибудь плагин
  2. Использование стандартных настроек вроде listchars не дает подсветки в случае использования пробелов для отступов при опции noexpandtab
  3. Задание зависимости от настроек в 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