Mercurial > hg > xemacs-beta
diff man/xemacs/search.texi @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 972bbb6d6ca2 abe6d1db359e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/xemacs/search.texi Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,883 @@ + +@node Search, Fixit, Display, Top +@chapter Searching and Replacement +@cindex searching + + Like other editors, Emacs has commands for searching for occurrences of +a string. The principal search command is unusual in that it is +@dfn{incremental}: it begins to search before you have finished typing the +search string. There are also non-incremental search commands more like +those of other editors. + + Besides the usual @code{replace-string} command that finds all +occurrences of one string and replaces them with another, Emacs has a fancy +replacement command called @code{query-replace} which asks interactively +which occurrences to replace. + +@menu +* Incremental Search:: Search happens as you type the string. +* Non-Incremental Search:: Specify entire string and then search. +* Word Search:: Search for sequence of words. +* Regexp Search:: Search for match for a regexp. +* Regexps:: Syntax of regular expressions. +* Search Case:: To ignore case while searching, or not. +* Replace:: Search, and replace some or all matches. +* Other Repeating Search:: Operating on all matches for some regexp. +@end menu + +@node Incremental Search, Non-Incremental Search, Search, Search +@section Incremental Search + + An incremental search begins searching as soon as you type the first +character of the search string. As you type in the search string, Emacs +shows you where the string (as you have typed it so far) is found. +When you have typed enough characters to identify the place you want, you +can stop. Depending on what you do next, you may or may not need to +terminate the search explicitly with a @key{RET}. + +@c WideCommands +@table @kbd +@item C-s +Incremental search forward (@code{isearch-forward}). +@item C-r +Incremental search backward (@code{isearch-backward}). +@end table + +@kindex C-s +@kindex C-r +@findex isearch-forward +@findex isearch-backward + @kbd{C-s} starts an incremental search. @kbd{C-s} reads characters from +the keyboard and positions the cursor at the first occurrence of the +characters that you have typed. If you type @kbd{C-s} and then @kbd{F}, +the cursor moves right after the first @samp{F}. Type an @kbd{O}, and see +the cursor move to after the first @samp{FO}. After another @kbd{O}, the +cursor is after the first @samp{FOO} after the place where you started the +search. Meanwhile, the search string @samp{FOO} has been echoed in the +echo area.@refill + + The echo area display ends with three dots when actual searching is going +on. When search is waiting for more input, the three dots are removed. +(On slow terminals, the three dots are not displayed.) + + If you make a mistake in typing the search string, you can erase +characters with @key{DEL}. Each @key{DEL} cancels the last character of the +search string. This does not happen until Emacs is ready to read another +input character; first it must either find, or fail to find, the character +you want to erase. If you do not want to wait for this to happen, use +@kbd{C-g} as described below.@refill + + When you are satisfied with the place you have reached, you can type +@key{RET} (or @key{C-m}), which stops searching, leaving the cursor where +the search brought it. Any command not specially meaningful in searches also +stops the search and is then executed. Thus, typing @kbd{C-a} exits the +search and then moves to the beginning of the line. @key{RET} is necessary +only if the next command you want to type is a printing character, +@key{DEL}, @key{ESC}, or another control character that is special +within searches (@kbd{C-q}, @kbd{C-w}, @kbd{C-r}, @kbd{C-s}, or @kbd{C-y}). + + Sometimes you search for @samp{FOO} and find it, but were actually +looking for a different occurance of it. To move to the next occurrence +of the search string, type another @kbd{C-s}. Do this as often as +necessary. If you overshoot, you can cancel some @kbd{C-s} +characters with @key{DEL}. + + After you exit a search, you can search for the same string again by +typing just @kbd{C-s C-s}: the first @kbd{C-s} is the key that invokes +incremental search, and the second @kbd{C-s} means ``search again''. + + If the specified string is not found at all, the echo area displays +the text @samp{Failing I-Search}. The cursor is after the place where +Emacs found as much of your string as it could. Thus, if you search for +@samp{FOOT}, and there is no @samp{FOOT}, the cursor may be after the +@samp{FOO} in @samp{FOOL}. At this point there are several things you +can do. If you mistyped the search string, correct it. If you like the +place you have found, you can type @key{RET} or some other Emacs command +to ``accept what the search offered''. Or you can type @kbd{C-g}, which +removes from the search string the characters that could not be found +(the @samp{T} in @samp{FOOT}), leaving those that were found (the +@samp{FOO} in @samp{FOOT}). A second @kbd{C-g} at that point cancels +the search entirely, returning point to where it was when the search +started. + + If a search is failing and you ask to repeat it by typing another +@kbd{C-s}, it starts again from the beginning of the buffer. Repeating +a failing backward search with @kbd{C-r} starts again from the end. This +is called @dfn{wrapping around}. @samp{Wrapped} appears in the search +prompt once this has happened. + +@cindex quitting (in search) + The @kbd{C-g} ``quit'' character does special things during searches; +just what it does depends on the status of the search. If the search has +found what you specified and is waiting for input, @kbd{C-g} cancels the +entire search. The cursor moves back to where you started the search. If +@kbd{C-g} is typed when there are characters in the search string that have +not been found---because Emacs is still searching for them, or because it +has failed to find them---then the search string characters which have not +been found are discarded from the search string. The +search is now successful and waiting for more input, so a second @kbd{C-g} +cancels the entire search. + + To search for a control character such as @kbd{C-s} or @key{DEL} or +@key{ESC}, you must quote it by typing @kbd{C-q} first. This function +of @kbd{C-q} is analogous to its meaning as an Emacs command: it causes +the following character to be treated the way a graphic character would +normally be treated in the same context. + + To search backwards, you can use @kbd{C-r} instead of @kbd{C-s} to +start the search; @kbd{C-r} is the key that runs the command +(@code{isearch-backward}) to search backward. You can also use +@kbd{C-r} to change from searching forward to searching backwards. Do +this if a search fails because the place you started was too far down in the +file. Repeated @kbd{C-r} keeps looking for more occurrences backwards. +@kbd{C-s} starts going forward again. You can cancel @kbd{C-r} in a +search with @key{DEL}. + + The characters @kbd{C-y} and @kbd{C-w} can be used in incremental search +to grab text from the buffer into the search string. This makes it +convenient to search for another occurrence of text at point. @kbd{C-w} +copies the word after point as part of the search string, advancing +point over that word. Another @kbd{C-s} to repeat the search will then +search for a string including that word. @kbd{C-y} is similar to @kbd{C-w} +but copies the rest of the current line into the search string. + + The characters @kbd{M-p} and @kbd{M-n} can be used in an incremental +search to recall things which you have searched for in the past. A +list of the last 16 things you have searched for is retained, and +@kbd{M-p} and @kbd{M-n} let you cycle through that ring. + +The character @kbd{M-@key{TAB}} does completion on the elements in +the search history ring. For example, if you know that you have +recently searched for the string @code{POTATOE}, you could type +@kbd{C-s P O M-@key{TAB}}. If you had searched for other strings +beginning with @code{PO} then you would be shown a list of them, and +would need to type more to select one. + + You can change any of the special characters in incremental search via +the normal keybinding mechanism: simply add a binding to the +@code{isearch-mode-map}. For example, to make the character +@kbd{C-b} mean ``search backwards'' while in isearch-mode, do this: + +@example +(define-key isearch-mode-map "\C-b" 'isearch-repeat-backward) +@end example + +These are the default bindings of isearch-mode: + +@findex isearch-delete-char +@findex isearch-exit +@findex isearch-quote-char +@findex isearch-repeat-forward +@findex isearch-repeat-backward +@findex isearch-yank-line +@findex isearch-yank-word +@findex isearch-abort +@findex isearch-ring-retreat +@findex isearch-ring-advance +@findex isearch-complete + +@kindex DEL (isearch-mode) +@kindex RET (isearch-mode) +@kindex C-q (isearch-mode) +@kindex C-s (isearch-mode) +@kindex C-r (isearch-mode) +@kindex C-y (isearch-mode) +@kindex C-w (isearch-mode) +@kindex C-g (isearch-mode) +@kindex M-p (isearch-mode) +@kindex M-n (isearch-mode) +@kindex M-TAB (isearch-mode) + +@table @kbd +@item DEL +Delete a character from the incremental search string (@code{isearch-delete-char}). +@item RET +Exit incremental search (@code{isearch-exit}). +@item C-q +Quote special characters for incremental search (@code{isearch-quote-char}). +@item C-s +Repeat incremental search forward (@code{isearch-repeat-forward}). +@item C-r +Repeat incremental search backward (@code{isearch-repeat-backward}). +@item C-y +Pull rest of line from buffer into search string (@code{isearch-yank-line}). +@item C-w +Pull next word from buffer into search string (@code{isearch-yank-word}). +@item C-g +Cancels input back to what has been found successfully, or aborts the +isearch (@code{isearch-abort}). +@item M-p +Recall the previous element in the isearch history ring +(@code{isearch-ring-retreat}). +@item M-n +Recall the next element in the isearch history ring +(@code{isearch-ring-advance}). +@item M-@key{TAB} +Do completion on the elements in the isearch history ring +(@code{isearch-complete}). + +@end table + +Any other character which is normally inserted into a buffer when typed +is automatically added to the search string in isearch-mode. + +@subsection Slow Terminal Incremental Search + + Incremental search on a slow terminal uses a modified style of display +that is designed to take less time. Instead of redisplaying the buffer at +each place the search gets to, it creates a new single-line window and uses +that to display the line the search has found. The single-line window +appears as soon as point gets outside of the text that is already +on the screen. + + When the search is terminated, the single-line window is removed. Only +at this time the window in which the search was done is redisplayed to show +its new value of point. + + The three dots at the end of the search string, normally used to indicate +that searching is going on, are not displayed in slow style display. + +@vindex search-slow-speed + The slow terminal style of display is used when the terminal baud rate is +less than or equal to the value of the variable @code{search-slow-speed}, +initially 1200. + +@vindex search-slow-window-lines + The number of lines to use in slow terminal search display is controlled +by the variable @code{search-slow-window-lines}. Its normal value is 1. + +@node Non-Incremental Search, Word Search, Incremental Search, Search +@section Non-Incremental Search +@cindex non-incremental search + + Emacs also has conventional non-incremental search commands, which require +you type the entire search string before searching begins. + +@table @kbd +@item C-s @key{RET} @var{string} @key{RET} +Search for @var{string}. +@item C-r @key{RET} @var{string} @key{RET} +Search backward for @var{string}. +@end table + + To do a non-incremental search, first type @kbd{C-s @key{RET}} +(or @kbd{C-s C-m}). This enters the minibuffer to read the search string. +Terminate the string with @key{RET} to start the search. If the string +is not found, the search command gets an error. + + By default, @kbd{C-s} invokes incremental search, but if you give it an +empty argument, which would otherwise be useless, it invokes non-incremental +search. Therefore, @kbd{C-s @key{RET}} invokes non-incremental search. +@kbd{C-r @key{RET}} also works this way. + +@findex search-forward +@findex search-backward + Forward and backward non-incremental searches are implemented by the +commands @code{search-forward} and @code{search-backward}. You can bind +these commands to keys. The reason that incremental +search is programmed to invoke them as well is that @kbd{C-s @key{RET}} +is the traditional sequence of characters used in Emacs to invoke +non-incremental search. + + Non-incremental searches performed using @kbd{C-s @key{RET}} do +not call @code{search-forward} right away. They first check +if the next character is @kbd{C-w}, which requests a word search. +@ifinfo +@xref{Word Search}. +@end ifinfo + +@node Word Search, Regexp Search, Non-Incremental Search, Search +@section Word Search +@cindex word search + + Word search looks for a sequence of words without regard to how the +words are separated. More precisely, you type a string of many words, +using single spaces to separate them, and the string is found even if +there are multiple spaces, newlines or other punctuation between the words. + + Word search is useful in editing documents formatted by text formatters. +If you edit while looking at the printed, formatted version, you can't tell +where the line breaks are in the source file. Word search, allows you +to search without having to know the line breaks. + +@table @kbd +@item C-s @key{RET} C-w @var{words} @key{RET} +Search for @var{words}, ignoring differences in punctuation. +@item C-r @key{RET} C-w @var{words} @key{RET} +Search backward for @var{words}, ignoring differences in punctuation. +@end table + + Word search is a special case of non-incremental search. It is invoked +with @kbd{C-s @key{RET} C-w} followed by the search string, which +must always be terminated with another @key{RET}. Being non-incremental, this +search does not start until the argument is terminated. It works by +constructing a regular expression and searching for that. @xref{Regexp +Search}. + + You can do a backward word search with @kbd{C-r @key{RET} C-w}. + +@findex word-search-forward +@findex word-search-backward + Forward and backward word searches are implemented by the commands +@code{word-search-forward} and @code{word-search-backward}. You can +bind these commands to keys. The reason that incremental +search is programmed to invoke them as well is that @kbd{C-s @key{RET} C-w} +is the traditional Emacs sequence of keys for word search. + +@node Regexp Search, Regexps, Word Search, Search +@section Regular Expression Search +@cindex regular expression +@cindex regexp + + A @dfn{regular expression} (@dfn{regexp}, for short) is a pattern that +denotes a set of strings, possibly an infinite set. Searching for matches +for a regexp is a powerful operation that editors on Unix systems have +traditionally offered. In XEmacs, you can search for the next match for +a regexp either incrementally or not. + +@kindex M-C-s +@findex isearch-forward-regexp +@findex isearch-backward-regexp + Incremental search for a regexp is done by typing @kbd{M-C-s} +(@code{isearch-forward-regexp}). This command reads a search string +incrementally just like @kbd{C-s}, but it treats the search string as a +regexp rather than looking for an exact match against the text in the +buffer. Each time you add text to the search string, you make the regexp +longer, and the new regexp is searched for. A reverse regexp search command +@code{isearch-backward-regexp} also exists, but no key runs it. + + All of the control characters that do special things within an ordinary +incremental search have the same functionality in incremental regexp search. +Typing @kbd{C-s} or @kbd{C-r} immediately after starting a search +retrieves the last incremental search regexp used: +incremental regexp and non-regexp searches have independent defaults. + +@findex re-search-forward +@findex re-search-backward + Non-incremental search for a regexp is done by the functions +@code{re-search-forward} and @code{re-search-backward}. You can invoke +them with @kbd{M-x} or bind them to keys. You can also call +@code{re-search-forward} by way of incremental regexp search with +@kbd{M-C-s @key{RET}}. + +@node Regexps, Search Case, Regexp Search, Search +@section Syntax of Regular Expressions + +Regular expressions have a syntax in which a few characters are special +constructs and the rest are @dfn{ordinary}. An ordinary character is a +simple regular expression which matches that character and nothing else. +The special characters are @samp{$}, @samp{^}, @samp{.}, @samp{*}, +@samp{+}, @samp{?}, @samp{[}, @samp{]} and @samp{\}; no new special +characters will be defined. Any other character appearing in a regular +expression is ordinary, unless a @samp{\} precedes it.@refill + +For example, @samp{f} is not a special character, so it is ordinary, and +therefore @samp{f} is a regular expression that matches the string @samp{f} +and no other string. (It does @i{not} match the string @samp{ff}.) Likewise, +@samp{o} is a regular expression that matches only @samp{o}.@refill + +Any two regular expressions @var{a} and @var{b} can be concatenated. The +result is a regular expression which matches a string if @var{a} matches +some amount of the beginning of that string and @var{b} matches the rest of +the string.@refill + +As a simple example, you can concatenate the regular expressions @samp{f} +and @samp{o} to get the regular expression @samp{fo}, which matches only +the string @samp{fo}. To do something nontrivial, you +need to use one of the following special characters: + +@table @kbd +@item .@: @r{(Period)} +is a special character that matches any single character except a newline. +Using concatenation, you can make regular expressions like @samp{a.b}, which +matches any three-character string which begins with @samp{a} and ends with +@samp{b}.@refill + +@item * +is not a construct by itself; it is a suffix, which means the +preceding regular expression is to be repeated as many times as +possible. In @samp{fo*}, the @samp{*} applies to the @samp{o}, so +@samp{fo*} matches one @samp{f} followed by any number of @samp{o}s. +The case of zero @samp{o}s is allowed: @samp{fo*} does match +@samp{f}.@refill + +@samp{*} always applies to the @i{smallest} possible preceding +expression. Thus, @samp{fo*} has a repeating @samp{o}, not a +repeating @samp{fo}.@refill + +The matcher processes a @samp{*} construct by immediately matching +as many repetitions as it can find. Then it continues with the rest +of the pattern. If that fails, backtracking occurs, discarding some +of the matches of the @samp{*}-modified construct in case that makes +it possible to match the rest of the pattern. For example, matching +@samp{ca*ar} against the string @samp{caaar}, the @samp{a*} first +tries to match all three @samp{a}s; but the rest of the pattern is +@samp{ar} and there is only @samp{r} left to match, so this try fails. +The next alternative is for @samp{a*} to match only two @samp{a}s. +With this choice, the rest of the regexp matches successfully.@refill + +@item + +is a suffix character similar to @samp{*} except that it requires that +the preceding expression be matched at least once. For example, +@samp{ca+r} will match the strings @samp{car} and @samp{caaaar} +but not the string @samp{cr}, whereas @samp{ca*r} would match all +three strings.@refill + +@item ? +is a suffix character similar to @samp{*} except that it can match the +preceding expression either once or not at all. For example, +@samp{ca?r} will match @samp{car} or @samp{cr}; nothing else. + +@item [ @dots{} ] +@samp{[} begins a @dfn{character set}, which is terminated by a +@samp{]}. In the simplest case, the characters between the two form +the set. Thus, @samp{[ad]} matches either one @samp{a} or one +@samp{d}, and @samp{[ad]*} matches any string composed of just +@samp{a}s and @samp{d}s (including the empty string), from which it +follows that @samp{c[ad]*r} matches @samp{cr}, @samp{car}, @samp{cdr}, +@samp{caddaar}, etc.@refill + +You can include character ranges in a character set by writing two +characters with a @samp{-} between them. Thus, @samp{[a-z]} matches any +lower-case letter. Ranges may be intermixed freely with individual +characters, as in @samp{[a-z$%.]}, which matches any lower-case letter +or @samp{$}, @samp{%}, or period. +@refill + +Note that inside a character set the usual special characters are not +special any more. A completely different set of special characters +exists inside character sets: @samp{]}, @samp{-}, and @samp{^}.@refill + +To include a @samp{]} in a character set, you must make it the first +character. For example, @samp{[]a]} matches @samp{]} or @samp{a}. To +include a @samp{-}, write @samp{---}, which is a range containing only +@samp{-}. To include @samp{^}, make it other than the first character +in the set.@refill + +@item [^ @dots{} ] +@samp{[^} begins a @dfn{complement character set}, which matches any +character except the ones specified. Thus, @samp{[^a-z0-9A-Z]} +matches all characters @i{except} letters and digits.@refill + +@samp{^} is not special in a character set unless it is the first +character. The character following the @samp{^} is treated as if it +were first (@samp{-} and @samp{]} are not special there). + +Note that a complement character set can match a newline, unless +newline is mentioned as one of the characters not to match. + +@item ^ +is a special character that matches the empty string, but only if at +the beginning of a line in the text being matched. Otherwise, it fails +to match anything. Thus, @samp{^foo} matches a @samp{foo} that occurs +at the beginning of a line. + +@item $ +is similar to @samp{^} but matches only at the end of a line. Thus, +@samp{xx*$} matches a string of one @samp{x} or more at the end of a line. + +@item \ +does two things: it quotes the special characters (including +@samp{\}), and it introduces additional special constructs. + +Because @samp{\} quotes special characters, @samp{\$} is a regular +expression that matches only @samp{$}, and @samp{\[} is a regular +expression that matches only @samp{[}, and so on.@refill +@end table + +Note: for historical compatibility, special characters are treated as +ordinary ones if they are in contexts where their special meanings make no +sense. For example, @samp{*foo} treats @samp{*} as ordinary since there is +no preceding expression on which the @samp{*} can act. It is poor practice +to depend on this behavior; better to quote the special character anyway, +regardless of where is appears.@refill + +Usually, @samp{\} followed by any character matches only +that character. However, there are several exceptions: characters +which, when preceded by @samp{\}, are special constructs. Such +characters are always ordinary when encountered on their own. Here +is a table of @samp{\} constructs. + +@table @kbd +@item \| +specifies an alternative. +Two regular expressions @var{a} and @var{b} with @samp{\|} in +between form an expression that matches anything @var{a} or +@var{b} matches.@refill + +Thus, @samp{foo\|bar} matches either @samp{foo} or @samp{bar} +but no other string.@refill + +@samp{\|} applies to the largest possible surrounding expressions. Only a +surrounding @samp{\( @dots{} \)} grouping can limit the grouping power of +@samp{\|}.@refill + +Full backtracking capability exists to handle multiple uses of @samp{\|}. + +@item \( @dots{} \) +is a grouping construct that serves three purposes: + +@enumerate +@item +To enclose a set of @samp{\|} alternatives for other operations. +Thus, @samp{\(foo\|bar\)x} matches either @samp{foox} or @samp{barx}. + +@item +To enclose a complicated expression for the postfix @samp{*} to operate on. +Thus, @samp{ba\(na\)*} matches @samp{bananana}, etc., with any (zero or +more) number of @samp{na} strings.@refill + +@item +To mark a matched substring for future reference. + +@end enumerate + +This last application is not a consequence of the idea of a +parenthetical grouping; it is a separate feature which happens to be +assigned as a second meaning to the same @samp{\( @dots{} \)} construct +because in practice there is no conflict between the two meanings. +Here is an explanation: + +@item \@var{digit} +after the end of a @samp{\( @dots{} \)} construct, the matcher remembers the +beginning and end of the text matched by that construct. Then, later on +in the regular expression, you can use @samp{\} followed by @var{digit} +to mean ``match the same text matched the @var{digit}'th time by the +@samp{\( @dots{} \)} construct.''@refill + +The strings matching the first nine @samp{\( @dots{} \)} constructs appearing +in a regular expression are assigned numbers 1 through 9 in order that the +open-parentheses appear in the regular expression. @samp{\1} through +@samp{\9} may be used to refer to the text matched by the corresponding +@samp{\( @dots{} \)} construct. + +For example, @samp{\(.*\)\1} matches any newline-free string that is +composed of two identical halves. The @samp{\(.*\)} matches the first +half, which may be anything, but the @samp{\1} that follows must match +the same exact text. + +@item \` +matches the empty string, provided it is at the beginning +of the buffer. + +@item \' +matches the empty string, provided it is at the end of +the buffer. + +@item \b +matches the empty string, provided it is at the beginning or +end of a word. Thus, @samp{\bfoo\b} matches any occurrence of +@samp{foo} as a separate word. @samp{\bballs?\b} matches +@samp{ball} or @samp{balls} as a separate word.@refill + +@item \B +matches the empty string, provided it is @i{not} at the beginning or +end of a word. + +@item \< +matches the empty string, provided it is at the beginning of a word. + +@item \> +matches the empty string, provided it is at the end of a word. + +@item \w +matches any word-constituent character. The editor syntax table +determines which characters these are. + +@item \W +matches any character that is not a word-constituent. + +@item \s@var{code} +matches any character whose syntax is @var{code}. @var{code} is a +character which represents a syntax code: thus, @samp{w} for word +constituent, @samp{-} for whitespace, @samp{(} for open-parenthesis, +etc. @xref{Syntax}.@refill + +@item \S@var{code} +matches any character whose syntax is not @var{code}. +@end table + + Here is a complicated regexp used by Emacs to recognize the end of a +sentence together with any whitespace that follows. It is given in Lisp +syntax to enable you to distinguish the spaces from the tab characters. In +Lisp syntax, the string constant begins and ends with a double-quote. +@samp{\"} stands for a double-quote as part of the regexp, @samp{\\} for a +backslash as part of the regexp, @samp{\t} for a tab and @samp{\n} for a +newline. + +@example +"[.?!][]\"')]*\\($\\|\t\\| \\)[ \t\n]*" +@end example + +@noindent +This regexp contains four parts: a character set matching +period, @samp{?} or @samp{!}; a character set matching close-brackets, +quotes or parentheses, repeated any number of times; an alternative in +backslash-parentheses that matches end-of-line, a tab or two spaces; and +a character set matching whitespace characters, repeated any number of +times. + +@node Search Case, Replace, Regexps, Search +@section Searching and Case + +@vindex case-fold-search + All searches in Emacs normally ignore the case of the text they +are searching through; if you specify searching for @samp{FOO}, +@samp{Foo} and @samp{foo} are also considered a match. Regexps, and in +particular character sets, are included: @samp{[aB]} matches @samp{a} +or @samp{A} or @samp{b} or @samp{B}.@refill + + If you want a case-sensitive search, set the variable +@code{case-fold-search} to @code{nil}. Then all letters must match +exactly, including case. @code{case-fold-search} is a per-buffer +variable; altering it affects only the current buffer, but +there is a default value which you can change as well. @xref{Locals}. +You can also use @b{Case Sensitive Search} from the @b{Options} menu +on your screen. + +@node Replace, Other Repeating Search, Search Case, Search +@section Replacement Commands +@cindex replacement +@cindex string substitution +@cindex global substitution + + Global search-and-replace operations are not needed as often in Emacs as +they are in other editors, but they are available. In addition to the +simple @code{replace-string} command which is like that found in most +editors, there is a @code{query-replace} command which asks you, for each +occurrence of a pattern, whether to replace it. + + The replace commands all replace one string (or regexp) with one +replacement string. It is possible to perform several replacements in +parallel using the command @code{expand-region-abbrevs}. @xref{Expanding +Abbrevs}. + +@menu +* Unconditional Replace:: Replacing all matches for a string. +* Regexp Replace:: Replacing all matches for a regexp. +* Replacement and Case:: How replacements preserve case of letters. +* Query Replace:: How to use querying. +@end menu + +@node Unconditional Replace, Regexp Replace, Replace, Replace +@subsection Unconditional Replacement +@findex replace-string +@findex replace-regexp + +@table @kbd +@item M-x replace-string @key{RET} @var{string} @key{RET} @var{newstring} @key{RET} +Replace every occurrence of @var{string} with @var{newstring}. +@item M-x replace-regexp @key{RET} @var{regexp} @key{RET} @var{newstring} @key{RET} +Replace every match for @var{regexp} with @var{newstring}. +@end table + + To replace every instance of @samp{foo} after point with @samp{bar}, +use the command @kbd{M-x replace-string} with the two arguments +@samp{foo} and @samp{bar}. Replacement occurs only after point: if you +want to cover the whole buffer you must go to the beginning first. By +default, all occurrences up to the end of the buffer are replaced. To +limit replacement to part of the buffer, narrow to that part of the +buffer before doing the replacement (@pxref{Narrowing}). + + When @code{replace-string} exits, point is left at the last occurrence +replaced. The value of point when the @code{replace-string} command was +issued is remembered on the mark ring; @kbd{C-u C-@key{SPC}} moves back +there. + + A numeric argument restricts replacement to matches that are surrounded +by word boundaries. + +@node Regexp Replace, Replacement and Case, Unconditional Replace, Replace +@subsection Regexp Replacement + + @code{replace-string} replaces exact matches for a single string. The +similar command @code{replace-regexp} replaces any match for a specified +pattern. + + In @code{replace-regexp}, the @var{newstring} need not be constant. It +can refer to all or part of what is matched by the @var{regexp}. @samp{\&} +in @var{newstring} stands for the entire text being replaced. +@samp{\@var{d}} in @var{newstring}, where @var{d} is a digit, stands for +whatever matched the @var{d}'th parenthesized grouping in @var{regexp}. +For example,@refill + +@example +M-x replace-regexp @key{RET} c[ad]+r @key{RET} \&-safe @key{RET} +@end example + +@noindent +would replace (for example) @samp{cadr} with @samp{cadr-safe} and @samp{cddr} +with @samp{cddr-safe}. + +@example +M-x replace-regexp @key{RET} \(c[ad]+r\)-safe @key{RET} \1 @key{RET} +@end example + +@noindent +would perform exactly the opposite replacements. To include a @samp{\} +in the text to replace with, you must give @samp{\\}. + +@node Replacement and Case, Query Replace, Regexp Replace, Replace +@subsection Replace Commands and Case + +@vindex case-replace +@vindex case-fold-search + If the arguments to a replace command are in lower case, the command +preserves case when it makes a replacement. Thus, the following command: + +@example +M-x replace-string @key{RET} foo @key{RET} bar @key{RET} +@end example + +@noindent +replaces a lower-case @samp{foo} with a lower case @samp{bar}, @samp{FOO} +with @samp{BAR}, and @samp{Foo} with @samp{Bar}. If upper-case letters are +used in the second argument, they remain upper-case every time that +argument is inserted. If upper-case letters are used in the first +argument, the second argument is always substituted exactly as given, with +no case conversion. Likewise, if the variable @code{case-replace} is set +to @code{nil}, replacement is done without case conversion. If +@code{case-fold-search} is set to @code{nil}, case is significant in +matching occurrences of @samp{foo} to replace; also, case conversion of the +replacement string is not done. + +@node Query Replace,, Replacement and Case, Replace +@subsection Query Replace +@cindex query replace + +@table @kbd +@item M-% @var{string} @key{RET} @var{newstring} @key{RET} +@itemx M-x query-replace @key{RET} @var{string} @key{RET} @var{newstring} @key{RET} +Replace some occurrences of @var{string} with @var{newstring}. +@item M-x query-replace-regexp @key{RET} @var{regexp} @key{RET} @var{newstring} @key{RET} +Replace some matches for @var{regexp} with @var{newstring}. +@end table + +@kindex M-% +@findex query-replace + If you want to change only some of the occurrences of @samp{foo} to +@samp{bar}, not all of them, you can use @code{query-replace} instead of +@kbd{M-%}. This command finds occurrences of @samp{foo} one by one, +displays each occurrence, and asks you whether to replace it. A numeric +argument to @code{query-replace} tells it to consider only occurrences +that are bounded by word-delimiter characters.@refill + +@findex query-replace-regexp + Aside from querying, @code{query-replace} works just like +@code{replace-string}, and @code{query-replace-regexp} works +just like @code{replace-regexp}.@refill + + The things you can type when you are shown an occurrence of @var{string} +or a match for @var{regexp} are: + +@kindex SPC (query-replace) +@kindex DEL (query-replace) +@kindex , (query-replace) +@kindex ESC (query-replace) +@kindex . (query-replace) +@kindex ! (query-replace) +@kindex ^ (query-replace) +@kindex C-r (query-replace) +@kindex C-w (query-replace) +@kindex C-l (query-replace) + +@c WideCommands +@table @kbd +@item @key{SPC} +to replace the occurrence with @var{newstring}. This preserves case, just +like @code{replace-string}, provided @code{case-replace} is non-@code{nil}, +as it normally is.@refill + +@item @key{DEL} +to skip to the next occurrence without replacing this one. + +@item , @r{(Comma)} +to replace this occurrence and display the result. You are then +prompted for another input character. However, since the replacement has +already been made, @key{DEL} and @key{SPC} are equivalent. At this +point, you can type @kbd{C-r} (see below) to alter the replaced text. To +undo the replacement, you can type @kbd{C-x u}. +This exits the @code{query-replace}. If you want to do further +replacement you must use @kbd{C-x ESC} to restart (@pxref{Repetition}). + +@item @key{ESC} +to exit without doing any more replacements. + +@item .@: @r{(Period)} +to replace this occurrence and then exit. + +@item ! +to replace all remaining occurrences without asking again. + +@item ^ +to go back to the location of the previous occurrence (or what used to +be an occurrence), in case you changed it by mistake. This works by +popping the mark ring. Only one @kbd{^} in a row is allowed, because +only one previous replacement location is kept during @code{query-replace}. + +@item C-r +to enter a recursive editing level, in case the occurrence needs to be +edited rather than just replaced with @var{newstring}. When you are +done, exit the recursive editing level with @kbd{C-M-c} and the next +occurrence will be displayed. @xref{Recursive Edit}. + +@item C-w +to delete the occurrence, and then enter a recursive editing level as +in @kbd{C-r}. Use the recursive edit to insert text to replace the +deleted occurrence of @var{string}. When done, exit the recursive +editing level with @kbd{C-M-c} and the next occurrence will be +displayed. + +@item C-l +to redisplay the screen and then give another answer. + +@item C-h +to display a message summarizing these options, then give another +answer. +@end table + + If you type any other character, Emacs exits the @code{query-replace}, and +executes the character as a command. To restart the @code{query-replace}, +use @kbd{C-x @key{ESC}}, which repeats the @code{query-replace} because it +used the minibuffer to read its arguments. @xref{Repetition, C-x ESC}. + +@node Other Repeating Search,, Replace, Search +@section Other Search-and-Loop Commands + + Here are some other commands that find matches for a regular expression. +They all operate from point to the end of the buffer. + +@findex list-matching-lines +@findex occur +@findex count-matches +@findex delete-non-matching-lines +@findex delete-matching-lines +@c grosscommands +@table @kbd +@item M-x occur +Print each line that follows point and contains a match for the +specified regexp. A numeric argument specifies the number of context +lines to print before and after each matching line; the default is +none. + +@kindex C-c C-c (Occur mode) +The buffer @samp{*Occur*} containing the output serves as a menu for +finding occurrences in their original context. Find an occurrence +as listed in @samp{*Occur*}, position point there, and type @kbd{C-c +C-c}; this switches to the buffer that was searched and moves point to +the original of the same occurrence. + +@item M-x list-matching-lines +Synonym for @kbd{M-x occur}. + +@item M-x count-matches +Print the number of matches following point for the specified regexp. + +@item M-x delete-non-matching-lines +Delete each line that follows point and does not contain a match for +the specified regexp. + +@item M-x delete-matching-lines +Delete each line that follows point and contains a match for the +specified regexp. +@end table