diff options
author | John Wiegley <johnw@newartisans.com> | 2004-04-04 08:08:59 +0000 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2004-04-04 08:08:59 +0000 |
commit | 47eebe8d73897546f02370b58db71bb46dce7064 (patch) | |
tree | ec37734d1849dee90ad0e03b7bb34903a4ddfaab /ledger.el | |
parent | aedc23ef576ac14f4ca45f8546162b0206ac57a0 (diff) | |
download | fork-ledger-47eebe8d73897546f02370b58db71bb46dce7064.tar.gz fork-ledger-47eebe8d73897546f02370b58db71bb46dce7064.tar.bz2 fork-ledger-47eebe8d73897546f02370b58db71bb46dce7064.zip |
Reconcile mode is now working.
Diffstat (limited to 'ledger.el')
-rw-r--r-- | ledger.el | 101 |
1 files changed, 83 insertions, 18 deletions
@@ -1,3 +1,42 @@ +;;; ledger.el --- Helper code for using my "ledger" command-line tool + +;; Copyright (C) 2004 John Wiegley (johnw AT gnu DOT org) + +;; Emacs Lisp Archive Entry +;; Filename: ledger.el +;; Version: 1.1 +;; Date: Thu 02-Apr-2004 +;; Keywords: data +;; Author: John Wiegley (johnw AT gnu DOT org) +;; Maintainer: John Wiegley (johnw AT gnu DOT org) +;; Description: Helper code for using my "ledger" command-line tool +;; URL: http://www.newartisans.com/johnw/emacs.html +;; Compatibility: Emacs21 + +;; This file is not part of GNU Emacs. + +;; This is free software; you can redistribute it and/or modify it under +;; the terms of the GNU General Public License as published by the Free +;; Software Foundation; either version 2, or (at your option) any later +;; version. +;; +;; This is distributed in the hope that it will be useful, but WITHOUT +;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +;; for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +;; MA 02111-1307, USA. + +;;; Commentary: + +;; This code is only meaningful if you are using "ledger". + +(defvar ledger-version "1.1" + "The version of ledger.el currently loaded") + (defun ledger-add-entry (entry) (interactive (list (read-string "Entry: " @@ -9,12 +48,19 @@ (delete-char 5) (exchange-point-and-mark))) -(defun ledger-clear-current () +(defun ledger-toggle-current () (interactive) - (save-excursion - (when (re-search-backward "^[0-9]" nil t) - (skip-chars-forward "0-9./") - (insert " *")))) + (let (clear) + (save-excursion + (when (or (looking-at "^[0-9]") + (re-search-backward "^[0-9]" nil t)) + (skip-chars-forward "0-9./") + (delete-horizontal-space) + (if (equal ?\* (char-after)) + (delete-char 1) + (insert " * ") + (setq clear t)))) + clear)) (define-derived-mode ledger-mode text-mode "Ledger" "A mode for editing ledger data files." @@ -22,7 +68,7 @@ (let ((map (current-local-map))) (define-key map [(control ?c) (control ?n)] 'ledger-add-entry) (define-key map [(control ?c) (control ?c)] - 'ledger-clear-current))) + 'ledger-toggle-current))) (defun ledger-parse-entries (account) (let* ((now (current-time)) @@ -33,11 +79,12 @@ (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}+\\)?[./]?" + (concat "\\(Y\\s-+\\([0-9]+\\)\\|" + "\\([0-9]\\{4\\}+\\)?[./]?" "\\([0-9]+\\)[./]\\([0-9]+\\)\\s-+" "\\(\\*\\s-+\\)?\\(.+\\)\\)")) (let ((found (match-string 2)) - when) + total when) (if found (setq current-year (string-to-number found)) (let ((start (match-beginning 0)) @@ -52,15 +99,19 @@ (or year current-year))) (when (or (not mark) (time-less-p then when)) (forward-line) + (setq total 0.0) (while (looking-at - (concat "\\s-+\\([A-Za-z_].+?\\) \\s-*" - "\\([^0-9]+\\)\\s-*\\([0-9.]+\\)")) + (concat "\\s-+\\([A-Za-z_].+?\\)\\(\\s-*$\\| \\s-*" + "\\([^0-9]+\\)\\s-*\\([0-9.]+\\)\\)")) (let ((acct (match-string 1)) - (amt (match-string 3))) + (amt (match-string 4))) + (if amt + (setq amt (string-to-number amt) + total (+ total amt))) (if (string= account acct) (setq entries (cons (list (copy-marker start) - mark when desc amt) + mark when desc (or amt total)) entries)))) (forward-line))))))) (forward-line)) @@ -69,7 +120,7 @@ (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) + (define-key map [? ] 'ledger-reconcile-toggle) (use-local-map map))) (defvar ledger-buf nil) @@ -77,10 +128,18 @@ (defun ledger-reconcile-toggle () (interactive) - (let ((where (get-text-property (point) 'where))) + (let ((where (get-text-property (point) 'where)) + cleared) (with-current-buffer ledger-buf (goto-char where) - (ledger-clear-current)))) + (setq cleared (ledger-toggle-current))) + (if cleared + (add-text-properties (line-beginning-position) + (line-end-position) + (list 'face 'bold)) + (remove-text-properties (line-beginning-position) + (line-end-position) + (list 'face))))) (defun ledger-reconcile (account) (interactive "sAccount to reconcile: ") @@ -95,9 +154,15 @@ (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)))) + (nth 3 item) (nth 4 item))) (if (nth 1 item) (set-text-properties beg (1- (point)) (list 'face 'bold - 'where (nth 0 item)))))))) + 'where (nth 0 item))) + (set-text-properties beg (1- (point)) + (list 'where (nth 0 item)))))) + (goto-char (point-min)))) + +(provide 'ledger) + +;;; ledger.el ends here |