Each Answer to this Q is separated by one/two green lines.
Does anyone know how to set up auto completion to work nicely with python, django, and vim?
I’ve been trying to use pysmell, but I can’t seem to get it set up correctly (or maybe I don’t know how it works). Right now, I run pysmell in the django directory (I’m using the trunk) and move the resulting tags to my project directory, then I also run pysmell in the project directory. Vim doesn’t pick up the django tags, though, and they don’t get auto completed.
Does anyone know how to set up auto completion in vim so that it will complete the long django functions (like get_object_or_404) as well as classes/functions in my own code? I have poked around on google but haven’t found any good resources.
First off, thank you for asking this question, as it forced me to figure this out myself and it’s great!
Here is the page I used as a reference: PySmell v0.6 released : orestis.gr
- Install PySmell using the
- Generate the
PYSMELLTAGSfile for django by going to your
site-packages/djangodirectory and running:
pysmell . -o ~/PYSMELLTAGS.django
- Copy that file to your project directory, and then ran
pysmell .to generate the project PYSMELLTAGS file
- Make sure pysmell is in your
- Run vim (
- Set the autocomplete command (
- Type ^x^o to autocomplete and it should work
I realize this is not a sustainable solution, but you should be able to use this as a start to getting it setup to always work (e.g., add the export to your .bashrc, add the :source to your .vimrc, setup
autocmd FileType python set omnifunc=pysmell#Complete, etc.)
Let me know if this is enough to get you started. It worked for me!
I simply added this to my .vimrc and as long as the
PYSMELLTAGS.django files are in my project root, it works fine without any other work:
python << EOF import os import sys import vim sys.path.append("/usr/local/python/lib/python2.5/site-packages") EOF exe ":source ~/src/pysmell/pysmell.vim" autocmd FileType python set omnifunc=pysmell#Complete
As I wrote in other places, I developed Jedi. I really think it is far better than all the existing solutions (even PyCharm).
It is built upon pythoncomplete and much much more powerful!
It works for complex code:
And has additional features:
There is a list of all possible features:
- builtin functions/classes support
- complex module / function / class structures
- ignores syntax and indentation errors
- multiple returns / yields
- tuple assignments / array indexing / dictionary indexing
- exceptions / with-statement
- *args / **kwargs
- descriptors -> property / staticmethod / classmethod
- generators (yield statement) / iterators
- support for some magic methods:
- support for list.append, set.add, list.extend, etc.
- (nested) list comprehensions / ternary expressions
- relative imports
- function annotations (py3k feature, are ignored right now, but being parsed.
I don’t know what to do with them.)
- class decorators (py3k feature, are being ignored too, until I find a use
case, that doesn’t work with Jedi)
isinstancechecks for if/while/assert
I’ve had good luck with exuberant-ctags for this.
I use this macro in my vimrc:
execute 'map :!/usr/bin/exuberant-ctags -f '.&tags.' --recurse '.$_P4ROOT.' '
You’ll want to modify that slightly, so that it includes your python /site-packages/django/ directory as well as your own code.
Then, hit F2 inside vim to update the tags, and use the regular vim tag bindings to navigate.
Today, you not need special extentions for django autocomplete in vim. Make sure that you have vim with python support.
To check it, type in xterm:
vim –version|grep python
+python -python3 +quickfix +reltime +rightleft -ruby +scrollbind +signs … …
To make work autocomplete, add this lines in your .vimrc:
autocmd FileType python set omnifunc=pythoncomplete#Complete
python import sys,os
python os.environ[‘DJANGO_SETTINGS_MODULE’] = ‘djangoProject.settings’
- sys.path.append is path to your django workspace directory
- djangoProject is name of your django project, which is going just after ‘/home/sergey/workspace/django’
Finally, save it and restart vim. Now, after ‘.’, you press default ctrl-x ctrl-o to get your autocomplete.