vim: как применить * новую * подсветку синтаксиса (smarty) вместо html в зависимости от содержимого файла? - PullRequest
0 голосов
/ 16 октября 2011

Я установил (и, похоже, хорошо работает) этот файл "Подсветка синтаксиса Smarty" здесь . Проблема в том, что он связан с файлами * .tpl. У меня также есть подсветка синтаксиса HTML.

Вот что я хотел бы сделать: открывая HTML-файлы, просто проверьте, есть ли какие-нибудь специальные символы Smarty, такие как { (alphanum) $xx (alphanum) } или {* *}. Если это так, используйте «Smarty синтаксическая подсветка», в противном случае используйте «HTML подсветка синтаксиса». Есть идеи, как мне это сделать?

Не стесняйтесь сменить тему, чтобы сделать ее более общей, и мой вопрос тоже.

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Поместив это в ваши vimfiles, как ftdetect/smarty.vim должно работать:

autocmd BufNewFile,BufRead *.html call s:CheckForSmarty()

function! s:CheckForSmarty()
  for n in range(1, line('$'))
    let line = getline(n)
    if line =~ '{.*$\k\+}' || line =~ '{\*.*\*}'
      set filetype=smarty
      return
    endif
  endfor
endfunction

По сути, каждый раз, когда вы открываете html-файл, вызывается (script-local) функция s:CheckForSmarty.Он будет проходить через каждую строку и проверять ее на соответствие двум регулярным выражениям, которые вы видите.Если один из них совпадает, тип файла устанавливается на smarty, и функция завершает свое выполнение.В противном случае мы позволим vim позаботиться обо всем остальном.Вы можете настроить регулярные выражения, если они не работают достаточно хорошо для вас, я не очень умный пользователь, поэтому я не могу быть уверен, что они охватывают все варианты использования.

Это может быть медленнобольшие HTML-файлы, я тестировал только на маленьких.Если это оказывается проблемой, вы можете ограничить сценарий проверкой только первых 10 строк (вот как определяется тип файла htmldjango):

function! s:CheckForSmarty()
  for n in range(1, line('$'))
    if n > 10
      return
    endif

    let line = getline(n)
    if line =~ '{.*$\k\+}' || line =~ '{\*.*\*}'
      set filetype=smarty
      return
    endif
  endfor
endfunction

Другой способ вручную исправить скоростьпроблема заключается в размещении комментария вверху файла, например {* smarty *}.Vim увидит комментарий в самой первой строке, поэтому не будет смысла перебирать остальную часть файла.

0 голосов
/ 16 октября 2011

Поскольку я не слишком знаком с синтаксисом smarty, вы можете настроить регулярное выражение моего примера ниже.

function! s:CheckSmarty()
    for i in range(1, min([10, line('$')]))
        let line = getline(i)
        if line =~ '{\*.\{-}\*}'
            setl filetype=smarty
            return
        endif
    endfor
endfunction

au BufNewFile,BufRead *.html,*.htm call s:CheckSmarty()

Вы можете легко изменить количество строк, чтобы проверить наличие меток smarty в каждом html-файле. Здесь важно использовать setlocal, чтобы просто изменить текущий буфер.

...