diff options
Diffstat (limited to 'ledger-xact.el')
-rw-r--r-- | ledger-xact.el | 62 |
1 files changed, 45 insertions, 17 deletions
diff --git a/ledger-xact.el b/ledger-xact.el index 6f61bba..f8fb216 100644 --- a/ledger-xact.el +++ b/ledger-xact.el @@ -30,7 +30,8 @@ (require 'ledger-navigate) (require 'ledger-exec) (require 'ledger-post) -(declare-function ledger-read-date "ledger-mode") +(declare-function ledger-read-date "ledger-mode" (prompt)) +(declare-function ledger-format-date "ledger-init" (&optional date)) ;; TODO: This file depends on code in ledger-mode.el, which depends on this. @@ -62,16 +63,30 @@ (move-overlay ledger-xact-highlight-overlay b (+ 1 e)) (move-overlay ledger-xact-highlight-overlay 1 1)))))) -(defun ledger-xact-payee () - "Return the payee of the transaction containing point or nil." +(defun ledger-xact-context () + "Return the context of the transaction containing point or nil." (let ((i 0)) (while (eq (ledger-context-line-type (ledger-context-other-line i)) 'acct-transaction) (setq i (- i 1))) (let ((context-info (ledger-context-other-line i))) (if (eq (ledger-context-line-type context-info) 'xact) - (ledger-context-field-value context-info 'payee) + context-info nil)))) +(defun ledger-xact-payee () + "Return the payee of the transaction containing point or nil." + (let ((xact-context (ledger-xact-context))) + (if xact-context + (ledger-context-field-value xact-context 'payee) + nil))) + +(defun ledger-xact-date () + "Return the date of the transaction containing point or nil." + (let ((xact-context (ledger-xact-context))) + (if xact-context + (ledger-context-field-value xact-context 'date) + nil))) + (defun ledger-time-less-p (t1 t2) "Say whether time value T1 is less than time value T2." ;; TODO: assert listp, or support when both are strings @@ -120,6 +135,9 @@ MOMENT is an encoded date" mark desc))))) (forward-line)))) +(defvar ledger-copy-transaction-insert-blank-line-after nil + "Non-nil means insert blank line after a transaction inserted with ‘ledger-copy-transaction-at-point’.") + (defun ledger-copy-transaction-at-point (date) "Ask for a new DATE and copy the transaction under point to that date. Leave point on the first amount." (interactive (list @@ -128,7 +146,10 @@ MOMENT is an encoded date" (transaction (buffer-substring-no-properties (car extents) (cadr extents))) (encoded-date (ledger-parse-iso-date date))) (ledger-xact-find-slot encoded-date) - (insert transaction "\n") + (insert transaction + (if ledger-copy-transaction-insert-blank-line-after + "\n\n" + "\n")) (beginning-of-line -1) (ledger-navigate-beginning-of-xact) (re-search-forward ledger-iso-date-regexp) @@ -141,19 +162,23 @@ MOMENT is an encoded date" "Delete the transaction surrounging POS." (interactive "d") (let ((bounds (ledger-navigate-find-xact-extents pos))) - (delete-region (car bounds) (cadr bounds)))) + (delete-region (car bounds) (cadr bounds))) + (delete-blank-lines)) (defvar ledger-add-transaction-last-date nil "Last date entered using `ledger-read-transaction'.") (defun ledger-read-transaction () "Read the text of a transaction, which is at least the current date." - (let ((reference-date (or ledger-add-transaction-last-date (current-time)))) - (read-string - "Transaction: " - ;; Pre-fill year and month, but not day: this assumes DD is the last format arg. - (ledger-format-date reference-date) - 'ledger-minibuffer-history))) + (let* ((reference-date (or ledger-add-transaction-last-date (current-time))) + (full-date-string (ledger-format-date reference-date)) + ;; Pre-fill year and month, but not day: this assumes DD is the last format arg. + (initial-string (replace-regexp-in-string "[0-9]+$" "" full-date-string)) + (entered-string (read-string "Transaction: " + initial-string 'ledger-minibuffer-history))) + (if (string= initial-string entered-string) + full-date-string + entered-string))) (defun ledger-parse-iso-date (date) "Try to parse DATE using `ledger-iso-date-regexp' and return a time value or nil." @@ -172,14 +197,17 @@ correct chronological place in the buffer." (let* ((args (with-temp-buffer (insert transaction-text) (eshell-parse-arguments (point-min) (point-max)))) - (ledger-buf (current-buffer))) + (ledger-buf (current-buffer)) + (separator "\n")) (unless insert-at-point (let* ((date (car args)) (parsed-date (ledger-parse-iso-date date))) (setq ledger-add-transaction-last-date parsed-date) (push-mark) ;; TODO: what about when it can't be parsed? - (ledger-xact-find-slot (or parsed-date date)))) + (ledger-xact-find-slot (or parsed-date date)) + (when (looking-at "\n*\\'") + (setq separator "")))) (if (> (length args) 1) (save-excursion (insert @@ -189,10 +217,10 @@ correct chronological place in the buffer." (goto-char (point-min)) (ledger-post-align-postings (point-min) (point-max)) (buffer-string)) - "\n")) + separator)) (progn - (insert (car args) " \n\n") - (end-of-line -1))))) + (insert (car args) " ") + (save-excursion (insert "\n" separator)))))) (provide 'ledger-xact) |