diff options
author | John Wiegley <johnw@newartisans.com> | 2003-10-29 07:47:41 +0000 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2003-10-29 07:47:41 +0000 |
commit | 8c5b124e9961d3ee64105e1576e79f304c18b40e (patch) | |
tree | fb7055327dedd10466f2fcfc4d8d1fdebcb6f7d2 /ledger.el | |
parent | 0d29133f8abee4cd24ca2eecce7f82be7534d5a9 (diff) | |
download | fork-ledger-8c5b124e9961d3ee64105e1576e79f304c18b40e.tar.gz fork-ledger-8c5b124e9961d3ee64105e1576e79f304c18b40e.tar.bz2 fork-ledger-8c5b124e9961d3ee64105e1576e79f304c18b40e.zip |
changes
Diffstat (limited to 'ledger.el')
-rw-r--r-- | ledger.el | 89 |
1 files changed, 88 insertions, 1 deletions
@@ -9,8 +9,95 @@ (delete-char 5) (exchange-point-and-mark))) +(defun ledger-clear-current () + (interactive) + (save-excursion + (when (re-search-backward "^[0-9]" nil t) + (skip-chars-forward "0-9./") + (insert " *")))) + (define-derived-mode ledger-mode text-mode "Ledger" "A mode for editing ledger data files." (setq comment-start ";" comment-end nil) (let ((map (current-local-map))) - (define-key map [(control ?c) ?n] 'ledger-add-entry))) + (define-key map [(control ?c) (control ?n)] 'ledger-add-entry) + (define-key map [(control ?c) (control ?c)] + 'ledger-clear-current))) + +(defun ledger-parse-entries (account) + (let* ((now (current-time)) + (current-year (nth 5 (decode-time now))) + (then now) + entries) + ;; `then' is 45 days ago + (setq then (time-subtract then (seconds-to-time (* 45 24 60 60)))) + (while (not (eobp)) + (when (looking-at + (concat "\\(Y\\s-+\\([0-9]+\\)\\|\\([0-9]{4}+\\)?[./]?" + "\\([0-9]+\\)[./]\\([0-9]+\\)\\s-+" + "\\(\\*\\s-+\\)?\\(.+\\)\\)")) + (let ((found (match-string 2)) + when) + (if found + (setq current-year (string-to-number found)) + (let ((start (match-beginning 0)) + (year (match-string 3)) + (month (string-to-number (match-string 4))) + (day (string-to-number (match-string 5))) + (mark (match-string 6)) + (desc (match-string 7))) + (if (and year (> (length year) 0)) + (setq year (string-to-number year))) + (setq when (encode-time 0 0 0 day month + (or year current-year))) + (when (or (not mark) (time-less-p then when)) + (forward-line) + (while (looking-at + (concat "\\s-+\\([A-Za-z_].+?\\) \\s-*" + "\\([^0-9]+\\)\\s-*\\([0-9.]+\\)")) + (let ((acct (match-string 1)) + (amt (match-string 3))) + (if (string= account acct) + (setq entries + (cons (list (copy-marker start) + mark when desc amt) + entries)))) + (forward-line))))))) + (forward-line)) + (nreverse entries))) + +(define-derived-mode ledger-reconcile-mode text-mode "Reconcile" + "A mode for reconciling ledger entries." + (let ((map (make-sparse-keymap))) + (define-key map [space] 'ledger-reconcile-toggle) + (use-local-map map))) + +(defvar ledger-buf nil) +(make-variable-buffer-local 'ledger-buf) + +(defun ledger-reconcile-toggle () + (interactive) + (let ((where (get-text-property (point) 'where))) + (with-current-buffer ledger-buf + (goto-char where) + (ledger-clear-current)))) + +(defun ledger-reconcile (account) + (interactive "sAccount to reconcile: ") + (let ((items (save-excursion + (goto-char (point-min)) + (ledger-parse-entries account))) + (buf (current-buffer))) + (pop-to-buffer (generate-new-buffer "*Reconcile*")) + (ledger-reconcile-mode) + (setq ledger-buf buf) + (dolist (item items) + (let ((beg (point))) + (insert (format "%s %-30s %8.2f\n" + (format-time-string "%Y.%m.%d" (nth 2 item)) + (nth 3 item) + (string-to-number (nth 4 item)))) + (if (nth 1 item) + (set-text-properties beg (1- (point)) + (list 'face 'bold + 'where (nth 0 item)))))))) |