views:

878

answers:

2

So I have VIM7 (enhanced) on CentOS5 and it comes with all the usual VIM plugins/scripts ready to go.

$ find /usr/share/vim/vim70/ -name \*python\*
/usr/share/vim/vim70/syntax/python.vim
/usr/share/vim/vim70/ftplugin/python.vim
/usr/share/vim/vim70/indent/python.vim
/usr/share/vim/vim70/autoload/pythoncomplete.vim

I would think that when opening a file ending in .py (vim file.py) it would automatically load these plugins, but I am not sure that is the case. What I want is:

press TAB and receive 4 spaces auto indent next line for suites, conditionals, etc

I have this working by explicitly setting tabstop, shiftwidth, etc in my vimrc. Isn't this what the above python files are for? Why do I have to set these things in my vimrc? How do I get these features from the vim plugins instead?

Current vimrc:

syntax on
set hls
set expandtab
set textwidth=0
set tabstop=4
set softtabstop=4
set shiftwidth=4
set autoindent
set backspace=indent,eol,start
set incsearch
set ignorecase
set ruler
set wildmenu
set smarttab
filetype indent on
filetype on
filetype plugin on
+2  A: 

Setting tabstop, shiftwidth, etc... in your vimrc is correct, these set your global settings, as well as serve as parameters to the filetype specific indentation support.

The language indentation plugins use these settings, but typically also set an indent expression (:he inde) appropriate for the language. Thus the python indenter should be automatically indenting after a block opening statement (def, class, for...), and dedenting after a closing one (return, pass, continue...) and doing so according to the ts,sw,... you have set.

If you're still unsure if the plugin is loading for a buffer simply do :filetype to show the detection, plugin, and indent settings, and :set ft? to see the detected type.

abeyer
So to summarize the ../indent/python.vim file is not capable of setting the tabstop, shiftwidth, etc for me...so they must be specified within the vimrc? What happens if I wanted tabstop to be different depending on filetype? Can I place these vimrc settings in the indent/python.vim file so as to only have them load for python files?
CarpeNoctem
You could add those settings to indent/python.vim and get that result, but a better way would be to add filetype specific settings as autocmds that will run after a buffer is loaded. (:he au)
abeyer
+2  A: 

My understanding is that the python.vim is just a syntax highlighting file possibly because python files can be indented multiple ways. PEP8 prescribes 4 spaces but legacy files could be different including using tabs. Some of our legacy python files actually use 2 spaces per indent. So I leave python indenting to vim and configure it per file and per filetype. The following line in .vimrc gives me python specific settings which differ from say my xml, xhtml, html (2 spaces).

au FileType python setl shiftwidth=4 tabstop=4

You can also set specific settings by file with a modeline which is handy if you do have legacy files.

# vi: set tabstop=2 expandtab textwidth=70 filetype=python:
chauncey