検索エンジンから来た人に注意このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。 したがって、一般的な Emacs ユーザーにとっては、
このマニュアルと実機の動作とが符合しない場合があります。
|
構文テーブル(syntax table)には、それぞれの文字の構文上の働きが 記述されていま す。この情報は、解析コマンドや、複雑な移動のコマンドを制御したり、語、 シンボル、構文要素 の始まりと終わりを決定するために使用されます。また、現在の構 文テーブルは、この章でふれる関数のほかにも、語移動関数(see section 単語単位での移動)や リスト移動関数(see section 釣り合った式をまたがる移動)の意味の制御も行なっています。
構文テーブルは、256個の要素からなるベクタです。そして、 1バイト(8ビット)で表すことのできる256文字に対して、 一つのエントリを持っています。 おのおのの要素は整数であり、その文字の構文をコード化したものです。
構文テーブルは、Lispリーダのためにではなく、テキストを操作するた めにだけ、利用されます。Lisp式を読むときには、Emacs Lispは、最初から組み込まれた構文規則を使います。また、これらの規則は変更できません。
バッファには、それぞれ主モードがあり、主モードごとに、さ まざまな文字の構文クラスに独自の考え方を持っています。たとえば、 Lispモードでは、`;'という文字は、コメントの始まりとなりますが、 Cモードでは、文の終わりを表します。このような変化に対応するために、 Emacsではバッファごとにローカルの構文テーブルを選択します。特に、主 モードでは、おのおの独自のテーブルをもっていて、そのモードを使うバッフ ァごとにそれらテーブルが利用可能になっています。このテーブルを変更する と、あるモードを次に利用するときの文法ばかりでなく、すべての同じモードのバッファ上 での構文を変更すことになります。しばしば、似ているモードは一つのテーブルを 共有しています。どのように構文テーブルをセットアップするかの例は、 See section 主モードの例。
構文テーブルは、いくつかの文字については標準のテーブルから情報を 継承することができます。また、残りの文字について独自に情報を指定することも できます。この構文クラスの「継承」とは、 「標準の構文テーブルから、その文字の構文を継承する」ことを意味し ています。ほとんどの主モードの構文テーブルは、0から31までと 128から255までの文字コードを引き継いでいます。これは、 128から255の間に追加のアルファベット文字をもつISO Latin-1のような文字集合では 便利です。こういった文字について、標準構文テーブルだけを変更すると全ての主 モードに影響があります。
t
を返します。つまり、そのベクタが構文テーブルであるかもしれない
ということを意味します。しかし、この検査だけでは、なかに何が含まれてい
ても、長さが256のベクタであれば、構文テーブルであると判断されます。
この節では文字の構文を示す構文クラスやフラグについて、そして
それらがどうやって構文記述子(syntax descriptor)として表
されるかについて述べます。構文記述子とは
modify-syntax-entry
に渡して望みの構文を指定するための
Lisp文字列です。
Emacsには、多くの構文クラス(syntax classes)が定義してあります。 構文テーブルは、各文字を一つのクラスに置きます。ある構文テーブルにおける ある文字のクラスと、ほかの構文テーブルにおける同じ文字のクラスとに、 関連がある必要はありません。
各クラスはニモニック文字で指示され、このニモニック文字はクラスを 指定したい場合に、そのクラスの名前となります。通常この指示子は そのクラスでよく使われる文字になっています。とはいうものの、 指示子としての意味は不変で、現在その文字がどんな構文を持っているかとも 無関係です。
構文記述子は、構文クラスや、対応文字(かっこの対応を調べるためだけに使わ れる)、フラグを記述するためのLisp文字列です。最初の文字は、構文クラスの 指示子になります。2番目の文字は対応文字で、使わなければ、ス ペースを置きます。その次には、望みのフラグ用文字がきます。対応文字やフラグが必 要なければ、1文字だけで十分です。
たとえば、Cモードでは、文字`*'の記述子は`. 23'となります (句読点、対応文字なし、コメント開始の2番目の文字、 コメント終了の1番目の文字)。また、`/'のエントリ は、`. 14'です(句読点、対応文字なし、コメントの開始 の1番目の文字、コメント終了の2番目の文字)。
ここでは、構文クラスのテーブルや、それらを表す文字、意味、使い方の例 について述べます。
開き括弧のクラスは`('で、閉じ括弧のそれは、`)'で指示されます。
TextモードやCモードでは、対になる括弧には、`()'、`[]'、 `{}'があります。Emacs Lispでは、リストやベクタの区切り、 (`()' と `[]')が、括弧文字として分類されています。
Emacsの構文解析は、1文字列を1トークンとみなします。文字が 通常もっている構文上の意味は、文字列中では抑止されます。
Lispモードには、2種類の文字列quote文字があります。二重引用符 (`"')と縦棒(`|')です。`|'は、Emacs Lispでは、使われ ませんが、Common Lispでは、使われます。C言語も、2種類の文字列quote文字 があります。文字列のための二重引用符と、文字定数のための単一引用符 (`'')です。
英文テキストは、プログラミング言語でないので、文字列quote文字はありま せん。英文のなかで、引用符が使われることはありますが、引用符中の文字に、 通常の構文上の属性をなくして欲しくはありません。
このクラスの文字は、words-include-escapes
が非nil
の場
合、語の一部としてみなされます。See section 単語単位での移動。
このクラスの文字は、words-include-escapes
が非nil
の場合、
語の一部とみなされます。See section 単語単位での移動。
TeXモードのバックスラシュために、このクラスは使われます。
英文テキストには、コメント文字はありません。Lispでは、セミコロン(`;') でコメントが始まり、改行、改ページで終わります。
構文テーブル中の文字に対するエントリには、 クラスのほかにもフラグを含めることができます。 六つのフラグを利用可能で、それらは、`1'、`2'、`3'、`4'、 `b'、`p'といった文字で表されます。
`p'を除くすべてのフラグは、複数文字からなるコメント区切りを表すため に使われます。数字のフラグは、文字クラスに関連づいた構文上の属性に加えて、 文字がコ メント・シーケンスにもなりうることを示します。フラグは、Cモードの `*'のような文字があるために、クラスからもほかのフラグからも独立です。 Cモードの`*'は、句読点文字であり、かつ、コメント開始シーケンス (`/*')の2番目の文字であり、かつ、コメント終了シーケンス (`*/')の最初の文字です。
文字cのためのフラグは:
backward-prefix-chars
は、基本構文クラスが前置(`'')で
ある文字ばかりでなく、これらの文字も越えて後方に移動します。
See section 移動と構文。
この節では、構文テーブルを作成したり、アクセスしたり、変更するための 関数について述べます。
ほとんどの主モードの構文テーブルはこのようにして作成されます。
nil
だった場合)、現在の構文テーブルのコピー
を返します。tableが、構文テーブルでなかった場合、エラーが通知されます。
この関数は常に、nil
を返します。この文字のテーブル中の古い構文情報は
捨てられます。
構文記述子の最初の文字が、12のクラス指示子の一つでなかった場合、エラーが 通知されます。charが、文字でない場合もまた、エラーが通知されます。
例: ;; スペース文字をクラス空白に入れる。 (modify-syntax-entry ?\ " ") => nil ;; `$'を`^'が対応する ;; 閉じ括弧となる、開き括弧文字とする。 (modify-syntax-entry ?$ "(^") => nil ;; `^'を`$'が対応する ;; 開き括弧となる、閉じ括弧文字とする。 (modify-syntax-entry ?^ ")$") => nil ;; `/'を句読点文字とする。 ;; コメント開始シーケンスの第1文字で、 ;; コメント終了シーケンスの第2文字である。 ;; Cモードで使われる。 (modify-syntax-entry ?/ ". 14") => nil
charが、文字でなければ、エラーが通知されます。
以下の例は、Cモードに当てはまります。最初の例は、スペースの構文クラスが 空白(スペースで表される)であることを示します。2番目の例は、`/'の 構文が句読点であることを示します。これは、コメント開始と終了のシーケ ンスでもあるということは、示していません。3番目の例は、開き括弧は、開き 括弧のクラスに属していることを示しています。対応文字が`)'であ ることは示していません。
(char-to-string (char-syntax ?\ )) => " " (char-to-string (char-syntax ?/)) => "." (char-to-string (char-syntax ?\()) => "("
この節では、ある構文クラスの文字をまたがって移動する関数について述べます。 Emacsのバージョン18以前には、これらの関数は存在しません。
ここに括弧が対で対応する、釣り合った式(S式(sexp)としても知られる)を 解析したりスキャンしたりする関数をいくつか挙げます。 構文テーブルは、文字の解釈を制御します。つまり、これらの関数は、 LispモードのときはLisp式向けに、Cモードのときは、Cの式向けに使用されます。 釣り合った式にまたがって移動する、便利で高機能の関数については、 See section 釣り合った式をまたがる移動。
stateがnil
の場合、startは、関数定義の始まりのような、
括弧をつかった構造の先頭であると仮定されます。一方、構造体の中間で
解析を再開したい場合もあるでしょう。このためには、解析状態の初期値を
記述したstate引数を与えなければなりません。
3番目の引数target-depthが、非nil
の場合、括弧の深さが
target-depthと等しくなると、解析を止めます。深さは、0もしくは、
stateに与えられた数で始まります。
4番目の引数stop-beforeが、非nil
の場合、S式を始める
文字が現れたとき解析が止まります。stop-commentが非nil
の
場合、コメントの開始にきたとき、解析は止まります。
5番目の引数stateは、以下に述べるこの関数の値と同じ形式の八つの
要素からなるリストです。1回の呼出しの戻り値は、parse-partial-sexp
に対する次の呼出し時の解析の状態を初期化するために使うことができます。
結果は、解析の最終的な状態を表す八つの要素からなるリストとなります:
nil
。
nil
。
nil
。より正確には、これは、
文字列を終了させる文字です。
t
。
t
。
t
。
引数state内の要素0、3、4、5、7は重要です。
depthが非ゼロならば、括弧の深さはこの値から数えます。
止まるためのただ一つの候補は、括弧の深さがゼロになる場所です。
scan-lists
は、そういう場所をcount回数えて、止まります。
それゆえ、depthの正の値は、depth段の括弧を抜け出ることを
意味します。
parse-sexp-ignore-comments
が、非nil
の場合、スキャンはコメ
ントを無視します。
スキャンがバッファ(もしくは、そのアクセス可能部分)の先頭、末尾に達した場合で、
深さがゼロではない場合、エラーが通知されます。深さがゼロなのに、
count
を使い切ってない場合、nil
が返ります。
parse-sexp-ignore-comments
が、非nil
ならば、コメントは
無視されます。
スキャンが、括弧のグループの途中で、バッファの(アクセス可能な部分の)
先頭や末尾に達したら、エラーが通知されます。count
を使い切る前に、
先頭や末尾に達したら、nil
が返されます。
nil
であれば、この節の関数やforward-sexp
によって
コメントは、空白として扱われます。
古いEmacsのバージョンでは、コメント終了が`*/'のよう
なものであり、コメントを終らせるときにだけ現れるという場合にかぎり、
使えた機能でした。改行がコメントを終わらせる言語では、全ての改行が
コメントの終わりではないため、この変数をnil
にする必要がありました。
この制限は、もうなくなりました。
一つあるいは、複数のコメントを越えて前方あるいは後方に移動するために、
forward-comment
を利用することができます。
ポイント以後、全てのコメントと空白を越えて前方に移動するには、
(forward-comment (buffer-size))
を使ってください。
引数には(buffer-size)
が使えます。
バッファ内のコメント数がこの値を越えることは、あり得ないからです。
Emacsのほとんどの主モードは、おのおの独自の構文テーブルを備えています。 ここでは、それらをいくつか紹介します。
read
では、影響ありません)。
構文テーブルの各要素は、1文字の構文をコード化した整数です。 内容は、構文クラス、対応文字候補、フラグです。 Lispプログラムは、その要素で直接働くわけではありません。 Lispレベルの構文テーブル関数は、普通は構文記述子 (see section 構文記述子)によって機能します。
構文テーブルの各要素の下位8ビットは、構文クラスを示しています。
次の8ビットは対応する逆括弧(その文字が括弧構文をもつなら)です。 違う場合、意味を持ちません。 その次の6ビットは、フラグです。
Go to the first, previous, next, last section, table of contents.