Как стать автором
Поиск
Написать публикацию
Обновить

Zen-Coding в Vim

Проблема


С недавнего времени стал активно использовать в своей работе Zen Coding. Данная технология в разы ускоряет верстку
страниц. Вот только нормального плагина для любимого Vim не было. Очень хотелось, чтобы аббревиатуры разворачивались
по нажатию клавиши tab. Причем все это должно было нормально работать с плагином snipMate, потому как его я тоже
активно применяю.



Решение


Решение оказалось очень простым. Я решил немного переделать код snipMate, чтобы он разворачивал
аббревиатуры Zen Coding.


Реализация



  1. Для начала, качаем сам плагин snipMate отсюда.
  2. Устанавливаем плагин согласно документации
  3. Скачиваем Zen Coding отсюда.
  4. Распакоовываем архив. Копируем папку /python/zencoding из архива в папку, с файлами Vim в подпапку plugin
  5. Далее открываем файл snipMate.vim и добавляем строки
    1. if snippet == ""
    2.     py import zencodingvim, vim
    3.     py zencodingvim.run(vim.eval("word"))
    4.     let col = col('.') - len(word)
    5.     sil exe
      's/\V'.escape(word,
      '/\.').'\%#//'
    6.     return snipMate#expandSnip(snippet, col)
    7. endif


    после:
    1. for scope in [bufnr('%')] + split(&ft,
      '\.') + ['_']
    2.         let [trigger,
      snippet] = s:GetSnippet(word, scope)
    3.         " If word
      is a trigger for a snippet,
      delete the trigger & expand
    4.         " the snippet.
    5.         if snippet !=
      ''
    6.             let col =
      col('.') - len(trigger)
    7.             sil exe
      's/\V'.escape(trigger,
      '/\.').'\%#//'
    8.             return
      snipMate#expandSnip(snippet, col)
    9.         endif
    10.     endfor


  6. Создаем файл zencodingvim.py в той же папке(plugins) с таким содержанием:
    1. import vim , re, zencoding
    2.  
    3. def add_placeholders(text):
    4.     _ix = [ 0]
    5.     def get_ix(m):
    6.         _ix[ 0] +=
      1
    7.         return
      '${%s}' % _ix[ 0]
    8.  
    9.  
    10.     return re.sub(zencoding.utils.get_caret_placeholder(),
      get_ix, text)
    11.  
    12.  
    13. def run(word):
    14.     if vim.eval("&ft")
      == 'css':
    15.         filetype = 'css'
    16.     else:
    17.         filetype = 'html'
    18.  
    19.     abbr = zencoding.utils.extract_abbreviation(word)
    20.     snippet = zencoding.expand_abbreviation(abbr, filetype,
      "xhtml")
    21.     snippet = add_placeholders(snippet)
    22.     vim.command("let snippet = '%s'"
      % snippet)




Результат


Теперь по нажатию клавиши TAB, snipMate сначла ищет snippet в своих запасах, а затем использует Zen Coding.


Решение получилось довольно легким. Если будет желание, можно будет написать полноценный плагин, который будет полностью нативно поддерживать Zen Coding.


Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.