[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.
This commit is contained in:
Steve Purcell 2014-12-09 15:11:44 +00:00
parent c8dd5d4a0a
commit b623306591
2 changed files with 53 additions and 57 deletions

View file

@ -228,17 +228,20 @@ With a prefix argument, remove the effective date."
(defun ledger-mode-clean-buffer () (defun ledger-mode-clean-buffer ()
"Indent, remove multiple line feeds and sort the buffer." "Indent, remove multiple line feeds and sort the buffer."
(interactive) (interactive)
(let ((start (point-min-marker))
(end (point-max-marker)))
(goto-char start)
(ledger-navigate-beginning-of-xact) (ledger-navigate-beginning-of-xact)
(beginning-of-line) (beginning-of-line)
(let ((target (buffer-substring (point) (progn (let ((target (buffer-substring (point) (progn
(end-of-line) (end-of-line)
(point))))) (point)))))
(untabify (point-min) (point-max)) (untabify start end)
(ledger-sort-buffer) (ledger-sort-buffer)
(ledger-post-align-postings (point-min) (point-max)) (ledger-post-align-postings start end)
(ledger-mode-remove-extra-lines) (ledger-mode-remove-extra-lines)
(goto-char (point-min)) (goto-char start)
(search-forward target))) (search-forward target))))
(defvar ledger-mode-map (defvar ledger-mode-map
(let ((map (make-sparse-keymap))) (let ((map (make-sparse-keymap)))

View file

@ -116,28 +116,21 @@ at beginning of account"
(unless beg (setq beg (if mark-first (mark) (point)))) (unless beg (setq beg (if mark-first (mark) (point))))
(unless end (setq end (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) ;; Extend region to whole lines
(let ((start-marker (set-marker (make-marker) (save-excursion
;; 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 beg)
(goto-char (line-beginning-position))))
(setq beg (end-marker (set-marker (make-marker) (save-excursion
(line-beginning-position))) (goto-char end)
(line-end-position)))))
(untabify start-marker end-marker)
(goto-char start-marker)
;; This is the guts of the alignment loop ;; This is the guts of the alignment loop
(while (and (or (setq acct-start-column (ledger-next-account (line-end-position))) (while (and (or (setq acct-start-column (ledger-next-account (line-end-position)))
lines-left) lines-left)
(< (point) end)) (< (point) end-marker))
(when acct-start-column (when acct-start-column
(setq acct-end-column (save-excursion (setq acct-end-column (save-excursion
(goto-char (match-end 2)) (goto-char (match-end 2))
@ -158,7 +151,7 @@ at beginning of account"
(insert (make-string amt-adjust ? )) (insert (make-string amt-adjust ? ))
(delete-char amt-adjust))))) (delete-char amt-adjust)))))
(forward-line) (forward-line)
(setq lines-left (not (eobp)))) (setq lines-left (not (eobp)))))
(setq inhibit-modification-hooks nil)))) (setq inhibit-modification-hooks nil))))
(defun ledger-post-edit-amount () (defun ledger-post-edit-amount ()