Mercurial > emacs
changeset 96338:adedca23247f
(Shift selection): New node.
(Mark): Copyedits.
(Persistent Mark): Move to the end of the chapter.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Thu, 26 Jun 2008 19:31:01 +0000 |
parents | b159337451a8 |
children | cbf300426b9c |
files | doc/emacs/mark.texi |
diffstat | 1 files changed, 214 insertions(+), 186 deletions(-) [+] |
line wrap: on
line diff
--- a/doc/emacs/mark.texi Thu Jun 26 19:30:54 2008 +0000 +++ b/doc/emacs/mark.texi Thu Jun 26 19:31:01 2008 +0000 @@ -13,13 +13,12 @@ you set @dfn{the mark} at one end of it, and move point to the other end. The text between point and the mark is called @dfn{the region}. - The region always extends between point and the mark, no matter -which one comes earlier in the text---the region starts from point or -the mark (whichever comes first), and ends at point or the mark -(whichever comes last). Every time you move point, the region -changes. When a region is active, Emacs highlights it using the -@code{region} face. You can customize the appearance of the -highlighting by changing this face (@pxref{Face Customization}). + If the mark is active, the region always extends between point and +the mark, no matter which one comes earlier in the text; each time you +move point, the region changes. Whenever the mark is active, Emacs +highlights the region. You can customize the appearance of this +highlighting by changing the @code{region} face (@pxref{Face +Customization}). The region persists only until you use it. The mark is automatically @dfn{deactivated} after certain non-motion commands, @@ -28,26 +27,23 @@ (@pxref{Quitting}). @vindex highlight-nonselected-windows - Each Emacs buffer has its own mark, and setting the mark in one -buffer has no effect on other buffers' marks. When you return to a -buffer with an active mark, the mark is at the same place as before. -When multiple windows show the same buffer, they can have different -values of point, and thus different regions (though they all share one -common mark position). @xref{Windows}. Ordinarily, only the selected -window highlights its region, if a region exists; however, if the -variable @code{highlight-nonselected-windows} is non-@code{nil}, each -window highlights its own region. - - If Delete Selection mode is enabled, some commands delete the region -when used while the mark is active. @xref{Mouse Commands}. + Setting the mark in one buffer has no effect on the marks in other +buffers. When you return to a buffer with an active mark, the mark is +at the same place as before. When multiple windows show the same +buffer, they can have different values of point, and thus different +regions, but they all share one common mark position. @xref{Windows}. +Ordinarily, only the selected window highlights its region; however, +if the variable @code{highlight-nonselected-windows} is +non-@code{nil}, each window highlights its own region. @menu * Setting Mark:: Commands to set the mark. * Marking Objects:: Commands to put region around textual units. * Using Region:: Summary of ways to operate on contents of the region. -* Persistent Mark:: Keeping the mark active all the time. * Mark Ring:: Previous mark positions saved so you can go back there. * Global Mark Ring:: Previous mark positions in various buffers. +* Shift selection:: Using shifted cursor motion keys. +* Persistent Mark:: Keeping the mark active all the time. @end menu @node Setting Mark @@ -57,67 +53,70 @@ @table @kbd @item C-@key{SPC} -Set the mark where point is (@code{set-mark-command}). +Set the mark at point (@code{set-mark-command}). @item C-@@ The same. @item C-x C-x -Set the mark where point was, and move point where the mark was +Set the mark at point, and move point where the mark was (@code{exchange-point-and-mark}). @item Drag-Mouse-1 Set point and the mark around the text you drag across. @item Mouse-3 -Set the mark where point is, then move point to where you click +Set the mark at point, then move point to where you click (@code{mouse-save-then-kill}). +@item @samp{Shifted motion keys} +Set the mark at point if the mark is inactive, then move point. @end table @kindex C-SPC +@kindex C-@@ @findex set-mark-command The most common way to set the mark is with @kbd{C-@key{SPC}} -(@code{set-mark-command}). This sets the mark where point is. You -can then move point away, leaving the mark behind. +(@code{set-mark-command}), which sets the mark where point +is@footnote{There is no @kbd{C-@key{SPC}} character in +@acronym{ASCII}; usually, typing @kbd{C-@key{SPC}} on a text terminal +gives the character @kbd{C-@@}. This key is also bound to +@code{set-mark-command}, so unless you are unlucky enough to have an +text terminal that behaves differently, you might as well think of +@kbd{C-@@} as @kbd{C-@key{SPC}}.}. You can then move point away, +leaving the mark behind. For example, suppose you wish to convert part of the buffer to upper -case. To accomplish this, first go to the beginning of the text to be -capitalized, type @kbd{C-@key{SPC}}, and move point until the desired -portion of text is highlighted. You can now type @kbd{C-x C-u} -(@code{upcase-region}), which converts the text in the region to upper -case. This also automatically deactivates the mark. (Alternatively, -you could set the mark at the end, move to the beginning, and do -@kbd{C-x C-u}.) +case. To accomplish this, go to the beginning of the desired text, +type @kbd{C-@key{SPC}}, and move point until the desired portion of +text is highlighted. Now type @kbd{C-x C-u} (@code{upcase-region}). +This converts the text in the region to upper case, and then +deactivates the mark. @kindex C-x C-x @findex exchange-point-and-mark - The command @kbd{C-x C-x} (@code{exchange-point-and-mark}) puts the -mark where point was and moves point where the mark was, keeping the -region unchanged. If no mark is active, Emacs reactivates the mark at -the position where it was last set. @kbd{C-x C-x} is useful when you -are satisfied with the position of point but want to move the other -end of the region (where the mark is); do @kbd{C-x C-x} to put point -at that end of the region, and then move it. Using @kbd{C-x C-x} a -second time, if necessary, puts the mark at the new position with -point back at its original position. + The command @kbd{C-x C-x} (@code{exchange-point-and-mark}) exchanges +the positions of point and the mark, keeping the region unchanged. If +no mark is active, Emacs first reactivates the mark wherever it was +last set. @kbd{C-x C-x} is useful when you are satisfied with the +position of point but want to move the other end of the region (where +the mark is). Using @kbd{C-x C-x} a second time, if necessary, puts +the mark at the new position with point back at its original position. - You can also set the mark with the mouse. In fact, there are two -ways to do this. You can press the left mouse button -(@kbd{down-mouse-1}) and drag the mouse across a range of text while -holding down the button; this sets the mark where you first pressed -the mouse button, and point where you release it. Alternatively, you -can click the right mouse button (@kbd{mouse-3}), which sets the mark -at point and then moves point to where you clicked. + You can also set the mark with the mouse (@pxref{Mouse Commands}). +If you press the left mouse button (@kbd{down-mouse-1}) and drag the +mouse across a range of text while holding down this button, this sets +the mark where you first pressed the mouse button and puts point where +you release it. Alternatively, clicking the right mouse button +(@kbd{mouse-3}) sets the mark at point and then moves point to where +you clicked. Using the mouse to mark a region also copies the region +into the kill ring (@pxref{Kill Ring}). - Using the mouse to mark a region also copies the region into the -kill ring (@pxref{Kill Ring}). If you don't want to modify the kill -ring, you must use keyboard commands to set the mark. @xref{Mouse -Commands}. - -@kindex C-@@ - There is no such character as @kbd{C-@key{SPC}} in @acronym{ASCII}; -when you type @key{SPC} while holding down @key{CTRL} on a text -terminal, what you get is the character @kbd{C-@@}. This key is also -bound to @code{set-mark-command}---so unless you are unlucky enough to -have a text terminal where typing @kbd{C-@key{SPC}} does not produce -@kbd{C-@@}, you might as well think of this character as -@kbd{C-@key{SPC}}. +@cindex shift-selection + Finally, you can set the mark by holding down the shift key while +typing certain cursor motion commands (such as @kbd{S-@key{right}}, +@kbd{S-C-f}, @kbd{S-C-n}, etc.) This is referred to as +@dfn{shift-selection}. This sets the mark at point before moving +point, but only if there is no active mark set via shift-selection. +The mark set by mouse commands and by shift-selection behaves slightly +differently from the usual mark: any subsequent unshifted cursor +motion command deactivates it automatically. For details, @xref{Shift +selection}. Whenever the mark is active, you can deactivate it by typing @kbd{C-g} (@pxref{Quitting}). The mark is also automatically @@ -132,24 +131,27 @@ @table @kbd @item M-@@ -Set mark after end of next word (@code{mark-word}). This command and -the following one do not move point. +Set mark after end of next word (@code{mark-word}). This does not +move point. @item C-M-@@ -Set mark after end of following balanced expression (@code{mark-sexp}). +Set mark after end of following balanced expression +(@code{mark-sexp}). This does not move point. @item M-h Move point to the beginning of the current paragraph, and set mark at the end (@code{mark-paragraph}). @item C-M-h Move point to the beginning of the current defun, and set mark at the end (@code{mark-defun}). +@item C-x C-p +Move point to the beginning of the current page, and set mark at the +end (@code{mark-page}). @item C-x h Move point to the beginning of the buffer, and set mark at the end (@code{mark-whole-buffer}). -@item C-x C-p -Move point to the beginning of the current page, and set mark at the -end (@code{mark-page}). @end table +@findex mark-word +@findex mark-sexp @kbd{M-@@} (@code{mark-word}) puts the mark at the end of the next word, while @kbd{C-M-@@} (@code{mark-sexp}) puts it at the end of the next balanced expression (@pxref{Expressions}). These commands handle @@ -157,38 +159,32 @@ @kindex C-x h @findex mark-whole-buffer - Other commands set both point and mark, to delimit an object in the -buffer. For example, @kbd{M-h} (@code{mark-paragraph}) moves point to -the beginning of the paragraph that surrounds or follows point, and -puts the mark at the end of that paragraph (@pxref{Paragraphs}). It -prepares the region so you can indent, case-convert, or kill a whole -paragraph. With a prefix argument, if the argument's value is positive, -@kbd{M-h} marks that many paragraphs starting with the one surrounding -point. If the prefix argument is @minus{}@var{n}, @kbd{M-h} also -marks @var{n} paragraphs, running back form the one surrounding point. -In that last case, point moves forward to the end of that paragraph, -and the mark goes at the start of the region. + The other commands in the above list set both point and mark, so as +to delimit an object in the buffer. @kbd{M-h} (@code{mark-paragraph}) +moves point to the beginning of the paragraph that surrounds or +follows point, and sets the mark at the end of that paragraph +(@pxref{Paragraphs}). As a special exception, repeated invocations of +@kbd{M-h} extend the region to subsequent paragraphs. This is +convenient for indenting, case-converting, or killing entire +paragraphs. - @kbd{C-M-h} (@code{mark-defun}) similarly puts point before, and the -mark after, the current (or following) major top-level definition, or -defun (@pxref{Moving by Defuns}). Repeating @kbd{C-M-h} extends -the region to subsequent defuns. + The @kbd{M-h} command accepts prefix arguments. If the argument's +value is positive, @kbd{M-h} marks that many paragraphs starting with +the one surrounding point; therefore, @kbd{C-u M-h} is equivalent to +@kbd{M-h M-h M-h M-h}. If the prefix argument is @minus{}@var{n}, +@kbd{M-h} marks @var{n} paragraphs running back from the one +surrounding point; in this case, point moves forward to the end of +that paragraph, and the mark goes at the start of the region. - @kbd{C-x C-p} (@code{mark-page}) puts point before the current page, -and mark at the end (@pxref{Pages}). The mark goes after the -terminating page delimiter (to include it in the region), while point -goes after the preceding page delimiter (to exclude it). A numeric -argument specifies a later page (if positive) or an earlier page (if -negative) instead of the current page. - - While the mark is active, repeating the above commands extends the -region accordingly. For example, you can type either @kbd{C-u 2 M-@@} -or @kbd{M-@@ M-@@} to mark the next two words. Similarly, repeating -the @kbd{M-h} command extends the region to subsequent paragraphs. + Similarly, @kbd{C-M-h} (@code{mark-defun}) sets mark and point +around major top-level definitions (@pxref{Moving by Defuns}), and +@kbd{C-x C-p} (@code{mark-page}) does the same for pages +(@pxref{Pages}). These treat repeated invokations and prefix +arguments similarly to @code{mark-paragraph}. Finally, @kbd{C-x h} (@code{mark-whole-buffer}) sets up the entire -buffer as the region, by putting point at the beginning and the mark at -the end. (In some programs this is called ``select all.'') +buffer as the region, by putting point at the beginning and the mark +at the end. (In some programs this is called ``select all.'') @node Using Region @section Operating on the Region @@ -225,6 +221,124 @@ Most commands that operate on the text in the region have the word @code{region} in their names. + If Delete Selection mode is enabled, some commands delete the region +when used while the mark is active. @xref{Mouse Commands}. + +@node Mark Ring +@section The Mark Ring + +@cindex mark ring + Aside from delimiting the region, the mark is also useful for +remembering spots that you may want to go back to. Each buffer +remembers 16 previous locations of the mark, in the @dfn{mark ring}. +Commands that set the mark also push the old mark onto this ring. + +@table @kbd +@item C-@key{SPC} C-@key{SPC} +Set the mark, pushing it onto the mark ring, without activating it. +@item C-u C-@key{SPC} +Move point to where the mark was, and restore the mark from the ring +of former marks. +@end table + +@kindex C-SPC C-SPC + The command C-@key{SPC} C-@key{SPC} is handy when you want to use +the mark to remember a position to which you may wish to return. It +pushes the current point onto the mark ring, without activating the +mark (which would cause Emacs to highlight the region). This is +actually two consecutive invocations of @kbd{C-@key{SPC}} +(@code{set-mark-command}); the first @kbd{C-@key{SPC}} sets the mark, +and the second @kbd{C-@key{SPC}} deactivates it. (When Transient Mark +mode is off, C-@key{SPC} C-@key{SPC} instead activates Transient Mark +mode temporarily. @xref{Persistent Mark}.) + +@kindex C-u C-SPC + To return to a marked position, use @code{set-mark-command} with a +prefix argument: @kbd{C-u C-@key{SPC}}. This moves point to where the +mark was, and deactivates the mark if it was active. Each subsequent +@kbd{C-u C-@key{SPC}} jumps to a prior position stored in the mark +ring. The positions you move through in this way are not lost; they +go to the end of the ring. + +@vindex set-mark-command-repeat-pop + If you set @code{set-mark-command-repeat-pop} to non-@code{nil}, +then immediately after you type @kbd{C-u C-@key{SPC}}, you can type +@kbd{C-@key{SPC}} instead of @kbd{C-u C-@key{SPC}} to cycle through +the mark ring. By default, @code{set-mark-command-repeat-pop} is +@code{nil}. + + Each buffer has its own mark ring. All editing commands use the +current buffer's mark ring. In particular, @kbd{C-u C-@key{SPC}} +always stays in the same buffer. + +@vindex mark-ring-max + The variable @code{mark-ring-max} specifies the maximum number of +entries to keep in the mark ring. If that many entries exist and +another one is pushed, the earliest one in the list is discarded. Repeating +@kbd{C-u C-@key{SPC}} cycles through the positions currently in the +ring. + +@vindex mark-even-if-inactive + If the variable @code{mark-even-if-inactive} is @code{nil}, commands +can only use the mark and the region when it is active. This variable +is non-@code{nil} by default. + + If you want to move back to the same place over and over, the mark +ring may not be convenient enough. If so, you can record the position +in a register for later retrieval (@pxref{RegPos,, Saving Positions in +Registers}). + +@node Global Mark Ring +@section The Global Mark Ring +@cindex global mark ring + + In addition to the ordinary mark ring that belongs to each buffer, +Emacs has a single @dfn{global mark ring}. Each time you set a mark, +in any buffer, this is recorded in the global mark ring in addition to +the current buffer's own mark ring. + +@kindex C-x C-@key{SPC} +@findex pop-global-mark + The command @kbd{C-x C-@key{SPC}} (@code{pop-global-mark}) jumps to +the buffer and position of the latest entry in the global ring. It also +rotates the ring, so that successive uses of @kbd{C-x C-@key{SPC}} take +you to earlier buffers and mark positions. + +@node Shift selection +@section Shift selection +@cindex shift-selection + + If you hold down the shift key while typing a cursor motion command, +this sets the mark before moving point, so that the region extends +from the original position of point to its new position. This +feature, newly introduced in Emacs 23, is referred to as +@dfn{shift-selection}. It is similar to the way text is selected in +other editors. + + The mark set via shift-selection behaves a little differently from +what we have described above. Firstly, in addition to the usual ways +of deactivating the mark (such as changing the buffer text or typing +@kbd{C-g}), the mark is deactivated by any @emph{unshifted} cursor +motion command. Secondly, any subsequent @emph{shifted} cursor motion +command avoids setting the mark anew. Therefore, a series of shifted +cursor motion commands will continuously extend the region. + + Shift-selection only works if the shifted cursor motion key is not +already bound to a separate command (@pxref{Customization}). For +example, if you bind @kbd{S-C-f} to another command, typing +@kbd{S-C-f} runs that command instead of performing a shift-selected +version of @kbd{C-f} (@code{forward-char}). + + A mark set via mouse commands behaves the same as a mark set via +shift-selection (@pxref{Setting Mark}). For example, if you specify a +region by dragging the mouse, you can continue to extend the region +using shifted cursor motion commands. In either case, any unshifted +cursor motion command deactivates the mark. + + To turn off shift-selection, set @code{shift-select-mode} to +@code{nil}. Doing this does not disable setting the mark via mouse +commands. + @node Persistent Mark @section Persistent Marks @cindex mode, Transient Mark @@ -233,7 +347,7 @@ @cindex region highlighting @cindex Zmacs mode - By default, the region is highlighted whenever it exists, and it + By default, the region is highlighted whenever it exists, and disappears once you use it or explicitly deactivate the mark. This behavior is called Transient Mark mode@footnote{It is also sometimes called @dfn{Zmacs mode}, because the Zmacs editor on the MIT Lisp @@ -246,15 +360,15 @@ deactivated, but can be set to different locations using commands such as @kbd{C-@key{SPC}}. After the first time you set the mark in a buffer, there is always a region in that buffer. Emacs will not -highlight the region, because that would be a nuisance. As an +highlight the region, because that would be a nuisance. As a special exception, the region is temporarily highlighted after it is set with the mouse. To turn off Transient Mark mode, type @kbd{M-x transient-mark-mode}. This command toggles the mode; you can use the same command to turn -Transient Mark mode on again. You can also toggle Transient Mark mode -using the menu bar: in the @samp{Options} menu, use the @samp{Active -Region Highlighting} menu item. +Transient Mark mode on again. You can also turn off Transient Mark +mode using the menu bar: in the @samp{Options} menu, toggle the +@samp{Active Region Highlighting} menu item. Here are the details of how Emacs behaves when Transient Mark mode is off: @@ -311,92 +425,6 @@ the region when Transient Mark mode is off. Enabling Transient Mark mode momentarily gives you a way to use these commands on the region. -@node Mark Ring -@section The Mark Ring - -@cindex mark ring - Aside from delimiting the region, the mark is also useful for -remembering spots that you may want to go back to. Each buffer -remembers 16 previous locations of the mark, in the @dfn{mark ring}. -Commands that set the mark also push the old mark onto this ring. - -@table @kbd -@item C-@key{SPC} C-@key{SPC} -Set the mark, pushing it onto the mark ring, without activating it. -@item C-u C-@key{SPC} -Move point to where the mark was, and restore the mark from the ring -of former marks. -@end table - -@kindex C-SPC C-SPC - The command C-@key{SPC} C-@key{SPC} is handy when you want to use -the mark to remember a position to which you may want to return. It -pushes the current point onto the mark ring, without activating the -mark (which would cause Emacs to highlight the region). This is -actually two consecutive invocations of @kbd{C-@key{SPC}} -(@code{set-mark-command}); the first @kbd{C-@key{SPC}} sets the mark, -and the second @kbd{C-@key{SPC}} deactivates it. (When Transient Mark -mode is off, C-@key{SPC} C-@key{SPC} instead activates Transient Mark -mode temporarily. @xref{Persistent Mark}.) - -@kindex C-u C-SPC - To return to a marked position, use @code{set-mark-command} with a -prefix argument: @kbd{C-u C-@key{SPC}}. This moves point to where the -mark was, and deactivates the mark if it was active. Each subsequent -@kbd{C-u C-@key{SPC}} jumps to a prior position stored in the mark -ring. The positions you move through in this way are not lost; they -go to the end of the ring. - -@vindex set-mark-command-repeat-pop - If you set @code{set-mark-command-repeat-pop} to non-@code{nil}, -then immediately after you type @kbd{C-u C-@key{SPC}}, you can type -@kbd{C-@key{SPC}} instead of @kbd{C-u C-@key{SPC}} to cycle through -the mark ring. By default, @code{set-mark-command-repeat-pop} is -@code{nil}. - - Each buffer has its own mark ring. All editing commands use the -current buffer's mark ring. In particular, @kbd{C-u C-@key{SPC}} -always stays in the same buffer. - -@vindex mark-ring-max - The variable @code{mark-ring-max} specifies the maximum number of -entries to keep in the mark ring. If that many entries exist and -another one is pushed, the earliest one in the list is discarded. Repeating -@kbd{C-u C-@key{SPC}} cycles through the positions currently in the -ring. - -@vindex mark-even-if-inactive - If the variable @code{mark-even-if-inactive} is @code{nil}, commands -can only use the mark and the region when it is active. This variable -is non-@code{nil} by default. - - If you want to move back to the same place over and over, the mark -ring may not be convenient enough. If so, you can record the position -in a register for later retrieval (@pxref{RegPos,, Saving Positions in -Registers}). - -@node Global Mark Ring -@section The Global Mark Ring -@cindex global mark ring - - In addition to the ordinary mark ring that belongs to each buffer, -Emacs has a single @dfn{global mark ring}. It records a sequence of -buffers in which you have recently set the mark, so you can go back -to those buffers. - - Setting the mark always makes an entry on the current buffer's mark -ring. If you have switched buffers since the previous mark setting, the -new mark position makes an entry on the global mark ring also. The -result is that the global mark ring records a sequence of buffers that -you have been in, and, for each buffer, a place where you set the mark. - -@kindex C-x C-@key{SPC} -@findex pop-global-mark - The command @kbd{C-x C-@key{SPC}} (@code{pop-global-mark}) jumps to -the buffer and position of the latest entry in the global ring. It also -rotates the ring, so that successive uses of @kbd{C-x C-@key{SPC}} take -you to earlier and earlier buffers. - @ignore arch-tag: f35e4d82-911b-4cfc-a3d7-3c87b2abba20 @end ignore