emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to strings.texi


From: Glenn Morris
Subject: [Emacs-diffs] Changes to strings.texi
Date: Thu, 06 Sep 2007 04:23:17 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Glenn Morris <gm>       07/09/06 04:23:17

Index: strings.texi
===================================================================
RCS file: strings.texi
diff -N strings.texi
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ strings.texi        6 Sep 2007 04:23:17 -0000       1.1
@@ -0,0 +1,1163 @@
address@hidden -*-texinfo-*-
address@hidden This is part of the GNU Emacs Lisp Reference Manual.
address@hidden Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1998, 1999, 
2001,
address@hidden   2002, 2003, 2004, 2005, 2006, 2007  Free Software Foundation, 
Inc.
address@hidden See the file elisp.texi for copying conditions.
address@hidden ../info/strings
address@hidden Strings and Characters, Lists, Numbers, Top
address@hidden  node-name,  next,  previous,  up
address@hidden Strings and Characters
address@hidden strings
address@hidden character arrays
address@hidden characters
address@hidden bytes
+
+  A string in Emacs Lisp is an array that contains an ordered sequence
+of characters.  Strings are used as names of symbols, buffers, and
+files; to send messages to users; to hold text being copied between
+buffers; and for many other purposes.  Because strings are so important,
+Emacs Lisp has many functions expressly for manipulating them.  Emacs
+Lisp programs use strings more often than individual characters.
+
+  @xref{Strings of Events}, for special considerations for strings of
+keyboard character events.
+
address@hidden
+* Basics: String Basics.      Basic properties of strings and characters.
+* Predicates for Strings::    Testing whether an object is a string or char.
+* Creating Strings::          Functions to allocate new strings.
+* Modifying Strings::         Altering the contents of an existing string.
+* Text Comparison::           Comparing characters or strings.
+* String Conversion::         Converting to and from characters and strings.
+* Formatting Strings::        @code{format}: Emacs's analogue of @code{printf}.
+* Case Conversion::           Case conversion functions.
+* Case Tables::                      Customizing case conversion.
address@hidden menu
+
address@hidden String Basics
address@hidden String and Character Basics
+
+  Characters are represented in Emacs Lisp as integers;
+whether an integer is a character or not is determined only by how it is
+used.  Thus, strings really contain integers.
+
+  The length of a string (like any array) is fixed, and cannot be
+altered once the string exists.  Strings in Lisp are @emph{not}
+terminated by a distinguished character code.  (By contrast, strings in
+C are terminated by a character with @acronym{ASCII} code 0.)
+
+  Since strings are arrays, and therefore sequences as well, you can
+operate on them with the general array and sequence functions.
+(@xref{Sequences Arrays Vectors}.)  For example, you can access or
+change individual characters in a string using the functions @code{aref}
+and @code{aset} (@pxref{Array Functions}).
+
+  There are two text representations for address@hidden characters in
+Emacs strings (and in buffers): unibyte and multibyte (@pxref{Text
+Representations}).  An @acronym{ASCII} character always occupies one byte in a
+string; in fact, when a string is all @acronym{ASCII}, there is no real
+difference between the unibyte and multibyte representations.
+For most Lisp programming, you don't need to be concerned with these two
+representations.
+
+  Sometimes key sequences are represented as strings.  When a string is
+a key sequence, string elements in the range 128 to 255 represent meta
+characters (which are large integers) rather than character
+codes in the range 128 to 255.
+
+  Strings cannot hold characters that have the hyper, super or alt
+modifiers; they can hold @acronym{ASCII} control characters, but no other
+control characters.  They do not distinguish case in @acronym{ASCII} control
+characters.  If you want to store such characters in a sequence, such as
+a key sequence, you must use a vector instead of a string.
address@hidden Type}, for more information about the representation of meta
+and other modifiers for keyboard input characters.
+
+  Strings are useful for holding regular expressions.  You can also
+match regular expressions against strings with @code{string-match}
+(@pxref{Regexp Search}).  The functions @code{match-string}
+(@pxref{Simple Match Data}) and @code{replace-match} (@pxref{Replacing
+Match}) are useful for decomposing and modifying strings after
+matching regular expressions against them.
+
+  Like a buffer, a string can contain text properties for the characters
+in it, as well as the characters themselves.  @xref{Text Properties}.
+All the Lisp primitives that copy text from strings to buffers or other
+strings also copy the properties of the characters being copied.
+
+  @xref{Text}, for information about functions that display strings or
+copy them into buffers.  @xref{Character Type}, and @ref{String Type},
+for information about the syntax of characters and strings.
address@hidden Characters}, for functions to convert between text
+representations and to encode and decode character codes.
+
address@hidden Predicates for Strings
address@hidden The Predicates for Strings
+
+For more information about general sequence and array predicates,
+see @ref{Sequences Arrays Vectors}, and @ref{Arrays}.
+
address@hidden stringp object
+This function returns @code{t} if @var{object} is a string, @code{nil}
+otherwise.
address@hidden defun
+
address@hidden string-or-null-p object
+This function returns @code{t} if @var{object} is a string or nil,
address@hidden otherwise.
address@hidden defun
+
address@hidden char-or-string-p object
+This function returns @code{t} if @var{object} is a string or a
+character (i.e., an integer), @code{nil} otherwise.
address@hidden defun
+
address@hidden Creating Strings
address@hidden Creating Strings
+
+  The following functions create strings, either from scratch, or by
+putting strings together, or by taking them apart.
+
address@hidden make-string count character
+This function returns a string made up of @var{count} repetitions of
address@hidden  If @var{count} is negative, an error is signaled.
+
address@hidden
+(make-string 5 ?x)
+     @result{} "xxxxx"
+(make-string 0 ?x)
+     @result{} ""
address@hidden example
+
+  Other functions to compare with this one include @code{char-to-string}
+(@pxref{String Conversion}), @code{make-vector} (@pxref{Vectors}), and
address@hidden (@pxref{Building Lists}).
address@hidden defun
+
address@hidden string &rest characters
+This returns a string containing the characters @var{characters}.
+
address@hidden
+(string ?a ?b ?c)
+     @result{} "abc"
address@hidden example
address@hidden defun
+
address@hidden substring string start &optional end
+This function returns a new string which consists of those characters
+from @var{string} in the range from (and including) the character at the
+index @var{start} up to (but excluding) the character at the index
address@hidden  The first character is at index zero.
+
address@hidden
address@hidden
+(substring "abcdefg" 0 3)
+     @result{} "abc"
address@hidden group
address@hidden example
+
address@hidden
+Here the index for @samp{a} is 0, the index for @samp{b} is 1, and the
+index for @samp{c} is 2.  Thus, three letters, @samp{abc}, are copied
+from the string @code{"abcdefg"}.  The index 3 marks the character
+position up to which the substring is copied.  The character whose index
+is 3 is actually the fourth character in the string.
+
+A negative number counts from the end of the string, so that @minus{}1
+signifies the index of the last character of the string.  For example:
+
address@hidden
address@hidden
+(substring "abcdefg" -3 -1)
+     @result{} "ef"
address@hidden group
address@hidden example
+
address@hidden
+In this example, the index for @samp{e} is @minus{}3, the index for
address@hidden is @minus{}2, and the index for @samp{g} is @minus{}1.
+Therefore, @samp{e} and @samp{f} are included, and @samp{g} is excluded.
+
+When @code{nil} is used for @var{end}, it stands for the length of the
+string.  Thus,
+
address@hidden
address@hidden
+(substring "abcdefg" -3 nil)
+     @result{} "efg"
address@hidden group
address@hidden example
+
+Omitting the argument @var{end} is equivalent to specifying @code{nil}.
+It follows that @code{(substring @var{string} 0)} returns a copy of all
+of @var{string}.
+
address@hidden
address@hidden
+(substring "abcdefg" 0)
+     @result{} "abcdefg"
address@hidden group
address@hidden example
+
address@hidden
+But we recommend @code{copy-sequence} for this purpose (@pxref{Sequence
+Functions}).
+
+If the characters copied from @var{string} have text properties, the
+properties are copied into the new string also.  @xref{Text Properties}.
+
address@hidden also accepts a vector for the first argument.
+For example:
+
address@hidden
+(substring [a b (c) "d"] 1 3)
+     @result{} [b (c)]
address@hidden example
+
+A @code{wrong-type-argument} error is signaled if @var{start} is not
+an integer or if @var{end} is neither an integer nor @code{nil}.  An
address@hidden error is signaled if @var{start} indicates a
+character following @var{end}, or if either integer is out of range
+for @var{string}.
+
+Contrast this function with @code{buffer-substring} (@pxref{Buffer
+Contents}), which returns a string containing a portion of the text in
+the current buffer.  The beginning of a string is at index 0, but the
+beginning of a buffer is at index 1.
address@hidden defun
+
address@hidden substring-no-properties string &optional start end
+This works like @code{substring} but discards all text properties from
+the value.  Also, @var{start} may be omitted or @code{nil}, which is
+equivalent to 0.  Thus, @address@hidden(substring-no-properties
address@hidden)}} returns a copy of @var{string}, with all text
+properties removed.
address@hidden defun
+
address@hidden concat &rest sequences
address@hidden copying strings
address@hidden concatenating strings
+This function returns a new string consisting of the characters in the
+arguments passed to it (along with their text properties, if any).  The
+arguments may be strings, lists of numbers, or vectors of numbers; they
+are not themselves changed.  If @code{concat} receives no arguments, it
+returns an empty string.
+
address@hidden
+(concat "abc" "-def")
+     @result{} "abc-def"
+(concat "abc" (list 120 121) [122])
+     @result{} "abcxyz"
+;; @address@hidden is an empty sequence.}
+(concat "abc" nil "-def")
+     @result{} "abc-def"
+(concat "The " "quick brown " "fox.")
+     @result{} "The quick brown fox."
+(concat)
+     @result{} ""
address@hidden example
+
address@hidden
+The @code{concat} function always constructs a new string that is
+not @code{eq} to any existing string.
+
+In Emacs versions before 21, when an argument was an integer (not a
+sequence of integers), it was converted to a string of digits making up
+the decimal printed representation of the integer.  This obsolete usage
+no longer works.  The proper way to convert an integer to its decimal
+printed form is with @code{format} (@pxref{Formatting Strings}) or
address@hidden (@pxref{String Conversion}).
+
+For information about other concatenation functions, see the
+description of @code{mapconcat} in @ref{Mapping Functions},
address@hidden in @ref{Vector Functions}, and @code{append} in @ref{Building
+Lists}.
address@hidden defun
+
address@hidden split-string string &optional separators omit-nulls
+This function splits @var{string} into substrings at matches for the
+regular expression @var{separators}.  Each match for @var{separators}
+defines a splitting point; the substrings between the splitting points
+are made into a list, which is the value returned by
address@hidden
+
+If @var{omit-nulls} is @code{nil}, the result contains null strings
+whenever there are two consecutive matches for @var{separators}, or a
+match is adjacent to the beginning or end of @var{string}.  If
address@hidden is @code{t}, these null strings are omitted from the
+result.
+
+If @var{separators} is @code{nil} (or omitted),
+the default is the value of @code{split-string-default-separators}.
+
+As a special case, when @var{separators} is @code{nil} (or omitted),
+null strings are always omitted from the result.  Thus:
+
address@hidden
+(split-string "  two words ")
+     @result{} ("two" "words")
address@hidden example
+
+The result is not @code{("" "two" "words" "")}, which would rarely be
+useful.  If you need such a result, use an explicit value for
address@hidden:
+
address@hidden
+(split-string "  two words "
+              split-string-default-separators)
+     @result{} ("" "two" "words" "")
address@hidden example
+
+More examples:
+
address@hidden
+(split-string "Soup is good food" "o")
+     @result{} ("S" "up is g" "" "d f" "" "d")
+(split-string "Soup is good food" "o" t)
+     @result{} ("S" "up is g" "d f" "d")
+(split-string "Soup is good food" "o+")
+     @result{} ("S" "up is g" "d f" "d")
address@hidden example
+
+Empty matches do count, except that @code{split-string} will not look
+for a final empty match when it already reached the end of the string
+using a non-empty match or when @var{string} is empty:
+
address@hidden
+(split-string "aooob" "o*")
+     @result{} ("" "a" "" "b" "")
+(split-string "ooaboo" "o*")
+     @result{} ("" "" "a" "b" "")
+(split-string "" "")
+     @result{} ("")
address@hidden example
+
+However, when @var{separators} can match the empty string,
address@hidden is usually @code{t}, so that the subtleties in the
+three previous examples are rarely relevant:
+
address@hidden
+(split-string "Soup is good food" "o*" t)
+     @result{} ("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d")
+(split-string "Nice doggy!" "" t)
+     @result{} ("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!")
+(split-string "" "" t)
+     @result{} nil
address@hidden example
+
+Somewhat odd, but predictable, behavior can occur for certain
+``non-greedy'' values of @var{separators} that can prefer empty
+matches over non-empty matches.  Again, such values rarely occur in
+practice:
+
address@hidden
+(split-string "ooo" "o*" t)
+     @result{} nil
+(split-string "ooo" "\\|o+" t)
+     @result{} ("o" "o" "o")
address@hidden example
address@hidden defun
+
address@hidden split-string-default-separators
+The default value of @var{separators} for @code{split-string}.  Its
+usual value is @address@hidden"[ \f\t\n\r\v]+"}}.
address@hidden defvar
+
address@hidden Modifying Strings
address@hidden Modifying Strings
+
+  The most basic way to alter the contents of an existing string is with
address@hidden (@pxref{Array Functions}).  @code{(aset @var{string}
address@hidden @var{char})} stores @var{char} into @var{string} at index
address@hidden  Each character occupies one or more bytes, and if @var{char}
+needs a different number of bytes from the character already present at
+that index, @code{aset} signals an error.
+
+  A more powerful function is @code{store-substring}:
+
address@hidden store-substring string idx obj
+This function alters part of the contents of the string @var{string}, by
+storing @var{obj} starting at index @var{idx}.  The argument @var{obj}
+may be either a character or a (smaller) string.
+
+Since it is impossible to change the length of an existing string, it is
+an error if @var{obj} doesn't fit within @var{string}'s actual length,
+or if any new character requires a different number of bytes from the
+character currently present at that point in @var{string}.
address@hidden defun
+
+  To clear out a string that contained a password, use
address@hidden:
+
address@hidden clear-string string
+This makes @var{string} a unibyte string and clears its contents to
+zeros.  It may also change @var{string}'s length.
address@hidden defun
+
address@hidden 2000
address@hidden Text Comparison
address@hidden Comparison of Characters and Strings
address@hidden string equality
+
address@hidden char-equal character1 character2
+This function returns @code{t} if the arguments represent the same
+character, @code{nil} otherwise.  This function ignores differences
+in case if @code{case-fold-search} is address@hidden
+
address@hidden
+(char-equal ?x ?x)
+     @result{} t
+(let ((case-fold-search nil))
+  (char-equal ?x ?X))
+     @result{} nil
address@hidden example
address@hidden defun
+
address@hidden string= string1 string2
+This function returns @code{t} if the characters of the two strings
+match exactly.  Symbols are also allowed as arguments, in which case
+their print names are used.
+Case is always significant, regardless of @code{case-fold-search}.
+
address@hidden
+(string= "abc" "abc")
+     @result{} t
+(string= "abc" "ABC")
+     @result{} nil
+(string= "ab" "ABC")
+     @result{} nil
address@hidden example
+
+The function @code{string=} ignores the text properties of the two
+strings.  When @code{equal} (@pxref{Equality Predicates}) compares two
+strings, it uses @code{string=}.
+
+For technical reasons, a unibyte and a multibyte string are
address@hidden if and only if they contain the same sequence of
+character codes and all these codes are either in the range 0 through
+127 (@acronym{ASCII}) or 160 through 255 (@code{eight-bit-graphic}).
+However, when a unibyte string gets converted to a multibyte string,
+all characters with codes in the range 160 through 255 get converted
+to characters with higher codes, whereas @acronym{ASCII} characters
+remain unchanged.  Thus, a unibyte string and its conversion to
+multibyte are only @code{equal} if the string is all @acronym{ASCII}.
+Character codes 160 through 255 are not entirely proper in multibyte
+text, even though they can occur.  As a consequence, the situation
+where a unibyte and a multibyte string are @code{equal} without both
+being all @acronym{ASCII} is a technical oddity that very few Emacs
+Lisp programmers ever get confronted with.  @xref{Text
+Representations}.
address@hidden defun
+
address@hidden string-equal string1 string2
address@hidden is another name for @code{string=}.
address@hidden defun
+
address@hidden lexical comparison
address@hidden string< string1 string2
address@hidden (findex string< causes problems for permuted index!!)
+This function compares two strings a character at a time.  It
+scans both the strings at the same time to find the first pair of corresponding
+characters that do not match.  If the lesser character of these two is
+the character from @var{string1}, then @var{string1} is less, and this
+function returns @code{t}.  If the lesser character is the one from
address@hidden, then @var{string1} is greater, and this function returns
address@hidden  If the two strings match entirely, the value is @code{nil}.
+
+Pairs of characters are compared according to their character codes.
+Keep in mind that lower case letters have higher numeric values in the
address@hidden character set than their upper case counterparts; digits and
+many punctuation characters have a lower numeric value than upper case
+letters.  An @acronym{ASCII} character is less than any address@hidden
+character; a unibyte address@hidden character is always less than any
+multibyte address@hidden character (@pxref{Text Representations}).
+
address@hidden
address@hidden
+(string< "abc" "abd")
+     @result{} t
+(string< "abd" "abc")
+     @result{} nil
+(string< "123" "abc")
+     @result{} t
address@hidden group
address@hidden example
+
+When the strings have different lengths, and they match up to the
+length of @var{string1}, then the result is @code{t}.  If they match up
+to the length of @var{string2}, the result is @code{nil}.  A string of
+no characters is less than any other string.
+
address@hidden
address@hidden
+(string< "" "abc")
+     @result{} t
+(string< "ab" "abc")
+     @result{} t
+(string< "abc" "")
+     @result{} nil
+(string< "abc" "ab")
+     @result{} nil
+(string< "" "")
+     @result{} nil
address@hidden group
address@hidden example
+
+Symbols are also allowed as arguments, in which case their print names
+are used.
address@hidden defun
+
address@hidden string-lessp string1 string2
address@hidden is another name for @code{string<}.
address@hidden defun
+
address@hidden compare-strings string1 start1 end1 string2 start2 end2 
&optional ignore-case
+This function compares the specified part of @var{string1} with the
+specified part of @var{string2}.  The specified part of @var{string1}
+runs from index @var{start1} up to index @var{end1} (@code{nil} means
+the end of the string).  The specified part of @var{string2} runs from
+index @var{start2} up to index @var{end2} (@code{nil} means the end of
+the string).
+
+The strings are both converted to multibyte for the comparison
+(@pxref{Text Representations}) so that a unibyte string and its
+conversion to multibyte are always regarded as equal.  If
address@hidden is address@hidden, then case is ignored, so that
+upper case letters can be equal to lower case letters.
+
+If the specified portions of the two strings match, the value is
address@hidden  Otherwise, the value is an integer which indicates how many
+leading characters agree, and which string is less.  Its absolute value
+is one plus the number of characters that agree at the beginning of the
+two strings.  The sign is negative if @var{string1} (or its specified
+portion) is less.
address@hidden defun
+
address@hidden assoc-string key alist &optional case-fold
+This function works like @code{assoc}, except that @var{key} must be a
+string or symbol, and comparison is done using @code{compare-strings}.
+Symbols are converted to strings before testing.
+If @var{case-fold} is address@hidden, it ignores case differences.
+Unlike @code{assoc}, this function can also match elements of the alist
+that are strings or symbols rather than conses.  In particular, @var{alist} can
+be a list of strings or symbols rather than an actual alist.
address@hidden Lists}.
address@hidden defun
+
+  See also the @code{compare-buffer-substrings} function in
address@hidden Text}, for a way to compare text in buffers.  The
+function @code{string-match}, which matches a regular expression
+against a string, can be used for a kind of string comparison; see
address@hidden Search}.
+
address@hidden String Conversion
address@hidden  node-name,  next,  previous,  up
address@hidden Conversion of Characters and Strings
address@hidden conversion of strings
+
+  This section describes functions for conversions between characters,
+strings and integers.  @code{format} (@pxref{Formatting Strings})
+and @code{prin1-to-string}
+(@pxref{Output Functions}) can also convert Lisp objects into strings.
address@hidden (@pxref{Input Functions}) can ``convert'' a
+string representation of a Lisp object into an object.  The functions
address@hidden and @code{string-make-unibyte} convert the
+text representation of a string (@pxref{Converting Representations}).
+
+  @xref{Documentation}, for functions that produce textual descriptions
+of text characters and general input events
+(@code{single-key-description} and @code{text-char-description}).  These
+are used primarily for making help messages.
+
address@hidden char-to-string character
address@hidden character to string
+This function returns a new string containing one character,
address@hidden  This function is semi-obsolete because the function
address@hidden is more general.  @xref{Creating Strings}.
address@hidden defun
+
address@hidden string-to-char string
address@hidden string to character
+  This function returns the first character in @var{string}.  If the
+string is empty, the function returns 0.  The value is also 0 when the
+first character of @var{string} is the null character, @acronym{ASCII} code
+0.
+
address@hidden
+(string-to-char "ABC")
+     @result{} 65
+
+(string-to-char "xyz")
+     @result{} 120
+(string-to-char "")
+     @result{} 0
address@hidden
+(string-to-char "\000")
+     @result{} 0
address@hidden group
address@hidden example
+
+This function may be eliminated in the future if it does not seem useful
+enough to retain.
address@hidden defun
+
address@hidden number-to-string number
address@hidden integer to string
address@hidden integer to decimal
+This function returns a string consisting of the printed base-ten
+representation of @var{number}, which may be an integer or a floating
+point number.  The returned value starts with a minus sign if the argument is
+negative.
+
address@hidden
+(number-to-string 256)
+     @result{} "256"
address@hidden
+(number-to-string -23)
+     @result{} "-23"
address@hidden group
+(number-to-string -23.5)
+     @result{} "-23.5"
address@hidden example
+
address@hidden int-to-string
address@hidden is a semi-obsolete alias for this function.
+
+See also the function @code{format} in @ref{Formatting Strings}.
address@hidden defun
+
address@hidden string-to-number string &optional base
address@hidden string to number
+This function returns the numeric value of the characters in
address@hidden  If @var{base} is address@hidden, it must be an integer
+between 2 and 16 (inclusive), and integers are converted in that base.
+If @var{base} is @code{nil}, then base ten is used.  Floating point
+conversion only works in base ten; we have not implemented other
+radices for floating point numbers, because that would be much more
+work and does not seem useful.  If @var{string} looks like an integer
+but its value is too large to fit into a Lisp integer,
address@hidden returns a floating point result.
+
+The parsing skips spaces and tabs at the beginning of @var{string},
+then reads as much of @var{string} as it can interpret as a number in
+the given base.  (On some systems it ignores other whitespace at the
+beginning, not just spaces and tabs.)  If the first character after
+the ignored whitespace is neither a digit in the given base, nor a
+plus or minus sign, nor the leading dot of a floating point number,
+this function returns 0.
+
address@hidden
+(string-to-number "256")
+     @result{} 256
+(string-to-number "25 is a perfect square.")
+     @result{} 25
+(string-to-number "X256")
+     @result{} 0
+(string-to-number "-4.5")
+     @result{} -4.5
+(string-to-number "1e5")
+     @result{} 100000.0
address@hidden example
+
address@hidden string-to-int
address@hidden is an obsolete alias for this function.
address@hidden defun
+
+  Here are some other functions that can convert to or from a string:
+
address@hidden @code
address@hidden concat
address@hidden can convert a vector or a list into a string.
address@hidden Strings}.
+
address@hidden vconcat
address@hidden can convert a string into a vector.  @xref{Vector
+Functions}.
+
address@hidden append
address@hidden can convert a string into a list.  @xref{Building Lists}.
address@hidden table
+
address@hidden Formatting Strings
address@hidden  node-name,  next,  previous,  up
address@hidden Formatting Strings
address@hidden formatting strings
address@hidden strings, formatting them
+
+  @dfn{Formatting} means constructing a string by substitution of
+computed values at various places in a constant string.  This constant string
+controls how the other values are printed, as well as where they appear;
+it is called a @dfn{format string}.
+
+  Formatting is often useful for computing messages to be displayed.  In
+fact, the functions @code{message} and @code{error} provide the same
+formatting feature described here; they differ from @code{format} only
+in how they use the result of formatting.
+
address@hidden format string &rest objects
+This function returns a new string that is made by copying
address@hidden and then replacing any format specification
+in the copy with encodings of the corresponding @var{objects}.  The
+arguments @var{objects} are the computed values to be formatted.
+
+The characters in @var{string}, other than the format specifications,
+are copied directly into the output, including their text properties,
+if any.
address@hidden defun
+
address@hidden @samp{%} in format
address@hidden format specification
+  A format specification is a sequence of characters beginning with a
address@hidden  Thus, if there is a @samp{%d} in @var{string}, the
address@hidden function replaces it with the printed representation of
+one of the values to be formatted (one of the arguments @var{objects}).
+For example:
+
address@hidden
address@hidden
+(format "The value of fill-column is %d." fill-column)
+     @result{} "The value of fill-column is 72."
address@hidden group
address@hidden example
+
+  Since @code{format} interprets @samp{%} characters as format
+specifications, you should @emph{never} pass an arbitrary string as
+the first argument.  This is particularly true when the string is
+generated by some Lisp code.  Unless the string is @emph{known} to
+never include any @samp{%} characters, pass @code{"%s"}, described
+below, as the first argument, and the string as the second, like this:
+
address@hidden
+  (format "%s" @var{arbitrary-string})
address@hidden example
+
+  If @var{string} contains more than one format specification, the
+format specifications correspond to successive values from
address@hidden  Thus, the first format specification in @var{string}
+uses the first such value, the second format specification uses the
+second such value, and so on.  Any extra format specifications (those
+for which there are no corresponding values) cause an error.  Any
+extra values to be formatted are ignored.
+
+  Certain format specifications require values of particular types.  If
+you supply a value that doesn't fit the requirements, an error is
+signaled.
+
+  Here is a table of valid format specifications:
+
address@hidden @samp
address@hidden %s
+Replace the specification with the printed representation of the object,
+made without quoting (that is, using @code{princ}, not
address@hidden@pxref{Output Functions}).  Thus, strings are represented
+by their contents alone, with no @samp{"} characters, and symbols appear
+without @samp{\} characters.
+
+If the object is a string, its text properties are
+copied into the output.  The text properties of the @samp{%s} itself
+are also copied, but those of the object take priority.
+
address@hidden %S
+Replace the specification with the printed representation of the object,
+made with quoting (that is, using @address@hidden
+Functions}).  Thus, strings are enclosed in @samp{"} characters, and
address@hidden characters appear where necessary before special characters.
+
address@hidden %o
address@hidden integer to octal
+Replace the specification with the base-eight representation of an
+integer.
+
address@hidden %d
+Replace the specification with the base-ten representation of an
+integer.
+
address@hidden %x
address@hidden %X
address@hidden integer to hexadecimal
+Replace the specification with the base-sixteen representation of an
+integer.  @samp{%x} uses lower case and @samp{%X} uses upper case.
+
address@hidden %c
+Replace the specification with the character which is the value given.
+
address@hidden %e
+Replace the specification with the exponential notation for a floating
+point number.
+
address@hidden %f
+Replace the specification with the decimal-point notation for a floating
+point number.
+
address@hidden %g
+Replace the specification with notation for a floating point number,
+using either exponential notation or decimal-point notation, whichever
+is shorter.
+
address@hidden %%
+Replace the specification with a single @samp{%}.  This format
+specification is unusual in that it does not use a value.  For example,
address@hidden(format "%% %d" 30)} returns @code{"% 30"}.
address@hidden table
+
+  Any other format character results in an @samp{Invalid format
+operation} error.
+
+  Here are several examples:
+
address@hidden
address@hidden
+(format "The name of this buffer is %s." (buffer-name))
+     @result{} "The name of this buffer is strings.texi."
+
+(format "The buffer object prints as %s." (current-buffer))
+     @result{} "The buffer object prints as strings.texi."
+
+(format "The octal value of %d is %o,
+         and the hex value is %x." 18 18 18)
+     @result{} "The octal value of 18 is 22,
+         and the hex value is 12."
address@hidden group
address@hidden example
+
address@hidden field width
address@hidden padding
+  A specification can have a @dfn{width}, which is a signed decimal
+number between the @samp{%} and the specification character.  If the
+printed representation of the object contains fewer characters than
+this width, @code{format} extends it with padding.  The padding goes
+on the left if the width is positive (or starts with zero) and on the
+right if the width is negative.  The padding character is normally a
+space, but it's @samp{0} if the width starts with a zero.
+
+  Some of these conventions are ignored for specification characters
+for which they do not make sense.  That is, @samp{%s}, @samp{%S} and
address@hidden accept a width starting with 0, but still pad with
address@hidden on the left.  Also, @samp{%%} accepts a width, but
+ignores it.  Here are some examples of padding:
+
address@hidden
+(format "%06d is padded on the left with zeros" 123)
+     @result{} "000123 is padded on the left with zeros"
+
+(format "%-6d is padded on the right" 123)
+     @result{} "123    is padded on the right"
address@hidden example
+
address@hidden
+If the width is too small, @code{format} does not truncate the
+object's printed representation.  Thus, you can use a width to specify
+a minimum spacing between columns with no risk of losing information.
+
+  In the following three examples, @samp{%7s} specifies a minimum
+width of 7.  In the first case, the string inserted in place of
address@hidden has only 3 letters, it needs 4 blank spaces as padding.  In
+the second case, the string @code{"specification"} is 13 letters wide
+but is not truncated.  In the third case, the padding is on the right.
+
address@hidden
address@hidden
+(format "The word `%7s' actually has %d letters in it."
+        "foo" (length "foo"))
+     @result{} "The word `    foo' actually has 3 letters in it."
address@hidden group
+
address@hidden
+(format "The word `%7s' actually has %d letters in it."
+        "specification" (length "specification"))
+     @result{} "The word `specification' actually has 13 letters in it."
address@hidden group
+
address@hidden
+(format "The word `%-7s' actually has %d letters in it."
+        "foo" (length "foo"))
+     @result{} "The word `foo    ' actually has 3 letters in it."
address@hidden group
address@hidden smallexample
+
address@hidden precision in format specifications
+  All the specification characters allow an optional @dfn{precision}
+before the character (after the width, if present).  The precision is
+a decimal-point @samp{.} followed by a digit-string.  For the
+floating-point specifications (@samp{%e}, @samp{%f}, @samp{%g}), the
+precision specifies how many decimal places to show; if zero, the
+decimal-point itself is also omitted.  For @samp{%s} and @samp{%S},
+the precision truncates the string to the given width, so @samp{%.3s}
+shows only the first three characters of the representation for
address@hidden  Precision has no effect for other specification
+characters.
+
address@hidden flags in format specifications
+  Immediately after the @samp{%} and before the optional width and
+precision, you can put certain ``flag'' characters.
+
+  @samp{+} as a flag inserts a plus sign before a positive number, so
+that it always has a sign.  A space character as flag inserts a space
+before a positive number.  (Otherwise, positive numbers start with the
+first digit.)  Either of these two flags ensures that positive numbers
+and negative numbers use the same number of columns.  These flags are
+ignored except for @samp{%d}, @samp{%e}, @samp{%f}, @samp{%g}, and if
+both flags are used, the @samp{+} takes precedence.
+
+  The flag @samp{#} specifies an ``alternate form'' which depends on
+the format in use.  For @samp{%o} it ensures that the result begins
+with a @samp{0}.  For @samp{%x} and @samp{%X}, it prefixes the result
+with @samp{0x} or @samp{0X}.  For @samp{%e}, @samp{%f}, and @samp{%g},
+the @samp{#} flag means include a decimal point even if the precision
+is zero.
+
address@hidden Case Conversion
address@hidden node-name, next, previous, up
address@hidden Case Conversion in Lisp
address@hidden upper case
address@hidden lower case
address@hidden character case
address@hidden case conversion in Lisp
+
+  The character case functions change the case of single characters or
+of the contents of strings.  The functions normally convert only
+alphabetic characters (the letters @samp{A} through @samp{Z} and
address@hidden through @samp{z}, as well as address@hidden letters); other
+characters are not altered.  You can specify a different case
+conversion mapping by specifying a case table (@pxref{Case Tables}).
+
+  These functions do not modify the strings that are passed to them as
+arguments.
+
+  The examples below use the characters @samp{X} and @samp{x} which have
address@hidden codes 88 and 120 respectively.
+
address@hidden downcase string-or-char
+This function converts a character or a string to lower case.
+
+When the argument to @code{downcase} is a string, the function creates
+and returns a new string in which each letter in the argument that is
+upper case is converted to lower case.  When the argument to
address@hidden is a character, @code{downcase} returns the
+corresponding lower case character.  This value is an integer.  If the
+original character is lower case, or is not a letter, then the value
+equals the original character.
+
address@hidden
+(downcase "The cat in the hat")
+     @result{} "the cat in the hat"
+
+(downcase ?X)
+     @result{} 120
address@hidden example
address@hidden defun
+
address@hidden upcase string-or-char
+This function converts a character or a string to upper case.
+
+When the argument to @code{upcase} is a string, the function creates
+and returns a new string in which each letter in the argument that is
+lower case is converted to upper case.
+
+When the argument to @code{upcase} is a character, @code{upcase}
+returns the corresponding upper case character.  This value is an integer.
+If the original character is upper case, or is not a letter, then the
+value returned equals the original character.
+
address@hidden
+(upcase "The cat in the hat")
+     @result{} "THE CAT IN THE HAT"
+
+(upcase ?x)
+     @result{} 88
address@hidden example
address@hidden defun
+
address@hidden capitalize string-or-char
address@hidden capitalization
+This function capitalizes strings or characters.  If
address@hidden is a string, the function creates and returns a new
+string, whose contents are a copy of @var{string-or-char} in which each
+word has been capitalized.  This means that the first character of each
+word is converted to upper case, and the rest are converted to lower
+case.
+
+The definition of a word is any sequence of consecutive characters that
+are assigned to the word constituent syntax class in the current syntax
+table (@pxref{Syntax Class Table}).
+
+When the argument to @code{capitalize} is a character, @code{capitalize}
+has the same result as @code{upcase}.
+
address@hidden
address@hidden
+(capitalize "The cat in the hat")
+     @result{} "The Cat In The Hat"
address@hidden group
+
address@hidden
+(capitalize "THE 77TH-HATTED CAT")
+     @result{} "The 77th-Hatted Cat"
address@hidden group
+
address@hidden
+(capitalize ?x)
+     @result{} 88
address@hidden group
address@hidden example
address@hidden defun
+
address@hidden upcase-initials string-or-char
+If @var{string-or-char} is a string, this function capitalizes the
+initials of the words in @var{string-or-char}, without altering any
+letters other than the initials.  It returns a new string whose
+contents are a copy of @var{string-or-char}, in which each word has
+had its initial letter converted to upper case.
+
+The definition of a word is any sequence of consecutive characters that
+are assigned to the word constituent syntax class in the current syntax
+table (@pxref{Syntax Class Table}).
+
+When the argument to @code{upcase-initials} is a character,
address@hidden has the same result as @code{upcase}.
+
address@hidden
address@hidden
+(upcase-initials "The CAT in the hAt")
+     @result{} "The CAT In The HAt"
address@hidden group
address@hidden example
address@hidden defun
+
+  @xref{Text Comparison}, for functions that compare strings; some of
+them ignore case differences, or can optionally ignore case differences.
+
address@hidden Case Tables
address@hidden The Case Table
+
+  You can customize case conversion by installing a special @dfn{case
+table}.  A case table specifies the mapping between upper case and lower
+case letters.  It affects both the case conversion functions for Lisp
+objects (see the previous section) and those that apply to text in the
+buffer (@pxref{Case Changes}).  Each buffer has a case table; there is
+also a standard case table which is used to initialize the case table
+of new buffers.
+
+  A case table is a char-table (@pxref{Char-Tables}) whose subtype is
address@hidden  This char-table maps each character into the
+corresponding lower case character.  It has three extra slots, which
+hold related tables:
+
address@hidden @var
address@hidden upcase
+The upcase table maps each character into the corresponding upper
+case character.
address@hidden canonicalize
+The canonicalize table maps all of a set of case-related characters
+into a particular member of that set.
address@hidden equivalences
+The equivalences table maps each one of a set of case-related characters
+into the next character in that set.
address@hidden table
+
+  In simple cases, all you need to specify is the mapping to lower-case;
+the three related tables will be calculated automatically from that one.
+
+  For some languages, upper and lower case letters are not in one-to-one
+correspondence.  There may be two different lower case letters with the
+same upper case equivalent.  In these cases, you need to specify the
+maps for both lower case and upper case.
+
+  The extra table @var{canonicalize} maps each character to a canonical
+equivalent; any two characters that are related by case-conversion have
+the same canonical equivalent character.  For example, since @samp{a}
+and @samp{A} are related by case-conversion, they should have the same
+canonical equivalent character (which should be either @samp{a} for both
+of them, or @samp{A} for both of them).
+
+  The extra table @var{equivalences} is a map that cyclically permutes
+each equivalence class (of characters with the same canonical
+equivalent).  (For ordinary @acronym{ASCII}, this would map @samp{a} into
address@hidden and @samp{A} into @samp{a}, and likewise for each set of
+equivalent characters.)
+
+  When you construct a case table, you can provide @code{nil} for
address@hidden; then Emacs fills in this slot from the lower case
+and upper case mappings.  You can also provide @code{nil} for
address@hidden; then Emacs fills in this slot from
address@hidden  In a case table that is actually in use, those
+components are address@hidden  Do not try to specify @var{equivalences}
+without also specifying @var{canonicalize}.
+
+  Here are the functions for working with case tables:
+
address@hidden case-table-p object
+This predicate returns address@hidden if @var{object} is a valid case
+table.
address@hidden defun
+
address@hidden set-standard-case-table table
+This function makes @var{table} the standard case table, so that it will
+be used in any buffers created subsequently.
address@hidden defun
+
address@hidden standard-case-table
+This returns the standard case table.
address@hidden defun
+
address@hidden current-case-table
+This function returns the current buffer's case table.
address@hidden defun
+
address@hidden set-case-table table
+This sets the current buffer's case table to @var{table}.
address@hidden defun
+
address@hidden with-case-table table address@hidden
+The @code{with-case-table} macro saves the current case table, makes
address@hidden the current case table, evaluates the @var{body} forms,
+and finally restores the case table.  The return value is the value of
+the last form in @var{body}.  The case table is restored even in case
+of an abnormal exit via @code{throw} or error (@pxref{Nonlocal
+Exits}).
address@hidden defmac
+
+  Some language environments may modify the case conversions of
address@hidden characters; for example, in the Turkish language
+environment, the @acronym{ASCII} character @samp{I} is downcased into
+a Turkish ``dotless i''.  This can interfere with code that requires
+ordinary ASCII case conversion, such as implementations of
address@hidden network protocols.  In that case, use the
address@hidden macro with the variable @var{ascii-case-table},
+which stores the unmodified case table for the @acronym{ASCII}
+character set.
+
address@hidden ascii-case-table
+The case table for the @acronym{ASCII} character set.  This should not be
+modified by any language environment settings.
address@hidden defvar
+
+  The following three functions are convenient subroutines for packages
+that define address@hidden character sets.  They modify the specified
+case table @var{case-table}; they also modify the standard syntax table.
address@hidden Tables}.  Normally you would use these functions to change
+the standard case table.
+
address@hidden set-case-syntax-pair uc lc case-table
+This function specifies a pair of corresponding letters, one upper case
+and one lower case.
address@hidden defun
+
address@hidden set-case-syntax-delims l r case-table
+This function makes characters @var{l} and @var{r} a matching pair of
+case-invariant delimiters.
address@hidden defun
+
address@hidden set-case-syntax char syntax case-table
+This function makes @var{char} case-invariant, with syntax
address@hidden
address@hidden defun
+
address@hidden Command describe-buffer-case-table
+This command displays a description of the contents of the current
+buffer's case table.
address@hidden deffn
+
address@hidden
+   arch-tag: 700b8e95-7aa5-4b52-9eb3-8f2e1ea152b4
address@hidden ignore




reply via email to

[Prev in Thread] Current Thread [Next in Thread]