summaryrefslogtreecommitdiff
path: root/lisp/ledger-sort.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/ledger-sort.el')
-rw-r--r--lisp/ledger-sort.el107
1 files changed, 52 insertions, 55 deletions
diff --git a/lisp/ledger-sort.el b/lisp/ledger-sort.el
index c5a41952..870e298c 100644
--- a/lisp/ledger-sort.el
+++ b/lisp/ledger-sort.el
@@ -1,6 +1,6 @@
;;; ledger-xact.el --- Helper code for use with the "ledger" command-line tool
-;; Copyright (C) 2003-2013 John Wiegley (johnw AT gnu DOT org)
+;; Copyright (C) 2003-2015 John Wiegley (johnw AT gnu DOT org)
;; This file is not part of GNU Emacs.
@@ -16,8 +16,8 @@
;;
;; 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.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+;; MA 02110-1301 USA.
@@ -26,39 +26,34 @@
;;; Code:
-(defun ledger-next-record-function ()
- "Move point to next transaction."
- (if (re-search-forward ledger-payee-any-status-regex nil t)
- (goto-char (match-beginning 0))
- (goto-char (point-max))))
-
-(defun ledger-end-record-function ()
- "Move point to end of transaction."
- (forward-paragraph))
(defun ledger-sort-find-start ()
+ "Find the beginning of a sort region"
(if (re-search-forward ";.*Ledger-mode:.*Start sort" nil t)
(match-end 0)))
(defun ledger-sort-find-end ()
+ "Find the end of a sort region"
(if (re-search-forward ";.*Ledger-mode:.*End sort" nil t)
(match-end 0)))
(defun ledger-sort-insert-start-mark ()
+ "Insert a marker to start a sort region"
(interactive)
(save-excursion
(goto-char (point-min))
(if (ledger-sort-find-start)
- (delete-region (match-beginning 0) (match-end 0))))
+ (delete-region (match-beginning 0) (match-end 0))))
(beginning-of-line)
(insert "\n; Ledger-mode: Start sort\n\n"))
(defun ledger-sort-insert-end-mark ()
+ "Insert a marker to end a sort region"
(interactive)
(save-excursion
(goto-char (point-min))
(if (ledger-sort-find-end)
- (delete-region (match-beginning 0) (match-end 0))))
+ (delete-region (match-beginning 0) (match-end 0))))
(beginning-of-line)
(insert "\n; Ledger-mode: End sort\n\n"))
@@ -69,57 +64,59 @@
(defun ledger-sort-region (beg end)
"Sort the region from BEG to END in chronological order."
(interactive "r") ;; load beg and end from point and mark
- ;; automagically
+ ;; automagically
(let ((new-beg beg)
- (new-end end)
- point-delta
- (bounds (ledger-find-xact-extents (point)))
- target-xact)
-
- (setq point-delta (- (point) (car bounds)))
- (setq target-xact (buffer-substring (car bounds) (cadr bounds)))
- (setq inhibit-modification-hooks t)
+ (new-end end)
+ point-delta
+ (bounds (ledger-navigate-find-xact-extents (point)))
+ target-xact)
+
+ (setq point-delta (- (point) (car bounds)))
+ (setq target-xact (buffer-substring (car bounds) (cadr bounds)))
+ (setq inhibit-modification-hooks t)
(save-excursion
(save-restriction
- (goto-char beg)
- (ledger-next-record-function) ;; make sure point is at the
- ;; beginning of a xact
- (setq new-beg (point))
- (goto-char end)
- (ledger-next-record-function) ;; make sure end of region is at
- ;; the beginning of next record
- ;; after the region
- (setq new-end (point))
- (narrow-to-region new-beg new-end)
- (goto-char new-beg)
-
- (let ((inhibit-field-text-motion t))
- (sort-subr
- nil
- 'ledger-next-record-function
- 'ledger-end-record-function
- 'ledger-sort-startkey))))
-
- (goto-char (point-min))
- (re-search-forward (regexp-quote target-xact))
- (goto-char (+ (match-beginning 0) point-delta))
+ (goto-char beg)
+ ;; make sure point is at the beginning of a xact
+ (ledger-navigate-next-xact)
+ (unless (looking-at ledger-payee-any-status-regex)
+ (ledger-navigate-next-xact))
+ (setq new-beg (point))
+ (goto-char end)
+ (ledger-navigate-next-xact)
+ ;; make sure end of region is at the beginning of next record
+ ;; after the region
+ (setq new-end (point))
+ (narrow-to-region new-beg new-end)
+ (goto-char new-beg)
+
+ (let ((inhibit-field-text-motion t))
+ (sort-subr
+ nil
+ 'ledger-navigate-next-xact
+ 'ledger-navigate-end-of-xact
+ 'ledger-sort-startkey))))
+
+ (goto-char (point-min))
+ (re-search-forward (regexp-quote target-xact))
+ (goto-char (+ (match-beginning 0) point-delta))
(setq inhibit-modification-hooks nil)))
(defun ledger-sort-buffer ()
"Sort the entire buffer."
(interactive)
(let (sort-start
- sort-end)
- (save-excursion
- (goto-char (point-min))
- (setq sort-start (ledger-sort-find-start)
- sort-end (ledger-sort-find-end)))
+ sort-end)
+ (save-excursion
+ (goto-char (point-min))
+ (setq sort-start (ledger-sort-find-start)
+ sort-end (ledger-sort-find-end)))
(ledger-sort-region (if sort-start
- sort-start
- (point-min))
- (if sort-end
- sort-end
- (point-max)))))
+ sort-start
+ (point-min))
+ (if sort-end
+ sort-end
+ (point-max)))))
(provide 'ledger-sort)