Поместив это в ваши 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 увидит комментарий в самой первой строке, поэтому не будет смысла перебирать остальную часть файла.