diff options
Diffstat (limited to 'indent')
| -rw-r--r-- | indent/ledger.vim | 52 | 
1 files changed, 52 insertions, 0 deletions
| diff --git a/indent/ledger.vim b/indent/ledger.vim new file mode 100644 index 00000000..9dde49b6 --- /dev/null +++ b/indent/ledger.vim @@ -0,0 +1,52 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ledger') == -1 + +" Vim filetype indent file +" filetype: ledger +" by Johann Klähn; Use according to the terms of the GPL>=2. +" vim:ts=2:sw=2:sts=2:foldmethod=marker + +scriptencoding utf-8 + +if exists('b:did_indent') +  finish +endif +let b:did_indent = 1 + +setl autoindent +setl indentexpr=GetLedgerIndent() + +if exists('*GetLedgerIndent') +  finish +endif + +function GetLedgerIndent(...) +  " You can pass in a line number when calling this function manually. +  let lnum = a:0 > 0 ? a:1 : v:lnum +  " If this line is empty look at (the indentation of) the last line. +  " Note that inside of a transaction no blank lines are allowed. +  let line = getline(lnum) +  let prev = getline(lnum - 1) + +  if line =~# '^\s\+\S' +    " Lines that already are indented (→postings, sub-directives) keep their indentation. +    return &shiftwidth +  elseif line =~# '^\s*$' +    " Current line is empty, try to guess its type based on the previous line. +    if prev =~# '^\([[:digit:]~=]\|\s\+\S\)' +      " This is very likely a posting or a sub-directive. +      " While lines following the start of a transaction are automatically +      " indented you will have to indent the first line following a +      " pre-declaration manually. This makes it easier to type long lists of +      " 'account' pre-declarations without sub-directives, for example. +      return &shiftwidth +    else +      return 0 +    endif +  else +    " Everything else is not indented: +    " start of transactions, pre-declarations, apply/end-lines +    return 0 +  endif +endf + +endif | 
