Информация для всех » Программирование » Zen-Coding в Vim
23.08.2011
Zen-Coding в Vim
Проблема
С недавнего времени стал активно использовать в своей работе Zen Coding. Данная технология в разы ускоряет верстку
страниц. Вот только нормального плагина для любимого Vim не было. Очень хотелось, чтобы аббревиатуры разворачивались
по нажатию клавиши tab. Причем все это должно было нормально работать с плагином snipMate, потому как его я тоже
активно применяю.
Решение
Решение оказалось очень простым. Я решил немного переделать код snipMate, чтобы он разворачивал
аббревиатуры Zen Coding.
Реализация
Для начала, качаем сам плагин snipMate отсюда https://github.com/msanders/snipmate.vim/tarball/master.
Устанавливаем плагин согласно документации
Скачиваем Zen Coding отсюда https://github.com/sergeche/zen-coding/tarball/master.
Распакоовываем архив. Копируем папку /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.
С недавнего времени стал активно использовать в своей работе Zen Coding. Данная технология в разы ускоряет верстку
страниц. Вот только нормального плагина для любимого Vim не было. Очень хотелось, чтобы аббревиатуры разворачивались
по нажатию клавиши tab. Причем все это должно было нормально работать с плагином snipMate, потому как его я тоже
активно применяю.
Решение
Решение оказалось очень простым. Я решил немного переделать код snipMate, чтобы он разворачивал
аббревиатуры Zen Coding.
Реализация
Для начала, качаем сам плагин snipMate отсюда https://github.com/msanders/snipmate.vim/tarball/master.
Устанавливаем плагин согласно документации
Скачиваем Zen Coding отсюда https://github.com/sergeche/zen-coding/tarball/master.
Распакоовываем архив. Копируем папку /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.
Просмотров: 6351