Reconcile mode is now working.
This commit is contained in:
parent
aedc23ef57
commit
47eebe8d73
1 changed files with 83 additions and 18 deletions
97
ledger.el
97
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)
|
(defun ledger-add-entry (entry)
|
||||||
(interactive
|
(interactive
|
||||||
(list (read-string "Entry: "
|
(list (read-string "Entry: "
|
||||||
|
|
@ -9,12 +48,19 @@
|
||||||
(delete-char 5)
|
(delete-char 5)
|
||||||
(exchange-point-and-mark)))
|
(exchange-point-and-mark)))
|
||||||
|
|
||||||
(defun ledger-clear-current ()
|
(defun ledger-toggle-current ()
|
||||||
(interactive)
|
(interactive)
|
||||||
|
(let (clear)
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(when (re-search-backward "^[0-9]" nil t)
|
(when (or (looking-at "^[0-9]")
|
||||||
|
(re-search-backward "^[0-9]" nil t))
|
||||||
(skip-chars-forward "0-9./")
|
(skip-chars-forward "0-9./")
|
||||||
(insert " *"))))
|
(delete-horizontal-space)
|
||||||
|
(if (equal ?\* (char-after))
|
||||||
|
(delete-char 1)
|
||||||
|
(insert " * ")
|
||||||
|
(setq clear t))))
|
||||||
|
clear))
|
||||||
|
|
||||||
(define-derived-mode ledger-mode text-mode "Ledger"
|
(define-derived-mode ledger-mode text-mode "Ledger"
|
||||||
"A mode for editing ledger data files."
|
"A mode for editing ledger data files."
|
||||||
|
|
@ -22,7 +68,7 @@
|
||||||
(let ((map (current-local-map)))
|
(let ((map (current-local-map)))
|
||||||
(define-key map [(control ?c) (control ?n)] 'ledger-add-entry)
|
(define-key map [(control ?c) (control ?n)] 'ledger-add-entry)
|
||||||
(define-key map [(control ?c) (control ?c)]
|
(define-key map [(control ?c) (control ?c)]
|
||||||
'ledger-clear-current)))
|
'ledger-toggle-current)))
|
||||||
|
|
||||||
(defun ledger-parse-entries (account)
|
(defun ledger-parse-entries (account)
|
||||||
(let* ((now (current-time))
|
(let* ((now (current-time))
|
||||||
|
|
@ -33,11 +79,12 @@
|
||||||
(setq then (time-subtract then (seconds-to-time (* 45 24 60 60))))
|
(setq then (time-subtract then (seconds-to-time (* 45 24 60 60))))
|
||||||
(while (not (eobp))
|
(while (not (eobp))
|
||||||
(when (looking-at
|
(when (looking-at
|
||||||
(concat "\\(Y\\s-+\\([0-9]+\\)\\|\\([0-9]{4}+\\)?[./]?"
|
(concat "\\(Y\\s-+\\([0-9]+\\)\\|"
|
||||||
|
"\\([0-9]\\{4\\}+\\)?[./]?"
|
||||||
"\\([0-9]+\\)[./]\\([0-9]+\\)\\s-+"
|
"\\([0-9]+\\)[./]\\([0-9]+\\)\\s-+"
|
||||||
"\\(\\*\\s-+\\)?\\(.+\\)\\)"))
|
"\\(\\*\\s-+\\)?\\(.+\\)\\)"))
|
||||||
(let ((found (match-string 2))
|
(let ((found (match-string 2))
|
||||||
when)
|
total when)
|
||||||
(if found
|
(if found
|
||||||
(setq current-year (string-to-number found))
|
(setq current-year (string-to-number found))
|
||||||
(let ((start (match-beginning 0))
|
(let ((start (match-beginning 0))
|
||||||
|
|
@ -52,15 +99,19 @@
|
||||||
(or year current-year)))
|
(or year current-year)))
|
||||||
(when (or (not mark) (time-less-p then when))
|
(when (or (not mark) (time-less-p then when))
|
||||||
(forward-line)
|
(forward-line)
|
||||||
|
(setq total 0.0)
|
||||||
(while (looking-at
|
(while (looking-at
|
||||||
(concat "\\s-+\\([A-Za-z_].+?\\) \\s-*"
|
(concat "\\s-+\\([A-Za-z_].+?\\)\\(\\s-*$\\| \\s-*"
|
||||||
"\\([^0-9]+\\)\\s-*\\([0-9.]+\\)"))
|
"\\([^0-9]+\\)\\s-*\\([0-9.]+\\)\\)"))
|
||||||
(let ((acct (match-string 1))
|
(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)
|
(if (string= account acct)
|
||||||
(setq entries
|
(setq entries
|
||||||
(cons (list (copy-marker start)
|
(cons (list (copy-marker start)
|
||||||
mark when desc amt)
|
mark when desc (or amt total))
|
||||||
entries))))
|
entries))))
|
||||||
(forward-line)))))))
|
(forward-line)))))))
|
||||||
(forward-line))
|
(forward-line))
|
||||||
|
|
@ -69,7 +120,7 @@
|
||||||
(define-derived-mode ledger-reconcile-mode text-mode "Reconcile"
|
(define-derived-mode ledger-reconcile-mode text-mode "Reconcile"
|
||||||
"A mode for reconciling ledger entries."
|
"A mode for reconciling ledger entries."
|
||||||
(let ((map (make-sparse-keymap)))
|
(let ((map (make-sparse-keymap)))
|
||||||
(define-key map [space] 'ledger-reconcile-toggle)
|
(define-key map [? ] 'ledger-reconcile-toggle)
|
||||||
(use-local-map map)))
|
(use-local-map map)))
|
||||||
|
|
||||||
(defvar ledger-buf nil)
|
(defvar ledger-buf nil)
|
||||||
|
|
@ -77,10 +128,18 @@
|
||||||
|
|
||||||
(defun ledger-reconcile-toggle ()
|
(defun ledger-reconcile-toggle ()
|
||||||
(interactive)
|
(interactive)
|
||||||
(let ((where (get-text-property (point) 'where)))
|
(let ((where (get-text-property (point) 'where))
|
||||||
|
cleared)
|
||||||
(with-current-buffer ledger-buf
|
(with-current-buffer ledger-buf
|
||||||
(goto-char where)
|
(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)
|
(defun ledger-reconcile (account)
|
||||||
(interactive "sAccount to reconcile: ")
|
(interactive "sAccount to reconcile: ")
|
||||||
|
|
@ -95,9 +154,15 @@
|
||||||
(let ((beg (point)))
|
(let ((beg (point)))
|
||||||
(insert (format "%s %-30s %8.2f\n"
|
(insert (format "%s %-30s %8.2f\n"
|
||||||
(format-time-string "%Y.%m.%d" (nth 2 item))
|
(format-time-string "%Y.%m.%d" (nth 2 item))
|
||||||
(nth 3 item)
|
(nth 3 item) (nth 4 item)))
|
||||||
(string-to-number (nth 4 item))))
|
|
||||||
(if (nth 1 item)
|
(if (nth 1 item)
|
||||||
(set-text-properties beg (1- (point))
|
(set-text-properties beg (1- (point))
|
||||||
(list 'face 'bold
|
(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