Проблема
С недавнего времени стал активно использовать в своей работе Zen Coding. Данная технология в разы ускоряет верстку
страниц. Вот только нормального плагина для любимого Vim не было. Очень хотелось, чтобы аббревиатуры разворачивались
по нажатию клавиши tab. Причем все это должно было нормально работать с плагином snipMate, потому как его я тоже
активно применяю.
Решение
Решение оказалось очень простым. Я решил немного переделать код snipMate, чтобы он разворачивал
аббревиатуры Zen Coding.
Реализация
- Для начала, качаем сам плагин snipMate отсюда.
- Устанавливаем плагин согласно документации
- Скачиваем Zen Coding отсюда.
- Распакоовываем архив. Копируем папку /python/zencoding из архива в папку, с файлами Vim в подпапку plugin
- Далее открываем файл snipMate.vim и добавляем строки
- if snippet == ""
- py import zencodingvim, vim
- py zencodingvim.run(vim.eval("word"))
- let col = col('.') - len(word)
- sil exe
's/\V'.escape(word,
'/\.').'\%#//' - return snipMate#expandSnip(snippet, col)
- endif
после:
- for scope in [bufnr('%')] + split(&ft,
'\.') + ['_']
- let [trigger,
snippet] = s:GetSnippet(word, scope)
- " If word
is a trigger for a snippet,
delete the trigger & expand
- " the snippet.
- if snippet !=
'' - let col =
col('.') - len(trigger)
- sil exe
's/\V'.escape(trigger,
'/\.').'\%#//' - return
snipMate#expandSnip(snippet, col)
- endif
- endfor
- Создаем файл zencodingvim.py в той же папке(plugins) с таким содержанием:
- import vim , re, zencoding
- def add_placeholders(text):
- _ix = [ 0]
- def get_ix(m):
- _ix[ 0] +=
1 - return
'${%s}' % _ix[ 0]
- return re.sub(zencoding.utils.get_caret_placeholder(),
get_ix, text)
- def run(word):
- if vim.eval("&ft")
== 'css':
- filetype = 'css'
- else:
- filetype = 'html'
- abbr = zencoding.utils.extract_abbreviation(word)
- snippet = zencoding.expand_abbreviation(abbr, filetype,
"xhtml")
- snippet = add_placeholders(snippet)
- vim.command("let snippet = '%s'"
% snippet)
Результат
Теперь по нажатию клавиши TAB, snipMate сначла ищет snippet в своих запасах, а затем использует Zen Coding.
Решение получилось довольно легким. Если будет желание, можно будет написать полноценный плагин, который будет полностью нативно поддерживать Zen Coding.