" ---------------------------------------------------------------
" Version: 0.2
" Authors: Christian Brabandt <cb@256bit.org>
" Last Change: Tue, 19 July 2010 21:16:28 +0200
" Script:  
" License: VIM License
" Documentation: N/A
" GetLatestVimScripts: 
" Documentation: N/A
" Init Folkore "{{{1
if &cp || exists("g:loaded_indentSigns")
 finish
endif
let g:loaded_indentSigns   = 1
let s:keepcpo              = &cpo
set cpo&vim
" Check preconditions
fu! s:Check() "{{{1
	" Check for the existence of unsilent
	if exists(":unsilent")
		let s:echo_cmd='unsilent echomsg'
	else
		let s:echo_cmd='echomsg'
	endif
	if !has("signs")
		call add(s:msg, "Sign Support support not available in your Vim version.")
		call add(s:msg, "IndentSigns plugin will not be working!")
		call s:WarningMsg()
		throw 'indentSigns:abort'
	endif
	let s:sign_prefix = 99
	let s:id_hl       = {}
	let s:id_hl.Line  = "DiffAdd"
	let s:id_hl.Error = "Error"
	let s:id_hl.Check = "User1"
endfu
fu! s:WarningMsg() "{{{1
	redraw!
	if !empty(s:msg)
		let msg=["IndentSigns.vim: " . s:msg[0]] + s:msg[1:]
		echohl WarningMsg
		for mess in msg
			exe s:echo_cmd "mess"
		endfor
		echohl Normal
		let v:errmsg=msg[0]
	endif
endfu
fu! s:Init() "{{{1
	" Message queue, that will be displayed.
	let s:msg  = []
	" Only check the first time this file is loaded
	" It should not be neccessary to check every time
	if !exists("s:precheck")
		call s:Check()
		let s:precheck=1
	endif
	" This variable is a prefix for all placed signs.
	" This is needed, to not mess with signs placed by the user
	let s:signs={}
	" Delete previously placed signs
	call s:UnPlaceSigns()
	call s:DefineSigns()
	call s:AuCmd(1)
endfu
fu! s:AuCmd(arg) "{{{1
	if a:arg
	augroup IndentSigns
		autocmd!
		let s:verbose=0
		au InsertLeave,CursorHold * :call s:UpdateView()
	augroup END
	else
	augroup IndentSigns
		autocmd!
	augroup END
	endif
endfu
fu! s:UnPlaceSigns() "{{{1
	redir => a
	silent sign place
	redir end
	let b=split(a,"\n")
	let b=filter(b, 'v:val =~ "id=".s:sign_prefix')
	let b=map(b, 'matchstr(v:val, ''id=\zs\d\+'')')
	for id in b
	exe "sign unplace" id
	endfor
endfu
fu! s:PlaceSigns() "{{{1
	for item in range(1,line('$'))
		let indent=indent(item)
		let div   = &l:sts > 0 ? &l:sts : &ts
		if div > 0
			if len(split(getline(item), '\t\zs')) > 1
				exe "sign place " s:sign_prefix . item . " line=" .
					\ item . " name=IndentTabError buffer=" . bufnr('')
			elseif indent > 0 && (indent % div) > 0
				exe "sign place " s:sign_prefix . item . " line=" .
					\ item . " name=IndentCheck buffer=" . bufnr('')
			elseif indent > 0 && (indent/div) > 0
				exe "sign place " s:sign_prefix . item . " line=" .
					\ item . " name=" . (indent/div > 9 ? '10' : (indent/div)) . " buffer=" . bufnr('')
			endif
		endif
	endfor
endfu
fu! s:DefineSigns() "{{{1
	for item in range(1,9)
		exe "silent! sign undefine " item
		exe "sign define" item	"text=".item . " texthl=" . s:id_hl.Line
	endfor
	" Indentlevel > 9
	exe "sign define 10" 	"text=>".item . " texthl=" . s:id_hl.Line
	exe "sign define IndentTabError text=E texthl=" . s:id_hl.Error . " linehl=" . s:id_hl.Error
	exe "sign define IndentCheck text=C texthl=" . s:id_hl.Check . " linehl=" . s:id_hl.Check
endfu
fu! s:UpdateView()"{{{1
	if !exists("b:changes_chg_tick")
		let b:changes_chg_tick = 0
	endif
	" Only update, if there have been changes to the buffer
	if b:changes_chg_tick != b:changedtick
		call indentSigns#Run()
	endif
endfu
fu! indentSigns#Run()"{{{1
	try
		call s:Init()
    catch /^indentSigns:/
		call s:WarningMsg()
		return
    endtry
	call s:PlaceSigns()
endfu
fu! s:CleanUp()"{{{1
	" only delete signs, that have been set by this plugin
	call s:UnPlaceSigns()
	for item in range(1,9)
		exe "sign undefine " item
	endfor
	sign undefine IndentTabError
	sign undefine IndentCheck
	call s:AuCmd(0)
endfu
" Define Commands "{{{1
:com! IndentSigns :call indentSigns#Run()
:com! DisableIndentSigns :call s:CleanUp()
" Restore Vim Settings "{{{1
let &cpo= s:keepcpo
unlet s:keepcpo
" Modeline "{{{1
" vi:fdm=marker fdl=0
Hi Burnett,!
On Fr, 26 Aug 2011, Burnett, Rick wrote:
> Hello All!
> 
> I've been looking around to see if it is possible to create a script or add a feature that I would use quite a bit.
> 
> When editing python code, how much a line is indented sets the scope of the code, as many of you know, however, sometimes with long scopes that are heavily nested, it can be confusing to easily see how many indents you need.
> 
> What I would LOVE is to set vim similar to where it shows numbers, but instead, have the number show the number of indents relative to the current setting of ts.
> 
> What would happen is this
> 
> 	1)  The number is computed by the number of spaces at the lead (^\s*) / tab space setting (ts)
> 
> 	2)  If the number had any remainder (so not zero remainder) this means something isn't spaced right, set the text color to orange.
> 
> 	3)  If ANY tabs (\t) are in the line, set the color to red to indicate the line needs to be fixed.
> 
> I realize computing every line is expensive, but I'd be willing to take that hit on turning this one for some of the difficult functions I write.  It would also be nice if it ran on what was displayed only maybe.
> 
> Is this possible?  Or will I need to actually edit the gvim sourcecode for this sort of functionality?
I think I posted sometimes a similar script here: 
http://groups.google.com/group/vim_use/msg/cd69f15256f89531
So taking that script, adjusting it a little, you get the one I 
attached. (I have only barely tested it).
regards,
Christian
-- 
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
 
No comments:
Post a Comment