@c-*-texinfo-*-@cThisispartoftheGNUEmacsLispReferenceManual.@cCopyright(C)1990,1991,1992,1993,1994FreeSoftwareFoundation,Inc.@cSeethefileelisp.texiforcopyingconditions.@setfilename../info/strings@nodeStringsandCharacters,Lists,Numbers,Top@commentnode-name,next,previous,up@chapterStringsandCharacters@cindexstrings@cindexcharacterarrays@cindexcharacters@cindexbytesAstringinEmacsLispisanarraythatcontainsanorderedsequenceofcharacters.Stringsareusedasnamesofsymbols,buffers,andfiles,tosendmessagestousers,toholdtextbeingcopiedbetweenbuffers,andformanyotherpurposes.Becausestringsaresoimportant,EmacsLisphasmanyfunctionsexpresslyformanipulatingthem.EmacsLispprogramsusestringsmoreoftenthanindividualcharacters.@xref{StringsofEvents},forspecialconsiderationsforstringsofkeyboardcharacterevents.@menu*Basics:StringBasics.Basicpropertiesofstringsandcharacters.*PredicatesforStrings::Testingwhetheranobjectisastringorchar.*CreatingStrings::Functionstoallocatenewstrings.*TextComparison::Comparingcharactersorstrings.*StringConversion::Convertingcharactersorstringsandviceversa.*FormattingStrings::@code{format}:Emacs's analog of @code{printf}.* Character Case:: Case conversion functions.* Case Table:: Customizing case conversion.@end menu@node String Basics@section String and Character Basics Strings in Emacs Lisp are arrays that contain an ordered sequence ofcharacters. Characters are represented in Emacs Lisp as integers;whether an integer was intended as a character or not is determined onlyby how it is used. Thus, strings really contain integers. The length of a string (like any array) is fixed and independent ofthe string contents, and cannot be altered. Strings in Lisp are@emph{not} terminated by a distinguished character code. (By contrast,strings in C are terminated by a character with @sc{ASCII} code 0.)This means that any character, including the null character (@sc{ASCII}code 0), is a valid element of a string.@refill Since strings are considered arrays, you can operate on them with thegeneral array functions. (@xref{Sequences Arrays Vectors}.) Forexample, you can access or change individual characters in a stringusing the functions @code{aref} and @code{aset} (@pxref{ArrayFunctions}). Each character in a string is stored in a single byte. Therefore,numbers not in the range 0 to 255 are truncated when stored into astring. This means that a string takes up much less memory than avector of the same length. Sometimes key sequences are represented as strings. When a string isa key sequence, string elements in the range 128 to 255 represent metacharacters (which are extremely large integers) rather than keyboardevents in the range 128 to 255. Strings cannot hold characters that have the hyper, super or altmodifiers; they can hold @sc{ASCII} control characters, but no othercontrol characters. They do not distinguish case in @sc{ASCII} controlcharacters. @xref{Character Type}, for more information aboutrepresentation of meta and other modifiers for keyboard inputcharacters. Strings are useful for holding regular expressions. You can alsomatch regular expressions against strings (@pxref{Regexp Search}). Thefunctions @code{match-string} (@pxref{Simple Match Data}) and@code{replace-match} (@pxref{Replacing Match}) are useful fordecomposing and modifying strings based on regular expression matching. Like a buffer, a string can contain text properties for the charactersin it, as well as the characters themselves. @xref{Text Properties}.All the Lisp primitives that copy text from strings to buffers or otherstrings also copy the properties of the characters being copied. @xref{Text}, for information about functions that display strings orcopy them into buffers. @xref{Character Type}, and @ref{String Type},for information about the syntax of characters and strings.@node Predicates for Strings@section The Predicates for StringsFor more information about general sequence and array predicates,see @ref{Sequences Arrays Vectors}, and @ref{Arrays}.@defun stringp object This function returns @code{t} if @var{object} is a string, @code{nil}otherwise.@end defun@defun char-or-string-p object This function returns @code{t} if @var{object} is a string or acharacter (i.e., an integer), @code{nil} otherwise.@end defun@node Creating Strings@section Creating Strings The following functions create strings, either from scratch, or byputting strings together, or by taking them apart.@defun make-string count character This function returns a string made up of @var{count} repetitions of@var{character}. If @var{count} is negative, an error is signaled.@example(make-string 5 ?x) @result{} "xxxxx"(make-string 0 ?x) @result{} ""@end example Other functions to compare with this one include @code{char-to-string}(@pxref{String Conversion}), @code{make-vector} (@pxref{Vectors}), and@code{make-list} (@pxref{Building Lists}).@end defun@defun substring string start &optional endThis function returns a new string which consists of those charactersfrom @var{string} in the range from (and including) the character at theindex @var{start} up to (but excluding) the character at the index@var{end}. The first character is at index zero.@example@group(substring "abcdefg" 0 3) @result{} "abc"@end group@end example@noindentHere the index for @samp{a} is 0, the index for @samp{b} is 1, and theindex for @samp{c} is 2. Thus, three letters, @samp{abc}, are copiedfrom the string @code{"abcdefg"}. The index 3 marks the characterposition up to which the substring is copied. The character whose indexis 3 is actually the fourth character in the string.A negative number counts from the end of the string, so that @minus{}1signifies the index of the last character of the string. For example: @example@group(substring "abcdefg" -3 -1) @result{} "ef"@end group@end example@noindentIn this example, the index for @samp{e} is @minus{}3, the index for@samp{f} 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 as an index, it stands for the length of thestring. Thus,@example@group(substring "abcdefg" -3 nil) @result{} "efg"@end group@end exampleOmitting the argument @var{end} is equivalent to specifying @code{nil}.It follows that @code{(substring @var{string} 0)} returns a copy of allof @var{string}.@example@group(substring "abcdefg" 0) @result{} "abcdefg"@end group@end example@noindentBut we recommend @code{copy-sequence} for this purpose (@pxref{SequenceFunctions}).If the characters copied from @var{string} have text properties, theproperties are copied into the new string also. @xref{Text Properties}.A @code{wrong-type-argument} error is signaled if either @var{start} or@var{end} is not an integer or @code{nil}. An @code{args-out-of-range}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{BufferContents}), which returns a string containing a portion of the text inthe current buffer. The beginning of a string is at index 0, but thebeginning of a buffer is at index 1.@end defun@defun concat &rest sequences@cindex copying strings@cindex concatenating stringsThis function returns a new string consisting of the characters in thearguments passed to it (along with their text properties, if any). Thearguments may be strings, lists of numbers, or vectors of numbers; theyare not themselves changed. If @code{concat} receives no arguments, itreturns an empty string.@example(concat "abc" "-def") @result{} "abc-def"(concat "abc" (list 120 (+ 256 121)) [122]) @result{} "abcxyz";; @r{@code{nil} is an empty sequence.}(concat "abc" nil "-def") @result{} "abc-def"(concat "The " "quick brown " "fox.") @result{} "The quick brown fox."(concat) @result{} ""@end example@noindentThe second example above shows how characters stored in strings aretaken modulo 256. In other words, each character in the string isstored in one byte.The @code{concat} function always constructs a new string that isnot @code{eq} to any existing string.When an argument is an integer (not a sequence of integers), it isconverted to a string of digits making up the decimal printedrepresentation of the integer. @strong{Don'tusethisfeature;weplantoeliminateit.Ifyoualreadyusethisfeature,changeyourprogramsnow!}Theproperwaytoconvertanintegertoadecimalnumberinthiswayiswith@code{format}(@pxref{FormattingStrings})or@code{number-to-string}(@pxref{StringConversion}).@example@group(concat137)@result{}"137"(concat54321)@result{}"54321"@endgroup@endexampleForinformationaboutotherconcatenationfunctions,seethedescriptionof@code{mapconcat}in@ref{MappingFunctions},@code{vconcat}in@ref{Vectors},and@code{append}in@ref{BuildingLists}.@enddefun@need2000@nodeTextComparison@sectionComparisonofCharactersandStrings@cindexstringequality@defunchar-equalcharacter1character2Thisfunctionreturns@code{t}iftheargumentsrepresentthesamecharacter,@code{nil}otherwise.Thisfunctionignoresdifferencesincaseif@code{case-fold-search}isnon-@code{nil}.@example(char-equal?x?x)@result{}t(char-to-string(+256?x))@result{}"x"(char-equal?x(+256?x))@result{}t@endexample@enddefun@defunstring=string1string2Thisfunctionreturns@code{t}ifthecharactersofthetwostringsmatchexactly;caseissignificant.@example(string="abc""abc")@result{}t(string="abc""ABC")@result{}nil(string="ab""ABC")@result{}nil@endexampleThefunction@code{string=}ignoresthetextpropertiesofthetwostrings.Tocomparestringsinawaythatcomparestheirtextpropertiesalso,use@code{equal}(@pxref{EqualityPredicates}).@enddefun@defunstring-equalstring1string2@code{string-equal}isanothernamefor@code{string=}.@enddefun@cindexlexicalcomparison@defunstring<string1string2@c(findexstring<causesproblemsforpermutedindex!!)Thisfunctioncomparestwostringsacharacteratatime.Firstitscansboththestringsatoncetofindthefirstpairofcorrespondingcharactersthatdonotmatch.Ifthelessercharacterofthosetwoisthecharacterfrom@var{string1},then@var{string1}isless,andthisfunctionreturns@code{t}.Ifthelessercharacteristheonefrom@var{string2},then@var{string1}isgreater,andthisfunctionreturns@code{nil}.Ifthetwostringsmatchentirely,thevalueis@code{nil}.Pairsofcharactersarecomparedbytheir@sc{ASCII}codes.Keepinmindthatlowercaselettershavehighernumericvaluesinthe@sc{ASCII}charactersetthantheiruppercasecounterparts;numbersandmanypunctuationcharactershavealowernumericvaluethanuppercaseletters.@example@group(string<"abc""abd")@result{}t(string<"abd""abc")@result{}nil(string<"123""abc")@result{}t@endgroup@endexampleWhenthestringshavedifferentlengths,andtheymatchuptothelengthof@var{string1},thentheresultis@code{t}.Iftheymatchuptothelengthof@var{string2},theresultis@code{nil}.Astringofnocharactersislessthananyotherstring.@example@group(string<"""abc")@result{}t(string<"ab""abc")@result{}t(string<"abc""")@result{}nil(string<"abc""ab")@result{}nil(string<"""")@result{}nil@endgroup@endexample@enddefun@defunstring-lesspstring1string2@code{string-lessp}isanothernamefor@code{string<}.@enddefunSeealso@code{compare-buffer-substrings}in@ref{ComparingText},forawaytocomparetextinbuffers.Thefunction@code{string-match},whichmatchesaregularexpressionagainstastring,canbeusedforakindofstringcomparison;see@ref{RegexpSearch}.@nodeStringConversion@commentnode-name,next,previous,up@sectionConversionofCharactersandStrings@cindexconversionofstringsThissectiondescribesfunctionsforconversionsbetweencharacters,stringsandintegers.@code{format}and@code{prin1-to-string}(@pxref{OutputFunctions})canalsoconvertLispobjectsintostrings.@code{read-from-string}(@pxref{InputFunctions})can``convert''astringrepresentationofaLispobjectintoanobject.@xref{Documentation},forfunctionsthatproducetextualdescriptionsoftextcharactersandgeneralinputevents(@code{single-key-description}and@code{text-char-description}).Thesefunctionsareusedprimarilyformakinghelpmessages.@defunchar-to-stringcharacter@cindexcharactertostringThisfunctionreturnsanewstringwithalengthofonecharacter.Thevalueof@var{character},modulo256,isusedtoinitializetheelementofthestring.Thisfunctionissimilarto@code{make-string}withanintegerargumentof1.(@xref{CreatingStrings}.)Thisconversioncanalsobedonewith@code{format}usingthe@samp{%c}formatspecification.(@xref{FormattingStrings}.)@example(char-to-string?x)@result{}"x"(char-to-string(+256?x))@result{}"x"(make-string1?x)@result{}"x"@endexample@enddefun@defunstring-to-charstring@cindexstringtocharacterThisfunctionreturnsthefirstcharacterin@var{string}.Ifthestringisempty,thefunctionreturns0.Thevalueisalso0whenthefirstcharacterof@var{string}isthenullcharacter,@sc{ASCII}code0.@example(string-to-char"ABC")@result{}65(string-to-char"xyz")@result{}120(string-to-char"")@result{}0(string-to-char"\000")@result{}0@endexampleThisfunctionmaybeeliminatedinthefutureifitdoesnotseemusefulenoughtoretain.@enddefun@defunnumber-to-stringnumber@cindexintegertostring@cindexintegertodecimalThisfunctionreturnsastringconsistingoftheprintedrepresentationof@var{number},whichmaybeanintegerorafloatingpointnumber.Thevaluestartswithasigniftheargumentisnegative.@example(number-to-string256)@result{}"256"(number-to-string-23)@result{}"-23"(number-to-string-23.5)@result{}"-23.5"@endexample@cindexint-to-string@code{int-to-string}isasemi-obsoletealiasforthisfunction.Seealsothefunction@code{format}in@ref{FormattingStrings}.@enddefun@defunstring-to-numberstring@cindexstringtonumberThisfunctionreturnsthenumericvalueofthecharactersin@var{string},readinbaseten.Itskipsspacesandtabsatthebeginningof@var{string},thenreadsasmuchof@var{string}asitcaninterpretasanumber.(Onsomesystemsitignoresotherwhitespaceatthebeginning,notjustspacesandtabs.)Ifthefirstcharacteraftertheignoredwhitespaceisnotadigitoraminussign,thisfunctionreturns0.@example(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@endexample@findexstring-to-int@code{string-to-int}isanobsoletealiasforthisfunction.@enddefun@nodeFormattingStrings@commentnode-name,next,previous,up@sectionFormattingStrings@cindexformattingstrings@cindexstrings,formattingthem@dfn{Formatting}meansconstructingastringbysubstitutionofcomputedvaluesatvariousplacesinaconstantstring.Thisstringcontrolshowtheothervaluesareprintedaswellaswheretheyappear;itiscalleda@dfn{formatstring}.Formattingisoftenusefulforcomputingmessagestobedisplayed.Infact,thefunctions@code{message}and@code{error}providethesameformattingfeaturedescribedhere;theydifferfrom@code{format}onlyinhowtheyusetheresultofformatting.@defunformatstring&restobjectsThisfunctionreturnsanewstringthatismadebycopying@var{string}andthenreplacinganyformatspecificationinthecopywithencodingsofthecorresponding@var{objects}.Thearguments@var{objects}arethecomputedvaluestobeformatted.@enddefun@cindex@samp{%}informat@cindexformatspecificationAformatspecificationisasequenceofcharactersbeginningwitha@samp{%}.Thus,ifthereisa@samp{%d}in@var{string},the@code{format}functionreplacesitwiththeprintedrepresentationofoneofthevaluestobeformatted(oneofthearguments@var{objects}).Forexample:@example@group(format"The value of fill-column is %d."fill-column)@result{}"The value of fill-column is 72."@endgroup@endexampleIf@var{string}containsmorethanoneformatspecification,theformatspecificationscorrespondwithsuccessivevaluesfrom@var{objects}.Thus,thefirstformatspecificationin@var{string}usesthefirstsuchvalue,thesecondformatspecificationusesthesecondsuchvalue,andsoon.Anyextraformatspecifications(thoseforwhichtherearenocorrespondingvalues)causeunpredictablebehavior.Anyextravaluestobeformattedareignored.Certainformatspecificationsrequirevaluesofparticulartypes.However,noerrorissignaledifthevalueactuallysuppliedfailstohavetheexpectedtype.Instead,theoutputislikelytobemeaningless.Hereisatableofvalidformatspecifications:@table@samp@item%sReplacethespecificationwiththeprintedrepresentationoftheobject,madewithoutquoting.Thus,stringsarerepresentedbytheircontentsalone,withno@samp{"} characters, and symbols appear without @samp{\}characters.If there is no corresponding object, the empty string is used.@item %SReplace the specification with the printed representation of the object,made with quoting. Thus, strings are enclosed in @samp{"}characters,and@samp{\}charactersappearwherenecessarybeforespecialcharacters.Ifthereisnocorrespondingobject,theemptystringisused.@item%o@cindexintegertooctalReplacethespecificationwiththebase-eightrepresentationofaninteger.@item%dReplacethespecificationwiththebase-tenrepresentationofaninteger.@item%x@cindexintegertohexadecimalReplacethespecificationwiththebase-sixteenrepresentationofaninteger.@item%cReplacethespecificationwiththecharacterwhichisthevaluegiven.@item%eReplacethespecificationwiththeexponentialnotationforafloatingpointnumber.@item%fReplacethespecificationwiththedecimal-pointnotationforafloatingpointnumber.@item%gReplacethespecificationwithnotationforafloatingpointnumber,usingeitherexponentialnotationordecimal-pointnotationwhicheverisshorter.@item%%Asingle@samp{%}isplacedinthestring.Thisformatspecificationisunusualinthatitdoesnotuseavalue.Forexample,@code{(format"%%%d"30)}returns@code{"% 30"}.@endtableAnyotherformatcharacterresultsinan@samp{Invalidformatoperation}error.Hereareseveralexamples:@example@group(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."181818)@result{}"The octal value of 18 is 22, and the hex value is 12."@endgroup@endexample@cindexnumericprefix@cindexfieldwidth@cindexpaddingAllthespecificationcharactersallowanoptionalnumericprefixbetweenthe@samp{%}andthecharacter.Theoptionalnumericprefixdefinestheminimumwidthfortheobject.Iftheprintedrepresentationoftheobjectcontainsfewercharactersthanthis,thenitispadded.Thepaddingisontheleftiftheprefixispositive(orstartswithzero)andontherightiftheprefixisnegative.Thepaddingcharacterisnormallyaspace,butifthenumericprefixstartswithazero,zerosareusedforpadding.@example(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"@endexample@code{format}nevertruncatesanobject's printed representation, nomatter what width you specify. Thus, you can use a numeric prefix tospecify a minimum spacing between columns with no risk of losinginformation. In the following three examples, @samp{%7s} specifies a minimum widthof 7. In the first case, the string inserted in place of @samp{%7s} hasonly 3 letters, so 4 blank spaces are inserted for padding. In thesecond case, the string @code{"specification"} is 13 letters wide but isnot truncated. In the third case, the padding is on the right.@smallexample @group(format "The word `%7s'actuallyhas%dlettersinit." "foo" (length "foo")) @result{} "Theword`foo' actually has 3 letters in it." @end group@group(format "The word `%7s'actuallyhas%dlettersinit." "specification" (length "specification")) @result{} "Theword`specification' actually has 13 letters in it." @end group@group(format "The word `%-7s'actuallyhas%dlettersinit." "foo" (length "foo")) @result{} "Theword`foo' actually has 3 letters in it." @end group@end smallexample@node Character Case@comment node-name, next, previous, up @section Character Case@cindex upper case @cindex lower case @cindex character case The character case functions change the case of single characters orof the contents of strings. The functions convert only alphabeticcharacters (the letters @samp{A} through @samp{Z} and @samp{a} through@samp{z}); other characters are not altered. The functions do notmodify the strings that are passed to them as arguments. The examples below use the characters @samp{X} and @samp{x} which have@sc{ASCII} codes 88 and 120 respectively.@defun downcase string-or-charThis function converts a character or a string to lower case.When the argument to @code{downcase} is a string, the function createsand returns a new string in which each letter in the argument that isupper case is converted to lower case. When the argument to@code{downcase} is a character, @code{downcase} returns thecorresponding lower case character. This value is an integer. If theoriginal character is lower case, or is not a letter, then the valueequals the original character.@example(downcase "The cat in the hat") @result{} "the cat in the hat"(downcase ?X) @result{} 120@end example@end defun@defun upcase string-or-charThis function converts a character or a string to upper case.When the argument to @code{upcase} is a string, the function createsand returns a new string in which each letter in the argument that islower 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 thevalue equals the original character.@example(upcase "The cat in the hat") @result{} "THE CAT IN THE HAT"(upcase ?x) @result{} 88@end example@end defun@defun capitalize string-or-char@cindex capitalizationThis function capitalizes strings or characters. If@var{string-or-char} is a string, the function creates and returns a newstring, whose contents are a copy of @var{string-or-char} in which eachword has been capitalized. This means that the first character of eachword is converted to upper case, and the rest are converted to lowercase.The definition of a word is any sequence of consecutive characters thatare assigned to the word constituent syntax class in the current syntaxtable (@xref{Syntax Class Table}).When the argument to @code{capitalize} is a character, @code{capitalize}has the same result as @code{upcase}.@example(capitalize "The cat in the hat") @result{} "The Cat In The Hat"(capitalize "THE 77TH-HATTED CAT") @result{} "The 77th-Hatted Cat"@group(capitalize ?x) @result{} 88@end group@end example@end defun@node Case Table@section The Case Table You can customize case conversion by installing a special @dfn{casetable}. A case table specifies the mapping between upper case and lowercase letters. It affects both the string and character case conversionfunctions (see the previous section) and those that apply to text in thebuffer (@pxref{Case Changes}). You need a case table if you are using alanguage which has letters other than the standard @sc{ASCII} letters. A case table is a list of this form:@example(@var{downcase} @var{upcase} @var{canonicalize} @var{equivalences})@end example@noindentwhere each element is either @code{nil} or a string of length 256. Theelement @var{downcase} says how to map each character to its lower-caseequivalent. The element @var{upcase} maps each character to itsupper-case equivalent. If lower and upper case characters are inone-to-one correspondence, use @code{nil} for @var{upcase}; then Emacsdeduces the upcase table from @var{downcase}. For some languages, upper and lower case letters are not in one-to-onecorrespondence. There may be two different lower case letters with thesame upper case equivalent. In these cases, you need to specify themaps for both directions. The element @var{canonicalize} maps each character to a canonicalequivalent; any two characters that are related by case-conversion havethe same canonical equivalent character. The element @var{equivalences} is a map that cyclicly permutes eachequivalence class (of characters with the same canonical equivalent).(For ordinary @sc{ASCII}, this would map @samp{a} into @samp{A} and@samp{A} into @samp{a}, and likewise for each set of equivalentcharacters.) When you construct a case table, you can provide @code{nil} for@var{canonicalize}; then Emacs fills in this string from @var{upcase}and @var{downcase}. You can also provide @code{nil} for@var{equivalences}; then Emacs fills in this string from@var{canonicalize}. In a case table that is actually in use, thosecomponents are non-@code{nil}. Do not try to specify @var{equivalences}without also specifying @var{canonicalize}. Each buffer has a case table. Emacs also has a @dfn{standard casetable} which is copied into each buffer when you create the buffer.Changing the standard case table doesn'taffectanyexistingbuffers.Herearethefunctionsforworkingwithcasetables:@defuncase-table-pobjectThispredicatereturnsnon-@code{nil}if@var{object}isavalidcasetable.@enddefun@defunset-standard-case-tabletableThisfunctionmakes@var{table}thestandardcasetable,sothatitwillapplytoanybufferscreatedsubsequently.@enddefun@defunstandard-case-tableThisreturnsthestandardcasetable.@enddefun@defuncurrent-case-tableThisfunctionreturnsthecurrentbuffer's case table.@end defun@defun set-case-table tableThis sets the current buffer'scasetableto@var{table}.@enddefunThefollowingthreefunctionsareconvenientsubroutinesforpackagesthatdefinenon-@sc{ASCII}charactersets.Theymodifyastring@var{downcase-table}providedasanargument;thisshouldbeastringtobeusedasthe@var{downcase}partofacasetable.Theyalsomodifythestandardsyntaxtable.@xref{SyntaxTables}.@defunset-case-syntax-pairuclcdowncase-tableThisfunctionspecifiesapairofcorrespondingletters,oneuppercaseandonelowercase.@enddefun@defunset-case-syntax-delimslrdowncase-tableThisfunctionmakescharacters@var{l}and@var{r}amatchingpairofcase-invariantdelimiters.@enddefun@defunset-case-syntaxcharsyntaxdowncase-tableThisfunctionmakes@var{char}case-invariant,withsyntax@var{syntax}.@enddefun@deffnCommanddescribe-buffer-case-tableThiscommanddisplaysadescriptionofthecontentsofthecurrentbuffer'scasetable.@enddeffn@cindexISOLatin1@pindexiso-syntaxYoucanloadthelibrary@file{iso-syntax}tosetupthestandardsyntaxtableanddefineacasetableforthe8-bitISOLatin1characterset.