This is ../info/lispref.info, produced by makeinfo version 4.0 from lispref/lispref.texi. INFO-DIR-SECTION XEmacs Editor START-INFO-DIR-ENTRY * Lispref: (lispref). XEmacs Lisp Reference Manual. END-INFO-DIR-ENTRY Edition History: GNU Emacs Lisp Reference Manual Second Edition (v2.01), May 1993 GNU Emacs Lisp Reference Manual Further Revised (v2.02), August 1993 Lucid Emacs Lisp Reference Manual (for 19.10) First Edition, March 1994 XEmacs Lisp Programmer's Manual (for 19.12) Second Edition, April 1995 GNU Emacs Lisp Reference Manual v2.4, June 1995 XEmacs Lisp Programmer's Manual (for 19.13) Third Edition, July 1995 XEmacs Lisp Reference Manual (for 19.14 and 20.0) v3.1, March 1996 XEmacs Lisp Reference Manual (for 19.15 and 20.1, 20.2, 20.3) v3.2, April, May, November 1997 XEmacs Lisp Reference Manual (for 21.0) v3.3, April 1998 Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. Copyright (C) 1994, 1995 Sun Microsystems, Inc. Copyright (C) 1995, 1996 Ben Wing. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Foundation. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled "GNU General Public License" is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled "GNU General Public License" may be included in a translation approved by the Free Software Foundation instead of in the original English.  File: lispref.info, Node: Internals of Kill Ring, Prev: Low-Level Kill Ring, Up: The Kill Ring Internals of the Kill Ring -------------------------- The variable `kill-ring' holds the kill ring contents, in the form of a list of strings. The most recent kill is always at the front of the list. The `kill-ring-yank-pointer' variable points to a link in the kill ring list, whose CAR is the text to yank next. We say it identifies the "front" of the ring. Moving `kill-ring-yank-pointer' to a different link is called "rotating the kill ring". We call the kill ring a "ring" because the functions that move the yank pointer wrap around from the end of the list to the beginning, or vice-versa. Rotation of the kill ring is virtual; it does not change the value of `kill-ring'. Both `kill-ring' and `kill-ring-yank-pointer' are Lisp variables whose values are normally lists. The word "pointer" in the name of the `kill-ring-yank-pointer' indicates that the variable's purpose is to identify one element of the list for use by the next yank command. The value of `kill-ring-yank-pointer' is always `eq' to one of the links in the kill ring list. The element it identifies is the CAR of that link. Kill commands, which change the kill ring, also set this variable to the value of `kill-ring'. The effect is to rotate the ring so that the newly killed text is at the front. Here is a diagram that shows the variable `kill-ring-yank-pointer' pointing to the second entry in the kill ring `("some text" "a different piece of text" "yet older text")'. kill-ring kill-ring-yank-pointer | | | ___ ___ ---> ___ ___ ___ ___ --> |___|___|------> |___|___|--> |___|___|--> nil | | | | | | | | -->"yet older text" | | | --> "a different piece of text" | --> "some text" This state of affairs might occur after `C-y' (`yank') immediately followed by `M-y' (`yank-pop'). - Variable: kill-ring This variable holds the list of killed text sequences, most recently killed first. - Variable: kill-ring-yank-pointer This variable's value indicates which element of the kill ring is at the "front" of the ring for yanking. More precisely, the value is a tail of the value of `kill-ring', and its CAR is the kill string that `C-y' should yank. - User Option: kill-ring-max The value of this variable is the maximum length to which the kill ring can grow, before elements are thrown away at the end. The default value for `kill-ring-max' is 30.  File: lispref.info, Node: Undo, Next: Maintaining Undo, Prev: The Kill Ring, Up: Text Undo ==== Most buffers have an "undo list", which records all changes made to the buffer's text so that they can be undone. (The buffers that don't have one are usually special-purpose buffers for which XEmacs assumes that undoing is not useful.) All the primitives that modify the text in the buffer automatically add elements to the front of the undo list, which is in the variable `buffer-undo-list'. - Variable: buffer-undo-list This variable's value is the undo list of the current buffer. A value of `t' disables the recording of undo information. Here are the kinds of elements an undo list can have: `INTEGER' This kind of element records a previous value of point. Ordinary cursor motion does not get any sort of undo record, but deletion commands use these entries to record where point was before the command. `(BEG . END)' This kind of element indicates how to delete text that was inserted. Upon insertion, the text occupied the range BEG-END in the buffer. `(TEXT . POSITION)' This kind of element indicates how to reinsert text that was deleted. The deleted text itself is the string TEXT. The place to reinsert it is `(abs POSITION)'. `(t HIGH . LOW)' This kind of element indicates that an unmodified buffer became modified. The elements HIGH and LOW are two integers, each recording 16 bits of the visited file's modification time as of when it was previously visited or saved. `primitive-undo' uses those values to determine whether to mark the buffer as unmodified once again; it does so only if the file's modification time matches those numbers. `(nil PROPERTY VALUE BEG . END)' This kind of element records a change in a text property. Here's how you might undo the change: (put-text-property BEG END PROPERTY VALUE) `POSITION' This element indicates where point was at an earlier time. Undoing this element sets point to POSITION. Deletion normally creates an element of this kind as well as a reinsertion element. `nil' This element is a boundary. The elements between two boundaries are called a "change group"; normally, each change group corresponds to one keyboard command, and undo commands normally undo an entire group as a unit. - Function: undo-boundary This function places a boundary element in the undo list. The undo command stops at such a boundary, and successive undo commands undo to earlier and earlier boundaries. This function returns `nil'. The editor command loop automatically creates an undo boundary before each key sequence is executed. Thus, each undo normally undoes the effects of one command. Self-inserting input characters are an exception. The command loop makes a boundary for the first such character; the next 19 consecutive self-inserting input characters do not make boundaries, and then the 20th does, and so on as long as self-inserting characters continue. All buffer modifications add a boundary whenever the previous undoable change was made in some other buffer. This way, a command that modifies several buffers makes a boundary in each buffer it changes. Calling this function explicitly is useful for splitting the effects of a command into more than one unit. For example, `query-replace' calls `undo-boundary' after each replacement, so that the user can undo individual replacements one by one. - Function: primitive-undo count list This is the basic function for undoing elements of an undo list. It undoes the first COUNT elements of LIST, returning the rest of LIST. You could write this function in Lisp, but it is convenient to have it in C. `primitive-undo' adds elements to the buffer's undo list when it changes the buffer. Undo commands avoid confusion by saving the undo list value at the beginning of a sequence of undo operations. Then the undo operations use and update the saved value. The new elements added by undoing are not part of this saved value, so they don't interfere with continuing to undo.  File: lispref.info, Node: Maintaining Undo, Next: Filling, Prev: Undo, Up: Text Maintaining Undo Lists ====================== This section describes how to enable and disable undo information for a given buffer. It also explains how the undo list is truncated automatically so it doesn't get too big. Recording of undo information in a newly created buffer is normally enabled to start with; but if the buffer name starts with a space, the undo recording is initially disabled. You can explicitly enable or disable undo recording with the following two functions, or by setting `buffer-undo-list' yourself. - Command: buffer-enable-undo &optional buffer-or-name This command enables recording undo information for buffer BUFFER-OR-NAME, so that subsequent changes can be undone. If no argument is supplied, then the current buffer is used. This function does nothing if undo recording is already enabled in the buffer. It returns `nil'. In an interactive call, BUFFER-OR-NAME is the current buffer. You cannot specify any other buffer. - Function: buffer-disable-undo &optional buffer - Function: buffer-flush-undo &optional buffer This function discards the undo list of BUFFER, and disables further recording of undo information. As a result, it is no longer possible to undo either previous changes or any subsequent changes. If the undo list of BUFFER is already disabled, this function has no effect. This function returns `nil'. It cannot be called interactively. The name `buffer-flush-undo' is not considered obsolete, but the preferred name `buffer-disable-undo' is new as of Emacs versions 19. As editing continues, undo lists get longer and longer. To prevent them from using up all available memory space, garbage collection trims them back to size limits you can set. (For this purpose, the "size" of an undo list measures the cons cells that make up the list, plus the strings of deleted text.) Two variables control the range of acceptable sizes: `undo-limit' and `undo-strong-limit'. - Variable: undo-limit This is the soft limit for the acceptable size of an undo list. The change group at which this size is exceeded is the last one kept. - Variable: undo-strong-limit This is the upper limit for the acceptable size of an undo list. The change group at which this size is exceeded is discarded itself (along with all older change groups). There is one exception: the very latest change group is never discarded no matter how big it is.  File: lispref.info, Node: Filling, Next: Margins, Prev: Maintaining Undo, Up: Text Filling ======= "Filling" means adjusting the lengths of lines (by moving the line breaks) so that they are nearly (but no greater than) a specified maximum width. Additionally, lines can be "justified", which means inserting spaces to make the left and/or right margins line up precisely. The width is controlled by the variable `fill-column'. For ease of reading, lines should be no longer than 70 or so columns. You can use Auto Fill mode (*note Auto Filling::) to fill text automatically as you insert it, but changes to existing text may leave it improperly filled. Then you must fill the text explicitly. Most of the commands in this section return values that are not meaningful. All the functions that do filling take note of the current left margin, current right margin, and current justification style (*note Margins::). If the current justification style is `none', the filling functions don't actually do anything. Several of the filling functions have an argument JUSTIFY. If it is non-`nil', that requests some kind of justification. It can be `left', `right', `full', or `center', to request a specific style of justification. If it is `t', that means to use the current justification style for this part of the text (see `current-justification', below). When you call the filling functions interactively, using a prefix argument implies the value `full' for JUSTIFY. - Command: fill-paragraph justify This command fills the paragraph at or after point. If JUSTIFY is non-`nil', each line is justified as well. It uses the ordinary paragraph motion commands to find paragraph boundaries. *Note Paragraphs: (xemacs)Paragraphs. - Command: fill-region start end &optional justify This command fills each of the paragraphs in the region from START to END. It justifies as well if JUSTIFY is non-`nil'. The variable `paragraph-separate' controls how to distinguish paragraphs. *Note Standard Regexps::. - Command: fill-individual-paragraphs start end &optional justify mail-flag This command fills each paragraph in the region according to its individual fill prefix. Thus, if the lines of a paragraph were indented with spaces, the filled paragraph will remain indented in the same fashion. The first two arguments, START and END, are the beginning and end of the region to be filled. The third and fourth arguments, JUSTIFY and MAIL-FLAG, are optional. If JUSTIFY is non-`nil', the paragraphs are justified as well as filled. If MAIL-FLAG is non-`nil', it means the function is operating on a mail message and therefore should not fill the header lines. Ordinarily, `fill-individual-paragraphs' regards each change in indentation as starting a new paragraph. If `fill-individual-varying-indent' is non-`nil', then only separator lines separate paragraphs. That mode can handle indented paragraphs with additional indentation on the first line. - User Option: fill-individual-varying-indent This variable alters the action of `fill-individual-paragraphs' as described above. - Command: fill-region-as-paragraph start end &optional justify This command considers a region of text as a paragraph and fills it. If the region was made up of many paragraphs, the blank lines between paragraphs are removed. This function justifies as well as filling when JUSTIFY is non-`nil'. In an interactive call, any prefix argument requests justification. In Adaptive Fill mode, which is enabled by default, `fill-region-as-paragraph' on an indented paragraph when there is no fill prefix uses the indentation of the second line of the paragraph as the fill prefix. - Command: justify-current-line how eop nosqueeze This command inserts spaces between the words of the current line so that the line ends exactly at `fill-column'. It returns `nil'. The argument HOW, if non-`nil' specifies explicitly the style of justification. It can be `left', `right', `full', `center', or `none'. If it is `t', that means to do follow specified justification style (see `current-justification', below). `nil' means to do full justification. If EOP is non-`nil', that means do left-justification when `current-justification' specifies full justification. This is used for the last line of a paragraph; even if the paragraph as a whole is fully justified, the last line should not be. If NOSQUEEZE is non-`nil', that means do not change interior whitespace. - User Option: default-justification This variable's value specifies the style of justification to use for text that doesn't specify a style with a text property. The possible values are `left', `right', `full', `center', or `none'. The default value is `left'. - Function: current-justification This function returns the proper justification style to use for filling the text around point. - Variable: fill-paragraph-function This variable provides a way for major modes to override the filling of paragraphs. If the value is non-`nil', `fill-paragraph' calls this function to do the work. If the function returns a non-`nil' value, `fill-paragraph' assumes the job is done, and immediately returns that value. The usual use of this feature is to fill comments in programming language modes. If the function needs to fill a paragraph in the usual way, it can do so as follows: (let ((fill-paragraph-function nil)) (fill-paragraph arg)) - Variable: use-hard-newlines If this variable is non-`nil', the filling functions do not delete newlines that have the `hard' text property. These "hard newlines" act as paragraph separators.  File: lispref.info, Node: Margins, Next: Auto Filling, Prev: Filling, Up: Text Margins for Filling =================== - User Option: fill-prefix This variable specifies a string of text that appears at the beginning of normal text lines and should be disregarded when filling them. Any line that fails to start with the fill prefix is considered the start of a paragraph; so is any line that starts with the fill prefix followed by additional whitespace. Lines that start with the fill prefix but no additional whitespace are ordinary text lines that can be filled together. The resulting filled lines also start with the fill prefix. The fill prefix follows the left margin whitespace, if any. - User Option: fill-column This buffer-local variable specifies the maximum width of filled lines. Its value should be an integer, which is a number of columns. All the filling, justification and centering commands are affected by this variable, including Auto Fill mode (*note Auto Filling::). As a practical matter, if you are writing text for other people to read, you should set `fill-column' to no more than 70. Otherwise the line will be too long for people to read comfortably, and this can make the text seem clumsy. - Variable: default-fill-column The value of this variable is the default value for `fill-column' in buffers that do not override it. This is the same as `(default-value 'fill-column)'. The default value for `default-fill-column' is 70. - Command: set-left-margin from to margin This sets the `left-margin' property on the text from FROM to TO to the value MARGIN. If Auto Fill mode is enabled, this command also refills the region to fit the new margin. - Command: set-right-margin from to margin This sets the `right-margin' property on the text from FROM to TO to the value MARGIN. If Auto Fill mode is enabled, this command also refills the region to fit the new margin. - Function: current-left-margin This function returns the proper left margin value to use for filling the text around point. The value is the sum of the `left-margin' property of the character at the start of the current line (or zero if none), and the value of the variable `left-margin'. - Function: current-fill-column This function returns the proper fill column value to use for filling the text around point. The value is the value of the `fill-column' variable, minus the value of the `right-margin' property of the character after point. - Command: move-to-left-margin &optional n force This function moves point to the left margin of the current line. The column moved to is determined by calling the function `current-left-margin'. If the argument N is non-`nil', `move-to-left-margin' moves forward N-1 lines first. If FORCE is non-`nil', that says to fix the line's indentation if that doesn't match the left margin value. - Function: delete-to-left-margin from to This function removes left margin indentation from the text between FROM and TO. The amount of indentation to delete is determined by calling `current-left-margin'. In no case does this function delete non-whitespace. - Function: indent-to-left-margin This is the default `indent-line-function', used in Fundamental mode, Text mode, etc. Its effect is to adjust the indentation at the beginning of the current line to the value specified by the variable `left-margin'. This may involve either inserting or deleting whitespace. - Variable: left-margin This variable specifies the base left margin column. In Fundamental mode, indents to this column. This variable automatically becomes buffer-local when set in any fashion.  File: lispref.info, Node: Auto Filling, Next: Sorting, Prev: Margins, Up: Text Auto Filling ============ Auto Fill mode is a minor mode that fills lines automatically as text is inserted. This section describes the hook used by Auto Fill mode. For a description of functions that you can call explicitly to fill and justify existing text, see *Note Filling::. Auto Fill mode also enables the functions that change the margins and justification style to refill portions of the text. *Note Margins::. - Variable: auto-fill-function The value of this variable should be a function (of no arguments) to be called after self-inserting a space or a newline. It may be `nil', in which case nothing special is done in that case. The value of `auto-fill-function' is `do-auto-fill' when Auto-Fill mode is enabled. That is a function whose sole purpose is to implement the usual strategy for breaking a line. In older Emacs versions, this variable was named `auto-fill-hook', but since it is not called with the standard convention for hooks, it was renamed to `auto-fill-function' in version 19.  File: lispref.info, Node: Sorting, Next: Columns, Prev: Auto Filling, Up: Text Sorting Text ============ The sorting functions described in this section all rearrange text in a buffer. This is in contrast to the function `sort', which rearranges the order of the elements of a list (*note Rearrangement::). The values returned by these functions are not meaningful. - Function: sort-subr reverse nextrecfun endrecfun &optional startkeyfun endkeyfun This function is the general text-sorting routine that divides a buffer into records and sorts them. Most of the commands in this section use this function. To understand how `sort-subr' works, consider the whole accessible portion of the buffer as being divided into disjoint pieces called "sort records". The records may or may not be contiguous; they may not overlap. A portion of each sort record (perhaps all of it) is designated as the sort key. Sorting rearranges the records in order by their sort keys. Usually, the records are rearranged in order of ascending sort key. If the first argument to the `sort-subr' function, REVERSE, is non-`nil', the sort records are rearranged in order of descending sort key. The next four arguments to `sort-subr' are functions that are called to move point across a sort record. They are called many times from within `sort-subr'. 1. NEXTRECFUN is called with point at the end of a record. This function moves point to the start of the next record. The first record is assumed to start at the position of point when `sort-subr' is called. Therefore, you should usually move point to the beginning of the buffer before calling `sort-subr'. This function can indicate there are no more sort records by leaving point at the end of the buffer. 2. ENDRECFUN is called with point within a record. It moves point to the end of the record. 3. STARTKEYFUN is called to move point from the start of a record to the start of the sort key. This argument is optional; if it is omitted, the whole record is the sort key. If supplied, the function should either return a non-`nil' value to be used as the sort key, or return `nil' to indicate that the sort key is in the buffer starting at point. In the latter case, ENDKEYFUN is called to find the end of the sort key. 4. ENDKEYFUN is called to move point from the start of the sort key to the end of the sort key. This argument is optional. If STARTKEYFUN returns `nil' and this argument is omitted (or `nil'), then the sort key extends to the end of the record. There is no need for ENDKEYFUN if STARTKEYFUN returns a non-`nil' value. As an example of `sort-subr', here is the complete function definition for `sort-lines': ;; Note that the first two lines of doc string ;; are effectively one line when viewed by a user. (defun sort-lines (reverse beg end) "Sort lines in region alphabetically. Called from a program, there are three arguments: REVERSE (non-nil means reverse order), and BEG and END (the region to sort)." (interactive "P\nr") (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (sort-subr reverse 'forward-line 'end-of-line))) Here `forward-line' moves point to the start of the next record, and `end-of-line' moves point to the end of record. We do not pass the arguments STARTKEYFUN and ENDKEYFUN, because the entire record is used as the sort key. The `sort-paragraphs' function is very much the same, except that its `sort-subr' call looks like this: (sort-subr reverse (function (lambda () (skip-chars-forward "\n \t\f"))) 'forward-paragraph) - Command: sort-regexp-fields reverse record-regexp key-regexp start end This command sorts the region between START and END alphabetically as specified by RECORD-REGEXP and KEY-REGEXP. If REVERSE is a negative integer, then sorting is in reverse order. Alphabetical sorting means that two sort keys are compared by comparing the first characters of each, the second characters of each, and so on. If a mismatch is found, it means that the sort keys are unequal; the sort key whose character is less at the point of first mismatch is the lesser sort key. The individual characters are compared according to their numerical values. Since Emacs uses the ASCII character set, the ordering in that set determines alphabetical order. The value of the RECORD-REGEXP argument specifies how to divide the buffer into sort records. At the end of each record, a search is done for this regular expression, and the text that matches it is the next record. For example, the regular expression `^.+$', which matches lines with at least one character besides a newline, would make each such line into a sort record. *Note Regular Expressions::, for a description of the syntax and meaning of regular expressions. The value of the KEY-REGEXP argument specifies what part of each record is the sort key. The KEY-REGEXP could match the whole record, or only a part. In the latter case, the rest of the record has no effect on the sorted order of records, but it is carried along when the record moves to its new position. The KEY-REGEXP argument can refer to the text matched by a subexpression of RECORD-REGEXP, or it can be a regular expression on its own. If KEY-REGEXP is: `\DIGIT' then the text matched by the DIGITth `\(...\)' parenthesis grouping in RECORD-REGEXP is the sort key. `\&' then the whole record is the sort key. a regular expression then `sort-regexp-fields' searches for a match for the regular expression within the record. If such a match is found, it is the sort key. If there is no match for KEY-REGEXP within a record then that record is ignored, which means its position in the buffer is not changed. (The other records may move around it.) For example, if you plan to sort all the lines in the region by the first word on each line starting with the letter `f', you should set RECORD-REGEXP to `^.*$' and set KEY-REGEXP to `\'. The resulting expression looks like this: (sort-regexp-fields nil "^.*$" "\\" (region-beginning) (region-end)) If you call `sort-regexp-fields' interactively, it prompts for RECORD-REGEXP and KEY-REGEXP in the minibuffer. - Command: sort-lines reverse start end This command alphabetically sorts lines in the region between START and END. If REVERSE is non-`nil', the sort is in reverse order. - Command: sort-paragraphs reverse start end This command alphabetically sorts paragraphs in the region between START and END. If REVERSE is non-`nil', the sort is in reverse order. - Command: sort-pages reverse start end This command alphabetically sorts pages in the region between START and END. If REVERSE is non-`nil', the sort is in reverse order. - Command: sort-fields field start end This command sorts lines in the region between START and END, comparing them alphabetically by the FIELDth field of each line. Fields are separated by whitespace and numbered starting from 1. If FIELD is negative, sorting is by the -FIELDth field from the end of the line. This command is useful for sorting tables. - Command: sort-numeric-fields field start end This command sorts lines in the region between START and END, comparing them numerically by the FIELDth field of each line. The specified field must contain a number in each line of the region. Fields are separated by whitespace and numbered starting from 1. If FIELD is negative, sorting is by the -FIELDth field from the end of the line. This command is useful for sorting tables. - Command: sort-columns reverse &optional beg end This command sorts the lines in the region between BEG and END, comparing them alphabetically by a certain range of columns. The column positions of BEG and END bound the range of columns to sort on. If REVERSE is non-`nil', the sort is in reverse order. One unusual thing about this command is that the entire line containing position BEG, and the entire line containing position END, are included in the region sorted. Note that `sort-columns' uses the `sort' utility program, and so cannot work properly on text containing tab characters. Use `M-x `untabify'' to convert tabs to spaces before sorting.  File: lispref.info, Node: Columns, Next: Indentation, Prev: Sorting, Up: Text Counting Columns ================ The column functions convert between a character position (counting characters from the beginning of the buffer) and a column position (counting screen characters from the beginning of a line). A character counts according to the number of columns it occupies on the screen. This means control characters count as occupying 2 or 4 columns, depending upon the value of `ctl-arrow', and tabs count as occupying a number of columns that depends on the value of `tab-width' and on the column where the tab begins. *Note Usual Display::. Column number computations ignore the width of the window and the amount of horizontal scrolling. Consequently, a column value can be arbitrarily high. The first (or leftmost) column is numbered 0. - Function: current-column This function returns the horizontal position of point, measured in columns, counting from 0 at the left margin. The column position is the sum of the widths of all the displayed representations of the characters between the start of the current line and point. For an example of using `current-column', see the description of `count-lines' in *Note Text Lines::. - Function: move-to-column column &optional force This function moves point to COLUMN in the current line. The calculation of COLUMN takes into account the widths of the displayed representations of the characters between the start of the line and point. If column COLUMN is beyond the end of the line, point moves to the end of the line. If COLUMN is negative, point moves to the beginning of the line. If it is impossible to move to column COLUMN because that is in the middle of a multicolumn character such as a tab, point moves to the end of that character. However, if FORCE is non-`nil', and COLUMN is in the middle of a tab, then `move-to-column' converts the tab into spaces so that it can move precisely to column COLUMN. Other multicolumn characters can cause anomalies despite FORCE, since there is no way to split them. The argument FORCE also has an effect if the line isn't long enough to reach column COLUMN; in that case, it says to add whitespace at the end of the line to reach that column. If COLUMN is not an integer, an error is signaled. The return value is the column number actually moved to.  File: lispref.info, Node: Indentation, Next: Case Changes, Prev: Columns, Up: Text Indentation =========== The indentation functions are used to examine, move to, and change whitespace that is at the beginning of a line. Some of the functions can also change whitespace elsewhere on a line. Columns and indentation count from zero at the left margin. * Menu: * Primitive Indent:: Functions used to count and insert indentation. * Mode-Specific Indent:: Customize indentation for different modes. * Region Indent:: Indent all the lines in a region. * Relative Indent:: Indent the current line based on previous lines. * Indent Tabs:: Adjustable, typewriter-like tab stops. * Motion by Indent:: Move to first non-blank character.  File: lispref.info, Node: Primitive Indent, Next: Mode-Specific Indent, Up: Indentation Indentation Primitives ---------------------- This section describes the primitive functions used to count and insert indentation. The functions in the following sections use these primitives. - Function: current-indentation This function returns the indentation of the current line, which is the horizontal position of the first nonblank character. If the contents are entirely blank, then this is the horizontal position of the end of the line. - Command: indent-to column &optional minimum This function indents from point with tabs and spaces until COLUMN is reached. If MINIMUM is specified and non-`nil', then at least that many spaces are inserted even if this requires going beyond COLUMN. Otherwise the function does nothing if point is already beyond COLUMN. The value is the column at which the inserted indentation ends. - User Option: indent-tabs-mode If this variable is non-`nil', indentation functions can insert tabs as well as spaces. Otherwise, they insert only spaces. Setting this variable automatically makes it local to the current buffer.  File: lispref.info, Node: Mode-Specific Indent, Next: Region Indent, Prev: Primitive Indent, Up: Indentation Indentation Controlled by Major Mode ------------------------------------ An important function of each major mode is to customize the key to indent properly for the language being edited. This section describes the mechanism of the key and how to control it. The functions in this section return unpredictable values. - Variable: indent-line-function This variable's value is the function to be used by (and various commands) to indent the current line. The command `indent-according-to-mode' does no more than call this function. In Lisp mode, the value is the symbol `lisp-indent-line'; in C mode, `c-indent-line'; in Fortran mode, `fortran-indent-line'. In Fundamental mode, Text mode, and many other modes with no standard for indentation, the value is `indent-to-left-margin' (which is the default value). - Command: indent-according-to-mode This command calls the function in `indent-line-function' to indent the current line in a way appropriate for the current major mode. - Command: indent-for-tab-command This command calls the function in `indent-line-function' to indent the current line; except that if that function is `indent-to-left-margin', it calls `insert-tab' instead. (That is a trivial command that inserts a tab character.) - Command: newline-and-indent This function inserts a newline, then indents the new line (the one following the newline just inserted) according to the major mode. It does indentation by calling the current `indent-line-function'. In programming language modes, this is the same thing does, but in some text modes, where inserts a tab, `newline-and-indent' indents to the column specified by `left-margin'. - Command: reindent-then-newline-and-indent This command reindents the current line, inserts a newline at point, and then reindents the new line (the one following the newline just inserted). This command does indentation on both lines according to the current major mode, by calling the current value of `indent-line-function'. In programming language modes, this is the same thing does, but in some text modes, where inserts a tab, `reindent-then-newline-and-indent' indents to the column specified by `left-margin'.  File: lispref.info, Node: Region Indent, Next: Relative Indent, Prev: Mode-Specific Indent, Up: Indentation Indenting an Entire Region -------------------------- This section describes commands that indent all the lines in the region. They return unpredictable values. - Command: indent-region start end to-column This command indents each nonblank line starting between START (inclusive) and END (exclusive). If TO-COLUMN is `nil', `indent-region' indents each nonblank line by calling the current mode's indentation function, the value of `indent-line-function'. If TO-COLUMN is non-`nil', it should be an integer specifying the number of columns of indentation; then this function gives each line exactly that much indentation, by either adding or deleting whitespace. If there is a fill prefix, `indent-region' indents each line by making it start with the fill prefix. - Variable: indent-region-function The value of this variable is a function that can be used by `indent-region' as a short cut. You should design the function so that it will produce the same results as indenting the lines of the region one by one, but presumably faster. If the value is `nil', there is no short cut, and `indent-region' actually works line by line. A short-cut function is useful in modes such as C mode and Lisp mode, where the `indent-line-function' must scan from the beginning of the function definition: applying it to each line would be quadratic in time. The short cut can update the scan information as it moves through the lines indenting them; this takes linear time. In a mode where indenting a line individually is fast, there is no need for a short cut. `indent-region' with a non-`nil' argument TO-COLUMN has a different meaning and does not use this variable. - Command: indent-rigidly start end count This command indents all lines starting between START (inclusive) and END (exclusive) sideways by COUNT columns. This "preserves the shape" of the affected region, moving it as a rigid unit. Consequently, this command is useful not only for indenting regions of unindented text, but also for indenting regions of formatted code. For example, if COUNT is 3, this command adds 3 columns of indentation to each of the lines beginning in the region specified. In Mail mode, `C-c C-y' (`mail-yank-original') uses `indent-rigidly' to indent the text copied from the message being replied to. - Function: indent-code-rigidly start end columns &optional nochange-regexp This is like `indent-rigidly', except that it doesn't alter lines that start within strings or comments. In addition, it doesn't alter a line if NOCHANGE-REGEXP matches at the beginning of the line (if NOCHANGE-REGEXP is non-`nil').  File: lispref.info, Node: Relative Indent, Next: Indent Tabs, Prev: Region Indent, Up: Indentation Indentation Relative to Previous Lines -------------------------------------- This section describes two commands that indent the current line based on the contents of previous lines. - Command: indent-relative &optional unindented-ok This command inserts whitespace at point, extending to the same column as the next "indent point" of the previous nonblank line. An indent point is a non-whitespace character following whitespace. The next indent point is the first one at a column greater than the current column of point. For example, if point is underneath and to the left of the first non-blank character of a line of text, it moves to that column by inserting whitespace. If the previous nonblank line has no next indent point (i.e., none at a great enough column position), `indent-relative' either does nothing (if UNINDENTED-OK is non-`nil') or calls `tab-to-tab-stop'. Thus, if point is underneath and to the right of the last column of a short line of text, this command ordinarily moves point to the next tab stop by inserting whitespace. The return value of `indent-relative' is unpredictable. In the following example, point is at the beginning of the second line: This line is indented twelve spaces. -!-The quick brown fox jumped. Evaluation of the expression `(indent-relative nil)' produces the following: This line is indented twelve spaces. -!-The quick brown fox jumped. In this example, point is between the `m' and `p' of `jumped': This line is indented twelve spaces. The quick brown fox jum-!-ped. Evaluation of the expression `(indent-relative nil)' produces the following: This line is indented twelve spaces. The quick brown fox jum -!-ped. - Command: indent-relative-maybe This command indents the current line like the previous nonblank line. It calls `indent-relative' with `t' as the UNINDENTED-OK argument. The return value is unpredictable. If the previous nonblank line has no indent points beyond the current column, this command does nothing.  File: lispref.info, Node: Indent Tabs, Next: Motion by Indent, Prev: Relative Indent, Up: Indentation Adjustable "Tab Stops" ---------------------- This section explains the mechanism for user-specified "tab stops" and the mechanisms that use and set them. The name "tab stops" is used because the feature is similar to that of the tab stops on a typewriter. The feature works by inserting an appropriate number of spaces and tab characters to reach the next tab stop column; it does not affect the display of tab characters in the buffer (*note Usual Display::). Note that the character as input uses this tab stop feature only in a few major modes, such as Text mode. - Command: tab-to-tab-stop This command inserts spaces or tabs up to the next tab stop column defined by `tab-stop-list'. It searches the list for an element greater than the current column number, and uses that element as the column to indent to. It does nothing if no such element is found. - User Option: tab-stop-list This variable is the list of tab stop columns used by `tab-to-tab-stops'. The elements should be integers in increasing order. The tab stop columns need not be evenly spaced. Use `M-x edit-tab-stops' to edit the location of tab stops interactively.  File: lispref.info, Node: Motion by Indent, Prev: Indent Tabs, Up: Indentation Indentation-Based Motion Commands --------------------------------- These commands, primarily for interactive use, act based on the indentation in the text. - Command: back-to-indentation This command moves point to the first non-whitespace character in the current line (which is the line in which point is located). It returns `nil'. - Command: backward-to-indentation arg This command moves point backward ARG lines and then to the first nonblank character on that line. It returns `nil'. - Command: forward-to-indentation arg This command moves point forward ARG lines and then to the first nonblank character on that line. It returns `nil'.  File: lispref.info, Node: Case Changes, Next: Text Properties, Prev: Indentation, Up: Text Case Changes ============ The case change commands described here work on text in the current buffer. *Note Character Case::, for case conversion commands that work on strings and characters. *Note Case Tables::, for how to customize which characters are upper or lower case and how to convert them. - Command: capitalize-region start end This function capitalizes all words in the region defined by START and END. To capitalize means to convert each word's first character to upper case and convert the rest of each word to lower case. The function returns `nil'. If one end of the region is in the middle of a word, the part of the word within the region is treated as an entire word. When `capitalize-region' is called interactively, START and END are point and the mark, with the smallest first. ---------- Buffer: foo ---------- This is the contents of the 5th foo. ---------- Buffer: foo ---------- (capitalize-region 1 44) => nil ---------- Buffer: foo ---------- This Is The Contents Of The 5th Foo. ---------- Buffer: foo ---------- - Command: downcase-region start end This function converts all of the letters in the region defined by START and END to lower case. The function returns `nil'. When `downcase-region' is called interactively, START and END are point and the mark, with the smallest first. - Command: upcase-region start end This function converts all of the letters in the region defined by START and END to upper case. The function returns `nil'. When `upcase-region' is called interactively, START and END are point and the mark, with the smallest first. - Command: capitalize-word count This function capitalizes COUNT words after point, moving point over as it does. To capitalize means to convert each word's first character to upper case and convert the rest of each word to lower case. If COUNT is negative, the function capitalizes the -COUNT previous words but does not move point. The value is `nil'. If point is in the middle of a word, the part of the word before point is ignored when moving forward. The rest is treated as an entire word. When `capitalize-word' is called interactively, COUNT is set to the numeric prefix argument. - Command: downcase-word count This function converts the COUNT words after point to all lower case, moving point over as it does. If COUNT is negative, it converts the -COUNT previous words but does not move point. The value is `nil'. When `downcase-word' is called interactively, COUNT is set to the numeric prefix argument. - Command: upcase-word count This function converts the COUNT words after point to all upper case, moving point over as it does. If COUNT is negative, it converts the -COUNT previous words but does not move point. The value is `nil'. When `upcase-word' is called interactively, COUNT is set to the numeric prefix argument.  File: lispref.info, Node: Text Properties, Next: Substitution, Prev: Case Changes, Up: Text Text Properties =============== Text properties are an alternative interface to extents (*note Extents::), and are built on top of them. They are useful when you want to view textual properties as being attached to the characters themselves rather than to intervals of characters. The text property interface is compatible with FSF Emacs. Each character position in a buffer or a string can have a "text property list", much like the property list of a symbol (*note Property Lists::). The properties belong to a particular character at a particular place, such as, the letter `T' at the beginning of this sentence or the first `o' in `foo'--if the same character occurs in two different places, the two occurrences generally have different properties. Each property has a name and a value. Both of these can be any Lisp object, but the name is normally a symbol. The usual way to access the property list is to specify a name and ask what value corresponds to it. Note that FSF Emacs also looks at the `category' property to find defaults for text properties. We consider this too bogus to implement. Copying text between strings and buffers preserves the properties along with the characters; this includes such diverse functions as `substring', `insert', and `buffer-substring'. * Menu: * Examining Properties:: Looking at the properties of one character. * Changing Properties:: Setting the properties of a range of text. * Property Search:: Searching for where a property changes value. * Special Properties:: Particular properties with special meanings. * Saving Properties:: Saving text properties in files, and reading them back.