summaryrefslogtreecommitdiff
path: root/modules/ledger-config.el
blob: 21f7fb816abb444f01e13aef06ea538cd8c40838 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
;;; ledger-config.el --- Ledger Configuration -*- lexical-binding: t; -*-

;;; Commentary:

;; Use C-c ? in ledger mode for discoverability.

;; Unlike Mu4e and Elfeed (with Elfeed dashboard), there's no landing page for
;; Ledger. You're thrown immediately into your financial data file in edit mode.
;; Ok, but might be frightening for someone learning how to use Ledger. The
;; added hydra is intended to show what actions are available, as well as their
;; key bindings.


;; -------------------------------- Ledger Mode --------------------------------
;; edit files in ledger format

(use-package ledger-mode
  :mode ("\\.dat\\'"
         "\\.ledger\\'"
         "\\.journal\\'")
  :preface
  (defun cj/ledger-save ()
    "Automatically clean the ledger buffer at each save."
    (interactive)
    (save-excursion
      (when (buffer-modified-p)
        (with-demoted-errors (ledger-mode-clean-buffer))
        (save-buffer))))
  :bind
  (:map ledger-mode-map
        ("C-x C-s" . cj/ledger-save))
  :custom
  (ledger-clear-whole-transactions t)
  (ledger-reconcile-default-commodity "$")
  (ledger-report-use-header-line nil)
  (ledger-reports
   '(("bal"            "%(binary) --strict -f %(ledger-file) bal")
     ("bal this month" "%(binary) --strict -f %(ledger-file) bal -p %(month) -S amount")
     ("bal this year"  "%(binary) --strict -f %(ledger-file) bal -p 'this year'")
     ("net worth"      "%(binary) --strict -f %(ledger-file) bal Assets Liabilities")
     ("account"        "%(binary) --strict -f %(ledger-file) reg %(account)"))))

;; === Ledger Hydra ===
;; menu available while in ledger-mode for common ledger commands

(with-eval-after-load 'ledger-mode
  (defhydra hydra-ledger (:color teal :timeout 10 :hint nil)
    "Ledger common commands menu"
    ("r" ledger-report "report" :column "report")
    ("a" ledger-add-transaction "add transaction" :column "edit")
    ("R" ledger-sort-region  "sort region" :column "edit")
    ("A" ledger-sort-buffer  "sort all" :column "edit"))

  (defun ledger-mode-hook-hydra-setup ()
    "Create ledger hydra/menu keybinding when entering ledger mode."
    (local-set-key (kbd "C-c ?") 'hydra-ledger/body))
  (add-hook 'ledger-mode-hook 'ledger-mode-hook-hydra-setup))

;; ------------------------------ Flycheck Ledger ------------------------------
;; syntax and unbalanced transaction linting

(use-package flycheck-ledger
  :after ledger-mode)

;; ------------------------------- Company Ledger ------------------------------
;; autocompletion for ledger

(use-package company-ledger
  :after (company ledger-mode)
  :config
  (add-to-list 'company-backends 'company-ledger))

(provide 'ledger-config)
;;; ledger-config.el ends here.