summaryrefslogtreecommitdiff
path: root/ledger.el
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2004-04-04 08:08:59 +0000
committerJohn Wiegley <johnw@newartisans.com>2004-04-04 08:08:59 +0000
commit47eebe8d73897546f02370b58db71bb46dce7064 (patch)
treeec37734d1849dee90ad0e03b7bb34903a4ddfaab /ledger.el
parentaedc23ef576ac14f4ca45f8546162b0206ac57a0 (diff)
downloadfork-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.el101
1 files changed, 83 insertions, 18 deletions
diff --git a/ledger.el b/ledger.el
index a987a018..095138eb 100644
--- a/ledger.el
+++ b/ledger.el
@@ -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