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
" IndentSigns.vim - Using Signs for indenting level
" ---------------------------------------------------------------
" Version:      0.2
" Authors:      Christian Brabandt <c...@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

Reply via email to