Python + vim + spaces vs tab

Robin Becker robin at reportlab.com
Tue Jun 8 05:21:33 EDT 2010


On 07/06/2010 22:18, Hans Mulder wrote:
> Jean-Michel Pichavant wrote:
>> Hello,
>>
>> Does anyone knows a way to configure vim so it automatically select to
>> correct expandtab value depending on the current buffer 'way of doing' ?
>> I need to edit different files, some are using spaces, others tabs.
>> Those belong to different projects, and changing all spaces to tabs is
>> not an option for me.
>>
>> I can't make vim automatically comply with the current buffer coding
>> style, anyone knows if it is possible ?
>
> If you can't get vim to automatically recognize the different styles you
> have to work with, then you could look into adding a "modeline" to each
> file. Typing ":help modeline" in vim will tell you how they work.
>
> Adding such a line to each and every file may be a bit of work, and you
> may have to convince other people working on the project that "explicit
> is better than implicit".
>
> -- HansM
>

I use the following at the end of my vimrc
> 	if exists("loaded_python_tabs") || &cp || exists("#BufReadPre#*.py")
> 		finish
> 	endif
>
> 	augroup python_tabs
> 		" Remove all python_tabs autocommands
> 		au!
> 		autocmd BufWritePre,FileWritePre *.py,*.pyw,<PYTHON;python> call s:writepre()
> 		autocmd BufWritePost,FileWritePost *.py,*.pyw,<PYTHON;python> call s:writepost()
> 		autocmd BufAdd,BufFilePost,BufReadPost,FileReadPost,FilterReadPost *.py,*.pyw,<PYTHON;python> call s:readpost()
> 	augroup END
> 	fun s:readpost()
> 		if &expandtab
> 			return
> 		endif
> 		let l = line(".")
> 		let c = col(".")
> 		let v:errmsg=""
> 		silent! /^\t
> 		let tabbed_python = v:errmsg==""
> 		silent nohls
> 		if !exists("b:was_tabbed_python")
> 			let b:was_tabbed_python = tabbed_python
> 		endif
> 		if !tabbed_python
> 			let mod_save=&modified
> 			try
> 				'[,']retab!
> 			catch
> 			endtry
> 			let &l:modified=mod_save
> 		endif
> 		call cursor(l,c)
> 	endfun
> 	fun s:writepre()
> 		let b:tabs_expanded = 0
> 		if &expandtab || (exists("b:was_tabbed_python") && b:was_tabbed_python)
> 			return
> 		endif
> 		setlocal expandtab
> 		execute "silent '[,']retab!"
> 		let s:ma_save = &ma
> 		setlocal ma
> 		let b:tabs_expanded = 1
> 	endfun
> 	fun s:writepost()
> 		if b:tabs_expanded
> 			setlocal noexpandtab
> 			execute "silent '[,']retab!"
> 			let &l:ma = s:ma_save
> 		endif
> 		unlet b:tabs_expanded
> 	endfun
> 	let loaded_python_tabs = 1

the idea is to switch between using tabs and spaces depending on the original 
source. If the input is all spaces we switch to tabs internally and then convert 
on output. If it was tabbed we keep that, if mixed I think it keeps that. This 
works for me as I often work with long latency connections and prefer tabs to 
spaces.
-- 
Robin Becker




More information about the Python-list mailing list