[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/iedit c53a885fe5 040/301: Add bufferring modification func
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/iedit c53a885fe5 040/301: Add bufferring modification functionalities |
Date: |
Mon, 10 Jan 2022 22:58:48 -0500 (EST) |
branch: elpa/iedit
commit c53a885fe555b1313737d203766b61d1d720c9a2
Author: Victor Ren <victorhge@gmail.com>
Commit: Victor Ren <victorhge@gmail.com>
Add bufferring modification functionalities
---
iedit.el | 188 +++++++++++++++++++++++++++++++++++++++++++++------------------
1 file changed, 134 insertions(+), 54 deletions(-)
diff --git a/iedit.el b/iedit.el
index 4b8172e911..f9f94c73fd 100644
--- a/iedit.el
+++ b/iedit.el
@@ -2,7 +2,7 @@
;; Copyright (C) 2010, 2011, 2012 Victor Ren
-;; Time-stamp: <2012-01-29 23:15:17 Victor Ren>
+;; Time-stamp: <2012-01-30 12:48:14 Victor Ren>
;; Author: Victor Ren <victorhge@gmail.com>
;; Keywords: occurrence region replace simultaneous
;; Version: 0.92
@@ -153,6 +153,8 @@ forward or backward successful")
(defvar iedit-before-modification-string ""
"This is buffer local variable which is the buffer substring that is going
to be changed.")
+(defvar iedit-before-modification-undo-list nil
+ "This is buffer local variable which is the buffer undo list before
modification.")
;; `iedit-occurrence-update' gets called twice when change==0 and occurrence
;; is zero-width (beg==end)
;; -- for front and back insertion.
@@ -162,13 +164,20 @@ forward or backward successful")
(defvar iedit-aborting nil
"This is buffer local variable which indicates iedit-mode is aborting.")
+(defvar iedit-buffering nil
+ "This is buffer local variable which indicates iedit-mode is
+buffering, which means the modification to the current
+occurrence is not applied to other occurrences when it is true.")
+
(make-variable-buffer-local 'iedit-occurrences-overlays)
(make-variable-buffer-local 'iedit-unmatched-lines-invisible)
(make-variable-buffer-local 'iedit-case-sensitive)
(make-variable-buffer-local 'iedit-last-occurrence-in-history)
(make-variable-buffer-local 'iedit-forward-success)
(make-variable-buffer-local 'iedit-before-modification-string)
+(make-variable-buffer-local 'iedit-before-modification-undo-list)
(make-variable-buffer-local 'iedit-aborting)
+(make-variable-buffer-local 'iedit-buffering)
(defconst iedit-occurrence-overlay-name 'iedit-occurrence-overlay-name)
(defconst iedit-invisible-overlay-name 'iedit-invisible-overlay-name)
@@ -216,7 +225,8 @@ This is like `describe-bindings', but displays only Iedit
keys."
(let (same-window-buffer-names same-window-regexps)
(with-help-window "*Help*"
(with-current-buffer standard-output
- (princ "Iedit Mode Bindings:\n")
+ (princ "Iedit Mode Bindings:
+")
(princ (substitute-command-keys "\\{iedit-occurrence-local-map}"))))))
(defun iedit-describe-key ()
@@ -253,7 +263,8 @@ This is like `describe-bindings', but displays only Iedit
keys."
(define-key map (kbd "M-l") 'iedit-downcase-occurrences)
(define-key map (kbd "M-r") 'iedit-replace-occurrences)
(define-key map (kbd "M-c") 'iedit-clear-occurrences)
- (define-key map (kbd "M-d") 'iedit-delete-occurrences)
+ (define-key map (kbd "M-D") 'iedit-delete-occurrences)
+ (define-key map [C-return] 'iedit-toggle-buffering)
(define-key map (kbd "C-?") 'iedit-help-for-occurrences)
map)
"Keymap used within overlays.")
@@ -261,7 +272,7 @@ This is like `describe-bindings', but displays only Iedit
keys."
(defun iedit-help-for-occurrences ()
"Display iedit-occurrence-local-map."
(interactive)
- (message "M-u/l:up/downcase M-r:replace M-c:clear M-d:delete C-?:help"))
+ (message "M-u/l:up/downcase M-r:replace M-c:clear M-D:delete
C-return:buffering C-?:help"))
(or (assq 'iedit-mode minor-mode-map-alist)
(setq minor-mode-map-alist
@@ -381,28 +392,25 @@ iedit-occurrence-update is called for a removed overlay."
(setq iedit-occurrences-overlays nil)
(force-mode-line-update)
(run-hooks 'iedit-mode-hook)
- ;; (add-hook 'mouse-leave-buffer-hook 'iedit-done)
(add-hook 'kbd-macro-termination-hook 'iedit-done)
-
- (let ((orig-p (point-marker))
- (beg-col (progn (goto-char beg) (current-column)))
- (end-col (progn (goto-char end) (current-column))))
- (when (< end-col beg-col)
- (rotatef beg-col end-col))
- (goto-char beg)
- (loop do (progn
- (push (iedit-make-occurrence-overlay
- (progn
- (move-to-column beg-col t)
- (point))
- (progn
- (move-to-column end-col t)
- (point)))
- iedit-occurrences-overlays)
- (forward-line 1))
- until (> (point) end))
- (setq iedit-occurrences-overlays (nreverse iedit-occurrences-overlays))
- (goto-char orig-p)))
+ (save-excursion
+ (let ((beg-col (progn (goto-char beg) (current-column)))
+ (end-col (progn (goto-char end) (current-column))))
+ (when (< end-col beg-col)
+ (rotatef beg-col end-col))
+ (goto-char beg)
+ (loop do (progn
+ (push (iedit-make-occurrence-overlay
+ (progn
+ (move-to-column beg-col t)
+ (point))
+ (progn
+ (move-to-column end-col t)
+ (point)))
+ iedit-occurrences-overlays)
+ (forward-line 1))
+ until (> (point) end))
+ (setq iedit-occurrences-overlays (nreverse
iedit-occurrences-overlays)))))
(defun iedit-hide-unmatched-lines ()
"Hide unmatched lines using invisible overlay."
@@ -424,6 +432,8 @@ iedit-occurrence-update is called for a removed overlay."
(defun iedit-done ()
"Exit iedit mode."
+ (if iedit-buffering
+ (iedit-stop-buffering))
(let* ((ov (car iedit-occurrences-overlays))
(beg (overlay-start ov))
(end (overlay-end ov)))
@@ -439,6 +449,9 @@ iedit-occurrence-update is called for a removed overlay."
(remove-overlays (point-min) (point-max) iedit-occurrence-overlay-name t)
(remove-overlays (point-min) (point-max) iedit-invisible-overlay-name t)
(setq iedit-occurrences-overlays nil)
+ (setq iedit-aborting nil)
+ (setq iedit-before-modification-string "")
+ (setq iedit-before-modification-undo-list nil)
;; (remove-hook 'mouse-leave-buffer-hook 'iedit-done)
(remove-hook 'kbd-macro-termination-hook 'iedit-done)
(setq iedit-mode nil)
@@ -494,35 +507,35 @@ exit iedit mode."
;; ;;
;; We need to run just once. ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (if (and (= beg (overlay-start occurrence))
- (= end (overlay-end occurrence))
- (= change 0)
- (not iedit-skipped-modification-once))
- (setq iedit-skipped-modification-once t)
- (setq iedit-skipped-modification-once nil)
- (when (or (eq 0 change) ;; insertion
- (eq beg end) ;; deletion
- (not (string= iedit-before-modification-string
- (buffer-substring-no-properties beg end))))
- (let ((inhibit-modification-hooks t)
- (offset (- beg (overlay-start occurrence)))
- (value (buffer-substring-no-properties beg end)))
- (save-excursion
- ;; insertion or yank
- (if (eq 0 change)
+ (when (not iedit-buffering)
+ (if (and (= beg (overlay-start occurrence))
+ (= end (overlay-end occurrence))
+ (= change 0)
+ (not iedit-skipped-modification-once))
+ (setq iedit-skipped-modification-once t)
+ (setq iedit-skipped-modification-once nil)
+ (when (or (eq 0 change) ;; insertion
+ (eq beg end) ;; deletion
+ (not (string= iedit-before-modification-string
+ (buffer-substring-no-properties beg end))))
+ (let ((inhibit-modification-hooks t) ; todo: extract this as a
function
+ (offset (- beg (overlay-start occurrence)))
+ (value (buffer-substring-no-properties beg end)))
+ (save-excursion
+ ;; insertion or yank
+ (if (eq 0 change)
+ (dolist (another-occurrence (remove occurrence
iedit-occurrences-overlays))
+ (progn
+ (goto-char (+ (overlay-start another-occurrence)
offset))
+ (insert-and-inherit value)))
+ ;; deletion
(dolist (another-occurrence (remove occurrence
iedit-occurrences-overlays))
- (progn
- (goto-char (+ (overlay-start another-occurrence) offset))
- (insert-and-inherit value)))
- ;; deletion
- (dolist (another-occurrence (remove occurrence
iedit-occurrences-overlays))
- (let* ((beginning (+ (overlay-start another-occurrence)
offset))
- (ending (+ beginning change)))
- (delete-region beginning ending)
- (unless (eq beg end) ;; replacement
- (goto-char beginning)
- (insert-and-inherit value))))))))))))
+ (let* ((beginning (+ (overlay-start another-occurrence)
offset))
+ (ending (+ beginning change)))
+ (delete-region beginning ending)
+ (unless (eq beg end) ;; replacement
+ (goto-char beginning)
+ (insert-and-inherit value)))))))))))))
;; (elp-instrument-list '(insert-and-inherit delete-region goto-char
iedit-occurrence-update buffer-substring-no-properties string=
re-search-forward replace-match))
;; slowest version:
@@ -662,7 +675,7 @@ the buffer."
(save-excursion
(delete-region beg end)
(goto-char beg)
- (insert string)))
+ (insert-and-inherit string)))
string))
(defun iedit-clear-occurrences()
@@ -680,6 +693,73 @@ the buffer."
(interactive)
(iedit-foreach-occurrence-call 'delete-region))
+(defun iedit-toggle-buffering ()
+ "Toggle buffering."
+ (interactive)
+ (if iedit-buffering
+ (iedit-stop-buffering)
+ (iedit-start-buffering)))
+
+(defun iedit-start-buffering ()
+ "Start buffering."
+ (setq iedit-buffering t)
+ (let* ((ov (iedit-find-current-occurrence-overlay))
+ (beg (overlay-start ov))
+ (end (overlay-end ov)))
+ (setq iedit-before-modification-string
+ (buffer-substring-no-properties beg end))
+ (setq iedit-before-modification-undo-list buffer-undo-list)
+ (setq iedit-mode (propertize " Iedit-B" 'face 'font-lock-warning-face))
+ (force-mode-line-update)
+ (message "Iedit-mode buffering.")))
+
+(defun iedit-stop-buffering ()
+ "Stop buffering and apply the modification to other occurrences."
+ (let* ((inhibit-modification-hooks t)
+ (ov (iedit-find-current-occurrence-overlay))
+ (beg (overlay-start ov))
+ (end (overlay-end ov))
+ (modified-string (buffer-substring-no-properties beg end))
+ (offset (- (point) beg))) ;; delete-region move cursor
+ (when (not (string= iedit-before-modification-string modified-string))
+ (save-excursion
+ ;; Rollback the current modification and buffer-undo-list. This is to
+ ;; avoid the inconsistency if user undoes modifications
+ (delete-region beg end)
+ (goto-char beg)
+ (insert-and-inherit iedit-before-modification-string)
+ (setq buffer-undo-list iedit-before-modification-undo-list)
+ (dolist (occurrence iedit-occurrences-overlays) ; todo:extract as a
function
+ (let ((beginning (overlay-start occurrence))
+ (ending (overlay-end occurrence)))
+ (delete-region beginning ending)
+ (unless (eq beg end) ;; replacement
+ (goto-char beginning)
+ (insert-and-inherit modified-string)))))
+ (goto-char (+ (overlay-start ov) offset))))
+ (setq iedit-buffering nil)
+ (setq iedit-mode (propertize " Iedit" 'face 'font-lock-warning-face))
+ (force-mode-line-update)
+ (setq iedit-before-modification-undo-list nil)
+ (message "Iedit-mode stop buffering."))
+
+(defun iedit-find-current-occurrence-overlay ()
+ "Always return the current occurrence overlay at point or point - 1,
+since this function is supposed to be called in overlay local-map."
+ (or (iedit-find-overlay (point) 'iedit-occurrence-overlay-name)
+ (iedit-find-overlay (1- (point)) 'iedit-occurrence-overlay-name)))
+
+(defun iedit-find-overlay (point property)
+ "Return the overlay with PROPERTY at POINT."
+ (let ((overlays (overlays-at point))
+ found)
+ (while (and overlays (not found))
+ (let ((overlay (car overlays)))
+ (if (overlay-get overlay property)
+ (setq found overlay)
+ (setq overlays (cdr overlays)))))
+ found))
+
(provide 'iedit)
;;; iedit.el ends here
- [nongnu] elpa/iedit 17e8fca7e6 011/301: Merge from tsdh/master, (continued)
- [nongnu] elpa/iedit 17e8fca7e6 011/301: Merge from tsdh/master, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit 6d96992291 015/301: Remove duplicated comments, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit 011e8d354c 016/301: Performance optimization of iedit-occurrence-update, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit c8dac6bee8 020/301: exit iedit mode when change is not inside of occurrence., ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit 768d89b60c 022/301: Merge remote-tracking branch 'lewang/master', ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit 0edc86ff41 024/301: Fix the last occurrence problem when it is a complete symbol., ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit dd7d2f95f8 027/301: fix org-mode text-property compatibility (use insert-and-inherit), ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit d5d4027a33 030/301: fix `iedit-toggle-unmatched-lines-visible' for rectangles, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit 652087d63c 036/301: fix warning: the function `make-sparse-key-map' is not known to be, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit da47784c8d 038/301: Add iedit mode easy access keys, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit c53a885fe5 040/301: Add bufferring modification functionalities,
ELPA Syncer <=
- [nongnu] elpa/iedit 9bc57d2a30 041/301: make iedit-skipped-modification-once buffer local, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit e99e65fccb 044/301: Fix current point move problem when call iedit-replace-occurrences., ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit 4e31d50327 052/301: Add a prefix arg handling to iedit-toggle-unmatched-lines-visible, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit 87053a3d44 054/301: Remove two buffer local variables for rectangle., ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit e568677fe4 056/301: Add new functionality: restrict iedit-mode in region, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit a9bda4db66 060/301: Refine hotkeys, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit 4fa7342be9 065/301: Copy from iedit.el, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit b579dd0739 063/301: Update with new information, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit a13c4d6b56 067/301: Remove README, ELPA Syncer, 2022/01/10
- [nongnu] elpa/iedit 90ef2d5ac9 064/301: Add digit prefix argment 0 to enable restricting match in a function, ELPA Syncer, 2022/01/10