Настройка сниппетов Django SnipMate только для проектов Django

Я использую SnipMate с snipmate_for_django фрагменты для разработки Django с помощью MacVim.

Чтобы активировать фрагменты автоматически в зависимости от типа файла, Роб рекомендует добавить следующее в ~/.vimrc:

autocmd FileType python set ft=python.django " For SnipMate
autocmd FileType html set ft=htmldjango.html " For SnipMate

Это включает htmldjango фрагменты для всех html файлов.

Есть ли способ включить htmldjango фрагменты только для html файлов, расположенных в проекте Django?

Например, я не хочу включать фрагменты htmldjango, если я работаю над файлом html, связанным с проектом Rails.


person Matthew Rankin    schedule 22.02.2011    source источник


Ответы (2)


У меня тоже есть эта линия, но мне интересно, нужна ли она. filetype.vim по умолчанию, который поставляется с MacVim — найдите его в /Applications/MacVim.app/Contents/Resources/vim/runtime/filetype.vim — содержит фрагмент кода, который должен автоматически различать обычный HTML и Django, проверяя, есть ли тег extends или block в первых нескольких строках:

au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm  call s:FThtml()

" Distinguish between HTML, XHTML and Django
func! s:FThtml()
  let n = 1
  while n < 10 && n < line("$")
    if getline(n) =~ '\<DTD\s\+XHTML\s'
      setf xhtml
      return
    endif
    if getline(n) =~ '{%\s*\(extends\|block\)\>'
      setf htmldjango
      return
    endif
    let n = n + 1
  endwhile
  setf html
endfunc

На самом деле я взломал это, чтобы добавить load к определяющим тегам, но кажется, что этого достаточно почти во всех случаях.

person Daniel Roseman    schedule 22.02.2011
comment
По умолчанию filetype.vim, по-видимому, обрабатывает различие между шаблонами HTML и Django HTML. Однако похоже, что у него нет аналогичного метода для различения файлов, отличных от Django, и файлов Django .py. - person Matthew Rankin; 22.02.2011
comment
Я подтвердил, что строка autocmd FileType html set ft=htmldjango.html не нужна. filetype.vim по умолчанию действительно различает стандартные файлы HTML и файлы Django-HTML. Однако мне по-прежнему нужна была другая строка, чтобы установить тип файла python.django. Я думаю, что рассмотрю предложение @Xavier T. и попытаюсь сделать его более разумным в том, следует ли устанавливать только python или устанавливать тип файла python.django. - person Matthew Rankin; 22.02.2011

Вы должны проверить, как это делается в rails.vim, подключаемом модуле Rails от Тима Поупа, который работает туда.

Если вы редактируете *.rb (файл Ruby) из проекта Rails, вы включаете определенную конфигурацию Rails. Но не в том случае, если вы редактируете ruby-файл, отличный от Rails.

Вы должны проверить исходный код самостоятельно, но точка входа для обнаружения ниже:

augroup railsPluginDetect
  autocmd!
  autocmd BufNewFile,BufRead * call s:Detect(expand("<afile>:p"))
  autocmd VimEnter * if expand("<amatch>") == "" && !exists("b:rails_root") | call s:Detect(getcwd()) | endif | if exists("b:rails_root") | silent doau User BufEnterRails | endif
  autocmd FileType netrw if !exists("b:rails_root") | call s:Detect(expand("<afile>:p")) | endif | if exists("b:rails_root") | silent doau User BufEnterRails | endif
  autocmd BufEnter * if exists("b:rails_root")|silent doau User BufEnterRails|endif
  autocmd BufLeave * if exists("b:rails_root")|silent doau User BufLeaveRails|endif
  autocmd Syntax railslog if s:autoload()|call rails#log_syntax()|endif
augroup END

По сути, s:Detect находит корень проекта Rails и проверяет, существует ли ./config/environment.rb, и если это так, он создает событие BufEnterRails с silent doau User BufEnterRails, и есть еще одна автокоманда на случай, если произойдет BufEnterRails.

Вы должны следовать тому же пути для вашего плагина. При открытии буфера вы должны попытаться найти определенный файл или каталог Django в пути к файлу html, который вы редактируете, а затем решить, находитесь ли вы в проекте Django или нет.

Поскольку я не знаю Django, я не могу сказать, какой файл искать, но, вероятно, есть файл конфигурации проекта, общий для каждого проекта Django.

person Xavier T.    schedule 22.02.2011
comment
Спасибо. Я посмотрю, не смогу ли я заставить это работать для Django, выполнив поиск файла settings.py или manage.py. - person Matthew Rankin; 22.02.2011