Skip to content

Commit 90d1e24

Browse files
committed
Add undo cancelling, undo-tree
1 parent 79cf767 commit 90d1e24

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

line-reminder.el

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,9 @@
144144
(defvar-local line-reminder--before-end-linum -1
145145
"Record down the before end line number.")
146146

147+
(defvar-local line-reminder--undo-cancel-p nil
148+
"If non-nil, we should remove record of changes/saved lines for undo actions.")
149+
147150
;;; Util
148151

149152
(defun line-reminder--use-indicators-p ()
@@ -171,19 +174,15 @@ This function uses `string-match-p'."
171174
(defun line-reminder--mark-line-by-linum (ln fc)
172175
"Mark the line LN by using face name FC."
173176
(let ((inhibit-message t) (message-log-max nil))
174-
(ind-create-indicator-at-line ln
175-
:managed t
176-
:dynamic t
177-
:relative nil
178-
:fringe line-reminder-fringe-placed
179-
:bitmap line-reminder-fringe
180-
:face fc
181-
:priority
182-
(cl-case fc
183-
(line-reminder-modified-sign-face
184-
line-reminder-modified-sign-priority)
185-
(line-reminder-saved-sign-face
186-
line-reminder-saved-sign-priority)))))
177+
(ind-create-indicator-at-line
178+
ln :managed t :dynamic t :relative nil :fringe line-reminder-fringe-placed
179+
:bitmap line-reminder-fringe :face fc
180+
:priority
181+
(cl-case fc
182+
(line-reminder-modified-sign-face
183+
line-reminder-modified-sign-priority)
184+
(line-reminder-saved-sign-face
185+
line-reminder-saved-sign-priority)))))
187186

188187
(defun line-reminder--ind-remove-indicator-at-line (line)
189188
"Remove the indicator on LINE."
@@ -378,8 +377,7 @@ or less than zero line in current buffer."
378377

379378
(defun line-reminder--ind-clear-indicators-absolute ()
380379
"Clean up all the indicators."
381-
(when (line-reminder--use-indicators-p)
382-
(ind-clear-indicators-absolute)))
380+
(when (line-reminder--use-indicators-p) (ind-clear-indicators-absolute)))
383381

384382
(defun line-reminder--mark-buffer ()
385383
"Mark the whole buffer."
@@ -394,6 +392,7 @@ or less than zero line in current buffer."
394392
(defun line-reminder--before-change-functions (beg end)
395393
"Do stuff before buffer is changed with BEG and END."
396394
(when (line-reminder--is-valid-line-reminder-situation beg end)
395+
(setq line-reminder--undo-cancel-p undo-in-progress)
397396
(line-reminder--ind-delete-dups)
398397
(setq line-reminder--before-max-pt (point-max)
399398
line-reminder--before-max-linum (line-reminder--line-number-at-pos (point-max)))
@@ -460,6 +459,30 @@ or less than zero line in current buffer."
460459
;; Remove out range.
461460
(line-reminder--remove-lines-out-range)))))
462461

462+
;;; Undo
463+
464+
(defun line-reminder--undo-tree-root-p ()
465+
"Return non-nil, if undo is at the root of the undo list."
466+
(or (eq buffer-undo-list t)
467+
(null (undo-tree-node-previous (undo-tree-current buffer-undo-tree)))))
468+
469+
(defun line-reminder--undo-root-p ()
470+
"Compatible version to check root of undo list for different undo packages."
471+
(cond
472+
((and (featurep 'undo-tree) undo-tree-mode)
473+
(ignore-errors (line-reminder--undo-tree-root-p)))
474+
;; TODO: add default check
475+
(t nil)))
476+
477+
(defun line-reminder--post-command ()
478+
"Post command for undo cancelling."
479+
(when (and line-reminder--undo-cancel-p (line-reminder--undo-root-p))
480+
(setq line-reminder--change-lines '()
481+
line-reminder--saved-lines '())
482+
(line-reminder--ind-clear-indicators-absolute)
483+
;; Reset flag
484+
(setq line-reminder--undo-cancel-p nil)))
485+
463486
;;; Loading
464487

465488
(defun line-reminder--enable ()
@@ -472,12 +495,14 @@ or less than zero line in current buffer."
472495
(require 'indicators)))
473496
(add-hook 'before-change-functions #'line-reminder--before-change-functions nil t)
474497
(add-hook 'after-change-functions #'line-reminder--after-change-functions nil t)
498+
(add-hook 'post-command-hook #'line-reminder--post-command nil t)
475499
(advice-add 'save-buffer :after #'line-reminder-transfer-to-saved-lines))
476500

477501
(defun line-reminder--disable ()
478502
"Disable `line-reminder' in current buffer."
479503
(remove-hook 'before-change-functions #'line-reminder--before-change-functions t)
480504
(remove-hook 'after-change-functions #'line-reminder--after-change-functions t)
505+
(remove-hook 'post-command-hook #'line-reminder--post-command t)
481506
(advice-remove 'save-buffer #'line-reminder-transfer-to-saved-lines)
482507
(line-reminder-clear-reminder-lines-sign))
483508

0 commit comments

Comments
 (0)