;; along with GNU Emacs; see the file COPYING. If not, write to
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;;; Commentary:
+
+;; This package supplies the string and regular-expression replace functions
+;; documented in the Emacs user's manual.
+
;;; Code:
(defconst case-replace t "\
(interactive (query-replace-read-args "Replace regexp"))
(perform-replace regexp to-string nil t delimited)
(or unread-command-events (message "Done")))
+\f
+(defvar regexp-history nil
+ "History list for some commands that read regular expressions.")
-(fset 'delete-non-matching-lines 'keep-lines)
+(defalias 'delete-non-matching-lines 'keep-lines)
(defun keep-lines (regexp)
"Delete all lines except those containing matches for REGEXP.
A match split across lines preserves all the lines it lies in.
Applies to all lines after point."
- (interactive "sKeep lines (containing match for regexp): ")
+ (interactive (list (read-from-minibuffer
+ "Keep lines (containing match for regexp): "
+ nil nil nil 'regexp-history)))
(save-excursion
(or (bolp) (forward-line 1))
(let ((start (point)))
(and (not (eobp)) (= (match-beginning 0) (match-end 0))
(forward-char 1))))))
-(fset 'delete-matching-lines 'flush-lines)
+(defalias 'delete-matching-lines 'flush-lines)
(defun flush-lines (regexp)
"Delete lines containing matches for REGEXP.
If a match is split across lines, all the lines it lies in are deleted.
Applies to lines after point."
- (interactive "sFlush lines (containing match for regexp): ")
+ (interactive (list (read-from-minibuffer
+ "Flush lines (containing match for regexp): "
+ nil nil nil 'regexp-history)))
(save-excursion
(while (and (not (eobp))
(re-search-forward regexp nil t))
(point))
(progn (forward-line 1) (point))))))
-(fset 'count-matches 'how-many)
+(defalias 'count-matches 'how-many)
(defun how-many (regexp)
"Print number of matches for REGEXP following point."
- (interactive "sHow many matches for (regexp): ")
+ (interactive (list (read-from-minibuffer
+ "How many matches for (regexp): "
+ nil nil nil 'regexp-history)))
(let ((count 0) opoint)
(save-excursion
(while (and (not (eobp))
(forward-char 1)
(setq count (1+ count))))
(message "%d occurrences" count))))
-
+\f
(defvar occur-mode-map ())
(if occur-mode-map
()
(defvar occur-buffer nil)
(defvar occur-nlines nil)
(defvar occur-pos-list nil)
-(defvar occur-last-string "")
(defun occur-mode ()
"Major mode for output from \\[occur].
(pos (nth occur-number occur-pos-list)))
(pop-to-buffer occur-buffer)
(goto-char (marker-position pos))))
-
+\f
(defvar list-matching-lines-default-context-lines 0
"*Default number of context lines to include around a `list-matching-lines'
match. A negative number means to include that many lines before the match.
A positive number means to include that many lines both before and after.")
-(fset 'list-matching-lines 'occur)
+(defalias 'list-matching-lines 'occur)
(defun occur (regexp &optional nlines)
"Show all lines in the current buffer containing a match for REGEXP.
-Interactively, REGEXP defaults to the last REGEXP
-used interactively with \\[occur].
If a match spreads across multiple lines, all those lines are shown.
NLINES defaults to `list-matching-lines-default-context-lines'.
Interactively it is the prefix arg.
-The lines are shown in a buffer named *Occur*.
+The lines are shown in a buffer named `*Occur*'.
It serves as a menu to find any of the occurrences in this buffer.
\\[describe-mode] in that buffer will explain how."
- (interactive (list (setq occur-last-string
- (read-string "List lines matching regexp: "
- occur-last-string))
+ (interactive (list (let* ((default (car regexp-history))
+ (input
+ (read-from-minibuffer
+ (format "List lines matching regexp (default `%s'): " default)
+ nil nil nil
+ 'regexp-history)))
+ (if (> (length input) 0) input
+ (setcar regexp-history default)))
current-prefix-arg))
(setq nlines (if nlines (prefix-numeric-value nlines)
list-matching-lines-default-context-lines))
(re-search-forward regexp nil t))
(goto-char (match-beginning 0))
(beginning-of-line)
- (setq linenum (+ linenum (count-lines prevpos (point))))
+ (save-match-data
+ (setq linenum (+ linenum (count-lines prevpos (point)))))
(setq prevpos (point))
(goto-char (match-end 0))
(let* ((start (save-excursion
(define-key query-replace-map " " 'act)
(define-key query-replace-map "\d" 'skip)
(define-key query-replace-map [delete] 'skip)
+(define-key query-replace-map [backspace] 'skip)
(define-key query-replace-map "y" 'act)
(define-key query-replace-map "n" 'skip)
(define-key query-replace-map "," 'act-and-show)
(define-key query-replace-map "\e" 'exit)
+(define-key query-replace-map [escape] 'exit)
(define-key query-replace-map "q" 'exit)
+(define-key query-replace-map "\r" 'exit)
+(define-key query-replace-map [return] 'exit)
(define-key query-replace-map "." 'act-and-exit)
(define-key query-replace-map "\C-r" 'edit)
(define-key query-replace-map "\C-w" 'delete-and-edit)
(replace-match next-replacement nocasify literal)
(setq replace-count (1+ replace-count)))
(undo-boundary)
- (let (done replaced key)
+ (let (done replaced key def)
;; Loop reading commands until one of them sets done,
;; which means it has finished handling this occurrence.
(while (not done)
(message "Query replacing %s with %s: "
from-string next-replacement)
- (setq key (vector (read-event)))
+ (setq key (read-event))
+ (setq key (vector key))
(setq def (lookup-key map key))
;; Restore the match data while we process the command.
(store-match-data real-match-data)