diff options
author | Steve Purcell <steve@sanityinc.com> | 2014-12-09 15:11:44 +0000 |
---|---|---|
committer | Steve Purcell <steve@sanityinc.com> | 2014-12-09 15:11:44 +0000 |
commit | b623306591cab200cc7c69fb15ea7fe2dfc81bfd (patch) | |
tree | 19180f85741720beb8549a06d7c373ddbe88a0b9 /lisp | |
parent | c8dd5d4a0a88b22e9923ac2b5746a1812386a848 (diff) | |
download | ledger-b623306591cab200cc7c69fb15ea7fe2dfc81bfd.tar.gz ledger-b623306591cab200cc7c69fb15ea7fe2dfc81bfd.tar.bz2 ledger-b623306591cab200cc7c69fb15ea7fe2dfc81bfd.zip |
[emacs] Use markers instead of raw positions to make cleaning work better
Sometimes cleaning a buffer would leave the end of the buffer uncleaned,
because the end position would be moved along the way. This commit makes
the corresponding code use markers instead, which track the changes in
the buffer, and therefore ensure that the entire buffer is acted upon.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/ledger-mode.el | 25 | ||||
-rw-r--r-- | lisp/ledger-post.el | 91 |
2 files changed, 56 insertions, 60 deletions
diff --git a/lisp/ledger-mode.el b/lisp/ledger-mode.el index 4fc90f60..d3045661 100644 --- a/lisp/ledger-mode.el +++ b/lisp/ledger-mode.el @@ -228,17 +228,20 @@ With a prefix argument, remove the effective date." (defun ledger-mode-clean-buffer () "Indent, remove multiple line feeds and sort the buffer." (interactive) - (ledger-navigate-beginning-of-xact) - (beginning-of-line) - (let ((target (buffer-substring (point) (progn - (end-of-line) - (point))))) - (untabify (point-min) (point-max)) - (ledger-sort-buffer) - (ledger-post-align-postings (point-min) (point-max)) - (ledger-mode-remove-extra-lines) - (goto-char (point-min)) - (search-forward target))) + (let ((start (point-min-marker)) + (end (point-max-marker))) + (goto-char start) + (ledger-navigate-beginning-of-xact) + (beginning-of-line) + (let ((target (buffer-substring (point) (progn + (end-of-line) + (point))))) + (untabify start end) + (ledger-sort-buffer) + (ledger-post-align-postings start end) + (ledger-mode-remove-extra-lines) + (goto-char start) + (search-forward target)))) (defvar ledger-mode-map (let ((map (make-sparse-keymap))) diff --git a/lisp/ledger-post.el b/lisp/ledger-post.el index 11cd5847..a316129d 100644 --- a/lisp/ledger-post.el +++ b/lisp/ledger-post.el @@ -110,55 +110,48 @@ at beginning of account" (set-mark (point))) (let ((inhibit-modification-hooks t) - (mark-first (< (mark) (point))) - acct-start-column acct-end-column acct-adjust amt-width amt-adjust - (lines-left 1)) - - (unless beg (setq beg (if mark-first (mark) (point)))) - (unless end (setq end (if mark-first (mark) (point)))) - ;; Condition point and mark to the beginning and end of lines - (goto-char end) - (setq end (line-end-position)) - (goto-char beg) - (goto-char - (setq beg - (line-beginning-position))) - - (untabify beg end) - - ;; if untabify actually changed anything, then our begin and end are not correct. - (goto-char end) - (setq end (line-end-position)) - (goto-char beg) - (goto-char - (setq beg - (line-beginning-position))) - - ;; This is the guts of the alignment loop - (while (and (or (setq acct-start-column (ledger-next-account (line-end-position))) - lines-left) - (< (point) end)) - (when acct-start-column - (setq acct-end-column (save-excursion - (goto-char (match-end 2)) - (current-column))) - (when (/= (setq acct-adjust (- ledger-post-account-alignment-column acct-start-column)) 0) - (setq acct-end-column (+ acct-end-column acct-adjust)) ;;adjust the account ending column - (if (> acct-adjust 0) - (insert (make-string acct-adjust ? )) - (delete-char acct-adjust))) - (when (setq amt-width (ledger-next-amount (line-end-position))) - (if (/= 0 (setq amt-adjust (- (if (> (- ledger-post-amount-alignment-column amt-width) - (+ 2 acct-end-column)) - ledger-post-amount-alignment-column ;;we have room - (+ acct-end-column 2 amt-width)) - amt-width - (current-column)))) - (if (> amt-adjust 0) - (insert (make-string amt-adjust ? )) - (delete-char amt-adjust))))) - (forward-line) - (setq lines-left (not (eobp)))) + (mark-first (< (mark) (point))) + acct-start-column acct-end-column acct-adjust amt-width amt-adjust + (lines-left 1)) + + (unless beg (setq beg (if mark-first (mark) (point)))) + (unless end (setq end (if mark-first (mark) (point)))) + + ;; Extend region to whole lines + (let ((start-marker (set-marker (make-marker) (save-excursion + (goto-char beg) + (line-beginning-position)))) + (end-marker (set-marker (make-marker) (save-excursion + (goto-char end) + (line-end-position))))) + (untabify start-marker end-marker) + (goto-char start-marker) + + ;; This is the guts of the alignment loop + (while (and (or (setq acct-start-column (ledger-next-account (line-end-position))) + lines-left) + (< (point) end-marker)) + (when acct-start-column + (setq acct-end-column (save-excursion + (goto-char (match-end 2)) + (current-column))) + (when (/= (setq acct-adjust (- ledger-post-account-alignment-column acct-start-column)) 0) + (setq acct-end-column (+ acct-end-column acct-adjust)) ;;adjust the account ending column + (if (> acct-adjust 0) + (insert (make-string acct-adjust ? )) + (delete-char acct-adjust))) + (when (setq amt-width (ledger-next-amount (line-end-position))) + (if (/= 0 (setq amt-adjust (- (if (> (- ledger-post-amount-alignment-column amt-width) + (+ 2 acct-end-column)) + ledger-post-amount-alignment-column ;;we have room + (+ acct-end-column 2 amt-width)) + amt-width + (current-column)))) + (if (> amt-adjust 0) + (insert (make-string amt-adjust ? )) + (delete-char amt-adjust))))) + (forward-line) + (setq lines-left (not (eobp))))) (setq inhibit-modification-hooks nil)))) (defun ledger-post-edit-amount () |