diff options
author | Craig Earls <enderw88@gmail.com> | 2013-03-26 02:33:05 -0400 |
---|---|---|
committer | Craig Earls <enderw88@gmail.com> | 2013-03-26 02:33:05 -0400 |
commit | f1882d0a56f8b5828aaadfe06e5207a9b43d2ef0 (patch) | |
tree | ec001a4958708e97130d1b6a30b4cd1f9f3867b6 /lisp | |
parent | fec1c179e33225778fa4b69667d5382e7a2b5718 (diff) | |
download | fork-ledger-f1882d0a56f8b5828aaadfe06e5207a9b43d2ef0.tar.gz fork-ledger-f1882d0a56f8b5828aaadfe06e5207a9b43d2ef0.tar.bz2 fork-ledger-f1882d0a56f8b5828aaadfe06e5207a9b43d2ef0.zip |
Major speed improvements to ledger-post-align-postings
Got rid of markers. Use inhibit-modification-hook to suppress any other buffer stuff happening.
Got giant-buffer down to around 3.5 seconds with full modifications.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/ldg-post.el | 70 | ||||
-rw-r--r-- | lisp/ldg-state.el | 11 |
2 files changed, 36 insertions, 45 deletions
diff --git a/lisp/ldg-post.el b/lisp/ldg-post.el index 702518d3..a39dea65 100644 --- a/lisp/ldg-post.el +++ b/lisp/ldg-post.el @@ -124,11 +124,12 @@ PROMPT is a string to prompt with. CHOICES is a list of "\\([ \t]*[@={]@?[^\n;]+?\\)?" "\\([ \t]+;.+?\\|[ \t]*\\)?$")) -(defun ledger-next-amount (&optional end) +(defsubst ledger-next-amount (&optional end) "Move point to the next amount, as long as it is not past END. -Return the width of the amount field as an integer." - (beginning-of-line) - (when (re-search-forward ledger-post-amount-regex (marker-position end) t) +Return the width of the amount field as an integer and leave +point at beginning of the commodity." + ;;(beginning-of-line) + (when (re-search-forward ledger-post-amount-regex end t) (goto-char (match-beginning 0)) (skip-syntax-forward " ") (- (or (match-end 4) @@ -138,34 +139,29 @@ Return the width of the amount field as an integer." (concat "\\(^[ \t]+\\)" "\\([\\[(*!;a-zA-Z0-9]+?\\)")) -(defun ledger-next-account (&optional end) +(defsubst ledger-next-account (&optional end) "Move point to the beginning of the next account, or status marker (!*), as long as it is not past END. -Return the column of the beginning of the account" - (beginning-of-line) - (if (> (marker-position end) (point)) - (when (re-search-forward ledger-post-account-regex (marker-position end) t) - (goto-char (match-beginning 2)) - (current-column)))) +Return the column of the beginning of the account and leave point +at beginning of account" + ;; (beginning-of-line) + (if (> end (point)) + (when (re-search-forward ledger-post-account-regex end t) + (goto-char (match-beginning 2)) + (current-column)))) -(defun end-of-line-or-region (end-region) - "Return a number or marker to the END-REGION or end of line +(defsubst ledger-post-end-of-line-or-region (end-region) + "Return a number the END-REGION or end of line position, whichever is closer." - (let ((end (if (< end-region (line-end-position)) - end-region - (line-end-position)))) - (if (markerp end-region) - (copy-marker end) - end))) + (let ((eol (line-end-position))) + (if (< end-region eol) + end-region + eol))) (defsubst ledger-post-adjust (adjust-by) (if (> adjust-by 0) (insert (make-string adjust-by ? )) - (if (looking-back " " (- (point) 1)) - (delete-char adjust-by) - (skip-chars-forward "^ \t") - (delete-horizontal-space) - (insert " ")))) + (delete-char adjust-by))) (defun ledger-post-align-postings (&optional beg end) "Align all accounts and amounts within region, if there is no @@ -176,42 +172,40 @@ region align the posting on the current line." (not (use-region-p))) (set-mark (point))) - (let* ((has-align-hook (remove-hook - 'after-change-functions - 'ledger-post-maybe-align t)) + (let* ((inhibit-modification-hooks t) (mark-first (< (mark) (point))) (begin-region (if beg beg (if mark-first (mark) (point)))) (end-region (if end end - (if mark-first (point-marker) (mark-marker)))) + (if mark-first (point) (mark)))) acc-col amt-offset acc-adjust (lines-left 1)) ;; Condition point and mark to the beginning and end of lines (goto-char end-region) - (setq end-region (copy-marker (line-end-position))) + (setq end-region (line-end-position)) (goto-char begin-region) (goto-char - (setq begin-region - (copy-marker (line-beginning-position)))) - (while (or (setq acc-col (ledger-next-account (end-of-line-or-region end-region))) - (and (< (point) (marker-position end-region)) - (> lines-left 0))) + (setq begin-region + (line-beginning-position))) + (while (or (setq acc-col (ledger-next-account (ledger-post-end-of-line-or-region end-region))) + (and (< (point) end-region) + lines-left)) (when acc-col (setq acc-adjust (- ledger-post-account-alignment-column acc-col)) (if (/= acc-adjust 0) (ledger-post-adjust acc-adjust)) - (when (setq amt-offset (ledger-next-amount (end-of-line-or-region end-region))) + (when (setq amt-offset (ledger-next-amount (ledger-post-end-of-line-or-region end-region))) (let* ((amt-adjust (- ledger-post-amount-alignment-column amt-offset (current-column)))) (if (/= amt-adjust 0) (ledger-post-adjust amt-adjust))))) - (setq lines-left (forward-line))) - (if has-align-hook - (add-hook 'after-change-functions 'ledger-post-maybe-align t t))))) + (forward-line) + (setq lines-left (not (eobp)))) + (setq inhibit-modification-hooks nil)))) (defun ledger-post-maybe-align (beg end len) "Align amounts only if point is in a posting. diff --git a/lisp/ldg-state.el b/lisp/ldg-state.el index 88891aff..4f1b3695 100644 --- a/lisp/ldg-state.el +++ b/lisp/ldg-state.el @@ -122,12 +122,10 @@ dropped." ;;this excursion toggles the posting status (save-excursion - (let ((has-align-hook (remove-hook - 'after-change-functions - 'ledger-post-maybe-align t))) + (setq inhibit-modification-hooks t) - (goto-char (line-beginning-position)) - (when (looking-at "[ \t]") + (goto-char (line-beginning-position)) + (when (looking-at "[ \t]") (skip-chars-forward " \t") (let ((here (point)) (cur-status (ledger-state-from-char (char-after)))) @@ -162,8 +160,7 @@ dropped." ((looking-at " ") (delete-char 1)))) (setq new-status inserted)))) - (if has-align-hook - (add-hook 'after-change-functions 'ledger-post-maybe-align t t)))) + (setq inhibit-modification-hooks nil)) ;; This excursion cleans up the entry so that it displays ;; minimally. This means that if all posts are cleared, remove |