Reconcile mode is now working.
This commit is contained in:
parent
aedc23ef57
commit
47eebe8d73
1 changed files with 83 additions and 18 deletions
101
ledger.el
101
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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue