summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2019-07-21 12:08:42 +1000
committerMaxime Coste <mawww@kakoune.org>2019-07-21 12:08:42 +1000
commit27fce78eaca93492ced4bcf5289abb7257d2ff65 (patch)
treea6ed15fbfc9f883155fe7d67eb29f52754918b9f
parentbe3d0f8b33112430433ee15747c746a5fe135425 (diff)
parent0bd57817b31b84b150378584587914f93270c701 (diff)
Merge remote-tracking branch 'codesoap/ledger'
-rw-r--r--rc/filetype/ledger.kak142
-rw-r--r--rc/tools/comment.kak4
2 files changed, 146 insertions, 0 deletions
diff --git a/rc/filetype/ledger.kak b/rc/filetype/ledger.kak
new file mode 100644
index 00000000..4e4eaaf9
--- /dev/null
+++ b/rc/filetype/ledger.kak
@@ -0,0 +1,142 @@
+# Detection
+# ---------
+
+# The .ledger suffix is not required by ledger, but the best I can do.
+hook global BufCreate .*\.ledger %{
+ set-option buffer filetype ledger
+}
+
+# Initialization
+# --------------
+
+hook global WinSetOption filetype=ledger %{
+ require-module ledger
+
+ hook window InsertChar \n -group ledger-indent ledger-indent-on-new-line
+ hook window ModeChange insert:.* -group ledger-trim-indent ledger-trim-indent
+
+ hook -once -always window WinSetOption filetype=.* %{
+ remove-hooks window ledger-.+
+ unset-option window static_words # Remove static completion
+ }
+}
+
+hook -group ledger-highlight global WinSetOption filetype=ledger %{
+ add-highlighter window/ledger ref ledger
+ hook -once -always window WinSetOption filetype=.* %{
+ remove-highlighter window/ledger
+ }
+}
+
+# Completion
+# ----------
+
+hook -group ledger-complete global WinSetOption filetype=ledger %{
+ set-option window static_words account note alias payee check assert eval \
+ default apply fixed bucket capture comment commodity format nomarket \
+ define end include tag test year
+}
+
+provide-module ledger %[
+
+# Highlighters
+# ------------
+#
+# TODO: highlight tag comments
+
+add-highlighter shared/ledger regions
+
+# The following highlighters implement
+# https://www.ledger-cli.org/3.0/doc/ledger3.html#Transactions-and-Comments
+
+add-highlighter shared/ledger/transaction region '^[0-9]' '^(?=\H)' group
+add-highlighter shared/ledger/transaction/first_line regex \
+ '^([0-9].*?)\h.*?(( +|\t+);.*?)?$' 1:function 2:string
+add-highlighter shared/ledger/transaction/posting regex \
+ '^\h+([^\h;].*?)(( +|\t+).*?)?(( +|\t+);.*?)?$' 1:type 2:value 4:string
+add-highlighter shared/ledger/transaction/note regex '^\h+;[^$]*?$' 0:string
+
+add-highlighter shared/ledger/comment region '^(;|#|%|\||\*)' '$' fill comment
+
+# TODO: Improve
+add-highlighter shared/ledger/other region '^(P|=|~)' '$' fill meta
+
+# The following highlighters implement
+# https://www.ledger-cli.org/3.0/doc/ledger3.html#Command-Directives
+
+# Add highlighters for simple one-line command directives
+evaluate-commands %sh{
+ # TODO: Is `expr` also a command directive? The documentation confuses me.
+ for cmd in 'apply account' 'apply fixed' 'assert' 'bucket' 'check' 'end' \
+ 'include' 'apply tag' 'test' 'year'; do
+ echo "add-highlighter shared/ledger/ region '^${cmd}' '.' fill function"
+ done
+}
+
+add-highlighter shared/ledger/account region '^account' '^(?=\H)' group
+add-highlighter shared/ledger/account/first_line regex '^account' 0:function
+add-highlighter shared/ledger/account/note regex '^\h*note' 0:function
+add-highlighter shared/ledger/account/alias regex '^\h*alias' 0:function
+add-highlighter shared/ledger/account/payee regex '^\h*payee' 0:function
+add-highlighter shared/ledger/account/check regex '^\h*check' 0:function
+add-highlighter shared/ledger/account/assert regex '^\h*assert' 0:function
+add-highlighter shared/ledger/account/eval regex '^\h*eval' 0:function
+add-highlighter shared/ledger/account/default regex '^\h*default' 0:function
+
+add-highlighter shared/ledger/alias region '^alias' '$' group
+add-highlighter shared/ledger/alias/keyword regex '^alias' 0:function
+add-highlighter shared/ledger/alias/key regex '^alias\h([^$=]*)=?' 1:variable
+add-highlighter shared/ledger/alias/value regex '^alias\h.*?=(.*?)$' 1:value
+
+add-highlighter shared/ledger/capture region '^capture' '$' group
+add-highlighter shared/ledger/capture/keyword regex '^capture' 0:function
+add-highlighter shared/ledger/capture/account regex \
+ '^capture\h+(.*?)( +|\t+|$)' 1:type
+add-highlighter shared/ledger/capture/regex regex \
+ '^capture\h+.*?( +|\t+)(.*?)$' 2:value
+
+add-highlighter shared/ledger/comment_block region '^comment' '^end comment' \
+ fill comment
+
+add-highlighter shared/ledger/commodity region '^commodity' '^(?=\H)' group
+add-highlighter shared/ledger/commodity/first_line regex '^commodity' 0:function
+add-highlighter shared/ledger/commodity/note regex '^\h*note' 0:function
+add-highlighter shared/ledger/commodity/format regex '^\h*format' 0:function
+add-highlighter shared/ledger/commodity/nomarket regex '^\h*nomarket' 0:function
+add-highlighter shared/ledger/commodity/alias regex '^\h*alias' 0:function
+add-highlighter shared/ledger/commodity/default regex '^\h*default' 0:function
+
+add-highlighter shared/ledger/define region '^define' '$' group
+add-highlighter shared/ledger/define/keyword regex '^define' 0:function
+add-highlighter shared/ledger/define/key regex '^define\h([^$=]*)=?' 1:variable
+add-highlighter shared/ledger/define/value regex '^define\h.*?=(.*?)$' 1:value
+
+add-highlighter shared/ledger/payee region '^payee' '^(?=\H)' group
+add-highlighter shared/ledger/payee/first_line regex '^payee' 0:function
+add-highlighter shared/ledger/payee/alias regex '^\h*alias' 0:function
+add-highlighter shared/ledger/payee/uuid regex '^\h*uuid' 0:function
+
+add-highlighter shared/ledger/tag region '^tag' '^(?=\H)' group
+add-highlighter shared/ledger/tag/first_line regex '^tag' 0:function
+add-highlighter shared/ledger/tag/check regex '^\h*check' 0:function
+add-highlighter shared/ledger/tag/assert regex '^\h*assert' 0:function
+
+# Commands
+# --------
+
+define-command -hidden ledger-indent-on-new-line %[
+ evaluate-commands -draft -itersel %[
+ # preserve previous line indent
+ try %[ execute-keys -draft \; K <a-&> ]
+ # cleanup trailing whitespaces from previous line
+ try %[ execute-keys -draft k <a-x> s \h+$ <ret> d ]
+ # indent after the first line of a transaction
+ try %[ execute-keys -draft k<a-x> <a-k>^[0-9]<ret> j<a-gt> ]
+ ]
+]
+
+define-command -hidden ledger-trim-indent %{
+ try %{ execute-keys -draft \; <a-x> s ^\h+$ <ret> d }
+}
+
+]
diff --git a/rc/tools/comment.kak b/rc/tools/comment.kak
index fbfb8267..586b516b 100644
--- a/rc/tools/comment.kak
+++ b/rc/tools/comment.kak
@@ -67,6 +67,10 @@ hook global BufSetOption filetype=latex %{
set-option buffer comment_line '%'
}
+hook global BufSetOption filetype=ledger %{
+ set-option buffer comment_line ';'
+}
+
hook global BufSetOption filetype=lisp %{
set-option buffer comment_line ';'
set-option buffer comment_block_begin '#|'