comparison lisp/replace.el @ 282:c42ec1d1cded r21-0b39

Import from CVS: tag r21-0b39
author cvs
date Mon, 13 Aug 2007 10:33:18 +0200
parents 85a06df23a9a
children 182f72e8cd0d
comparison
equal deleted inserted replaced
281:090b52736db2 282:c42ec1d1cded
66 'query-replace-history)) 66 'query-replace-history))
67 (list from to current-prefix-arg))) 67 (list from to current-prefix-arg)))
68 68
69 ;; As per suggestion from Per Abrahamsen, limit replacement to the region 69 ;; As per suggestion from Per Abrahamsen, limit replacement to the region
70 ;; if the region is active. 70 ;; if the region is active.
71 (defun query-replace (from-string to-string &optional arg) 71 (defun query-replace (from-string to-string &optional delimited)
72 "Replace some occurrences of FROM-STRING with TO-STRING. 72 "Replace some occurrences of FROM-STRING with TO-STRING.
73 As each match is found, the user must type a character saying 73 As each match is found, the user must type a character saying
74 what to do with it. For directions, type \\[help-command] at that time. 74 what to do with it. For directions, type \\[help-command] at that time.
75 75
76 If `query-replace-interactive' is non-nil, the last incremental search 76 If `query-replace-interactive' is non-nil, the last incremental search
85 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace 85 Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
86 only matches surrounded by word boundaries. 86 only matches surrounded by word boundaries.
87 87
88 To customize possible responses, change the \"bindings\" in `query-replace-map'." 88 To customize possible responses, change the \"bindings\" in `query-replace-map'."
89 (interactive (query-replace-read-args "Query replace" nil)) 89 (interactive (query-replace-read-args "Query replace" nil))
90 (if (or (and (boundp 'zmacs-region-active-p) zmacs-region-active-p) 90 (perform-replace from-string to-string t nil delimited))
91 (and (boundp 'transient-mark-mode) transient-mark-mode mark-active)) 91
92 (save-restriction 92 (defun query-replace-regexp (regexp to-string &optional delimited)
93 (save-excursion
94 (narrow-to-region (point) (mark))
95 (goto-char (point-min))
96 (perform-replace from-string to-string t nil arg)))
97 (perform-replace from-string to-string t nil arg)))
98
99 (defun query-replace-regexp (regexp to-string &optional arg)
100 "Replace some things after point matching REGEXP with TO-STRING. 93 "Replace some things after point matching REGEXP with TO-STRING.
101 As each match is found, the user must type a character saying 94 As each match is found, the user must type a character saying
102 what to do with it. For directions, type \\[help-command] at that time. 95 what to do with it. For directions, type \\[help-command] at that time.
103 96
104 If `query-replace-interactive' is non-nil, the last incremental search 97 If `query-replace-interactive' is non-nil, the last incremental search
111 only matches surrounded by word boundaries. 104 only matches surrounded by word boundaries.
112 In TO-STRING, `\\&' stands for whatever matched the whole of REGEXP, 105 In TO-STRING, `\\&' stands for whatever matched the whole of REGEXP,
113 and `\\=\\N' (where N is a digit) stands for 106 and `\\=\\N' (where N is a digit) stands for
114 whatever what matched the Nth `\\(...\\)' in REGEXP." 107 whatever what matched the Nth `\\(...\\)' in REGEXP."
115 (interactive (query-replace-read-args "Query replace regexp" t)) 108 (interactive (query-replace-read-args "Query replace regexp" t))
116 (if (or (and (boundp 'zmacs-region-active-p) zmacs-region-active-p) 109 (perform-replace regexp to-string t t delimited))
117 (and (boundp 'transient-mark-mode) transient-mark-mode mark-active))
118 (save-restriction
119 (save-excursion
120 (narrow-to-region (point) (mark))
121 (goto-char (point-min))
122 (perform-replace regexp to-string t t arg)))
123 (perform-replace regexp to-string t t arg)))
124 110
125 ;;#### Not patently useful 111 ;;#### Not patently useful
126 (defun map-query-replace-regexp (regexp to-strings &optional arg) 112 (defun map-query-replace-regexp (regexp to-strings &optional arg)
127 "Replace some matches for REGEXP with various strings, in rotation. 113 "Replace some matches for REGEXP with various strings, in rotation.
128 The second argument TO-STRINGS contains the replacement strings, separated 114 The second argument TO-STRINGS contains the replacement strings, separated
592 ;FSFmacs (define-key map "\e" 'exit-prefix) 578 ;FSFmacs (define-key map "\e" 'exit-prefix)
593 (define-key map [escape] 'exit-prefix) 579 (define-key map [escape] 'exit-prefix)
594 580
595 (setq query-replace-map map))) 581 (setq query-replace-map map)))
596 582
597 583 ;; isearch-mode is dumped, so don't autoload.
598 (autoload 'isearch-highlight "isearch") 584 ;(autoload 'isearch-highlight "isearch")
599 585
600 ;; XEmacs 586 ;; XEmacs
601 (defun perform-replace-next-event (event) 587 (defun perform-replace-next-event (event)
602 (if isearch-highlight 588 (if isearch-highlight
603 (let ((aborted t)) 589 (let ((aborted t))
633 (keep-going t) 619 (keep-going t)
634 (stack nil) 620 (stack nil)
635 (next-rotate-count 0) 621 (next-rotate-count 0)
636 (replace-count 0) 622 (replace-count 0)
637 (lastrepl nil) ;Position after last match considered. 623 (lastrepl nil) ;Position after last match considered.
624 ;; If non-nil, it is marker saying where in the buffer to
625 ;; stop.
626 (limit nil)
638 (match-again t) 627 (match-again t)
639 ;; XEmacs addition 628 ;; XEmacs addition
640 (qr-case-fold-search 629 (qr-case-fold-search
641 (if (and case-fold-search search-caps-disable-folding) 630 (if (and case-fold-search search-caps-disable-folding)
642 (isearch-no-upper-case-p search-string) 631 (isearch-no-upper-case-p search-string)
643 case-fold-search)) 632 case-fold-search))
644 (message 633 (message
645 (if query-flag 634 (if query-flag
646 (substitute-command-keys 635 (substitute-command-keys
647 "Query replacing %s with %s: (\\<query-replace-map>\\[help] for help) ")))) 636 "Query replacing %s with %s: (\\<query-replace-map>\\[help] for help) "))))
637 ;; If the region is active, operate on region.
638 (when (region-active-p)
639 ;; Original Per Abrahamsen's code simply narrowed the region,
640 ;; thus providing a visual indication of the search boundary.
641 ;; Stallman, on the other hand, handles it like this.
642 (setq limit (copy-marker (region-end)))
643 (goto-char (region-beginning))
644 (zmacs-deactivate-region))
648 (if (stringp replacements) 645 (if (stringp replacements)
649 (setq next-replacement replacements) 646 (setq next-replacement replacements)
650 (or repeat-count (setq repeat-count 1))) 647 (or repeat-count (setq repeat-count 1)))
651 (if delimited-flag 648 (if delimited-flag
652 (setq search-function 're-search-forward 649 (setq search-function 're-search-forward
659 (unwind-protect 656 (unwind-protect
660 ;; Loop finding occurrences that perhaps should be replaced. 657 ;; Loop finding occurrences that perhaps should be replaced.
661 (while (and keep-going 658 (while (and keep-going
662 (not (eobp)) 659 (not (eobp))
663 (let ((case-fold-search qr-case-fold-search)) 660 (let ((case-fold-search qr-case-fold-search))
664 (funcall search-function search-string nil t)) 661 (funcall search-function search-string limit t))
665 ;; If the search string matches immediately after 662 ;; If the search string matches immediately after
666 ;; the previous match, but it did not match there 663 ;; the previous match, but it did not match there
667 ;; before the replacement was done, ignore the match. 664 ;; before the replacement was done, ignore the match.
668 (if (or (eq lastrepl (point)) 665 (if (or (eq lastrepl (point))
669 (and regexp-flag 666 (and regexp-flag
673 nil 670 nil
674 ;; Don't replace the null string 671 ;; Don't replace the null string
675 ;; right after end of previous replacement. 672 ;; right after end of previous replacement.
676 (forward-char 1) 673 (forward-char 1)
677 (let ((case-fold-search qr-case-fold-search)) 674 (let ((case-fold-search qr-case-fold-search))
678 (funcall search-function search-string nil t))) 675 (funcall search-function search-string limit t)))
679 t)) 676 t))
680 677
681 ;; Save the data associated with the real match. 678 ;; Save the data associated with the real match.
682 (setq real-match-data (match-data)) 679 (setq real-match-data (match-data))
683 680
795 ;; Change markers to numbers in the match data 792 ;; Change markers to numbers in the match data
796 ;; since lots of markers slow down editing. 793 ;; since lots of markers slow down editing.
797 (setq stack 794 (setq stack
798 (cons (cons (point) 795 (cons (cons (point)
799 (or replaced 796 (or replaced
800 (mapcar 797 (match-data t)))
801 #'(lambda (elt)
802 (if (markerp elt)
803 (prog1 (marker-position elt)
804 (set-marker elt nil))
805 elt))
806 (match-data))))
807 stack)) 798 stack))
808 (if replaced (setq replace-count (1+ replace-count))))) 799 (if replaced (setq replace-count (1+ replace-count)))))
809 (setq lastrepl (point))) 800 (setq lastrepl (point)))
810 (replace-dehighlight)) 801 ;; Useless in XEmacs. We handle (de)highlighting through
802 ;; perform-replace-next-event.
803 ;(replace-dehighlight)
804 )
811 (or unread-command-events 805 (or unread-command-events
812 (message "Replaced %d occurrence%s" 806 (message "Replaced %d occurrence%s"
813 replace-count 807 replace-count
814 (if (= replace-count 1) "" "s"))) 808 (if (= replace-count 1) "" "s")))
815 (and keep-going stack))) 809 (and keep-going stack)))
816 810
817 (defvar query-replace-highlight nil 811 ;; FSFmacs code: someone should port it.
818 "*Non-nil means to highlight words during query replacement.") 812
819 813 ;(defvar query-replace-highlight nil
820 (defvar replace-overlay nil) 814 ; "*Non-nil means to highlight words during query replacement.")
821 815
822 (defun replace-dehighlight () 816 ;(defvar replace-overlay nil)
823 (and replace-overlay 817
824 (progn 818 ;(defun replace-dehighlight ()
825 (delete-overlay replace-overlay) 819 ; (and replace-overlay
826 (setq replace-overlay nil)))) 820 ; (progn
827 821 ; (delete-overlay replace-overlay)
828 (defun replace-highlight (start end) 822 ; (setq replace-overlay nil))))
829 (and query-replace-highlight 823
830 (progn 824 ;(defun replace-highlight (start end)
831 (or replace-overlay 825 ; (and query-replace-highlight
832 (progn 826 ; (progn
833 (setq replace-overlay (make-overlay start end)) 827 ; (or replace-overlay
834 (overlay-put replace-overlay 'face 828 ; (progn
835 (if (internal-find-face 'query-replace) 829 ; (setq replace-overlay (make-overlay start end))
836 'query-replace 'region)))) 830 ; (overlay-put replace-overlay 'face
837 (move-overlay replace-overlay start end (current-buffer))))) 831 ; (if (internal-find-face 'query-replace)
832 ; 'query-replace 'region))))
833 ; (move-overlay replace-overlay start end (current-buffer)))))
838 834
839 (defun match-string (num &optional string) 835 (defun match-string (num &optional string)
840 "Return string of text matched by last search. 836 "Return string of text matched by last search.
841 NUM specifies which parenthesized expression in the last regexp. 837 NUM specifies which parenthesized expression in the last regexp.
842 Value is nil if NUMth pair didn't match, or there were less than NUM pairs. 838 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.