Merge pull request #64 from kljohann/vim

Vim: Update syntax file, create indentation file, set commentstring (Bugs 528, 529)
This commit is contained in:
John Wiegley 2012-04-22 14:48:46 -07:00
commit 04574bc511
3 changed files with 72 additions and 11 deletions

View file

@ -11,7 +11,7 @@ let b:did_ftplugin = 1
let b:undo_ftplugin = "setlocal ".
\ "foldmethod< foldtext< ".
\ "include< comments< omnifunc< formatprg<"
\ "include< comments< commentstring< omnifunc< formatprg<"
" don't fill fold lines --> cleaner look
setl fillchars="fold: "
@ -19,6 +19,7 @@ setl foldtext=LedgerFoldText()
setl foldmethod=syntax
setl include=^!include
setl comments=b:;
setl commentstring=;%s
setl omnifunc=LedgerComplete
" set location of ledger binary for checking and auto-formatting

View file

@ -0,0 +1,46 @@
" 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
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 &sw
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 &sw
else
return 0
endif
else
" Everything else is not indented:
" start of transactions, pre-declarations, apply/end-lines
return 0
endif
endf

View file

@ -17,15 +17,24 @@ syntax clear
" DATE[=EDATE] [*|!] [(CODE)] DESC <-- first line of transaction
" ACCOUNT AMOUNT [; NOTE] <-- posting
syn region ledgerTransaction start=/^[[:digit:]~]/ skip=/^\s/ end=/^/
\ fold keepend transparent contains=ledgerTransactionDate,ledgerMetadata,ledgerPosting
syn region ledgerTransaction start=/^[[:digit:]~=]/ skip=/^\s/ end=/^/
\ fold keepend transparent
\ contains=ledgerTransactionDate,ledgerMetadata,ledgerPosting,ledgerTransactionExpression
syn match ledgerTransactionDate /^\d\S\+/ contained
syn match ledgerTransactionExpression /^[=~]\s\+\zs.*/ contained
syn match ledgerPosting /^\s\+[^[:blank:];][^;]*\ze\%($\|;\)/
\ contained transparent contains=ledgerAccount,ledgerMetadata
" every space in an account name shall be surrounded by two non-spaces
" every account name ends with a tab, two spaces or the end of the line
syn match ledgerAccount /^\s\+\zs\%(\S\@<= \S\|\S\)\+\ze\%( \|\t\|\s*$\)/ contained
syn region ledgerPreDeclaration start=/^\(account\|payee\|commodity\|tag\)/ skip=/^\s/ end=/^/
\ keepend transparent
\ contains=ledgerPreDeclarationType,ledgerPreDeclarationName,ledgerPreDeclarationDirective
syn match ledgerPreDeclarationType /^\(account\|payee\|commodity\|tag\)/ contained
syn match ledgerPreDeclarationName /^\S\+\s\+\zs.*/ contained
syn match ledgerPreDeclarationDirective /^\s\+\zs\S\+/ contained
syn match ledgerComment /^;.*$/
" comments at eol must be preceeded by at least 2 spaces / 1 tab
syn region ledgerMetadata start=/\%( \|\t\|^\s\+\);/ skip=/^\s\+;/ end=/^/
@ -34,22 +43,27 @@ syn match ledgerTag /:[^:]\+:/hs=s+1,he=e-1 contained
syn match ledgerTag /\%(\%(;\|^tag\)[^:]\+\)\@<=[^:]\+:\ze[^:]\+$/ contained
syn match ledgerTypedTag /\%(\%(;\|^tag\)[^:]\+\)\@<=[^:]\+::\ze[^:]\+$/ contained
syn region ledgerTagStack
\ matchgroup=ledgerTagPush start=/^tag\>/
\ matchgroup=ledgerTagPop end=/^pop\>/
\ contains=ledgerTagHead,ledgerTagStack,ledgerTransaction,ledgerComment
syn match ledgerTagHead /\%(^tag\s\+\)\@<=\S.*$/ contained contains=ledgerTag transparent
syn region ledgerApply
\ matchgroup=ledgerStartApply start=/^apply\>/
\ matchgroup=ledgerEndApply end=/^end\s\+apply\>/
\ contains=ledgerApplyHead,ledgerApply,ledgerTransaction,ledgerComment
syn match ledgerApplyHead /\%(^apply\s\+\)\@<=\S.*$/ contained
highlight default link ledgerTransactionDate Constant
highlight default link ledgerTransactionExpression Statement
highlight default link ledgerMetadata Tag
highlight default link ledgerTypedTag Keyword
highlight default link ledgerTag Type
highlight default link ledgerTagPop Tag
highlight default link ledgerTagPush Tag
highlight default link ledgerStartApply Tag
highlight default link ledgerEndApply Tag
highlight default link ledgerApplyHead Type
highlight default link ledgerAccount Identifier
highlight default link ledgerPreDeclarationType Type
highlight default link ledgerPreDeclarationName Identifier
highlight default link ledgerPreDeclarationDirective Type
" syncinc is easy: search for the first transaction.
syn sync clear
syn sync match ledgerSync grouphere ledgerTransaction "^[[:digit:]~]"
syn sync match ledgerSync grouphere ledgerTransaction "^[[:digit:]~=]"
let b:current_syntax = "ledger"