仅为Django项目配置Django SnipMate代码段

时间:2011-02-22 13:14:39

标签: django vim macvim snipmate

我正在使用SnipMate与Rob Hudson的snipmate_for_django代码段进行Django开发MacVim

要根据文件类型自动激活代码段,Rob建议将以下内容添加到~/.vimrc

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

这会为所有htmldjango个文件启用html个代码段。

有没有办法只为位于Django项目中的htmldjango文件启用html代码段?

例如,如果我正在处理与Rails项目相关的htmldjango文件,我不想启用html代码段。

2 个答案:

答案 0 :(得分:1)

你应该检查一下Tim Pope的Rails插件rails.vim是如何完成的。

如果您正在从Rails项目编辑* .rb(Ruby文件),则启用一些特定的Rails配置。但是,如果您正在编辑非Rails ruby​​文件,那就不行了。

您应该自己检查源代码,但检测的入口点如下:

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发生的情况下还有另一个自动命令。

您必须遵循插件的相同路径。在打开缓冲区时,您应该尝试在正在编辑的html文件路径中查找特定的Django文件或目录,然后确定您是否在Django项目中。

由于我不知道Django,我不知道要查找哪个文件,但是每个Django项目都可能有一个共同的项目配置文件。

答案 1 :(得分:1)

我也有这条线,但我想知道是否需要。 MacVim附带的默认filetype.vim - 在/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添加到确定标签中,但这似乎在几乎所有情况下都足够了。