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