update packages

This commit is contained in:
2025-02-26 20:16:44 +01:00
parent 59db017445
commit 45d49daef0
291 changed files with 16240 additions and 522600 deletions

View File

@@ -40,16 +40,25 @@
(declare-function ledger-read-account-with-prompt "ledger-mode" (prompt))
(declare-function ledger-read-date "ledger-mode" (prompt))
(defvar ledger-buf nil)
(defvar ledger-bufs nil)
(defvar ledger-acct nil)
(defvar ledger-target nil)
(defvar-local ledger-reconcile-ledger-buf nil
"Buffer from which the current reconcile buffer was created.")
(defvar-local ledger-reconcile-account nil
"Account being reconciled in the current buffer.")
(defvar-local ledger-reconcile-target nil
"Target amount for this reconciliation process.")
(defgroup ledger-reconcile nil
"Options for Ledger-mode reconciliation"
:group 'ledger)
(defcustom ledger-recon-buffer-name "*Reconcile*"
(define-obsolete-variable-alias
'ledger-recon-buffer-name
'ledger-reconcile-buffer-name
"2023-12-15")
(defcustom ledger-reconcile-buffer-name "*Reconcile*"
"Name to use for reconciliation buffer."
:type 'string
:group 'ledger-reconcile)
@@ -84,7 +93,7 @@ Default is `ledger-default-date-format'."
:group 'ledger-reconcile)
(defcustom ledger-reconcile-target-prompt-string "Target amount for reconciliation "
"Prompt for recon target."
"Prompt for reconcile target."
:type 'string
:group 'ledger-reconcile)
@@ -122,8 +131,15 @@ if string is longer, it is not truncated unless
"Key for sorting reconcile buffer.
Possible values are \"(date)\", \"(amount)\", \"(payee)\" or \"(0)\" for
no sorting, i.e. using ledger file order."
:type 'string
no sorting, i.e. using ledger file order.
It can also be any value accepted by ledger's --sort option."
:type '(choice
(const :tag "Date" "(date)")
(const :tag "Amount" "(amount)")
(const :tag "Payee" "(payee)")
(const :tag "No sorting (Ledger file order)" "(0)")
(string :tag "Custom --sort expression"))
:group 'ledger-reconcile)
(defcustom ledger-reconcile-insert-effective-date nil
@@ -140,6 +156,14 @@ described above."
:type 'boolean
:group 'ledger-reconcile)
(defvar-local ledger-reconcile-last-balance-message nil)
(defvar-local ledger-reconcile-last-balance-equals-target nil)
(defface ledger-reconcile-last-balance-equals-target-face
'((t :inherit header-line :foreground "green3"))
"Face used for header line when cleared-or-pending balance equals the target."
:group 'ledger-reconcile)
;; s-functions below are copied from Magnars' s.el
;; prefix ledger-reconcile- is added to not conflict with s.el
(defun ledger-reconcile-s-pad-left (len padding s)
@@ -197,14 +221,18 @@ described above."
"Display the cleared-or-pending balance.
And calculate the target-delta of the account being reconciled."
(interactive)
(let* ((pending (ledger-reconcile-get-cleared-or-pending-balance ledger-buf ledger-acct)))
(when pending
(if ledger-target
(message "Cleared and Pending balance: %s, Difference from target: %s"
(ledger-commodity-to-string pending)
(ledger-commodity-to-string (ledger-subtract-commodity ledger-target pending)))
(message "Pending balance: %s"
(ledger-commodity-to-string pending))))))
(when-let (pending (ledger-reconcile-get-cleared-or-pending-balance ledger-reconcile-ledger-buf ledger-reconcile-account))
(let ((message
(if-let (diff (and ledger-reconcile-target (ledger-subtract-commodity ledger-reconcile-target pending)))
(progn
(setq ledger-reconcile-last-balance-equals-target (zerop (car diff)))
(format-message "Cleared and Pending balance: %s, Difference from target: %s"
(ledger-commodity-to-string pending)
(ledger-commodity-to-string diff)))
(format-message "Pending balance: %s"
(ledger-commodity-to-string pending)))))
(setq ledger-reconcile-last-balance-message message)
(message "%s" message))))
(defun ledger-is-stdin (file)
"True if ledger FILE is standard input."
@@ -233,7 +261,7 @@ do the same if its value is non-nil."
(ledger-insert-effective-date)))
(defun ledger-reconcile-toggle ()
"Toggle the current transaction, and mark the recon window."
"Toggle the current transaction, and mark the reconcile window."
(interactive)
(beginning-of-line)
(let ((where (get-text-property (point) 'where))
@@ -279,35 +307,38 @@ Return the number of uncleared xacts found."
(ledger-do-reconcile ledger-reconcile-sort-key)
(set-buffer-modified-p t)
(ledger-reconcile-ensure-xacts-visible)
(ledger-display-balance)
(goto-char (point-min))
(forward-line line))))
(defun ledger-reconcile-refresh-after-save ()
"Refresh the recon-window after the ledger buffer is saved."
"Refresh the reconcile window after the ledger buffer is saved."
(let ((curbufwin (get-buffer-window (current-buffer)))
(curpoint (point))
(recon-buf (get-buffer ledger-recon-buffer-name)))
(when (buffer-live-p recon-buf)
(with-current-buffer recon-buf
(reconcile-buf (get-buffer ledger-reconcile-buffer-name)))
(when (buffer-live-p reconcile-buf)
(with-current-buffer reconcile-buf
(ledger-reconcile-refresh)
(set-buffer-modified-p nil))
(when curbufwin
(select-window curbufwin)
(select-window curbufwin)
(goto-char curpoint)
(recenter)
(ledger-highlight-xact-under-point)))))
(defun ledger-reconcile-add ()
"Use ledger xact to add a new transaction."
(interactive)
(with-current-buffer ledger-buf
(let ((date (ledger-read-date "Date: "))
(text (read-string "Transaction: ")))
(ledger-add-transaction (concat date " " text))))
(defun ledger-reconcile-add (date xact)
"Use ledger xact to add a new transaction.
When called interactively, prompt for DATE, then XACT."
(interactive
(list (ledger-read-date "Date: ")
(read-string "Transaction: " nil 'ledger-minibuffer-history)))
(with-current-buffer ledger-reconcile-ledger-buf
(ledger-add-transaction (concat date " " xact)))
(ledger-reconcile-refresh))
(defun ledger-reconcile-delete ()
"Delete the transactions pointed to in the recon window."
"Delete the transactions pointed to in the reconcile window."
(interactive)
(let ((where (get-text-property (point) 'where)))
(when (ledger-reconcile-get-buffer where)
@@ -329,7 +360,7 @@ Return the number of uncleared xacts found."
(target-buffer (if where
(ledger-reconcile-get-buffer where)
nil))
(cur-win (get-buffer-window (get-buffer ledger-recon-buffer-name))))
(cur-win (get-buffer-window (get-buffer ledger-reconcile-buffer-name))))
(when target-buffer
(switch-to-buffer-other-window target-buffer)
(ledger-navigate-to-line (cdr where))
@@ -339,16 +370,15 @@ Return the number of uncleared xacts found."
(forward-char -1)
(when (and come-back cur-win)
(select-window cur-win)
(get-buffer ledger-recon-buffer-name)))))
(get-buffer ledger-reconcile-buffer-name)))))
(defun ledger-reconcile-save ()
"Save the ledger buffer."
(interactive)
(with-selected-window (selected-window) ; restoring window is needed because after-save-hook will modify window and buffers
(dolist (buf (cons ledger-buf ledger-bufs))
(with-current-buffer buf
(basic-save-buffer)))))
(with-current-buffer ledger-reconcile-ledger-buf
(basic-save-buffer))))
(defun ledger-reconcile-finish ()
@@ -374,22 +404,22 @@ exit reconcile mode if `ledger-reconcile-finish-force-quit'"
(defun ledger-reconcile-quit ()
"Quit the reconcile window without saving ledger buffer."
(interactive)
(let ((recon-buf (get-buffer ledger-recon-buffer-name))
(let ((reconcile-buf (get-buffer ledger-reconcile-buffer-name))
buf)
(if recon-buf
(with-current-buffer recon-buf
(if reconcile-buf
(with-current-buffer reconcile-buf
(ledger-reconcile-quit-cleanup)
(setq buf ledger-buf)
(setq buf ledger-reconcile-ledger-buf)
;; Make sure you delete the window before you delete the buffer,
;; otherwise, madness ensues
(delete-window (get-buffer-window recon-buf))
(kill-buffer recon-buf)
(delete-window (get-buffer-window reconcile-buf))
(kill-buffer reconcile-buf)
(set-window-buffer (selected-window) buf)))))
(defun ledger-reconcile-quit-cleanup ()
"Cleanup all hooks established by reconcile mode."
(interactive)
(let ((buf ledger-buf))
(let ((buf ledger-reconcile-ledger-buf))
(if (buffer-live-p buf)
(with-current-buffer buf
(remove-hook 'after-save-hook 'ledger-reconcile-refresh-after-save t)
@@ -398,10 +428,10 @@ exit reconcile mode if `ledger-reconcile-finish-force-quit'"
(ledger-highlight-xact-under-point))))))
(defun ledger-marker-where-xact-is (emacs-xact posting)
"Find the position of the EMACS-XACT in the `ledger-buf'.
"Find the position of the EMACS-XACT in the `ledger-reconcile-ledger-buf'.
POSTING is used in `ledger-clear-whole-transactions' is nil."
(let ((buf (if (ledger-is-stdin (nth 0 emacs-xact))
ledger-buf
ledger-reconcile-ledger-buf
(find-file-noselect (nth 0 emacs-xact)))))
(cons
buf
@@ -452,8 +482,10 @@ POSTING is used in `ledger-clear-whole-transactions' is nil."
(ledger-reconcile-format-posting beg
where
fmt
(ledger-format-date (nth 2 xact)) ; date
(if (nth 3 xact) (nth 3 xact) "") ; code
(ledger-format-date
(nth 2 xact)
ledger-reconcile-default-date-format) ; date
(if (nth 3 xact) (nth 3 xact) "") ; code
(nth 3 posting) ; status
(ledger-reconcile-truncate-right
(nth 4 xact) ; payee
@@ -467,8 +499,8 @@ POSTING is used in `ledger-clear-whole-transactions' is nil."
"SORT the uncleared transactions in the account.
The sorted results are displayed in in the *Reconcile* buffer.
Return a count of the uncleared transactions."
(let* ((buf ledger-buf)
(account ledger-acct)
(let* ((buf ledger-reconcile-ledger-buf)
(account ledger-reconcile-account)
(sort-by (if sort
sort
"(date)"))
@@ -477,19 +509,17 @@ Return a count of the uncleared transactions."
(ledger-exec-ledger buf (current-buffer)
"--uncleared" "--real" "emacs" "--sort" sort-by account)
(goto-char (point-min))
(unless (eobp)
(if (looking-at "(")
(read (current-buffer))))))
(when (and (not (eobp)) (looking-at "("))
(read (current-buffer)))))
(fmt (ledger-reconcile-compile-format-string ledger-reconcile-buffer-line-format)))
(if (> (length xacts) 0)
(progn
(if ledger-reconcile-buffer-header
(insert (format ledger-reconcile-buffer-header account)))
(dolist (xact xacts)
(ledger-reconcile-format-xact xact fmt))
(goto-char (point-max))
(delete-char -1)) ;gets rid of the extra line feed at the bottom of the list
(insert (concat "There are no uncleared entries for " account)))
(if (null xacts)
(insert (concat "There are no uncleared entries for " account))
(if ledger-reconcile-buffer-header
(insert (format ledger-reconcile-buffer-header account)))
(dolist (xact xacts)
(ledger-reconcile-format-xact xact fmt))
(goto-char (point-max))
(delete-char -1)) ;gets rid of the extra line feed at the bottom of the list
(goto-char (point-min))
(set-buffer-modified-p nil)
(setq buffer-read-only t)
@@ -501,17 +531,19 @@ Return a count of the uncleared transactions."
This is achieved by placing that transaction at the bottom of the main window.
The key to this is to ensure the window is selected when the buffer point is
moved and recentered. If they aren't strange things happen."
(let ((recon-window (get-buffer-window (get-buffer ledger-recon-buffer-name))))
(when recon-window
(fit-window-to-buffer recon-window)
(with-current-buffer ledger-buf
(let ((reconcile-window (get-buffer-window (get-buffer ledger-reconcile-buffer-name))))
(when reconcile-window
(fit-window-to-buffer reconcile-window)
(with-current-buffer ledger-reconcile-ledger-buf
(add-hook 'kill-buffer-hook 'ledger-reconcile-quit nil t)
(if (get-buffer-window ledger-buf)
(select-window (get-buffer-window ledger-buf)))
(if (get-buffer-window ledger-reconcile-ledger-buf)
(select-window (get-buffer-window ledger-reconcile-ledger-buf)))
(recenter))
(select-window recon-window)
(select-window reconcile-window)
(ledger-reconcile-visit t))
(with-current-buffer ledger-reconcile-ledger-buf
(when ledger-occur-mode
(ledger-occur-refresh)))
(add-hook 'post-command-hook 'ledger-reconcile-track-xact nil t)))
(defun ledger-reconcile-track-xact ()
@@ -541,33 +573,35 @@ moved and recentered. If they aren't strange things happen."
(search-forward account nil t))))
(defun ledger-reconcile (&optional account target)
"Start reconciling, prompt for ACCOUNT."
"Start reconciling, prompt for ACCOUNT.
If TARGET is non-nil, it is used as the initial target for
reconciliation, otherwise prompt for TARGET."
(interactive)
(let ((account (or account (ledger-read-account-with-prompt "Account to reconcile")))
(buf (current-buffer))
(rbuf (get-buffer ledger-recon-buffer-name)))
(rbuf (get-buffer ledger-reconcile-buffer-name)))
(when (ledger-reconcile-check-valid-account account)
(if rbuf ;; *Reconcile* already exists
(with-current-buffer rbuf
(set 'ledger-acct account) ;; already buffer local
(setq ledger-reconcile-account account)
(when (not (eq buf rbuf))
;; called from some other ledger-mode buffer
(ledger-reconcile-quit-cleanup)
(setq ledger-buf buf)) ;; should already be buffer-local
(setq ledger-reconcile-ledger-buf buf))
(unless (get-buffer-window rbuf)
(ledger-reconcile-open-windows buf rbuf)))
;; no recon-buffer, starting from scratch.
;; no reconcile-buffer, starting from scratch.
(with-current-buffer (setq rbuf
(get-buffer-create ledger-recon-buffer-name))
(get-buffer-create ledger-reconcile-buffer-name))
(ledger-reconcile-open-windows buf rbuf)
(ledger-reconcile-mode)
(make-local-variable 'ledger-target)
(set (make-local-variable 'ledger-buf) buf)
(set (make-local-variable 'ledger-acct) account)))
(setq ledger-reconcile-ledger-buf buf)
(setq ledger-reconcile-account account)))
(add-hook 'after-save-hook 'ledger-reconcile-refresh-after-save nil t)
@@ -575,6 +609,9 @@ moved and recentered. If they aren't strange things happen."
(if ledger-narrow-on-reconcile
(ledger-occur (regexp-quote account)))
(setq ledger-reconcile-last-balance-message nil)
(setq ledger-reconcile-last-balance-equals-target nil)
(with-current-buffer rbuf
(if (> (ledger-reconcile-refresh) 0)
(ledger-reconcile-change-target target)
@@ -585,7 +622,7 @@ moved and recentered. If they aren't strange things happen."
(defun ledger-reconcile-change-target (&optional target)
"Change the TARGET amount for the reconciliation process."
(interactive)
(setq ledger-target (or target (ledger-read-commodity-string ledger-reconcile-target-prompt-string)))
(setq ledger-reconcile-target (or target (ledger-read-commodity-string ledger-reconcile-target-prompt-string)))
(ledger-display-balance))
(defmacro ledger-reconcile-change-sort-key-and-refresh (sort-by)
@@ -598,29 +635,30 @@ moved and recentered. If they aren't strange things happen."
(defvar ledger-reconcile-mode-map
(let ((map (make-sparse-keymap)))
(define-key map [(control ?m)] #'ledger-reconcile-visit)
(define-key map [return] #'ledger-reconcile-visit)
(define-key map [(control ?x) (control ?s)] #'ledger-reconcile-save)
(define-key map [(control ?l)] #'ledger-reconcile-refresh)
(define-key map [(control ?c) (control ?c)] #'ledger-reconcile-finish)
(define-key map [? ] #'ledger-reconcile-toggle)
(define-key map [?a] #'ledger-reconcile-add)
(define-key map [?d] #'ledger-reconcile-delete)
(define-key map [?g] #'ledger-reconcile);
(define-key map [?n] #'next-line)
(define-key map [?p] #'previous-line)
(define-key map [?t] #'ledger-reconcile-change-target)
(define-key map [?s] #'ledger-reconcile-save)
(define-key map [?q] #'ledger-reconcile-quit)
(define-key map [?b] #'ledger-display-balance)
(define-key map (kbd "C-m") #'ledger-reconcile-visit)
(define-key map (kbd "<return>") #'ledger-reconcile-visit)
(define-key map (kbd "C-x C-s") #'ledger-reconcile-save)
(define-key map (kbd "C-l") #'ledger-reconcile-refresh)
(define-key map (kbd "C-c C-c") #'ledger-reconcile-finish)
(define-key map (kbd "SPC") #'ledger-reconcile-toggle)
(define-key map (kbd "a") #'ledger-reconcile-add)
(define-key map (kbd "d") #'ledger-reconcile-delete)
(define-key map (kbd "g") #'ledger-reconcile);
(define-key map (kbd "n") #'next-line)
(define-key map (kbd "p") #'previous-line)
(define-key map (kbd "t") #'ledger-reconcile-change-target)
(define-key map (kbd "s") #'ledger-reconcile-save)
(define-key map (kbd "q") #'ledger-reconcile-quit)
(define-key map (kbd "b") #'ledger-display-balance)
(define-key map (kbd "B") #'ledger-reconcile-display-balance-in-header-mode)
(define-key map [(control ?c) (control ?o)] (ledger-reconcile-change-sort-key-and-refresh "(0)"))
(define-key map (kbd "C-c C-o") (ledger-reconcile-change-sort-key-and-refresh "(0)"))
(define-key map [(control ?c) (control ?a)] (ledger-reconcile-change-sort-key-and-refresh "(amount)"))
(define-key map (kbd "C-c C-a") (ledger-reconcile-change-sort-key-and-refresh "(amount)"))
(define-key map [(control ?c) (control ?d)] (ledger-reconcile-change-sort-key-and-refresh "(date)"))
(define-key map (kbd "C-c C-d") (ledger-reconcile-change-sort-key-and-refresh "(date)"))
(define-key map [(control ?c) (control ?p)] (ledger-reconcile-change-sort-key-and-refresh "(payee)"))
(define-key map (kbd "C-c C-p") (ledger-reconcile-change-sort-key-and-refresh "(payee)"))
map)
"Keymap for `ledger-reconcile-mode'.")
@@ -655,6 +693,17 @@ moved and recentered. If they aren't strange things happen."
(define-derived-mode ledger-reconcile-mode text-mode "Reconcile"
"A mode for reconciling ledger entries.")
(define-minor-mode ledger-reconcile-display-balance-in-header-mode
"When enabled, display the cleared-or-pending balance in the header."
:group 'ledger-reconcile
(if ledger-reconcile-display-balance-in-header-mode
(setq header-line-format '(ledger-reconcile-last-balance-equals-target
(:propertize
ledger-reconcile-last-balance-message
face ledger-reconcile-last-balance-equals-target-face)
ledger-reconcile-last-balance-message))
(setq header-line-format nil)))
(provide 'ledger-reconcile)
;;; ledger-reconcile.el ends here