使用vim处理django

本文介绍了如何在Vim编辑器中配置各种插件和模式,以提高Django项目开发效率。主要内容包括Vim模式配置、插件推荐、语法高亮、代码补全、搜索功能以及快捷映射等,旨在实现Django开发流程的无缝集成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

翻译文章:https://code.djangoproject.com/wiki/UsingVimWithDjango#UsingVimwithDjango

翻译人:jiong

 

使用vim处理django

Vim模式:

确保所有的开发人员都使用一个标准的tab格式(只要他们使用Vim),你可以为你的文件添加一个Vim模式(特别的注释),以便让人们能用同一格式打开文件。例子:

# vim: ai ts=4 sts=4et sw=4

极力推荐你在vim中如下配置shiftwidth,TabStop和softtabstop,添加以下代码到你的.vimrc:

autocmd FileType python set sw=4
autocmd FileType python set ts=4
autocmd FileType python set sts=4

插件:

YouCompleteMe

YouCompleteMe是vim的一个快速,立即响应,代码模糊搜索引擎,它为python提供了一个​基于Jedi补全的引擎。

以下是推荐设置:

letg:ycm_collect_identifiers_from_tags_files = 1 " Let YCM read tags fromCtags file

letg:ycm_use_ultisnips_completer = 1 " Default 1, just ensure

letg:ycm_seed_identifiers_with_syntax = 1 " Completion for programminglanguage's keyword

let g:ycm_complete_in_comments= 1 " Completion in comments

letg:ycm_complete_in_strings = 1 " Completion in string

Ultisnips.vim

ultisnips是在vim上的最终解决方案,它由Python写成并与​youcompleteme配合得很好。

以下是推荐配置:

let g:UltiSnipsExpandTrigger       = "<c-j>"
let g:UltiSnipsJumpForwardTrigger  = "<c-j>"
let g:UltiSnipsJumpBackwardTrigger = "<c-p>"
let g:UltiSnipsListSnippets        = "<c-k>" "List possible snippets based on current file

XMLEdit.vim

xmledit.vim插件对于编辑XML和HTML文件十分有用。它使得标记的补全变得异常简单,并允许你在开始和结束标记之间来回移动。

 

Syntaxfor templates

Dave Hodder 已经贡献了标准的​Vim语法文件。

如果你对写自己的配置文件很感兴趣,这是一个让vm处理django模板语法的额外简单配置:

创建文件$VIM/vimfiles/after/syntax/html.vim,并写入以下内容:

syn region djangotagmarkers start="{{" end="}}"

syn region djangovariablemarkers start="{%" end="%}"

command! -nargs=+ HiLink hi def link<args>

HiLink djangotagmarkers PreProc

HiLink djangovariablemarkers PreProc

delcommand HiLink

 

Project.vim

这个插件为vim添加了IDE文件组织功能。

类似以下的配置可以用来查看项目的文件。它看起来可怕,但却绝对值得一试。

Django Project=/path/to/project CD=.filter="[^_]*.py" {

 settings.py

 urls.py

 apps=apps {

 Polls=polls {

  views.py

  models.py

  }

 ToDo=todo {

  views.py

  models.py

  }

 media=mediaDir {

 images=imagesDir {

  }

 }

}

这种结构还可以通过内置的“C”命令创建,这个命令也会遍历整个目录树。

 

Tag List

​Tag list插件可能与project插件类似,也可以在python文件中显示类和函数。它需要ctags程序安装在你的系统中,这在linux与 OS X上安装十分容易)。

另外,我创建了一个shell的功能,这一灵感来自Jeremy Jones。当你给Django项目目录传递路径的时候,它能创建一个新的标签列表:

djvim() {
     gvim "+cd $1" "+TlistAddFilesRecursive . [^_]*py\|*html\|*css" +TlistOpen
}

 

Pyflakes

已经被弃用了,取而代之的是syntastic。pyflakes Vim的必备功能已经合并入syntastic,其中一个就是基于插件的语法检查后台。这意味着你可以检查许多不同的语言。我建议使用syntastic,除非你大多只是编辑Python语言。

pyflakes插件突出常见的Python错误,比如像拼错变量名之类。它也给出警告:关于未使用的导入模块,重新定义的函数等。

这个插件足够快,因为它本身利用Vim的钩子进行注册来应对离开插入模式和保存缓冲的情况,这样,给出警告总是最及时的。

 

Syntastic

syntastic是语法检查插件,通过运行外部语法检查器并显示任何错误给用户。这可以在有需求时完成,或在文件保存时自动完成。如果检测到语法错误,那么用户会收到通知,让人高兴的是,用用户不必编译他们的代码或者执行他们的脚本来查找这些错误。

 

Mappings

我使用下面的相关配置来使在django相关文件中的跳跃更加方便:

let g:last_relative_dir = ''

nnoremap \1 :call RelatedFile("models.py")<cr>

nnoremap \2 :call RelatedFile("views.py")<cr>

nnoremap \3 :call RelatedFile("urls.py")<cr>

nnoremap \4 :call RelatedFile("admin.py")<cr>

nnoremap \5 :call RelatedFile("tests.py")<cr>

nnoremap \6 :call RelatedFile ("templates/" )<cr>

nnoremap \7 :call RelatedFile ("templatetags/" )<cr>

nnoremap \8 :call RelatedFile ( "management/")<cr>

nnoremap \0 :e settings.py<cr>

nnoremap \9 :e urls.py<cr>

 

fun! RelatedFile(file)

   #This is to check that the directory looks djangoish

   if filereadable(expand("%:h"). '/models.py') ||isdirectory(expand("%:h") . "/templatetags/")

       exec "edit %:h/" . a:file

       let g:last_relative_dir = expand("%:h") . '/'

       return ''

   endif

   if g:last_relative_dir != ''

       exec "edit " . g:last_relative_dir . a:file

       return ''

   endif

   echo "Cant determine where relative file is : " . a:file

   return ''

endfun

 

fun SetAppDir()

   if filereadable(expand("%:h"). '/models.py') ||isdirectory(expand("%:h") . "/templatetags/")

       let g:last_relative_dir = expand("%:h") . '/'

       return ''

    endif

endfun

autocmd BufEnter *.py call SetAppDir()

 

SurroundMappings

这些是surround插件的额外环境:

let b:surround_{char2nr("v")} ="{{ \r }}"

let b:surround_{char2nr("{")} ="{{ \r }}"

let b:surround_{char2nr("%")} ="{% \r %}"

let b:surround_{char2nr("b")} ="{% block \1block name: \1 %}\r{% endblock \1\1 %}"

let b:surround_{char2nr("i")} ="{% if \1condition: \1 %}\r{% endif %}"

let b:surround_{char2nr("w")} ="{% with \1with: \1 %}\r{% endwith %}"

let b:surround_{char2nr("f")} ="{% for \1for loop: \1 %}\r{% endfor %}"

let b:surround_{char2nr("c")} ="{% comment %}\r{% endcomment %}"

 

把上述内容放在~/.vim/ftplugin/htmldjango.vim中,在视觉模式中的例子(首先选中一些文本)

type 'Sv' or 'S{' for a variable

type 'Sb' for a block

type 'Si' for an if statement

type 'Sw' for a with statement

type 'Sc' for a comment

type 'Sf' for a for statement

type 'S%' for other template tags

 

Pony.vim

pony.vim是一个Django项目的插件。基本的命令可用于django的文件,包括tab键为app名字进行补全:

:Dadmin [app] -> [app]/admin.py

:Dmodels [app] -> [app]/models.py

:Dsettings [app] -> [app]/settings.py

:Dtests [app] -> [app]/tests.py

:Durls [app] -> [app]/urls.py

Dviews [app] -> [app]/views.py

The manage.py script is wrapped withcompletion and a few shortcuts :

 

:Dmanage -> manage.py

:Drunserver -> manage.py runserver

:Dsyncdb -> manage.py syncdb

:Dshell -> manage.py shell

:Ddbshell -> manage.py dbshell

 

Eclipse

如果你想要一个具备代码补全和快速访问django特定命令如syncdb,启动交互Django的shell等功能的ide ,那么Eclipse + Aptana studio插件(Django代码补全、自动导入以及更多功能)+ vrapper插件(VIM仿真)或viplugin(如果你喜欢的话)的组合,是一个不错的解决方案。另外你可以试试Aptana Studio,配上vim插件,但我经历了vrapper与 Aptana的冲突问题,所以并没有使用Aptana插件。

 

建议

Django项目的管理:通过panosl

这个想法是创建一个插件,利用project.vim封装django-admin / manage.py的功能。

这将使你创建一个新的Django项目、利用预先指定的文件生成项目的所有文件。利用manage.py的使用,这可以扩展到允许在项目中的应用程序的创建。

:djsp [projectname]

 

# This will in turn generate the requiredProject file with all the files of the project.

:djsa [appname]

 

# This will create a new app, and updatethe Project file with the new data regarding the application.

 

在这点上,还是不够的,尽管我们可以通过允许内部命令启动/停止测试服务器和类似的别的方法,来封装更多的django-admin/manage的功能。

在我看来,这将有助于Django的开发和发展,在编辑器方面给予更多的关注,这对我们来说,当然是(G)vim的活力。

 

这是给任何考虑写这个插件的人的一些笔记。

Vim有’read’命令,可以通过取样操作从命令至缓冲区读取输出;

Vim有特殊的缓冲区来存储不同类型的输出;

Project插件有一个函数CreateEntriesFromDir()可以用来创建新的条目。通过参数’1‘可以创建一个最适合django的条目;

Project插件默认允许使用者使用不同项目的文件。一个新的Django项目被创建时,可能是新的插件生成了项目文件。

下面的代码可以用来在缓冲区中创建项目项。值得注意的是,不同的设置可能会受到 DoSetup调用的警告,所以最好使用一个新的缓冲区。

function! GetProjectSNR()

   if exists(":Project")

       let a_sav = @a

       redir @a

       exec "silent function"

       redir END

       let funclist = @a

       let @a = a_sav

       let func =split(split(matchstr(funclist,'.SNR.\{-}GenerateEntry'),'\n')[-1])[1]

       return matchlist(func, '\(.*\)G')[1]

   endif

endfunction

 

function! Test()

   let SNR = GetProjectSNR()

   call {SNR}DoSetup()

   call {SNR}DoEntryFromDir(0, line("."), 'test', 'c:\temp','c:\temp', '', '', '*', 0, 0)

   return ''

endfunction

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值