検索エンジンから来た人に注意

このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。

しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。

したがって、一般的な Emacs ユーザーにとっては、 このマニュアルと実機の動作とが符合しない場合があります。
特に、公開用の Emacs Lisp コードを書こうとする人は、 新バージョンのマニュアル(英語)を参照することを強くおすすめします。


トップページ&リンク | マニュアルの目次 | 検索
Go to the first, previous, next, last section, table of contents.


文字列と文字

Emacs Lispでの文字列(string)は、順序づけられた文字の並び(ordered sequence of character)を含む配列です。文字列は、シンボル、バッファ、 ファイルなどの名前として、ユーザにメッセージを送るため、バッファ間でコ ピーするテキストを保持するため、その他多くの目的のために用いられます。 文字列は非常に重要であるため、Emacs Lispは、非常に多くの文字列を操作する 関数を持っています。Emacs Lispプログラムでは、一つ一つの文字よりも文字列 の方が多く用いられます。

キーボード文字イベントの文字列のために特別に考慮すべきことについては、 See section 文字列にキーボード・イベントを入れる

文字列・文字の基本的な性質

Emacs Lispでの文字列(string)は、順序づけられた文字の並び(ordered sequence of character)からなる配列です。また、Emacs Lispでは、文字は整数 で表現されますが、整数が文字を意味するかどうかは、それがどのように使わ れるかによってのみ決まります。つまり文字列は実は整数の集まりなのです。

どんな配列でもそうなのですが、文字列の長さも文字列の内容にかかわら ず固定され、変えることはできません。Lispでの文字列は、特定の文字コー ドで終端されていません (これに対して、CではASCII code の0で終端されます)。つまり、null文字(ASCIIコードの0)を含む 任意の文字が、文字列の有効な要素となります。

文字列は配列の一種であるため、一般的な配列用の関数で操作することが可能で す(See section シーケンス、配列、ベクタ)。たとえば、文字列内の個々の文字を、 arefasetを用いて取り出したり変更したりできます (see section 配列に関する関数)。

文字列中のそれぞれの文字は、1バイトのデータとして格納されます。したがっ て、0から255の範囲に入らない数は、文字列に格納されるときには切り捨てられます。 このため、同じ長さのベクタに比べて、文字列は、より少ないメモリで かまいません。

キー・シーケンスは、文字列として表現されるときがあります。このとき、文字 列の128から255までの範囲の要素は、128から255の範囲のキーボード・ イベントではなく、(非常に大きな整数である)メタ文字を表わします。

文字列は、hyper、super、もしくはalt、の修飾子(modifier)を持った文字を保 持することはできません。またASCII制御文字を保持することはできま すが、それ以外の制御文字を保持することはできません。文字列は、 ASCII制御文字の大文字小文字(case)を区別しません。(2)キーボード入力文字のメタ や他の修飾子の表現に関しての詳細は、See section 文字型

文字列は、正規表現を成立させるのにも用いられます。文字列に対して、正規表現 を用いた照合を行うことも可能です(see section 正規表現の検索)。正規表現照合に 基づいた文字列の分解および変更には、関数match-string (see section 単純な一致データのアクセス)およびreplace-match (see section 一致したテキストの置換)が用いられます。

バッファと同様に、文字列は、個々の文字を持つと同時に、文字列内の文字のた めのテキスト属性を持つことができます。See section テキスト属性。文字列か ら、バッファもしくは他の文字列へテキストをコピーする全てのLispプリミティ ブは、コピーされる文字のテキスト属性もいっしょにコピーします。

文字列を表示する関数もしくはバッファにコピーする関数に関しては、 See section テキスト。文字と文字列の構文(syntax)に関しては、 section 文字型およびSee section 文字列型

文字列の述語

一般的なシーケンスと配列の述語に関しての詳細は、section シーケンス、配列、ベクタとsection 配列を参照してください。

Function: stringp object
この関数は、objectが文字列であったらtを返し、そうでな い場合はnilを返します。

Function: char-or-string-p object
この関数は、objectが文字列もしくは文字(すなわち整数)であっ たらtを返し、そうでない場合にはnilを返します。

文字列の生成

以下の関数は、文字列を最初から生成したり、いくつかの文字列を結合して 生成したり、もしくは文字列の一部を取り出したりすることによって生成した りします。

Function: make-string count character
この関数は、count個の文字characterからなる文字列を返しま す。countが負のときはエラーとなります。
(make-string 5 ?x)
     => "xxxxx"
(make-string 0 ?x)
     => ""

この関数と比較されるものとして、char-to-string (see section 文字と文字列間の変換)とmake-vector (see section ベクタ)とmake-list とがあります(see section コンス・セルとリストの生成)。

Function: substring string start &optional end
この関数は、string中のstart番目の文字(この文字を含 む)から、end番目の文字(この文字は含まない)までの文字列を 生成し、返します。ここで最初の文字は0番目の文字とします。
(substring "abcdefg" 0 3)
     => "abc"

ここで、`a'のインデックスは0、`b'のインデックスは1、そして `c'のインデックスは2となります。したがって、文字列 "abcdefg"から3文字の`abc'がコピーされます。ここでイン デックス3は、その文字までの部分文字列をコピーすることを表します。 インデックス3で示される文字は、実際には文字列中の4番目の文字です。

負の数字は、文字列の終りから数えます。-1は文字列の最後の文字を 示します。たとえば、

(substring "abcdefg" -3 -1)
     => "ef"

この例で`e'のインデックスは-3、`f'のインデックスは -2、そして`g'のインデックスは-1となります。した がって`e'`f'は含まれ、`g'は含まれません。

nilがインデックスとして用いられた場合は、文字列の長さを表わします。 したがって、次のようになります。

(substring "abcdefg" -3 nil)
     => "efg"

引数endを省略することは、nilを指定することと等価です。よっ て(substring string 0)stringの全体のコピーを返 します。

(substring "abcdefg" 0)
     => "abcdefg"

しかしこのような用途には、copy-sequenceを用いることを推奨します (see section シーケンス)。

stringからコピーされた文字がテキスト属性を持っている場合は、その属 性も新たな文字列へコピーされます。See section テキスト属性

startもしくはendが整数でもnilでもない場合は、 wrong-type-argumentエラーとなります。startendより後 ろの文字を指している場合、もしくはいずれかの値がstringの範囲外であ る場合は、args-out-of-rangeエラーとなります。

この関数と、カレント・バッファのテキストの一部分の文字列を返す関数 buffer-substring (see section バッファ内容の調査)との違いに注意してくだ さい。文字列の先頭は0とインデックスされるのに対し、バッファの先頭は1 とインデックスされます。

Function: concat &rest sequences

この関数は、渡された引数に含まれる文字からなる新しい文字列を返します(も しテキスト属性を持っている場合は、テキスト属性もコピーされます)。引数は、 文字列、数のリスト、数のベクタのいずれかであり、引数自体は変更されま せん。引数が与えられなかった場合は、concatは空文字列を返し ます。

(concat "abc" "-def")
     => "abc-def"
(concat "abc" (list 120 (+ 256 121)) [122])
     => "abcxyz"
;; nilは空の列です.
(concat "abc" nil "-def")
     => "abc-def"
(concat "The " "quick brown " "fox.")
     => "The quick brown fox."
(concat)
     => ""

この2番目の例は、文字が、256で割った余りとして文字列に格納される様子を示 しています。つまり、文字列中のそれぞれの文字は、1バイトで格納されます。

関数concatは、既存のいかなる文字列ともeqでない新しい 文字列を常に生成します。

ある引数が、(整数の並びではなく)一つの整数である場合は、その整数を10進 数で表現した数字の文字列に変換されます。この機能を使用しないで ください。我々はこれを削除する予定です。すでにこの機能を使っていた ら、今すぐにあなたのプログラムを変更してください ! format (see section 文字列の書式変換)もしくはnumber-to-string (see section 文字と文字列間の変換)を用いるのが、整数を数字の文字列に変換する 正しい方法です。

(concat 137)
     => "137"
(concat 54 321)
     => "54321"

他の連結関数に関しては、section マッピング関数mapconcat、 section ベクタvconcat、さらにsection コンス・セルとリストの生成appendの解説を参照してください。

文字・文字列の比較

Function: char-equal character1 character2
この関数は、引数が同じ文字を表わす場合はtを返し、そうでない場合 nilを返します。case-fold-searchnilでない 場合は、大文字と小文字を区別しません。 (3)
(char-equal ?x ?x)
     => t
(char-to-string (+ 256 ?x))
     => "x"
(char-equal ?x  (+ 256 ?x))
     => t

Function: string= string1 string2
この関数は、二つの文字列の文字が完全に一致した時、tを返します。 大文字と小文字は区別されます。
(string= "abc" "abc")
     => t
(string= "abc" "ABC")
     => nil
(string= "ab" "ABC")
     => nil

関数string=は、二つの文字列のテキスト属性を無視します。テキスト属性も 含めて文字列を比較したい場合は、equalを使用してください (see section 等価述語)。

Function: string-equal string1 string2
string-equalstring=の別の名前です。

Function: string< string1 string2
この関数は、二つの文字列を一文字ずつ比較します。まず、 それぞれの文字列の先頭から順に調べていき、最初に、対応する文字が一致 しない最初の文字の組を見つけようとします。 この一致しない文字の組で、小さい方の文字がstring1のもの であった場合はstring1の方が小さいこととなり、この関数は tを返します。小さい方の文字がstrings2のものであった場合 はstring1の方が大きいこととなり、この関数はnilを返しま す。二つの文字列が完全に一致した場合はnilとなります。

それぞれの文字の組はASCIIコードで比較されます。ASCII文字集 合では、ある文字の小文字はその大文字よりも大きい値をもつことと、数字や 多くの句読点文字は、大文字よりも小さな値をもつことに気をつけてください。

(string< "abc" "abd")
     => t
(string< "abd" "abc")
     => nil
(string< "123" "abc")
     => t

異なる長さの文字列を比較するときに、string1の長さまで一致した場合は tとなります。string2の長さまで一致したときは nilとなります。文字を持たない文字列(長さ0の文字列)は、いか なる文字列よりも小さいものとされます。

(string< "" "abc")
     => t
(string< "ab" "abc")
     => t
(string< "abc" "")
     => nil
(string< "abc" "ab")
     => nil
(string< "" "")
     => nil                   

Function: string-lessp string1 string2
string-lesspstring<の別の名前です。

バッファ中のテキストを比較する方法に関しては、section テキストの比較compare-buffer-substringsを参照してください。正規表現を文字列に対して 照合する関数string-matchは、文字列比較の一手段としても用いることが できます。section 正規表現の検索参照。

文字と文字列間の変換

この節では、文字、文字列、および整数相互の変換を行う関数について説明し ます。formatprin1-to-string (see section 出力関数)は、Lispオブジェクトを文字列に変換します。 read-from-string (see section 入力関数)は、Lispオブジェクトの 文字列表現をLispオブジェクトに "変換" します。

テキスト文字と一般の入力イベントの解説(textual description)を生成する 関数(single-key-descriptionおよびtext-char-description) に関しては、See section ヘルプ。これらの関数はおもにヘルプ・メッセージ の生成に用いられます。

Function: char-to-string character
この関数は、1文字の文字列を新たに生成し、返します。characterの値 を256で割った余りの値が用いられます。

この関数は、整数の引数を一つ取る関数make-stringに似ています (See section 文字列の生成)。この変換は、`%c'書式指定子を用いた formatによって行うこともできます(See section 文字列の書式変換)。 (4)

(char-to-string ?x)
     => "x"
(char-to-string (+ 256 ?x))
     => "x"
(make-string 1 ?x)
     => "x"

Function: string-to-char string
この関数は、stringの最初の文字を返します。文字列が空文字列の場 合は0を返します。またstringがnull文字(ASCIIコードの 0)で始まっている場合も0を返します。
(string-to-char "ABC")
     => 65
(string-to-char "xyz")
     => 120
(string-to-char "")
     => 0
(string-to-char "\000")
     => 0

この関数は、将来、残す必要がないと判断された時点で削除されるかもしれません。

Function: number-to-string number
この関数は、整数もしくは浮動小数点数であるnumberの印字表現 の文字列を返します。引数が負であった場合は、返される文字列は負符号 `-'で始まります。
(number-to-string 256)
     => "256"
(number-to-string -23)
     => "-23"
(number-to-string -23.5)
     => "-23.5"

int-to-stringは、この関数に対するほとんど陳腐化した別名です。 (5)

section 文字列の書式変換formatも参照してください。

Function: string-to-number string
この関数は、string中の文字を基数10の数字として読込み、その数値を 返します。stringの先頭のスペースとタブを読みとばした後、 stringから数字として解釈できるかぎり読込みます(いくつかのシ ステムではスペースとタブ以外の空白文字(whitespace)も読みとばします)。 空白文字を除いた最初の文字が数字もしくは負符号`-'でなかった場合は、 この関数は0を返します。
(string-to-number "256")
     => 256
(string-to-number "25 is a perfect square.")
     => 25
(string-to-number "X256")
     => 0
(string-to-number "-4.5")
     => -4.5

string-to-intは、この関数に対してつけられている陳腐化した別名です。

文字列の書式変換

書式変換(formatting)とは、与えられた文字列のいくつかの部分を、 指示された処理の結果の値で、置き換え、結果の文字列を生成することを意味します。 この文字列は、それ自身以外の引数の値がどこに表示されるかだけでなく、どの ように印字されるかも指定します。この文字列を書式変換文字列 (format string)と呼びます。

書式変換は、メッセージの表示に便利です。事実messageerrorという関数は、ここで説明するものと同じ書式変換機能を持ちま す。書式変換の結果の使い方のみがformatと異なります。

Function: format string &rest objects
この関数は、stringをコピーし、その中の書式指定子(format specification)を、対応するobjectsの演算結果を文字列に変換したも のと置き換えた、新たな文字列を返します。引数objectsは、書式変換 に使われる値です。

書式指定子は、`%'で始まる文字の並びです。`%d'stringの中にある場合、format関数は、それを書式変換すべき 値の一つ(引数objectsの一つ)の印字表現と置き換えます。たとえば、

(format "The value of fill-column is %d." fill-column)
     => "The value of fill-column is 72."

stringが複数の書式指定子を含んでいる場合は、それぞれの書式指定は objectsのそれぞれの値に対応づけられます。たとえば、stringの 中の最初の書式指定子は、最初の値を用い、二つ目の書式指定子は二つ目の値を 用います。余分な書式指定子(対応する値がない書式指定子)があった場合の動作 は不定です。余分な値は無視されます。

いくつかの書式指定子は、特定の型の値と対応づけられなければなりません。 しかし、実際に与えられた値が期待された型ではなかったとしても エラーとはなりません。そのかわり出力が意味のないものとなります。

以下は有効な書式指定子の表です。

`%s'
指定子をquoteしないオブジェクトの印字表現と置き換えます。文字列は、 `"'文字で括られず、特殊文字には`\'文字を付加しません。 対応するオブジェクトがない場合は空文字列となります。
`%S'
指定子をquoteされたオブジェクトの印字表現と置き換えます。文字列は、 `"'文字で括られ、特殊文字の前には`\'文字が付加されます。 対応するオブジェクトがない場合は、空文字列となります。
`%o'
指定子を整数の8進数表現と置き換えます。
`%d'
指定子を整数の10進数表現と置き換えます。
`%x'
指定子を整数の16進数表現と置き換えます。
`%c'
指定子を与えられた値の文字と置き換えます。
`%e'
指定子を浮動小数点数の指数表記と置き換えます。
`%f'
指定子を浮動小数点数の小数点表記と置き換えます。
`%g'
指定子を浮動小数点数の指数表記と小数点表記のうち短いものと置き換えます。
`%%'
1文字の`%'となります。この書式指定は値を必要としない特殊なものです。 たとえば(format "%% %d" 30)"% 30"を返します。

これら以外の変換文字は`Invalid format operation'エラーとなります。

以下にいくつかの例をあげます。

(format "The name of this buffer is %s." (buffer-name))
     => "The name of this buffer is strings.texi."

(format "The buffer object prints as %s." (current-buffer))
     => "The buffer object prints as strings.texi."

(format "The octal value of %d is %o, 
         and the hex value is %x." 18 18 18)
     => "The octal value of 18 is 22, 
         and the hex value is 12."

全ての書式指定子は、`%'と指定子の間に数値前置詞をいれることができ ます。数値前置詞は、オブジェクトの最小の幅を指定します。オブジェクト の印字表現がこれよりも少ない文字の場合は、空白文字もしくは文字0が 付加されます。前置詞の値が正のときは(もしくは0で始まるときは)右に、 負のときは右に付加されます。通常は空白文字が付加されますが、数値前置詞 が0で始まる場合は0が付加されます。

(format "%06d is padded on the left with zeros" 123)
     => "000123 is padded on the left with zeros"

(format "%-6d is padded on the right" 123)
     => "123    is padded on the right"

formatは、幅を指定した場合でもオブジェクトの印字表現を切り詰 めることはありません。したがって数値前置詞によって、情報を失うことなく、 項目間の最小の間隔を指定することができます。

以下の三つの例で、`%7s'は最小幅7を指定します。最初の例では、 `%7s'の位置に入れられる文字列は3文字なので四つの空白文字(blank spaces)が加えられます。2番目の例では、文字列"specification" の幅は13文字ですが切り詰められません。3番目の例では右に空白文字が加え られています。

(format "The word `%7s' actually has %d letters in it."
        "foo" (length "foo"))
     => "The word `    foo' actually has 3 letters in it."  

(format "The word `%7s' actually has %d letters in it."
        "specification" (length "specification")) 
     => "The word `specification' actually has 13 letters in it."  

(format "The word `%-7s' actually has %d letters in it."
        "foo" (length "foo"))
     => "The word `foo    ' actually has 3 letters in it."  

大文字・小文字変換

大文字・小文字変換関数は、単一の文字もしくは文字列の段(case)の変換 を行ないます。これらの関数は、アルファベット文字(`A'から`Z'`a'から`z')のみを変換し、他の文字は変更しません。また引数 として与えられた文字列自身は変更しません。

以下の例では文字`X' (ASCII code 88)と`x' (ASCII code 120)を用います。

Function: downcase string-or-char
この関数は文字もしくは文字列を下段(lower case)に変えます。

引数downcaseが文字列の場合は、引数の文字列中の大文字が小文字に変 換された新たな文字列が返されます。

引数downcaseが文字の場合は、downcaseは対応する小文字を返し ます。この値は整数です。もとの文字が小文字もしくはアルファベット文字では なかった場合、もとの文字が返されます。

(downcase "The cat in the hat")
     => "the cat in the hat"

(downcase ?X)
     => 120

Function: upcase string-or-char
この関数は文字もしくは文字列を上段(upper case)に変えます。

引数upcaseが文字列の場合は、引数の文字列中の小文字が大文字に変換 された新たな文字列が返されます。

引数upcaseが文字の場合は、upcaseは対応する大文字を返 します。この値は整数です。もとの文字が大文字もしくはアルファベット文 字ではなかった場合、もとの文字が返されます。

(upcase "The cat in the hat")
     => "THE CAT IN THE HAT"

(upcase ?x)
     => 88

Function: capitalize string-or-char
この関数は文字列や文字のキャピタル化(capitalize)を行ないます。

引数string-or-charが文字列の場合、引数の string-or-charのそれぞれの単語(word)をキャピタル化した新たな文 字列が返されます。つまり各単語の最初の文字を大文字に変換し、残りの文字 を小文字に変換します。

単語(word)の定義は、現在の構文テーブル(syntax table)で単語を構成す る文字に分類される文字が連続したものです(See section 構文クラスのテーブル)。

capitalizeの引数が文字の場合は、capitalizeは、 upcaseと同じ値を返します。

(capitalize "The cat in the hat")
     => "The Cat In The Hat"

(capitalize "THE 77TH-HATTED CAT")
     => "The 77th-Hatted Cat"

(capitalize ?x)
     => 88

大文字小文字変換のカスタマイズ

特別な段変換テーブル(case table)を設定することで 上段と下段の対応をカスタマイズすることが可能です。この変換テーブルは 大文字と小文字の対応を規定します。文字列と文字の大文字小文字変換関数 (前節参照)とバッファ内のテキストに対する変換関数(see section 大文字/小文字の変換) の両方に効果があります。標準のASCII文字以外の文字を使う言語 を用いているのであれば、この変換テーブルの設定が必要になります。

段変換テーブルは次の形式を取ります。

(downcase upcase canonicalize equivalences)

ここで、それぞれの項は、nilもしくは長さ256の文字列です。項 downcaseは、それぞれの文字をその下段文字に対応させる仕方を示します。 upcaseは、それぞれの文字をその上段字に対応させる仕方を示します。上 下段が1対1に対応する場合、upcasenilとしてください。そうす れば、Emacsがdowncaseから上段を類推します。

いくつかの言語では、上下段は1対1対応しません。一つの大文字 に対して二つの異なる小文字がある場合もあります。このような場合は、双方向の 対応表を指定しなければなりません。

canonicalizeは、それぞれの文字を、標準等価(canonical equivalent)な文字と対応づけます。大文字・小文字変換で関連づけられる2 文字は同じ標準等価な文字を持ちます。

equivalencesは、(同じ標準等価な文字をもつ文字の)それぞれの 等価なクラスを循環させて並べ変えた対応表です(通常のASCIIでは、こ れは`a'`A'に対応づけ、`A'`a'に対応づける、 というようにそれぞれ等価な文字の組を同様に対応づけます)。(6)

canonicalizenilとして段変換テーブルを生成すると、 Emacsがupcasedowncaseからそれを埋めます。 またequivalencesnilとすれば、Emacsは canonicalizeから埋めます。実際に使われている変換テーブルでは、 これらの項はnilではありません。canonicalizeを指定せずに equivalencesを指定しようとしないでください。

それぞれのバッファは、段変換テーブルを一つ持ちます。また、Emacsは、 バッファを生成するときにそれぞれのバッファにコピーされる標準 段変換テーブル(standard case table)を持っています。標準段変換テーブルを 変更しても、すでに存在しているバッファには影響を与えません。

以下に段変換テーブルを操作する関数を示します。

Function: case-table-p object
この述語は、objectが有効な段変換テーブルであるとき non-nilを返します。

Function: set-standard-case-table table
この関数は、tableを標準段変換テーブルにします。この新しいテー ブルは、それ以後生成されるバッファに適用されます。

Function: standard-case-table
この関数は、標準段変換テーブルを返します。

Function: current-case-table
この関数は、現在のバッファの段変換テーブルを返します。

Function: set-case-table table
この関数は、現在のバッファの段変換テーブルをtableとし ます。

以下の三つの関数は、非ASCII文字集合を定義するプログラムで便利な サブルーチンです。引数として文字列downcase-tableを与え、それを変 更します。この文字列は、変換テーブルのdowncase部分に用いられる文字 列となります。これらの関数は、標準構文テーブルも変更します。See section 構文テーブル

Function: set-case-syntax-pair uc lc downcase-table
この関数は、対応する一組の大文字と小文字を指定します。

Function: set-case-syntax-delims l r downcase-table
この関数は、文字lからrまでを、段変換を行なわな い文字とします。

Function: set-case-syntax char syntax downcase-table
この関数は、charを構文syntaxでは段変換を行な わない文字とします。

Command: describe-buffer-case-table
このコマンドは、カレント・バッファの段変換テーブルの設定値を表示 します。

`iso-syntax'ライブラリをロードすることで、8-bit ISO Latin 1文字集合 のための標準構文テーブルの設定と段変換テーブルの定義を行うこ とができます。


Go to the first, previous, next, last section, table of contents.