我正在使用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
代码段。
答案 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
添加到确定标签中,但这似乎在几乎所有情况下都足够了。