Monday, July 19, 2010

Re: Show indentation level

" IndentSigns.vim - Using Signs for indenting level
" ---------------------------------------------------------------
" Version: 0.1
" 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_changes")
finish
endif
let g:loaded_indentSigns = 1
let s:keepcpo = &cpo
set cpo&vim

" Check preconditions"{{{1
fu! s:Check()
" 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 = "DiffAdd"
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)
if indent > 0
exe "sign place " s:sign_prefix . item . " line=" . item . " name=" . (indent/&l:sts) . " buffer=" . bufnr('')
endif
endfor
endfu


fu! s:DefineSigns()"{{{1
for item in range(1,99)
exe "silent! sign undefine " item
exe "sign define" item "text=".item . " texthl=" . s:id_hl
endfor
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,99)
exe "sign undefine " item
endfor
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 Pablo!

On Di, 06 Jul 2010, Pablo Giménez wrote:

> I am trying to make more clear my indent levels when programming python.
> In many editors you can set to visualize indentation level in your
> text, at every level a character, usually a point is shown, so you
> onlu need to count the number of preceding points to know your indent
> level.
> I am already using cream-showinvisibles plugin:
> http://vim.sourceforge.net/scripts/script.php?script_id=363
> But this one don't show indentation levels visually.

I am not sure I understand correctly. I think you could use the signs
feature to display the numerical indent level by calculating the
indentlevel by using indent()/&sts for each line.

<a little bit later…>

Here is a sample plugin. This is a very rough version, that was ripped
off of one of my plugins (changesPlugin:
http://www.vim.org/scripts/script.php?script_id=3052)

regards,
Christian
--
Urlaub ohne Unterlaß wäre ein gutes Training für den Aufenthalt in
der Hölle.
-- George Bernard Shaw

--
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: