Sorry, this came in totally delayed. I tried to post it, but it didn't
show up, so I sent you the mail.

On Tue, Mar 24, 2009 at 10:41 PM, Johann Klähn <[email protected]> wrote:
>
> I've updated the vim syntax file to allow those metadata-comments and
> align properly for multi-byte-characters:
>
> if version < 600
>  syntax clear
> elseif exists("b:current_sytax")
>  finish
> endif
>
> " for debugging
> syntax clear
>
> " region: a normal posting
> syn region postNorm start=/^\d/ skip=/^\s/ end=/^/ fold keepend
> transparent contains=postDate,Metadata
> syn match postDate /^\d\S\+/ contained
> syn match Metadata /^\s\+;.*$/ contained
> syn match Comment /^;.*$/
>
> highlight default link Comment SpecialKey
> highlight default link Metadata SpecialKey
> highlight default link postDate Question
>
> " folding: how to represent a posting in one line.
> function! LedgerFoldText()
>   let line = strpart(getline(v:foldstart), 0, 99)
>   let amount = ""
>
>   let delta = 1
>   while (delta >= 1 && delta < (v:foldend-v:foldstart+1))
>      let other_line = getline(v:foldstart+delta)
>
>      if len(matchstr(other_line, '^\s\+;')) != 0
>         " Skip metadata/leading comment
>         let delta = delta + 1
>      else
>         " No comment, look for amount...
>         let delta = -1
>         let lst = matchlist(other_line,'\(\%([0-9]\+[,.]\)\=[0-9]\+\%
> ([,.][0-9]\+\)\=\|[,.][0-9]\+\)\s*\%([A-Za-z$€¢]\+\s*\)\=\%(\s*;.*\)\=
> $')
>         if (len(lst) != 0)
>            let amount = lst[1]
>         endif
>      endif
>   endwhile
>
>   " Replace each char with x prior to counting
>   " this fixes problems with multi byte characters
>   let pad_len = 80 - strlen(substitute(line, ".", "x", "g")) - strlen
> (substitute(amount, ".", "x", "g"))
>
>   if (pad_len < 0)
>      pad_len = 0
>   endif
>   let pad = strpart
> ("
> ", 0, pad_len)
>   return line . pad . amount
> endfunction
> set foldtext=LedgerFoldText()
> set foldmethod=syntax
>
> " syncinc is easy: search for the first posting.
> syn sync clear
> syn sync match ledgerSync grouphere postNorm "^\d"
>
> let b:current_syntax = "ledger"
>

Reply via email to