3

我将SnipMate与 Rob Hudson 的片段一起用于使用MacVimsnipmate_for_django进行 Django 开发。

要根据文件类型自动激活片段,Rob 建议将以下内容添加到~/.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 项目相关的文件,我不想启用片段。

4

2 回答 2

1

您应该检查它是如何在rails.vim中完成的,这是Tim Pope 的 Rails 插件,它是这样工作的。

如果您正在编辑 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,如果是这种情况,它会创建一个事件BufEnterRailssilent doau User BufEnterRails并且在发生 BufEnterRails 的情况下还有另一个自动命令。

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

由于我不了解 Django,因此我无法确定要查找哪个文件,但每个 Django 项目可能都有一个通用的项目配置文件。

于 2011-02-22T14:21:50.430 回答
1

我也有那条线,但我想知道它是否需要。filetype.vimMacVim 附带的默认值- 在以下位置找到它/Applications/MacVim.app/Contents/Resources/vim/runtime/filetype.vim- 包含一些应该自动区分纯 HTML 和 Django 的代码,通过测试前几行中是否有extendsor标记: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到确定标签中,但这似乎在几乎所有情况下都足够了。

于 2011-02-22T14:30:32.173 回答