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
--
http://mail.python.org/mailman/listinfo/python-list