Pull to refresh

Vim FileStyle: проверяем открытый файл на соответствие настройкам Vim

Reading time 2 min
Views 6.1K

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


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

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

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

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

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



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

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


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

  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
Tags:
Hubs:
+14
Comments 21
Comments Comments 21

Articles