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