GNU Emacs Lisp Reference Manual

For Emacs Version 24.5

Revision 3.1, October 2014

by Bil Lewis, Dan LaLiberte, Richard Stallman,
the GNU Manual Group, et al.

This is the GNU Emacs Lisp Reference Manual corresponding to Emacs version 24.5.

Copyright © 1990–1996, 1998–2015 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being “GNU General Public License,” with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”

(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.”



Published by the Free Software Foundation
51 Franklin St, Fifth Floor
Boston, MA 02110-1301
USA
ISBN 1-882114-74-4



Cover art by Etienne Suvasa.


[ < ] [ > ]   [Contents] [Index] [ ? ]

Emacs Lisp

This is the GNU Emacs Lisp Reference Manual corresponding to Emacs version 24.5.

Copyright © 1990–1996, 1998–2015 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with the Invariant Sections being “GNU General Public License,” with the Front-Cover Texts being “A GNU Manual,” and with the Back-Cover Texts as in (a) below. A copy of the license is included in the section entitled “GNU Free Documentation License.”

(a) The FSF’s Back-Cover Text is: “You have the freedom to copy and modify this GNU manual. Buying copies from the FSF supports it in developing GNU and promoting software freedom.”


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1 Introduction

GNU Emacsテキストエディターのほとんどの部分は、Emacs Lispと呼ばれるプログラミング言語で記述されています。新しいコードをEmacs Lispで記述して、このエディターの拡張としてインストールできます。しかしEmacs Lispは、単なる“拡張言語”を越えた言語であり、それ自体で完全なコンピュータープログラミング言語です。他のプログラミング言語で行なうすべてのことに、この言語を使用できます。

Emacs Lispはエディターの中で使用するようにデザインされているので、テキストのスキャンやパースのための特別な機能をもち、同様にファイル、バッファー、ディスプレー、サブプロセスを処理する機能をもちます。Emacs Lispは編集機能と密に統合されています。したがって編集コマンドはLispプログラムから簡単に呼び出せる関数であり、カスタマイズのためのパラメーターは普通のLisp変数です。

このマニュアルはEmacs Lispの完全な記述を試みます。初心者のためのEmacs Lispのイントロダクションは、Free Software Foundationからも出版されている、Bob ChassellのAn Introduction to Emacs Lisp Programmingを参照してください。このマニュアルは、Emacsを使用した編集に熟知していることを前提としています。これの基本的な情報については、The GNU Emacs Manualを参照してください。

おおまかに言うと、前の方のチャプターでは多くのプログラミング言語に対応するEmacs Lispの機能について説明し、後のチャプターではEmacs Lispに特異な機能や、特に編集に関連した機能を説明します。

これは Emacs 24.5に対応したGNU Emacs Lisp Reference Manualです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.1 Caveats

このマニュアルは幾多のドラフトを経てきました。ほとんど完璧ではありますが、不備がないとも言えません。(ほとんどの特定のモードのように)それらが副次的であるとか、まだ記述されていないという理由により、カバーされていないトピックもあります。わたしたちがそれらを完璧に扱うことはできないので、いくつかの部分は意図的に省略しました。

このマニュアルは、それがカバーしている事柄については完全に正しくあるべきあり、故に、特定の説明テキスト、チャプターやセクションの順番にたいしての批判に開かれているべきです。判りにくかったり、このマニュアルでカバーされていない何かを学ぶためにソースを見たり実験から学ぶ必要があるなら、このマニュアルはおそらくフィクスされるべきなのかもしれません。わたしたちにそれを教えてください。

このマニュアルを使用するときは、間違いを見つけたらすぐに訂正を送ってください。関数または間数グループの単純な現実例を考えたときは、ぜひそれを記述して送ってください。それが妥当ならコメントでノード名と関数名や変数名を参照してください。あなたが訂正を求めるエディションのバージョンも示してください。

M-x report-emacs-bugを使用してコメントや訂正を送ってください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2 Lisp History

Lisp(LISt Processing language: リスト処理言語)は、MIT(Massachusetts Institute of Technology: マサチューセッツ工科大学)で、AI(artificial intelligence: 人工知能)の研究のために、1950年代末に最初に開発されました。Lisp言語の強力なパワーは、編集コマンドの記述のような、他の目的にも適っています。

長年の間に何ダースものLisp実装が構築されてきて、それぞれ特異な点があります。これらの多くは、1960年代にMITのProject MACで記述された、Maclispに影響を受けています。最終的に、Maclisp後裔の実装者は共同して、Common Lispと呼ばれる標準のLispシステムを開発しました。その間に、MITのGerry SussmanとGuy Steeleにより、簡潔だがとても強力なLisp方言である、Schemeが開発されました。

GNU Emacs LispはMaclispから多く、Common Lispから少し影響を受けています。Common Lispを知っている場合、多くの類似点に気がつくでしょう。しかしCommon Lispの多くの機能は、GNU Emacsが要求するメモリー量を削減するために、省略されるか単純化されています。ときには劇的に単純化がされているために、Common Lispユーザーは混乱するかもしれません。わたしたちは時折GNU Emacs LispがCommon Lispと異なるか示すでしょう。Common Lispを知らない場合、それについて心配する必要はありません。このマニュアルは自己完結しています。

cl-libライブラリーを通じて、Common Lispをかなりエミュレートできます。Overview in Common Lisp Extensionsを参照してください。

Emacs LispはSchemeの影響は受けていません。しかしGNUプロジェクトにはGuileと呼ばれるScheme実装があります。拡張が必要な新しいGNUソフトウェアーでは、Guileを使用します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3 Conventions

このセクションでは、このマニュアルで使用する表記規約を説明します。あなたはこのセクションはスキップして、後で参照したいと思うかもしれません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.1 Some Terms

このマニュアルでは、“Lispリーダー”および“Lispプリンター”という用語で、Lispのテキスト表現を実際のLispオブジェクトに変換したり、その逆を行なうLispルーチンを参照します。詳細については、Printed Representation and Read Syntaxを参照してください。あなた、つまりこのマニュアルを読んでいる人のことは“プログラマー”と考えて“あなた”と呼びます。“ユーザー”とは、あなたの記述したものも含めて、Lispプログラムを使用する人を指します。

Lispコードの例は、(list 1 2 3)のようなフォーマットです。 Examples of Lisp code are formatted like this: (list 1 2 3). メタ構文変数(metasyntactic variables)を表す名前や、説明されている関数の引数名前は、first-numberのような形式です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.2 nil and t

Emacs Lispでは、シンボルnilには3つの異なる意味があります。1つ目は‘nil’という名前のシンボル、2つ目は論理値のfalse、3つ目は空リスト — つまり要素が0のリストです。変数として使用した場合、nilは常に値nilをもちます。

Lispリーダーに関する限り、‘()’と‘nil’は同一です。これらは同じオブジェクト、つまりシンボルnilを意味します。このシンボルを異なる方法で記述するのは、完全に人間の読み手を意図したものです。Lispリーダーが‘()’か‘nil’のどちらかを読み取った後は、プログラマーが実際にどちらの表現で記述したかを判断する方法はありません。

このマニュアルでは、空リストを意味することを強調したいときは()と記述し、論理値のfalseを意味することを強調したいときはnilと記述します。この慣習はLispプログラムで使用してもよいでしょう。

(cons 'foo ())                ; 空リストを強調します
(setq foo-flag nil)           ; 論理値のfalseを強調します

論理値が期待されているコンテキストでは、非niltrueと判断されます。しかし論理値のtrueを表す好ましい方法はtです。trueを表す値を選択する必要があり、他に選択の根拠がない場合は、tを使用してください。シンボルtは、常に値tをもちます。

Emacs Lispでは、niltは、常に自分自身を評価する、特別なシンボルです。そのためプログラムでこれらを定数として使用する場合、クォートする必要はありません。これらの値を変更使用と試みると、結果はsetting-constantエラーとなります。Variables that Never Changeを参照してください。

Function: booleanp object

objectが、2つのカノニカルなブーリーン値(tまたはnil)の場合は、非nilをリターンします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.3 Evaluation Notation

評価することができるLisp式のことを、フォーム(form)と呼びます。フォームの評価により、常に結果としてLispオブジェクトが生成されます。このマニュアルの例では、これを‘’で示します:

(car '(1 2))
     ⇒ 1

これは、“(car '(1 2))を評価すると1になる”と読むことができます。

フォームがマクロ呼び出しの場合、それは評価されるための新しいLispのフォームに展開されます。展開された結果は‘’で示します。展開されたフォームを評価した結果を示すこともあれば、示さない場合もあります。

(third '(a b c))
     → (car (cdr (cdr '(a b c))))
     ⇒ c

1つのフォームを説明するために、同じ結果を生成する別のフォームを示すこともあります。完全に等価な2つのフォームは、‘’で示します。

(make-sparse-keymap) ≡ (list 'keymap)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.4 Printing Notation

このマニュアルの例の多くは、それらが評価されるときにテキストをプリントします。(*scratch*バッファーのような)Lisp Interactionバッファーでコード例を実行する場合、プリントされるテキストはそのバッファーに挿入されます。(関数eval-regionで評価するなど)他の方法でコード例を実行する場合、プリントされるテキストはエコーエリアに表示されます。

このマニュアルの例はプリントされるテキストがどこに出力されるかに関わらず、それを‘-|’で示します。フォームを評価することにより戻される値は、‘’とともに後続の行で示します。

(progn (prin1 'foo) (princ "\n") (prin1 'bar))
     -| foo
     -| bar
     ⇒ bar

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.5 Error Messages

エラーをシグナルする例も、いくつかあります。これは通常、エコーエリアにエラーメッセージを表示します。エラーメッセージの行は、‘error→’で始まります。‘error→’自体は、エコーエリアに表示されないことに注意してください。

(+ 23 'x)
error→ Wrong type argument: number-or-marker-p, x

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.6 Buffer Text Notation

バッファー内容の変更を説明する例もあり、それらの例ではテキストの“before(以前)”と“after(以後)”のバージョンを示します。それらの例では、バッファー内容の該当する部分を、ダッシュを用いた2行の破線(バッファー名を含む)で示します。さらに、‘’はポイントの位置を示します(もちろんポイントのシンボルは、バッファーのテキストの一部ではなく、それはポイントが現在配されている2つの文字のの位置を示します)。

---------- Buffer: foo ----------
This is the ∗contents of foo.
---------- Buffer: foo ----------

(insert "changed ")
     ⇒ nil
---------- Buffer: foo ----------
This is the changed ∗contents of foo.
---------- Buffer: foo ----------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.7 Format of Descriptions

このマニュアルでは関数(function)、変数(variable)、コマンド(command)、ユーザーオプション(user option)、スペシャルフォーム(special form)を、統一されたフォーマットで記述します。記述の最初の行には、そのアイテムの名前と、もしあれば引数(argument)が続きます。 そのアイテムの属するカテゴリー(function、variableなど)は、行の先頭に表示します。 それ以降の行は説明行で、例を含む場合もあります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.7.1 A Sample Function Description

関数の記述では、関数の名前が最初に記述されます。同じ行に引数の名前のリストが続きます。引数の値を参照するために、引数の名前は記述の本文にも使用されます。

引数リストの中にキーワード&optionalがある場合、その後の引数が省略可能であることを示します(省略された引数のデフォルトはnilです)。その関数を呼び出すときは、&optionalを記述しないでください。

キーワード&rest(これの後には1つの引数名を続けなければなりません)は、その後に任意の引数を続けることができることを表します。&restの後に記述された引数名の値には、その関数に渡された残りのすべての引数がリストとしてセットされます。この関数を呼び出すときは、&restを記述しないでください。

以下はfooという架空の関数(function)の説明です:

Function: foo integer1 &optional integer2 &rest integers

関数foointeger2からinteger1を減じてから、その結果に残りすべての引数を加えます。integer2が与えられなかった場合、デフォルトして数値19が使用されます。

(foo 1 5 3 9)
     ⇒ 16
(foo 5)
     ⇒ 14

より一般的には、

(foo w x y…)
≡
(+ (- x w) y…)

慣例として引数の名前には、(たとえばintegerinteger1bufferのような)期待されるタイプ名が含めます。(buffersのような)複数形のタイプは、しばしばそのタイプのオブジェクトのリストを意味します。objectのような引き数名は、それが任意のタイプであることを表します(Emacsオブジェクトタイプのリストは、Lisp Data Typesを参照してください)。他の名前をもつ引数(たとえばnew-file)は、関数に固有の引数で、関数がドキュメント文字列をもつ場合、引数のタイプはその中で説明されるべきです(Documentationを参照してください)。

&optional&restにより修飾される引数の、より完全な説明は、Lambda Expressionsを参照してください。

コマンド(command)、マクロ(macro)、スペシャルフォーム(special form)の説明も同じフォーマットをもちますが、‘Function’が‘Command’、‘Macro’、‘Special Form’に置き換えられます。コマンドは単にインタラクティブに呼び出すことができる関数です。マクロは関数とは違う方法(引数は評価されません)で引数を処理しますは、同じ方法で記述されます。

マクロとスペシャルフォームにたいする説明には、特定のオプション引数や繰り替えされる引数のために、より複雑な表記が使用されます。なぜなら引数リストが、より複雑な方法で別の引数に分離されるからです。‘[optional-arg]’はoptional-argがオプションであることを意味し、‘repeated-args’は0個以上の引数を表します。カッコ(parentheses)は、複数の引数をリスト構造の追加レベルにグループ化するのに使用されます。以下は例です:

Special Form: count-loop (var [from to [inc]]) body…

この架空のスペシャルフォームは、 bodyフォームを実行してから変数varをインクリメントするループを実装します。最初の繰り返しでは変数は値fromをもちます。以降の繰り返しでは、変数は1(incが与えられた場合はinc)増加されます。vartoに等しい場合、bodyを実行する前にループをexitします。以下は例です:

(count-loop (i 0 10)
  (prin1 i) (princ " ")
  (prin1 (aref vector i))
  (terpri))

fromtoが省略された場合、ループを実行する前にvarnilがバインドされ、繰り返しの先頭においてvarが非nilの場合は、ループをexitします。以下は例です:

(count-loop (done)
  (if (pending)
      (fixit)
    (setq done t)))

このスペシャルフォームでは、引数fromおよびtoはオプションですが、両方を指定するか、両方を未指定にしなければなりません。これらの引数が与えられた場合、オプションでincも同様に指定することができます。これらの引数は、フォームのすべての残りの要素を含むbodyと区別するために、引数varとともにリストにグループ化されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3.7.2 A Sample Variable Description

変数(variable)とは、オブジェクトにバインド(bind)(またはset)される名前です。変数がバインドされたオブジェクトのことを値(value)と呼びます。このような場合、その変数が値をもつ、という言い方もします。ほとんどすべての変数はユーザーがセットすることができますが、特にユーザーが変更できる特定の変数も存在し、これらはユーザーオプション(user options)と呼ばれます。通常の変数およびユーザーオプションは、関数と同様のフォーマットを使用して説明されますが、それらには引数がありません。

以下は架空の変数electric-future-mapにたいする説明です。

Variable: electric-future-map

この変数の値はElectric Command Futureモードで使用される完全なキーマップです。このマップの関数により、まだ実行していないコマンドの編集が可能になります。

ユーザーオプションも同じフォーマットをもちますが、‘Variable’が‘User Option’に置き換えられます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.4 Version Information

以下の機能は使用しているEmacsに関する情報を提供します。

Command: emacs-version &optional here

この関数は実行しているEmacsのバージョンを説明する文字列をreturnそます。バグレポートにこの文字列を含めるときに役立ちます。

(emacs-version)
  ⇒ "GNU Emacs 23.1 (i686-pc-linux-gnu, GTK+ Version 2.14.4)
             of 2009-06-01 on cyd.mit.edu"

hereが非nilの場合、関数はテキストをバッファーのポイントの前に挿入し、nilをreturnします。この関数がインタラクティブに呼び出された場合は、同じ情報をエコーエリアに出力しますが、プレフィクス引数を与えた場合は、hereが非nilになります。

Variable: emacs-build-time

この変数の値は、Emacsがビルドされた日時を示します。値は、current-timeの値と同様の、4つの整数からなるリストです(Time of Dayを参照してください)。

emacs-build-time
     ⇒ (20614 63694 515336 438000)
Variable: emacs-version

この変数の値は実行中のEmacsのバージョンで、"23.1.1"のような文字列です。この文字列の最後の数字は、実際にはEmacsのリリースバージョン番号の一部ではなく、任意のディレクトリーにおいてEmacsがビルドされる度にインクリメントされます。"22.0.91.1"のように4つの数字から構成される値は、それがリリースではないテストバージョンであることを示します。

Variable: emacs-major-version

Emacsのメジャーバージョン番号を示す整数です。Emacs 23.1では、値は23になります。

Variable: emacs-minor-version

Emacsのマイナーバージョン番号をしめす整数です。Emacs 23.1では、値は1になります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.5 Acknowledgments

このマニュアルは当初、Robert Krawitz、Bil Lewis、Dan LaLiberte、Richard M. Stallman、Chris Welty、GNUマニュアルグループのボランティアーにより、数年を費やして記述されました。Robert J. Chassellはこのマニュアルのレビューと編集をDefense Advanced Research Projects Agency、ARPA Order 6082のサポートのもとに手助けしてくれ、Computational Logic, IncのWarren A. Hunt, Jr.によりアレンジされました。それ以降も、追加のセクションがMiles Bader、Lars Brinkhoff、Chong Yidong、Kenichi Handa、Lute Kamstra、Juri Linkov、Glenn Morris、Thien-Thi Nguyen、Dan Nicolaescu、Martin Rudalics、Kim F. Storm、Luc Teirlinck、Eli Zaretskii、およびその他の人たちにより記述されました。

Drew Adams、Juanma Barranquero、Karl Berry、Jim Blandy、Bard Bloom、Stephane Boucher、David Boyes、Alan Carroll、Richard Davis、Lawrence R. Dodd、Peter Doornbosch、David A. Duff、Chris Eich、Beverly Erlebacher、David Eckelkamp、Ralf Fassel、Eirik Fuller、Stephen Gildea、Bob Glickstein、Eric Hanchrow、Jesper Harder、George Hartzell、Nathan Hess、Masayuki Ida、Dan Jacobson、Jak Kirman、Bob Knighten、Frederick M. Korz、Joe Lammens、Glenn M. Lewis、K. Richard Magill、Brian Marick、Roland McGrath、Stefan Monnier、Skip Montanaro、John Gardiner Myers、Thomas A. Peterson、Francesco Potortì、Friedrich Pukelsheim、Arnold D. Robbins、Raul Rockwell、Jason Rumney、Per Starbäck、Shinichirou Sugou、Kimmo Suominen、Edward Tharp、Bill Trost、Rickard Westman、Jean White、Eduard Wiebe、Matthew Wilding、Carl Witty、Dale Worley、Rusty Wright、David D. Zuhnにより訂正が提供されました。

より完全な貢献者のリストは、Emacsソースリポジトリーの関連する変更ログエントリーを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2 Lisp Data Types

Lispのオブジェクト(object)とは、Lispおプログラムにより操作されるデータです。型(type)データ型(data type)は、可能なオブジェクトの集合を意味します。

すべてのオブジェクトは少なくとも1つの型に属します。同じ型のオブジェクトは、同様な構造をもち、通常は同じコンテキストで使用されます。型は重複でき、オブジェクトは複数の型に属することができます。結果として、あるオブジェクトが特定の型に属するかどうかを尋ねることはできますが、オブジェクトが“その”型だけに属するかどうかは決定できません。

多くはありませんがEmacsにはいくつかの基本オブジェクト型が組み込まれています。これらの型は、他のすべての型を構成するもとであり、基本型(primitive types)と呼ばれます。すべてのオブジェクトはただ1つの基本型に属します。これらの型には、整数(integer)浮動小数点数(float)コンス(cons)シンボル(symbol)文字列(string)ベクター(vector)ハッシュテーブル(hash-table)サブルーチン(subr)バイトコード関数(byte-code function)、およびbufferのような編集に関連した特別な型(Editing Typesを参照してください)が含まれます。

基本型にはそれぞれ、オブジェクトがその型のメンバーかどうかのチェックを行なう、対応するLisp関数があります。

他の多くの言語とは異なり、Lispのオブジェクトは自己記述(self-typing)的です。オブジェクトの基本型は、オブジェクト自体に暗に含まれます。たとえばオブジェクトがベクターの場合、それを数字として扱うことはできません。Lispはベクターが数字でないことを知っているのです。

多くの言語では、プログラマーは各変数にたいしてデータ型を宣言しなければならず、コンパイラーは型を知っていますが、データの中に型はありません。Emacs Lispには、このような型宣言はありません。Lisp変数は任意の型の値をもつことができ、変数に保存した値と型を記憶します(実際には、特定の型の値だけをもつことができる少数のEmacs Lisp変数があります。Variables with Restricted Valuesを参照してください)。

このチャプターでは、GNU Emacs Lispの各標準型の意味、プリント表現(printed representation)、入力構文(read syntax)を説明します。これらのデータ型を使用する方法についての詳細は、以降のチャプターを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 Printed Representation and Read Syntax

オブジェクトのプリント表現(printed representation)とは、オブジェクトにたいしてLispプリンター(関数prin1)が生成する出力のフォーマットです。すべてのデータ型は一意なプリント表現をもちます。オブジェクトの入力構文(read syntax)とは、オブジェクトにたいしてLispリーダー(関数read)が受け取る入力のフォーマットです。これは一意である必要はありません。多くの種類のオブジェクトが複数の構文をもちます。Reading and Printing Lisp Objectsを参照してください。

ほとんどの場合、オブジェクトのプリント表記が、入力構文としても使用されます。しかしLispプログラム内の定数とすることに意味が無いいくつかの型には、入力構文がありません。これらのオブジェクトはハッシュ表記(hash notation)でプリントされ、‘#<’、説明的な文字列(典型的には型名にオブジェクトの名前を続けたもの)、‘>’で構成される文字列です。たとえば:

(current-buffer)
     ⇒ #<buffer objects.texi>

ハッシュ表気は読み取ることができないので、Lispリーダーは‘#<’に遭遇すると、常にエラーinvalid-read-syntaxをシグナルします。

他の言語では、式はテキストであり、これ以外の形式はありません。Lispでは、第一に式はLispオブジェクトであって、オブジェクトの入力構文であるテキストは副次的なものに過ぎません。たいてい、この違いを強調する必要はありませんが、このことを心に留めておかないと、たまに混乱することがあるでしょう。

インタラクティブに式を評価するとき、Lispインタープリターは最初にそれのテキスト表現を読み取り、Lispオブジェクトを生成してから、そのオブジェクトを評価します(Evaluationを参照してください)。しかし評価と読み取りは、別の処理です。読み取りによりテキストにより表現されたLispオブジェクトを読み取り、Lispオブジェクトがreturnされます。後でオブジェクトは評価されるかもしれないし、評価されないかもしれません。オブジェクトを読み取るための基本的な関数readの説明は、Input Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2 Comments

コメント(comment)hqあ、プログラム中に記述されたテキストであり、そのプログラムを読む人間ためだけに存在し、プログラムの意味には何の影響ももちません。Lispでは、それが文字列や文字定数にある場合をのぞき、セミコロン(‘;’)でコメントが開始されます。行の終端までがコメントになります。Lispリーダーはコメントを破棄します。コメントはLispシステム内でプログラムを表すLispオブジェクトの一部にはなりません。

#@count’構成は、次のcount個の文字をスキップします。これはプログラムにより生成されたバイナリーデータを含むコメントにたいして有用です。Emacs Lisp倍とコンパイラーは、出力ファイルにこれを使用します(Byte Compilationを参照してください)。しかしソースファイル用ではありません。

コメントのフォーマットにたいする慣例は、Tips on Writing Commentsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3 Programming Types

Emacs Lispには2種類の一般的な型があります。1つはLispプログラミングに関わるもので、もう1つは編集に関わるものです。前者はさまざまな形で多くのLisp実装に存在します。後者はEmacs Lispに固有です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.1 Integer Type

整数の値の範囲はマシンに依存します、最小のレンジは-536,870,912から536,870,911(30ビットでは -2**29 から 2**29 - 1) ですが、多くのマシンはこれより広い範囲を提供します。Emacs Lispの数学関数は整数のオーバーフローをチェックしません。したがってEmacsのh整数が30ビットの場合、(1+ 536870911)は-536,870,912になります。

整数にたいする入力構文は、(10を基数とする)数字のシーケンスで、オプションで先頭に符号、最後にピリオドがつきます。Lispインタープリターにより生成されるプリント表記には、先頭の ‘+’や、最後の‘.’はありません。

-1               ; 整数の-1.
1                ; 整数の1.
1.               ; これも整数の1.
+1               ; これも整数の1.

特別な例外として、数字シーケンスが有効なオブジェクトとしては大きすぎる、または小さすぎる整数を指定する場合、Lispリーダーはそれを浮動小数点数(Floating-Point Typeを参照してください)として読み取ります。たとえば、Emacsの整数が30ビットの場合、536870912は浮動小数点数の536870912.0として読み取られます。

詳細は、Numbersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.2 Floating-Point Type

浮動小数点数は、コンピューターにおける科学表記に相当するものです。浮動小数点数を10の指数をともなう有理数として考えることができます。正確な有効桁数と可能な指数は、マシン固有です。Emacsは値の保存にCデータ型のdoubleを使用し、内部的には10の指数ではなく、2の指数として記録します。

浮動小数点数のプリント表現には、(後に最低1つの数字をともなう)小数点と、指数のどちらか一方、または両方が必要です。たとえば‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は、いずれも浮動小数点数の1500を記述し、これらはすべて等価です。

詳細は、Numbersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3 Character Type

Emacs Lispでの文字(character)は、整数以外の何者でもありません。他の言い方をすると、文字は文字コードで表現されます。たとえば文字Aは、整数の65として表現されます。

プログラムで文字を個別に使用するのは稀であり、文字のシーケンスとして構成される文字列(strings)として扱われるのがより一般的です。String Typeを参照してください。

文字列やバッファーの中の文字は、現在のところ0から4194303の範囲 — つまり22ビットに制限されています(Character Codesを参照してください)。0から127のコードはASCIIコードで、残りは非ASCIIです(Non-ASCII Charactersを参照してください)。キーボード入力を表す文字は、Control、Meta、Shiftなどの修飾キーをエンコードするために、より広い範囲をもちます。

メッセージのために、文字にたいして人間が読むことができるテキストによる説明を生成する特別な関数が存在します。Describing Characters for Help Messagesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.1 Basic Char Syntax

文字は実際には整数なので、文字のプリント表現は10進数です。文字にたいする入力構文も利用可能ですが、Lispプログラムでこの方法により文字を記述するのは、明解なプログラミングではありません。文字にたいしては、Emacs Lispが提供する、特別な入力構文を常に使用するべきです。これらの構文フォーマットはクエスチョンマークで開始されます。

英数字にたいする通常の入力構文は、クエスチョンマークと、その後にその文字を記述します。したがって文字Aにたいしては‘?A’、文字Bにたいしては‘?B’、文字aにたいしては‘?a’となります。

たとえば:

?Q ⇒ 81     ?q ⇒ 113

句読点文字にも同じ構文を使用できますが、Lispコードを編集するためのEmacsコマンドが混乱しないように、‘\’を追加するのがよい場合がしばしばあります。たとえば開きカッコを記述するために‘?\(’と記述します。その文字が‘\’の場合、それをクォートするために、‘?\\’のように2つ目の‘\’を使用しなければなりません

control-g、backspace、tab、newline、vertical tab、formfeed、space、return、del、escapeはそれぞれ‘?\a’、‘?\b’、‘?\t’、‘?\n’、‘?\v’、‘?\f’、‘?\s’、‘?\r’、‘?\d’、‘?\e’と表すことができます(後にダッシュのついた‘?\s’は違う意味をもちます — これは後続の文字にたいして“super”の修飾を適用します)。したがって、

?\a ⇒ 7                 ; control-g, C-g
?\b ⇒ 8                 ; backspace, BS, C-h
?\t ⇒ 9                 ; tab, TAB, C-i
?\n ⇒ 10                ; newline, C-j
?\v ⇒ 11                ; vertical tab, C-k
?\f ⇒ 12                ; formfeed character, C-l
?\r ⇒ 13                ; carriage return, RET, C-m
?\e ⇒ 27                ; escape character, ESC, C-[
?\s ⇒ 32                ; space character, SPC
?\\ ⇒ 92                ; backslash character, \
?\d ⇒ 127               ; delete character, DEL

バックスラッシュが“エスケープ文字(escape character)”の役割を果たすので、これらのバックスラッシュで始まるシーケンスはエスケープシーケンス(escape sequences)とも呼ばれます。この用語法は、文字ESCとは関係ありません。‘\s’は文字定数としての使用を意図しており、文字定数の内部では、単にスペースを記述します。

エスケープという特別な意味を与えずに、任意の文字の前にバックスラッシュの使用することは許されており、害もありませんしたがって‘?\+’は‘?+’と等価です。ほとんどの文字の前にバックスラッシュを追加することに理由はありません。しかし、Lispコードを編集するEmacsコマンドが混乱するのを避けるために、文字‘()\|;'`"#.,’の前にはバックスラッシュを追加するべきです。space、tab、newline、formfeedのような空白文字の前にもバックスラッシュを追加できます。しかし、tabやspaceのような実際の空白文字のかわりに、‘\t’や‘\s’のような可読性のあるエスケープシーケンスを使用するほうが明解です(スペースを後にともなうバックスラッシュを記述する場合、後続のテキストと区別するために、文字定数の後に余分なスペースを記述するべきです)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.2 General Escape Syntax

特に重要なコントロール文字にたいする特別なエスケープシーケンスに加えて、Emacsは非ASCIIテキスト文字の指定に使用できる、何種類かのエスケープ構文を提供します。

最初に、文字をUnicodeの値で指定することができます。?\unnnnはUnicodeのコードポイント‘U+nnnn’の文字を表します。ここでnnnnは、(慣例により)正確に4桁の16進数です。バックスラッシュは、後続の文字がエスケープシーケンスを形成することを示し、‘u’はUnicodeエスケープシーケンスを指定します。

U+ffffより大きなコードポイントをもつUnicode文字を指定するために、若干異なる構文が存在します。?\U00nnnnnnはコードポイント‘U+nnnnnn’の文字を表します。ここでnnnnnnは6桁の16進数です。Unicode Standardは‘U+10ffff’までのコードポイントだけを定義するので、これより大きいコードポイントを指定すると、Emacsはエラーをシグナルします。

次に、文字を16進の文字コードで指定できます。16進エスケープシーケンスは、バックスラッシュ、‘x’、および16進の文字コードにより構成されます。したがって‘?\x41’は文字A、‘?\x1’は文字C-a?\xe0は grave accentつきの文字‘a’を表します。 任意の数の16進数を使用できるので、この方法により任意の文字コードを表すことができます。

最後に、8進の文字コードにより文字を指定できます。8進エスケープシーケンスは、3桁までの8進数字をともなうバックスラッシュにより形成されます。したがって‘?\101’は文字A、‘?\001’は文字C-a?\002は文字C-bを表します。この方法で指定できるのは、8進コード777までの文字だけです。

これらのエスケープシーケンスは、文字列内でも使用されます。Non-ASCII Characters in Stringsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.3 Control-Character Syntax

他の入力構文を使用してコントロール文字を表すことができます。これは後にバックスラッシュ、カレット、対応する非コントロール文字(大文字か小文字)をともなうクエスチョンマークから構成されます。たとえば‘?\^I’と‘?\^i’はどちらも、値が9である文字C-iにたいする、有効な入力構文です。

^’のかわりに、‘C-’を使用することもできます。したがって‘?\C-i’は、‘?\^I’や‘?\^i’と等価です。

?\^I ⇒ 9     ?\C-I ⇒ 9

文字列やバッファーの中では、ASCIIのコントロール文字だけが許されますが、キーボード入力にたいしては‘C-’により任意の文字をコントロール文字にすることができます。これらの非ASCIIのコントロール文字にたいするコントロール文字には 非コントロール文字にたいするコードと同様に、2**26 ビットが含まれます。通常のテキスト端末には、非ASCIIコントロール文字を生成する方法がありませんが、Xおよび他のウィンドウシステムを使用することにより、簡単に生成することができます。

歴史的な理由により、EmacsはDEL文字を、?のコントロール文字として扱います:

?\^? ⇒ 127     ?\C-? ⇒ 127

結果として、Xでは有意な入力文字であるControl-?文字を、‘\C-’を使用して表現することは今のところできません。さまざまなLispファイルがこの方法によりDELを参照するため、これを変更するのは簡単ではありません。

コントロール文字の表現はファイルや文字列のなかで見ることができますが、わたしたちは‘^’構文を推奨します。キーボード入力にたいするコントロール文字に好ましいのは、‘C-’構文です。どちらを使用するかはプログラムの意味に影響しませんが、プログラムを読む人の理解を助けるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.4 Meta-Character Syntax

メタ文字(meta character)とは、META修飾キーとともにタイプされた文字です。そのような文字を表す整数には 2**27 のビットがセットされています。基本的な文字コードの広い範囲を利用可能にするために、メタや他の修飾にたいして上位ビットを使用します。

文字列では、メタ文字を示すASCII文字に、 2**7 ビットが付加されます。したがって文字列に含めることができるメタ文字のコードは1から255の範囲となり、メタ文字は通常のASCII文字のメタ修飾されたバージョンとなります。文字列内でのMETA処理の詳細については、Putting Keyboard Events in Stringsを参照してください。

メタ文字の入力構文には‘\M-’を使用します。たとえば‘?\M-A’はM-Aを意味します。8進文字コード(以下参照)や、‘\C-’、その他の文字にたいする他の構文とともに‘\M-’を使用できます。したがって、M-Aは‘?\M-A’や‘?\M-\101’と記述できます。同様に、C-M-bは‘?\M-\C-b’、‘?\C-\M-b’、‘?\M-\002’と記述することができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.3.5 Other Character Modifier Bits

グラフィック文字(graphic character)の大文字小文字は、文字コードで示されます。たとえばASCIIでは、文字‘a’と文字‘A’は区別されます。しかしASCIIにはコントロール文字が大文字なのか小文字なのかを表現する方法がありません。コントロール文字がタイプされたときシフトキーが使用されたかを示すために、Emacsは 2**25 のビットを使用します。この区別は、X端末や、他の特別な端末を使用しているときだけ可能です。通常のテキスト端末は、これらの違いを報告しません。シフトをあらわすビットのためのLisp構文は‘\S-’です。したがって‘?\C-\S-o’や‘?\C-\S-O’は、shifted-control-o文字を表します。

Xウィンドウシステムは文字にセットできる、他に3つ修飾ビット — hypersuperaltを定義します。これらのビットにたいする構文は、‘\H-’、‘\s-’、‘\A-’です(これらのプレフィクスでは、大文字小文字は意味があります)。したがって‘?\H-\M-\A-x’はAlt-Hyper-Meta-xを表します(‘-’が後にない‘\s’は、スペース文字を表すことに注意してください)。 数値的には、ビット値2**22はalt、2**23はsuper、2**24はhyperです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.4 Symbol Type

GNU Emacs Lispでのシンボル(symbol)とは、名前をもつオブジェクトです。シンボル名は、そのシンボルのプリント表現としての役割があります。Lispの通常の使用では、1つのobarray(Creating and Interning Symbolsを参照してください)により、シンボル名は一意です — 2つのシンボルが同じ名前をもつことはありません。

シンボルは、変数、関数名としての役割や、プロパティーリストを保持する役割をもつことができます。他のすべてのLispオブジェクトから区別するためだけの役割をもつ場合もあり、データ構造内にそのようなシンボルが存在することは、確実に認識されるでしょう。与えられたコンテキストにおいて、通常はこれらのうちの1つの使用だけが意図されます。しかし3つすべての方法で、1つのシンボルを独立して使用することもできます。

名前がコロン(‘:’)で開始されるシンボルは、キーワードシンボル(keyword symbol)と呼ばれます。これらのシンボルは自動的に定数として振る舞い、通常は未知のシンボルと、いくつかの特定の候補を比較することだけに使用されます。Variables that Never Changeを参照してください。

シンボル名にはどんな文字でも含めることができます。ほとんどのシンボル名は英字、数字、‘-+=*/’などの句読点文字で記述されます。このような名前には、特別な句読点文字は必要ありません。名前が数字のように見えない限りは、名前にはどのような文字も使用できます(名前が数字のように見える場合は、名前の先頭に‘\’を記述して、強制的にシンボルとして解釈させます)。文字‘_~!@$%^&:<>{}?’はあまり使用されませんが、これらも特別な句読点文字を必要としません。他の文字も、バックスラッシュでエスケープすることにより、シンボル名に含めることができます。しかし、文字列内でのバックスラッシュの使用とは対照的に、シンボル名でのバックスラッシュは、バックスラッシュの後の1文字をエスケープするだけです。たとえば文字列内では、‘\t’はタブ文字を表します。しかしシンボル名の中では、‘\t’は英字‘t’をクォートするに過ぎません。 名前にタブ文字をもつシンボルを記述するには、(バックスラッシュを前置した)実際のタブを使用しなければなりません。しかし、そのようなことを行なうことは、めったにありません。

Common Lispに関する注意:Common Lispでは、明示的にエスケープされない限り、小文字は常に大文字に“フォールドされ(folded)”ます。Emacs Lispでは大文字と小文字は区別されます。

以下はシンボル名の例です。4番目の例の中の‘+’は、シンボルが数字として読み取られるのを防ぐために、エスケープされていることに注意してください。6番目の例では、名前の残りの部分により数字としては不正なので、エスケープの必要はありません。

foo                 ; foo’という名前のシンボル。
FOO                 ; foo’とは別の、‘FOO’という名前のシンボル。
1+                  ; 1+’という名前のシンボル
                    ;   (整数の‘+1’ではありません)。
\+1                 ; +1’という名前のシンボル
                    ;   (とても読みやすい名前とはいえません)。
\(*\ 1\ 2\)         ; (* 1 2)’という名前のシンボル(悪い名前)。
+-*/_~!@$%^&=:<>{}  ; +-*/_~!@$%^&=:<>{}’という名前のシンボル。
                    ;   これらの文字はエスケープする必要はありません。

シンボル名がプリント表現としての役割をもつというルールの例外として、‘##’があります。これは、名前が空文字列の、internされたシンボルのプリント表現です。さらに‘#:foo’は、internされていないfooという名前のシンボルにたいするプリント表現です(通常、Lispリーダーはすべてのシンボルをinternします。Creating and Interning Symbolsを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.5 Sequence Types

シーケンス(sequence)とは、要素の順序セットを表現する、Lispオブジェクトです。Emacs Lispには、2種類のシーケンス — リスト(lists)配列(arrays)があります。

リストはもっとも一般的に使用されるシーケンスです。リストは任意の型の要素を保持でき、要素の追加・削除により簡単に長さを変更できます。リストについては、次のサブセクションを参照してください。

配列は固定長のシーケンスです。配列はさらに文字列(strings)、ベクター(vectors)、文字テーブル(char-tables)、ブールベクター(bool-vectors)に細分されます。ベクターは任意の型の要素を保持できますが、文字列の要素は文字でなければならず、ブールベクターの要素はtnilでなければなりません。文字テーブルはベクターと似ていますが、有効な文字によりインデックスづけされる点が異なります。文字列内の文字は、バッファー内の文字のようにテキストプロパティーをもつことができます(Text Propertiesを参照してください)。しかしベクターは、その要素が文字のときでも、テキストプロパティーをサポートしません。

リスト、文字列、およびその他の配列型も、重要な類似点を共有します。たとえば、それらはすべて長さlをもち、要素は0からl-1でインデックスづけされます。いくつかの関数はシーケンス関数と呼ばれ、これらは任意の種類のシーケンスを許容します。たとえば、関数lengthは、任意の種類のシーケンスの長さを報告します。Sequences, Arrays, and Vectorsを参照してください。

シーケンスは読み取りにより常に新たに作成されるので、同じシーケンスを2回読み取るのは、一般的に不可能です。シーケンスにたいする入力構文を2回読み取った場合、内容が等しい2つのシーケンスを得ます。これには1つ例外があります。空リスト()は、常に同じオブジェクトnilを表します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6 Cons Cell and List Types

コンスセル(cons cell)は、CARスロット、CDRスロットと呼ばれる2つのスロットから構成されるオブジェクトです。各スロットは、任意のLispオブジェクトを保持できます。そのときCARスロットに保持されるオブジェクトが何であれ、わたしたちは“このコンスセルのCAR”のような言い方をします。これはCDRの場合も同様です。

リスト(list)は、コンスセルの連続するシリーズで、各コンスセルのCDRスロットは、次のコンスセル、または空リストを保持します。空リストは実際にはシンボルnilです。詳細については、Listsを参照してください。ほとんどのコンスセルはリストの一部として使用されるので、わたしたちはコンスセルにより構成される任意の構造を、リスト構造(list structure)という用語で参照します。

Cプログラマーにたいする注意: Lispのリストはコンスセルにより構築される、リンクリスト(linked list)として機能します。Lispではポインターは暗黙的なので、わたしたちはコンスセルのスロットが、値を“保持(hold)”するのか、それとも値を“指す(point)”のかを区別しません。

コンスセルはLispの中心なので、“コンスセルではないオブジェクト”にたいする単語もあります。これらのオブジェクトはアトム(atoms)と呼ばれます。

リストにたいする入力構文とプリント表現は等しく、それは左カッコ、任意の数の要素、右カコから構成されます。以下はリストの例です:

(A 2 "A")            ; 3要素のリスト。
()                   ; 要素がないリスト(空リスト)。
nil                  ; 要素がないリスト(空リスト)。
("A ()")             ; 1要素のリスト: 文字列"A ()"
(A ())               ; 2要素のリスト: Aと空リスト。
(A nil)              ; 同上
((A B C))            ; 1要素のリスト
                     ;   (この要素は、3要素のリスト)。

読み取りにおいては、カッコの内側は、リストの要素になります。つまり、コンスセルは各要素から作成されます。コンスセルのCARスロットは要素を保持し、CDRスロットはリスト内の次のコンスセル(このコンスセルはリスト内の次の要素を保持します)を参照します。最後のコンスセルのCDRスロットは、nilを保持するようにセットされます。

CARCDRという名称は、Lispの歴史に由来します。オリジナルのLisp実装はIBM 704コンピューターで実行されていました。ワードを2つの部分、つまり“address”と呼ばれる部分と、“decrement”と呼ばれる部分に分割していて、その際CARはaddress部から内容を取り出す命令で、CDRはdecrement部から内容を取り出す命令でした。対照的に“cons cells”は、これらを作成する関数consから命名されました。この関数は関数の目的、すなわちセルを作る(construction of cells)という目的から命名されました。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6.1 Drawing Lists as Box Diagrams

コンスセルを表現するドミノのような1対のボックスによる図により、リストを説明することができます(Lispリーダーがこのような図を読み取ることはできません。人間およびコンピューターが理解できるテキスト表記と異なり、ボックスの図は人間だけが理解できます)。この図は3要素のリスト(rose violet buttercup)を表したものです:

    --- ---      --- ---      --- ---
   |   |   |--> |   |   |--> |   |   |--> nil
    --- ---      --- ---      --- ---
     |            |            |
     |            |            |
      --> rose     --> violet   --> buttercup

この図では、ボックスは任意のLispオブジェクトへの参照を保持できるスロットを表します。ボックスのペアはコンスセルを表します。矢印はLispオブジェクト(アトム、または他のコンスセル)への参照を表します。

この例では、1番目のボックスは1番目のコンスセルで、それのCARrose(シンボル)を参照または“保持(holds)”します。2番目のボックスは1番目のコンスセルのCDRを保持し、次のボックスペア、すなわち2番目のコンスセルを参照します。2番目のコンスセルのCARvioletで、CDRは3番目のコンスセルです。(最後の)3番目のコンスセルのCDRは、nilです。

同じリスト(rose violet buttercup)を、違うやり方で描いた別の図で表してみましょう:

 ---------------       ----------------       -------------------
| car   | cdr   |     | car    | cdr   |     | car       | cdr   |
| rose  |   o-------->| violet |   o-------->| buttercup |  nil  |
|       |       |     |        |       |     |           |       |
 ---------------       ----------------       -------------------

要素がないリストは空リスト(empty list)で、これはシンボルnilと同じです。別の言い方をすると、nilはシンボルであり、リストでもあります。

以下は、リスト(A ())、または等価な(A nil)をボックスと矢印で描いたものです:

    --- ---      --- ---
   |   |   |--> |   |   |--> nil
    --- ---      --- ---
     |            |
     |            |
      --> A        --> nil

以下はもっと複雑な例です。これは、1番目の要素が2等疎のリスとである、3要素のリスト((pine needles) oak maple)を表します:

    --- ---      --- ---      --- ---
   |   |   |--> |   |   |--> |   |   |--> nil
    --- ---      --- ---      --- ---
     |            |            |
     |            |            |
     |             --> oak      --> maple
     |
     |     --- ---      --- ---
      --> |   |   |--> |   |   |--> nil
           --- ---      --- ---
            |            |
            |            |
             --> pine     --> needles

同じリストを2番目のボックス表記で表すと、以下のようになります:

 --------------       --------------       --------------
| car   | cdr  |     | car   | cdr  |     | car   | cdr  |
|   o   |   o------->| oak   |   o------->| maple |  nil |
|   |   |      |     |       |      |     |       |      |
 -- | ---------       --------------       --------------
    |
    |
    |        --------------       ----------------
    |       | car   | cdr  |     | car     | cdr  |
     ------>| pine  |   o------->| needles |  nil |
            |       |      |     |         |      |
             --------------       ----------------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6.2 Dotted Pair Notation

ドットペア表記(dotted pair notation)CARCDRが明示的に表されたコンスセルにたいする、一般的な構文です。この構文では、(a . b)は、CARがオブジェクトaで、CDRがオブジェクトbという意味になります。CDRがリスとである必要がないので、ドットペア表記は、より一般的なリスト構文です。しかしキスと構文が機能するでような場合には、より扱いにくくなります。ドットペア表記では、リスト‘(1 2 3)’は、‘(1 . (2 . (3 . nil)))’と記述されます。nilで終端されたリストにたいしては、どちらの表記法も使用できますが、リスト表記の方が、通常は明解で便利です。リストをプリントする場合、コンスセルのCDRがリスとでないときだけ、ドットペア表記が使用されます。

以下はボックスを使用してドットペア表記を表した例です。この例はペア(rose . violet)を表します。

    --- ---
   |   |   |--> violet
    --- ---
     |
     |
      --> rose

最後のCDRが非nilのコンスセルのチェーンを表すために、ドットペア表記とリスト表記を組み合わせることができます。リストの最後の要素の後にドットを記述して、その後に最後のコンスセルのCDRを記述します。たとえば、(rose violet . buttercup)は、(rose . (violet . buttercup))と等価です。オブジェクトは以下のようになります:

    --- ---      --- ---
   |   |   |--> |   |   |--> buttercup
    --- ---      --- ---
     |            |
     |            |
      --> rose     --> violet

構文(rose . violet . buttercup)は無効です。なぜならこれが意味することは何もないからです。何かあるにしても、violetのためにCDRがすでに使用されているコンスセルのCDRbuttercupを置く、ということになります。

リスト(rose violet)(rose . (violet))と等価であり、以下のようになります:

    --- ---      --- ---
   |   |   |--> |   |   |--> nil
    --- ---      --- ---
     |            |
     |            |
      --> rose     --> violet

同様に3要素のリスト(rose violet buttercup)は、(rose . (violet . (buttercup)))と等価です。 これは以下のようになります:

    --- ---      --- ---      --- ---
   |   |   |--> |   |   |--> |   |   |--> nil
    --- ---      --- ---      --- ---
     |            |            |
     |            |            |
      --> rose     --> violet   --> buttercup

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.6.3 Association List Type

連想リスト(association list)またはalistは、要素がコンスセルであるように特別に構成されたリストです。各要素においては、CARキー(key)で、CDR連想値(associated value)であると考えます(連想値がCDRCARに保存される場合もあります)。リストの先頭に連想値を追加したり削除するのが簡単なので、連想リストはスタック(stack)にしばしば使用されます。

たとえば、

(setq alist-of-colors
      '((rose . red) (lily . white) (buttercup . yellow)))

これは変数alist-of-colorsに3葉疎のalistをセットします。最初の要素では、roseがキーで、redが値になります。

alistと、alistに関数についての詳細な説明は、Association Listsを参照してください。テーブルを照合する、(多くのキーの操作を、より速く行なう)他の手段については、Hash Tablesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.7 Array Type

配列(array)は、他のLispオブジェクトを保持または参照する、任意の数のスロットから構成され、メモリーの連続ブロックに配列されます。配列の任意の要素へのアクセス時間は、大体同じです。対照的に、リストの要素にたいするアクセスは、リスト内でのその要素の位置に比例した時間を要します(リストの最後の要素にアクセスするには、リストの最初の要素にアクセスするより、長い時間を要します)。

Emacsは文字列(strings)、ベクター(vectors)、ブールベクター(bool-vectors)、文字テーブル(char-tables)という、4種の配列を定義します。

文字列は文字の配列で、ベクターは任意のオブジェクトの配列です。ブールベクターはtnilだけを保持できます。この種の配列は、もっとも大きい整数までの、任意の長さをもつことができます。文字テーブルは、任意の有効な文字コードによりインデックスづけされる疎な配列で、任意のオブジェクトを保持することができます。

配列の最初の要素はインデックス0、2番目の要素はインデックス1、...となります。これは0基準zero-originのインデックスづけと呼ばれます。たとえば、4要素の配列は、インデックス0、1、2、3をもちます。利用できる最大のインデックス値は、配列の長さより1小さくなります。1度配列が作成されると、長さは固定されます。

Emacs Lispのすべての配列は、1次元です(他のほとんどのプログラミング言語は多次元配列をサポートしますが、これらは必須ではありません。ネストされた1次元配列により同じ効果を得ることができます)。各種の配列のは、独自の入力構文をもちます。詳細は以降のセクションを参照してください。

配列型はシーケンス型のサブセットであり、文字列型、ベクター型、ブールベクター型、文字テーブル型が含まれます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8 String Type

文字列(string)とは、文字の配列です。Emacsがテキストエディターであることから予想できるように、文字列は、たとえばLispシンボルの名前、ユーザーへのメッセージ、バッファーから抽出されたテキストの表現など、多くの目的のために使用されます。Lispの文字列は定数です。文字列を評価すると、それと同じ文字列がreturnされます。

文字列を操作する関数については、Strings and Charactersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8.1 Syntax for Strings

文字列にたいする入力構文は、"like this"のように、ダブルクォート、任意個の文字、もう1つのダブルクォートから構成されます。文字列内にダブルクォートを含める場合は、それの前にバックスラッシュを記述します。したがって、"\""は1つのダブルクォート文字だけを含む文字列です。同様に、バックスラッシュを含める場合は、"this \\ is a single embedded backslash"のように、それの前にもう1つのバックスラッシュを記述します。

文字列にたいする入力構文では、改行(newline)は特別ではありません。ダブルクォートの間に改行を記述すれば、その改行は文字列内の文字となります。しかしエスケープされた改行 — 前に‘\’をともなう改行 —は文字列の一部とはなりません。同様に、エスケープされたスペース‘\  も無視されます。

"It is useful to include newlines
in documentation strings,
but the newline is \
ignored if escaped."
     ⇒ "It is useful to include newlines
in documentation strings,
but the newline is ignored if escaped."

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8.2 Non-ASCII Characters in Strings

Emacdの文字列内の非ASCII文字にたいしては、2つのテキスト表現 — マルチバイト(multibyte)とユニバイト(unibyte)があります(Text Representationsを参照してください)。大まかに言うと、ユニバイト文字列にはraw(生)バイトが保存され、マルチバイト文字列には人間が読めるテキストが保存されます。ユニバイト文字列内の各文字はバイトであり、値は0から255となります。対照的に、マルチバイト文字列内の各文字は、0から4194303の値をもつかもしれません(Character Typeを参照してください)。両方とも、127より上の文字は非ASCIIです。

文字をリテラルとして記述することにより、文字列に非ASCII文字を含めることができます。マルチバイトのバッファーや文字列、あるいはマルチバイトとしてvisitされたファイル等の、マルチバイトのソースから文字列定数を読み込む場合、Emacsは非ASCII文字をマルチバイト文字として読み取り、その文字列を自動的にマルチバイト文字列にします。ユニバイトのソースから文字列定数を読み込む場合、Emacsは非ASCII文字をユニバイト文字として読み取り、その文字列を湯にバイト文字列にします。

マルチバイト文字列内にリテラルとして文字を記述するかわりに、エスケープシーケンスを使用して文字コードとして記述できます。エスケープシーケンスについての詳細は、General Escape Syntaxを参照してください。

文字列定数内でUnicodeスタイルのエスケープシーケンス‘\uNNNN’または‘\U00NNNNNN’を使用する場合、(たとえASCII文字の場合でも)Emacsは自動的に文字列をマルチバイトとみなします。

文字列定数内で、16進エスケープシーケンス(‘\xn’)、および8進エスケープシーケンス(‘\n’)を使用することもできます。しかし注意してください: 文字列定数が16進または8進のエスケープシーケンスを含み、それらのエスケープシーケンスすべてがユニバイト文字(256より小)を指定していて、その文字列内に他にリテラルの非ASCII文字またはUnicodeスタイルのエスケープシーケンスが存在しない場合、Emacsは自動的に文字列をユニバイト文字列とみなします。つまり文字列内のすべての非ASCII文字は8ビットのrawバイトとみなされます。

16進および8進のエスケープシーケンスではエスケープされた文字コードは可変個の数字を含むかもしれないので、それに続く文字で、16進および8進として有効ではない最初の文字は、エスケープシーケンスを終了させます。文字列内の次の文字が16進または8進として解釈できる文字の場合は、‘\  (バックスラッシュとスペース)を記述して、エスケープシーケンスを終了できます。たとえば‘\xe0\ はgrave accentつきの‘a’という、1文字を表します。文字列内の‘\  は、バックスラッシュー改行と同様です。これは文字列内の文字とはなりませんが、先行する16進エスケープを終了します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8.3 Nonprinting Characters in Strings

リテラル文字と同様に、文字列定数内でバックスラッシュによるエスケープシーケンスを使用できます(ただし文字定数を開始するクエスチョンマークは使用しません)。たとえば、非プリント文字のタブとC-aを含む文字列は、"\t, \C-a"のように、それらの間にカンマとスペースを記述します。文字にたいする入力構文の説明は、Character Typeを参照してください。

しかし、バックスラッシュによるエスケープシーケンスとともに記述できるすべての文字が、文字列内で有効というわけではありません。文字列が保持できるコントロール文字は、ASCIIコントロール文字だけです。ASCIIコントロール文字では、文字列の大文字小文字は区別されません。

正確に言うと、文字列はメタ文字を保持できません。しかし文字列がキーシーケンスとして使用される場合、文字列内でメタで修飾されたASCII文字を表現するための方法を提供する、特別な慣習があります。文字列定数内でメタ文字を示すために‘\M-’構文を使用した場合、これは文字列内の文字の 2**7 のビットをセットします。その文字列がdefine-keyまたはlookup-keyで使用される場合、この数字コードは等価なメタ文字に変換されます。Character Typeを参照してください。

文字列はhyper、super、altで修飾された文字を保持できません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.8.4 Text Properties in Strings

文字列は、その文字自身に加えて、文字のプロパティーも保持することができます。これにより、特別なことをしなくても、文字列とバッファーとの間でテキストをコピーするプログラムが、テキストプロパティーをコピーすることが可能になります。テキストプロパティーが何を意味するかについての説明は、Text Propertiesを参照してください。テキストプロパティーをもつ文字列は、特別な入力構文とプリント構文を使用します。

#("characters" property-data...)

ここでproperty-dataは3個でグループ化された、0個以上の要素から構成されます:

beg end plist

要素begおよびendは整数で、文字列内のインデックスの範囲を指定します。plistはその範囲にたいするプロパティーリストです。たとえば、

#("foo bar" 0 3 (face bold) 3 4 nil 4 7 (face italic))

これはテキスト内容が‘foo bar’で、最初の3文字はfaceプロパティーに値boldをもち、最後の3文字はfaceプロパティーに値italicをもつことを表します。(4番目の文字にはテキストプロパティーはないので、プロパティーリストはnilです。実際には、範囲の中の指定されていない文字はデフォルトではプロパティーをもたないので、範囲のプロパティーリストをnilと指定する必要ありません)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.9 Vector Type

ベクター(vector)は、任意の型の要素からなる1次元の配列です。ベクター内の任意の要素へのアクセスに要す時間は、一定です(リストの場合、要素へのアクセスに要す時間は、リストの先頭からその要素までの距離に比例します)。

ベクターのプリント表現は、左角カッコ(left square bracket)、要素、右角カッコ(right square bracket)から構成されます。これは入力構文でもあります。数字や文字列と同様に、ベクターは評価において定数と判断されます。

[1 "two" (three)]      ; 3要素のベクター。
     ⇒ [1 "two" (three)]

ベクターに作用する関数については、Vectorsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.10 Char-Table Type

文字テーブル(char-table)は、任意の型の要素をもつ1次元の配列で、文字コードによりインデックスづけされます。文字テーブルは、文字コードに情報を割り当てることを必要とする多くの処理を簡単にするための、特別な追加の機能をもちます — たとえば、文字テーブルは、継承するための親、デフォルト値、特別な目的のために使用する少数の余分なスロットをもつことができます。文字テーブルは、文字セット全体にたいして1つの値を指定することもできます。

文字テーブルのプリント表現はベクターと似ていますが、最初に余分な‘#^’があります1

文字テーブルを操作する特別な関数については、Char-Tablesを参照してください。文字テーブルの使用には以下が含まれます:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.11 Bool-Vector Type

ブールベクター(bool-vector)は、要素がtnilでなければならない、1次元の配列です。

ブールベクターのプリント表現は文字列と似ていますが、後に長さを記述した‘#&’で始まります。これに続く文字列定数は、ビットマップとして実際に内容を指定するブールベクターです — 文字列定数内のそれぞれの“文字”は8ビットを含み、これはブールベクターの次の8要素を指定します(1はt、0はnilです)。文字の最下位ビットブールベクターの最下位のインデックスに対応します。

(make-bool-vector 3 t)
     ⇒ #&3"^G"
(make-bool-vector 3 nil)
     ⇒ #&3"^@"

C-g’の2進コードは111、‘C-@’はコード0の文字なので、この結果は道理にかなっています。

長さが8の倍数でない場合、プリント表現には余分な要素が表示されますが、これらの余分な要素に意味はありません。たとえば以下の例では、最初の3ビットだけが使用されるので、2つのブールベクターは等価です:

(equal #&3"\377" #&3"\007")
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.12 Hash Table Type

ハッシュテーブルは非常に高速な照合テーブルの一種で、キーを対応する値にマップするalistと似ていますが、より高速です。ハッシュテーブルのプリント表現、以下のようにハッシュテーブルのプロパティーと内容を指定します:

(make-hash-table)
     ⇒ #s(hash-table size 65 test eql rehash-size 1.5
                             rehash-threshold 0.8 data ())

ハッシュテーブルについての詳細な情報は、Hash Tablesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.13 Function Type

他のプログラミング言語の関数と同様に、Lisp関数は実行可能なコードです。他の言語とは異なり、Lispの関数はLispオブジェクトでもあります。Lispのコンパイルされていない関数はラムダ式 — つまり1番目の要素がシンボルlambdaであるリストです(Lambda Expressionsを参照してください)。

ほとんどのプログラミング言語では、名前のないの関数はありません。Lispでは、関数に本質的な名前はありません。名前がなくても、ラムダ式を関数として呼び出すことができます。これを強調するために、わたしたちはこれを無名関数(anonymous function)とも呼びます(Anonymous Functionsを参照してください)。Lispの名前つき関数は、関数セルに有効な関数がセットされた単なるシンボルです(Defining Functionsを参照してください)。

ほとんどの場合、関数はLispプログラム内のLisp式に名前が記述されたところで呼び出されます。しかし、実行時に関数オブジェクトを構築または取得してから、基本関数funcallおよびapplyにより呼び出すことができます。Calling Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.14 Macro Type

Lispマクロ(Lisp macro)は。Lisp言語を拡張する、ユーザー定義の構成です。これはオブジェクトとしてではなく関数のように表現されますが、引数の渡し方の意味が異なります。Lispマクロの形式はリストです。これは、最初の要素がmacroで、(lambdaシンボルを含む)CDRがLisp関数オブジェクトであるようなリストです。

Lispマクロオブジェクトは通常、ビルトインのdefmacro関数で定義されますが、macroで始まる任意のリストも、Emacsにとってはマクロです。マクロを記述する方法の説明は、Macrosを参照してください。

警告: Lispマクロとキーボードマクロ(Keyboard Macrosを参照してください)は、完全に別物です。修飾なしで“マクロ”という単語を使用したときは、キーボードマクロではなく、Lispマクロのことを指します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.15 Primitive Function Type

基本関数(primitive function)とは、Cプログラミング言語で記述された、Lispから呼び出せる関数です。基本関数はsubrsビルと陰関数(built-in functions)とも呼ばれます(単語“subr”は、“サブルーチン(subroutine)”が由来です)。ほとんどの基本関数、呼び出されたとき、すべての引数を評価します。すべての引数を評価しない基本関数は、スペシャルフォーム(special form)と呼ばれます(Special Formsを参照してください)。

呼び出す側からすれば、その関数が基本関数かどうかは、問題になりません。しかし、基本関数をLispで記述された関数で再定義した場合は、問題になります。理由は、その基本関数がCコードから直接呼び出されているかもしれないからです。Lispから再定義した関数を呼び出すと、これは新しい定義を使用するでしょうが、Cコードから呼び出すと、ビルトインの定義が使用されるでしょう。したがって、基本関数の再定義はしないでください

関数(function)という用語により、LispやCで記述された、すべてのEmacs関数を参照します。Lispで記述された関数についての情報は、Function Typeを参照してください。

基本関数に入力構文はなく、サブルーチン名とともにハッシュ表記でプリントします。

(symbol-function 'car)          ; そのシンボルの関数セルに
                                ;     アクセスします。
     ⇒ #<subr car>
(subrp (symbol-function 'car))  ; これは基本関数か?
     ⇒ t                ;    イェース。

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.16 Byte-Code Function Type

バイトコード関数オブジェクト(byte-code function objects)は、Lispコードをバイトコンパイルすることにより生成されます(Byte Compilationを参照してください)。内部的には、バイトコード関数オブジェクトは、ベクターによく似ています。しかしバイトコード関数オブジェクトが関数呼び出しのように見える場合、評価プロセスにより、このデータ型は特別に処理されます。Byte-Code Function Objectsを参照してください。

バイトコード関数オブジェクトのプリント表現と入力構文は、ベクターのものと似ていますが、開き角カッコ‘[’の前に‘#’があります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3.17 Autoload Type

autoloadオブジェクト(autoload object)は、最初の要素がシンボルautoloadのリストです。これはシンボルの関数定義として保存され、実際の定義にたいする代替としての役割をもちます。autoloadオブジェクトは、必要な時にロードされるLispコードファイルのなかで、実際の定義を見つけることができることを宣言します。これにはファイル名と、加えて実際の定義についての他のいくつかの情報が含まれます。

ファイルがロードされた後、そのシンボルは、autoloadオブジェクトではない、新しい関数定義をもつはずです。新しい定義は、最初からそこにあったかのように呼び出されます。ユーザーの観点からは、関数呼び出しは期待された動作、つまりロードされたファイル内の関数定義を使用します。

autoloadオブジェクトは通常、シンボルの関数セルにオブジェクトを保存する、関数autoloadにより作成されます。詳細は、Autoloadを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4 Editing Types

前のセクションの型は一般的なプログラミングの目的のために使用され、これらのほとんどは、ほとんどのLisp方言で一般的です。Emacs Lispは、編集に関する目的のために、いくつかの追加のデータ型を提供します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.1 Buffer Type

バッファー(buffer)とは、編集されるテキストを保持するオブジェクトです(Buffersを参照してください)。ほとんどのバッファーはディスクファイル(Filesを参照してください)の内容を保持するので、それらは編集できますが、他の目的のために使用されるものもいくつかあります。ほとんどのバッファーは、ユーザーにより閲覧されることも意図しているので、いつかはウィンドウ内(Windowsを参照してください)に表示されます。しかしバッファーはウィンドウに表示される必要はありません。バッファーはそれぞれ、ポイント(point)と呼ばれる位置指定をもちます(Positionsを参照してください)。ほとんどの編集コマンドは、カレントバッファー内のポイントに隣接する内容を処理します。常に1つのバッファーがカレントバッファー(current buffer)です。

バッファーの内容は文字列によく似ていますが、バッファーはEmacs Lispの文字列と同じようには使用されず、利用可能な操作は異なります。文字列にテキストを“挿入”するためには、部分文字列の結合が必要で、結果は完全に新しい文字列オブジェクトなのに比べて、バッファーでは既存のバッファーに効率的にテキストを挿入して、バッファーの内容を変更できます。

標準的なEmacs関数の多くは、カレントバッファー内の文字を操作したりテストするためのものです。このマニュアルには、これらの関数の説明のために、1つのチャプターをあてています(Textを参照してください)。

他のデータ構造のいくつかは、各バッファーに関連付けられています:

ローカルキーマップと変数リストは、具ローマルナバインディングや値を個別にオーバーライドするためのエントリーを含みます。これらは、実際にプログラムを変更することなく、異なるバッファーでのプログラムの振る舞いをカスタマイズするために使用されます。

バッファーはインダイレクト(indirect: 間接) — つまり他のバッファーとテキストを共有するが、それぞれ別に表示する — かもしれません。Indirect Buffersを参照してください。

バッファーに入力構文はありません。バッファーはバッファー名を含むハッシュ表記でプリントされます。

(current-buffer)
     ⇒ #<buffer objects.texi>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.2 Marker Type

マーカー(marker)は、特定のバッファー内の位置を表します。したがってマーカーには2つの内容 — 1つはバッファー、もう1つは位置 — をもちます。バッファーのテキストの変更では、マーカーが常にバッファー内の同じ2つの文字の間に位置することを確実にするために、必要に応じて自動的に位置の値が再配置されます。

マーカーは入力構文をもちません。マーカーは、カレントの文字位置と、そのバッファー名を与える、ハッシュ表記でプリントされます。

(point-marker)
     ⇒ #<marker at 10779 in objects.texi>

マーカーのテスト、作成、コピー、移動の方法についての情報は、Markersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.3 Window Type

ウィンドウ(window)はEmacsがバッファーを表示するために使用する端末スクリーンの部分を記述します。すべてのウィンドウは関連付けられた1つのバッファーをもち、バッファーの内容はそのウィンドウに表示されます。対照的に、あるバッファーは、1つのウィンドウに表示されるか、ウィンドウに表示されないか、それとも複数のウィンドウに表示されるかもしれません。

同時に複数のウィンドウが存在するかもしれませんが、常に1つのウィンドウが選択されたウィンドウ(selected window)になります。Emacsがコマンドにたいして準備できているときに、(通常は)カーソルが表示されるウィンドウが、選択されたウィンドウです。選択されたウィンドウは通常、カレントバッファーを表示しますが、これは必須ではありません。

スクリーン上でウィンドウはフレームにグループ化されます。各ウィンドウは、ただ1つだけのフレームに属します。Frame Typeを参照してください。

ウィンドウは入力構文をもちません。ウィンドウは、ウィンドウ番号、表示されているバッファー名を与える、ハッシュ表記でプリントされます。与えられたウィンドウに表示されるバッファーは頻繁に変更されるかもしれないので、一意にウィンドウを識別するためにウィンドウ番号が存在します。

(selected-window)
     ⇒ #<window 1 on objects.texi>

ウィンドウに作用する関数の説明は、Windowsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.4 Frame Type

フレーム(frame)とは、1つ以上のEmacsウィンドウを含むスクリーン領域です。スクリーン領域を参照するためにEmacsが使用するLispオブジェクトを指す場合も、“フレーム”という用語を使用します。

フレームは入力構文をもちません。フレームはフレームのタイトル、(フレームを一意に識別するのに便利な)メモリー内のアドレスを与えるハッシュ表記でプリントされます。

(selected-frame)
     ⇒ #<frame emacs@psilocin.gnu.org 0xdac80>

フレームに作用する関数の説明は、Framesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.5 Terminal Type

端末(terminal)は、1つ以上のEmacsフレーム(Frame Typeを参照してください)を表示する能力があるデバイスです。

端末は入力構文をもちません。端末は、その端末の順序番号、TTYデバイスファイル名を与える、ハッシュ表記でプリントされます。

(get-device-terminal nil)
     ⇒ #<terminal 1 on /dev/tty>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.6 Window Configuration Type

ウィンドウ構成(window configuration)は、フレーム内のウィンドウの位置、サイズ、内容についての情報を保持します。これにより後で同じウィンドウ配置を再作成できます。

ウィンドウ構成は入力構文をもちません。ウィンドウ構成のプリント表現は、‘#<window-configuration>’のようになります。ウィンドウ構成に関連するいくつかの関数の説明は、Window Configurationsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.7 Frame Configuration Type

フレーム構成(frame configuration)は、すべてのフレーム内のウィンドウの位置、サイズ、内容についての情報を保持します。これは基本型ではありません — 実際のところ、これはCARframe-configurationで、CDRがalistのリストです。各alist要素は、その要素のCARに示される1つのフレームを記述します。

フレーム構成に関連するいくつかの関数の説明は、Frame Configurationsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.8 Process Type

単語プロセス(process)は通常、実行中のプログラムを意味します。Emacs自身はこの種のプロセス内で実行されます。しかしEmacs Lispでは、プロセスとはEmacsプロセスにより作成されたサブプロセスを表す、Lispオブジェクトです。シェル、GDB、ftp、コンパイラーなどのプログラムは、Emacsのサブプロセスとして実行され、Emacsの能力を拡張します。さらに操作を行なうために、Emacsサブプロセスは、Emacsからテキスト入力を受け取り、テキスト出力をEmacsにreturnします。Emacsは、サブプロセスにシグナルを送ることもできます。

プロセスオブジェクトは入力構文をもちません。プロセスオブジェクトは、プロセス名を与えるハッシュ表記でプリントされます。

(process-list)
     ⇒ (#<process shell>)

プロセスの作成、削除、プロセスに関する情報のreturn、入力やシグナルの送信、出力の受信を行なう関数についての情報は、Processesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.9 Stream Type

ストリーム(stream)とは、文字のソースまたはシンクとして — つまり入力として文字を供給したり、出力として文字を受け入れるために使用できるオブジェクトです。多くの異なるタイプ — マーカー、バッファー、文字列、関数を、この方法で使用できます。ほとんどの場合、入力ストリーム(文字列ソース)は、キーボード、バッファー、ファイルから文字を受け取り、出力ストリーム(文字シンク)は文字を*Help*バッファーのようなバッファー、エコーエリアに文字を送ります。

オブジェクトnilは、他の意味に加えて、ストリームとして使用されることがあります。nilは変数standard-inputstandard-outputの値を表します。オブジェクトtも、入力としてミニバッファー(Minibuffersを参照してください)、出力としてエコーエリア(The Echo Areaを参照してください)の使用を指定するストリームになります。

ストリームは特別なプリント表現や入力構文をもたず、何であれ、それらの基本型としてプリントされます。

パース関数およびプリント関数を含む、ストリームに関連した関数の説明は、Reading and Printing Lisp Objectsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.10 Keymap Type

キーマップ(keymap)は、ユーザーがタイプした文字を、コマンドにマップします。このマップは、ユーザーのコマンド入力が実行される方法を制御します。キーマップは、実際にはCARがシンボルkeymapのリストです。

キーマップの作成、プレフィクスキーの処理、ローカルキーマップやグローバルキーマップ、キーバインドの変更についての情報は、Keymapsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.11 Overlay Type

オーバーレイ(overlay)は、バッファーの一部に適用するプロパティーを指定します。それぞれのオーバーレイはバッファーの指定された範囲に適用され、プロパティーリスト(プロパティー名と値が交互に記述された要素のリスト)を含みます。オーバーレイプロパティーは、バッファーの指定された一部を、一時的に異なるスタイルで表示するために使用されます。オーバーレイは入力構文をもたず、バッファーメイト範囲の位置を与えるハッシュ表記でプリントされます。

オーバーレイを作成したり使用する方法についての情報は、Overlaysを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4.12 Font Type

fontは、グラフィカルな端末上のテキストを表示する方法を指定します。実際には異なる3つのフォント型 — フォントオブジェクト(font objects)フォントスペック(font specs)フォントエンティティー(font entities) — が存在しますこれらは入力構文をもちません。これらのプリント構文は、‘#<font-object>’、‘#<font-spec>’、‘#<font-entity>’のようになります。これらのLispオブジェクトの説明は、Low-Level Font Representationを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.5 Read Syntax for Circular Objects

複雑なLispオブジェクトにおける共有された構造、または循環する構造を表すために、リーダー構成‘#n=’と‘#n#’を使用することができます。

後でオブジェクトを参照するには、オブジェクトの前で#n=を使用します。その後で、他の場所にある同じオブジェクトを参照するために、#n#を使用することができます。ここでnは任意の整数です。たとえば以下は、1番目の要素が3番目の要素にも繰り替えされるリストを作成する方法です:

(#1=(a) b #1#)

これは、以下のような通常の構文とは異なります

((a) b (a))

これは1番目の要素と3番目の要素がそっくりなリストですが、これらは同じLispオブジェクトではありません。以下で違いを見ることができます:

(prog1 nil
  (setq x '(#1=(a) b #1#)))
(eq (nth 0 x) (nth 2 x))
     ⇒ t
(setq x '((a) b (a)))
(eq (nth 0 x) (nth 2 x))
     ⇒ nil

“要素”として自身を含むような、循環する構造を作成するために、同じ構文を使用できます。以下は例です:

#1=(a #1#)

これは、2番目の要素がそのリスト自身であるリストを作成します。これが実際にうまくいくのか、以下で確認できます:

(prog1 nil
  (setq x '#1=(a #1#)))
(eq x (cadr x))
     ⇒ t

変数print-circleを非nil値にバインドした場合、Lispプリンターは、循環および共有されるLispオブジェクトを記録するこの構文を、生成することができます。Variables Affecting Outputを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.6 Type Predicates

Emacs Lispインタープリター自身は、関数が呼び出されたときに、その関数に渡された実際の引数にたいする型チェックは行ないません。それが行なえないのは、Lispにおける関数の引数は、他のプログラミング言語のようなデータ型宣言をもたないからです。したがって実際の引数が、その関数が使用できる型に属するかどうかをテストするのは、それぞれの関数に任されています。

すべてのビルトイン関数は、適切なときに実際の引数の型チェックを行い、引数の型が違う場合は、wrong-type-argumentエラーをシグナルします。たとえば以下は、+の引数に、+が扱うことができない引数を渡したとき何が起こるかの例です:

(+ 2 'a)
     error→ Wrong type argument: number-or-marker-p, a

異なる型にたいして異なる処理をプログラムに行なわせる場合は、明示的に型チェックを行なわなければなりません。オブジェクトの型をチェックするもっとも一般的な方法は、型述語(type predicate)関数の呼び出しです。Emacsはそれぞれの型にたいする型述語をもち、組み合わされた型にたいする述語もあります。

型述語関数は1つの引数をとり、その引数が適切な型であればt、そうでない場合はnilをreturnします。述語関数にたいする一般的なLisp慣習にしたがい、ほとんどの型述語の名前は、‘p’で終わります。

以下はリストにたいしてチェックを行なう述語listpと、シンボルにたいしてチェックを行なう述語symbolpの例です。

(defun add-on (x)
  (cond ((symbolp x)
         ;; If X is a symbol, put it on LIST.
         (setq list (cons x list)))
        ((listp x)
         ;; If X is a list, add its elements to LIST.
         (setq list (append x list)))
        (t
         ;; We handle only symbols and lists.
         (error "Invalid argument %s in add-on" x))))

以下の表は、事前定義された型述語(アルファベット順)と、さらに情報を得るためのリファレンスです。

atom

atomを参照してください。

arrayp

arraypを参照してください。

bool-vector-p

bool-vector-pを参照してください。

bufferp

bufferpを参照してください。

byte-code-function-p

byte-code-function-pを参照してください。

case-table-p

case-table-pを参照してください。

char-or-string-p

char-or-string-pを参照してください。

char-table-p

char-table-pを参照してください。

commandp

commandpを参照してください。

consp

conspを参照してください。

custom-variable-p

custom-variable-pを参照してください。

display-table-p

display-table-pを参照してください。

floatp

floatpを参照してください。

fontp

Low-Level Font Representationを参照してください。

frame-configuration-p

frame-configuration-pを参照してください。

frame-live-p

frame-live-pを参照してください。

framep

framepを参照してください。

functionp

functionpを参照してください。

hash-table-p

hash-table-pを参照してください。

integer-or-marker-p

integer-or-marker-pを参照してください。

integerp

integerpを参照してください。

keymapp

keymappを参照してください。

keywordp

Variables that Never Changeを参照してください。

listp

listpを参照してください。

markerp

markerpを参照してください。

wholenump

wholenumpを参照してください。

nlistp

nlistpを参照してください。

numberp

numberpを参照してください。

number-or-marker-p

number-or-marker-pを参照してください。

overlayp

overlaypを参照してください。

processp

processpを参照してください。

sequencep

sequencepを参照してください。

stringp

stringpを参照してください。

subrp

subrpを参照してください。

symbolp

symbolpを参照してください。

syntax-table-p

syntax-table-pを参照してください。

vectorp

vectorpを参照してください。

window-configuration-p

window-configuration-pを参照してください。

window-live-p

window-live-pを参照してください。

windowp

windowpを参照してください。

booleanp

booleanpを参照してください。

string-or-null-p

string-or-null-pを参照してください。

あるオブジェクトがどの型かチェックするもっとも一般的な方法は、関数type-ofの呼び出しです。オブジェクトは、ただ1つだけの基本型に属することを思い出してください。type-ofは、それがどの型(Lisp Data Typesを参照してください)か告げます。しかしtype-ofは基本型以外の型については何も知りません。ほとんどの場合、type-ofより型述語を使用するほうが便利でしょう。

Function: type-of object

この関数はobjectの基本型を名前とする、シンボルをreturnします。retuen値はシンボルbool-vectorbufferchar-tablecompiled-functionconsfloatfont-entityfont-objectfont-specframehash-tableintegermarkeroverlayprocessstringsubrsymbolvectorwindowwindow-configurationのうちの1つです。

(type-of 1)
     ⇒ integer
(type-of 'nil)
     ⇒ symbol
(type-of '())    ; ()nilです。
     ⇒ symbol
(type-of '(x))
     ⇒ cons

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.7 Equality Predicates

ここでは、2つのオブジェクトの同一性をテストする関数を説明します。(たとえば文字列などの)特定の型のオブジェクト同士で、内容の同一性をテストするのは、別の関数を使用します。これらの述語にたいしては、そのデータ型を説明する、適切なチャプターを参照してください。

Function: eq object1 object2

この関数はobject1object2が同じオブジェクトの場合はt、それ以外はnilをreturnします。

object1object2が、同じ値をもつ整数の場合、これらは同じオブジェクトと判断されます(eqtをreturnします)。object1object2が、同じ名前のシンボルの場合、通常は同じオブジェクトです。しかし例外もあります。Creating and Interning Symbolsを参照してください。(リスト、ベクター文字列などの)他の型にたいしては、同じ内容(または要素)の2つの引数が、両者eqである必要はありません。これらが同じオブジェクトの場合だけeqであり、その場合は、一方の内容を変更すると、もう一方の内容にも同じ変更が反映されます。

(eq 'foo 'foo)
     ⇒ t

(eq 456 456)
     ⇒ t

(eq "asdf" "asdf")
     ⇒ nil

(eq "" "")
     ⇒ t
;; この例外は省スペースのためにEmacs Lispが
;; ただ1つのマルチバイトの空文字列を作成するためです。

(eq '(1 (2 (3))) '(1 (2 (3))))
     ⇒ nil

(setq foo '(1 (2 (3))))
     ⇒ (1 (2 (3)))
(eq foo foo)
     ⇒ t
(eq foo '(1 (2 (3))))
     ⇒ nil

(eq [(1 2) 3] [(1 2) 3])
     ⇒ nil

(eq (point-marker) (point-marker))
     ⇒ nil

make-symbol関数は、internされていないシンボルをreturnします。これはLisp式内で、その名前を記述したシンボルとは区別されます。同じ名前の、異なるシンボルは、eqではありません。Creating and Interning Symbolsを参照してください。

(eq (make-symbol "foo") 'foo)
     ⇒ nil
Function: equal object1 object2

この関数は、object1object2が同じ構成要素をもつ場合はt、それ以外はnilをreturnします。eqは引数が同じオブジェクトなのかテストするのにたいして、equalは同一でない引数の内部を調べて、それらの要素または内容が同一化をテストします。したがって2つのオブジェクトがeqならば、それらはequalです。しかし、その逆は常に真ではありません。

(equal 'foo 'foo)
     ⇒ t

(equal 456 456)
     ⇒ t

(equal "asdf" "asdf")
     ⇒ t
(eq "asdf" "asdf")
     ⇒ nil

(equal '(1 (2 (3))) '(1 (2 (3))))
     ⇒ t
(eq '(1 (2 (3))) '(1 (2 (3))))
     ⇒ nil

(equal [(1 2) 3] [(1 2) 3])
     ⇒ t
(eq [(1 2) 3] [(1 2) 3])
     ⇒ nil

(equal (point-marker) (point-marker))
     ⇒ t

(eq (point-marker) (point-marker))
     ⇒ nil

文字列の比較は大文字小文字を区別しますが、テキストプロパティーは考慮しません — これは文字列内の文字だけを比較します。Text Propertiesを参照してください。テキストプロパティーも比較する場合は、equal-including-propertiesを使用します。記述的な理由により、ユニバイト文字列とマルチバイト文字列は、それらが同じ文字シーケンスを含み、それらすべてのコードが0から127(ASCII)、または160から255(8ビットグラフィック)の場合に限り、equalです(Text Representationsを参照してください)。

(equal "asdf" "ASDF")
     ⇒ nil

しかし2つの別のバッファーは、それらのテキスト内容が同じでも、equalと判断されることはありません。

equalのテストは再帰により実装されています。たとえば2つのコンスセルxyを与えると、(equal x y)は、以下の式の両方がtをreturnする場合に限り、tをreturnします:

(equal (car x) (car y))
(equal (cdr x) (cdr y))

これは再帰処理なので、循環するリストがあると無限再帰となります(エラーとなります)。

Function: equal-including-properties object1 object2

この関数はすべてのケースにおいてequalと同様に振る舞いますが、2つの文字列がequalになるためには、それらが同じテキストプロパティーをもつ必要があります。

(equal "asdf" (propertize "asdf" 'asdf t))
     ⇒ t
(equal-including-properties "asdf"
                            (propertize "asdf" 'asdf t))
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3 Numbers

GNU Emacsは2つの数値データ型 — 整数(integers)浮動小数点数(floating-point numbers)をサポートします。整数は-3、0、7、13、511などの整数です。浮動小数点数は-4.5、0.0、2.71828などの小数部をもちます・これらは指数記数法でも表現できます — ‘1.5e2’は‘150.0’と同じです。ここで‘e2’は10の2乗をあらわし、それに1.5を乗じるという意味です。整数計算は正確であり、オーバーフローするときもあります。浮動小数点数の計算においては、数値は固定された精度をもつため、、しばしば丸め誤差(rounding errors)を引き起こします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1 Integer Basics

整数の値の範囲はマシンに依存します。最小の範囲は-536,870,912から536,870,911(30ビット長の -2**29 から 2**29 - 1) ですが、多くのマシンはこれより広い範囲を提供します。このチャプターの例の多くは、最小の整数は30ビット長であると仮定します。

Lispリーダーは、(オプションで最初の符号記号と、最後のピリオドをともなう)数字のシーケンスとして整数を読み取ります。Emacsの範囲を超える整数は、浮動小数点数として扱われます。

 1               ; 整数1。
 1.              ; 整数1。
+1               ; これも整数1。
-1               ; 整数-1。
 9000000000000000000
                 ; 浮動小数点数9e18.
 0               ; 整数0
-0               ; 整数0

基数が10以外の整数の構文は、‘#’の後に基数を指定する文字 — 2進は‘b’、8進は‘o’、16進は‘x’、‘radixr’は基数radix — を記述します。基数を指定する文字の大文字小文字は区別されません。したがって‘#binteger’はintegerを2進として読み取り、‘#radixrinteger’はintegerを基数radixとして読み取ります。radixに指定できる値は2から36です。たとえば:

#b101100 ⇒ 44
#o54 ⇒ 44
#x2c ⇒ 44
#24r1k ⇒ 44

整数にたいして処理を行なうさまざまな関数、特にビット演算(Bitwise Operations on Integersを参照してください)を理解するためには、数を2進形式で見ることが助けになることがしばしばあります。

30ビットの2進では、10進数の整数5は以下のようになります:

0000...000101 (全部で30ビット)

(‘...’は30ビットのワードを満たすのに充分なビットを意味し、この場合の‘...’は12個の0ビットを意味します。以下の例でも、2進の整数を読みやすくするために、‘...’の表記を使用します)

整数の-1は、以下のようになります:

1111...111111 (全部で30ビット)

-1は30個の1で表現されます(これは2の補数表記と呼ばれます)。

-1から4を減じることにより、負の整数-5が得られます。10進の整数4は、2進では100です。したがって、-5は以下のようになります:

1111...111011 (全部で30ビット)

この実装では、0ビットの2進の最大は、10進の536,870,911です。これは2進では以下のようになります:

0111...111111 (全部で30ビット)

算術関数は整数が範囲の外かをチェックしないので、536,870,911に1を加えると、その値は負の整数-536,870,912になります:

(+ 1 536870911)
     ⇒ -536870912
     ⇒ 1000...000000 (全部で30ビット)

このチャプターで説明する多くの関数は、数字の位置として引数にマーカー(Markersを参照してください)を受け取ります。そのような関数にたいする実際の引数は数字かマーカーなので、わたしたちはこれらの引数にnumber-or-markerという名前を与えることがあります。引数の値がマーカーの場合、マーカーの位置が使用され、マーカーのバッファーは無視されます。

Variable: most-positive-fixnum

この変数の値は、Emacs Lispが扱える整数の最大値です。典型的な値は32ビットでは 2**29 - 1 、64ビットでは 2**61 - 1 です。

Variable: most-negative-fixnum

この変数の値は、Emacs Lispが扱える最小の整数です。これは負の整数です。典型的な値は32ビットでは -2**29 、64ビットでは -2**61、 です。

Emacs Lispでは、テキスト文字は整数により表現されます。0から(max-char)までの整数は、有効な文字として判断されます。Character Codesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2 Floating-Point Basics

浮動小数点数は整数ではない数を表現するのに便利です。浮動小数点数の範囲は、使用しているマシンでのCデータ型のdoubleと同じ範囲です。現在Emacsでサポートされているすべてのコンピューターでは、これは倍精度のIEEE浮動小数点数です。

浮動小数点数にたいする入力構文は、小数点と指数のどちらか1つ、または両方が必要とします。オプションの符号(‘+’か‘-’)は、その数字と指数の前に記述します。たとえば、‘1500.0’、‘+15e2’、‘15.0e+2’、‘+1500000e-3’、‘.15e4’は、値が1500の浮動小数点数を記述する5つの方法です。これらはすべて等価です。Common Lispと同様、Emacs Lispは、浮動小数点数の小数点の後に、少なくとも1つの数字を必要とします。‘1500.’は整数であり、浮動小数点数ではありません。

Emacs Lispは-0.0を、equal=に関して、通常の0と数学的に同じものとして扱います。これは、(他の処理がこれらを区別するとしても、-0.00.0は数学的に等しいとする)IEEE浮動小数点数規格にしたがっています。

IEEE浮動小数点数規格は、浮動小数点数として、正の無限大と、負の無限大をサポートします。この規格はNaNまたは“not-a-number(数字ではない)”と呼ばれる値クラスも提供します。数学関数は、正しい答えが存在しないような場合に、このような値をreturnします。たとえば(/ 0.0 0.0)はNaNをreturnします。NaN値に符号がついていたとしても、実用的な目的にたいして、Emacs Lispにおける異なるNaN値に、意味のある違いはありません。

以下は、これらの特別な浮動小数点数にたいする入力構文です:

infinity

1.0e+INF’と‘-1.0e+INF

not-a-number

0.0e+NaN’と‘-0.0e+NaN

以下の関数は浮動小数点数を扱うために特化したものです:

Function: isnan x

この述語は浮動小数引数がNaNのときはt、それ以外はnilをreturnします。

Function: frexp x

この関数はコンスセル(s . e)をreturnします。ここでseは、浮動小数点数のsignificand(浮動小数点数を2の指数表現したときの仮引数)と指数です。

xが有限の場合、sは0.5以上1.0未満の浮動小数点数で、eは整数で、 x = s * 2**eです。 xが0または無限の場合、sxと等しくなります。xがNaNの場合は、sもNaNです。xが0の場合、eは0です。

Function: ldexp sig &optional exp

この関数は、significandがsig、指数がexpの浮動小数点数をreturnします。

Function: copysign x1 x2

koの関数はx2の、x1の値にコピーして、その結果をreturnします。x1x2は浮動小数でなければなりません。

Function: logb x

この関数はxの2進指数をreturnします。より正確にいうと、この値は|x|の2を底とする対数を、整数に切り下げたものです。

(logb 10)
     ⇒ 3
(logb 10.0e20)
     ⇒ 69

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3 Type Predicates for Numbers

このセクションの関数は、数または数の特定の型にたいしてテストを行ないます。関数integerpおよびfloatpは、引き数として任意のLispオブジェクト型をとることができます(そうでないと、あまり使用する機会がありません)。しかし、述語zeropは、引き数として数を要求します。Predicates on Markersinteger-or-marker-pnumber-or-marker-pも参照してください。

Function: floatp object

この述語は、引数が浮動小数かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: integerp object

この述語は引数が整数かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: numberp object

この述語は引数が数(整数か浮動小数)かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: natnump object

この述語(名前は“natural number(自然数)”が由来です)は、引数が正の整数かどうかをテストして、もしそうならt、それ以外はnilをreturnします。0は整数と判断されます。

wholenumpは、natnumpにたいするシノニムです。

Function: zerop number

この述語は、引数が0かどうかをテストして、もしそうならt、それ以外はnilをreturnします。引数は数でなければなりません。

(zerop x)は、(= x 0)と等価です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4 Comparison of Numbers

数が数値的に等しいかテストするためには、eqではなく、通常は=を使用するべきです。同じ数値をもつ、多くの浮動小数オブジェクトが存在するかもしれません。これらを比較するのにeqを使用する場合、これは2つの値が同じオブジェクトかどうかをテストすることになります。対照的に、=はオブジェクトの数値的な値だけを比較します。

Emacs Lispでは、それぞれの整数はは、一意なLispオブジェクトです。したがって、整数に関しては、eq=と同じです。未知の整数の値を比較するのに、eqを使用するのが便利な場合があります。なぜなら未知の値が数字でない場合でも、eqはエラーを報告しません。対照的に、引数が数でもマーカーでもない場合、=はエラーをシグナルします。しかし、整数の比較においてさえ、使用できる場合は=を使用するのが、よいプログラミング習慣です。

数の比較において、2つの数が同じデータ型(どちらも整数、またはどちらも浮動小数)で、同じ値の場合は等しい数として扱う、equalのほうが便利なときもあります。対照的に、=は、整数と浮動小数点数を等しい数と扱うことができます。Equality Predicatesを参照してください。

他の欠点もあります。浮動小数演算は正確ではないので、浮動小数値を比較するのが悪いアイデアのときが、しばしばあります。通常は、近似的に等しいことをテストするほうがよいでしょう。以下はこれを行なう関数です:

(defvar fuzz-factor 1.0e-6)
(defun approx-equal (x y)
  (or (= x y)
      (< (/ (abs (- x y))
            (max (abs x) (abs y)))
         fuzz-factor)))

Common Lispに関する注意: Common Lispは複数ワード整数を実装していて、2つの別の整数オブジェクトが、同じ数値的な値をもつことができるので、Common Lispでの数の比較は、常に=が要求されます。Emacs Lispの整数は範囲が制限されているため、与えられた値に対応する整数オブジェクトは、1つだけです。

Function: = number-or-marker &rest number-or-markers

この関数は、すべての引数が数値的に等しいかどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: eql value1 value2

この関数はeqと同様に振る舞いますが、引数が両方とも数のときは例外です。これは数を型と数値的な値により比較するので、(eql 1.0 1)nilをreturnしますが、(eql 1.0 1.0)(eql 1 1)tをreturnします。

Function: /= number-or-marker1 number-or-marker2

この関数は引数が数値的に等しいかどうかをテストして、もし異なる場合はt、等しい場合はnilをreturnします。

Function: < number-or-marker &rest number-or-markers

この関数は、各引数がそれぞれ、その後の引数より小さいかどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: <= number-or-marker &rest number-or-markers

この関数は、各引数がそれぞれ、その後の引数以下かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: > number-or-marker &rest number-or-markers

この関数は、各引数がそれぞれ、その後の引数より大きいかどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: >= number-or-marker &rest number-or-markers

この関数は、各引数がそれぞれ、その後の引数以上かどうかをテストして、もしそうならt、それ以外はnilをreturnします。

Function: max number-or-marker &rest numbers-or-markers

この関数は引数の最大をreturnします。引数のどれかが浮動小数の場合は、たとえ最大が整数であっても、浮動小数として値がreturnされます。

(max 20)
     ⇒ 20
(max 1 2.5)
     ⇒ 2.5
(max 1 3 2.5)
     ⇒ 3.0
Function: min number-or-marker &rest numbers-or-markers

この関数は引数の最小をreturnします。引数のどれかが浮動小数の場合は、たとえ最小が整数であっても、浮動小数として値がreturnされます。

(min -4 1)
     ⇒ -4
Function: abs number

この関数はnumberの絶対値をreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.5 Numeric Conversions

整数を浮動少数に変換するには、関数floatを使用します。

Function: float number

これは浮動小数に変換されたnumberをreturnします。すでにnumberが浮動小数の場合、floatはそれを変更せずにreturnします。

浮動小数点数を整数に変換する関数が4つあります。これらは浮動小数点数を丸める方法がことなります。これらはすべて引数numberと、オプション引数としてdivisorを受け取ります。引数は両方とも整数または浮動小数点数です。divisornilのこともあります。divisornilまたは省略された場合、これらの関数はnumberを整数に変換するか、それが既に整数の場合は変更せずにreturnします。divisorが非nilの場合、これらの関数はnumberdivisorで除してから、その結果を整数に変換します。divisorが(整数か浮動小数かに関わらず)0の場合、Emacsはarith-errorエラーをシグナルします。

Function: truncate number &optional divisor

これは0に向かって丸めることにより整数に変換したnumberをreturnします。

(truncate 1.2)
     ⇒ 1
(truncate 1.7)
     ⇒ 1
(truncate -1.2)
     ⇒ -1
(truncate -1.7)
     ⇒ -1
Function: floor number &optional divisor

これは、下方(負の無限大に向かって)に丸めることにより整数に変換したnumberをreturnします。

divisorが指定された場合、modに相当する種類の除算演算を使用して、下方に丸めを行ないます。

(floor 1.2)
     ⇒ 1
(floor 1.7)
     ⇒ 1
(floor -1.2)
     ⇒ -2
(floor -1.7)
     ⇒ -2
(floor 5.99 3)
     ⇒ 1
Function: ceiling number &optional divisor

これは、上方(正の無限大に向かって)に丸めることにより整数に変換したnumberをreturnします。

(ceiling 1.2)
     ⇒ 2
(ceiling 1.7)
     ⇒ 2
(ceiling -1.2)
     ⇒ -1
(ceiling -1.7)
     ⇒ -1
Function: round number &optional divisor

これは、もっとも近い整数に向かって丸めることにより整数に変換したnumberをreturnします。2つの整数から等距離にある値の丸めでは、偶数の整数をreturnします。

(round 1.2)
     ⇒ 1
(round 1.7)
     ⇒ 2
(round -1.2)
     ⇒ -1
(round -1.7)
     ⇒ -2

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.6 Arithmetic Operations

Emacs Lispは伝統的な4つの算術演算(加減乗除)、同様に剰余とmodulusの関数、および1加算、1減算の関数を提供します。%を除き、これらの各関数は引き数として整数か浮動小数を受け取り、浮動小数の引数がある場合は、浮動小数点数をreturnします。

Emacs Lispの算術関数は整数のオーバーフローをチェックしません。したがって(1+ 536870911)は-536870912に評価されるかもしれず、それはハードウェアーに依存します。

Function: 1+ number-or-marker

この関数はnumber-or-marker + 1をreturnします。例えば、

(setq foo 4)
     ⇒ 4
(1+ foo)
     ⇒ 5

この関数はCの演算子++とは類似しません — この関数は変数をインクリメントしません。この関数は和を計算するだけです、したがって以下を続けて評価すると、

foo
     ⇒ 4

変数をインクリメントしたい場合は、以下のようにsetqを使用しなければなりません:

(setq foo (1+ foo))
     ⇒ 5
Function: 1- number-or-marker

この関数はnumber-or-marker - 1をreturnします。

Function: + &rest numbers-or-markers

この関数は引数すべてを加算します。引数を与えない場合、+は0をreturnします。

(+)
     ⇒ 0
(+ 1)
     ⇒ 1
(+ 1 2 3 4)
     ⇒ 10
Function: - &optional number-or-marker &rest more-numbers-or-markers

-関数は2つの目的 — 符号反転と減算 —を果たします。-に1つの引数を与えた場合、値は引数の符号を反転したものになります。複数の引数がある場合、number-or-markerからmore-numbers-or-markersまでの各値を蓄積的に減算します。引数がない場合、結果は0です。

(- 10 1 2 3 4)
     ⇒ 0
(- 10)
     ⇒ -10
(-)
     ⇒ 0
Function: * &rest numbers-or-markers

この関数はすべての引数を乗じて、積をreturnします。引数がない場合、*は1をreturnします。

(*)
     ⇒ 1
(* 1)
     ⇒ 1
(* 1 2 3 4)
     ⇒ 24
Function: / dividend divisor &rest divisors

この関数はdividenddivisorで除し、商をreturnします。追加の引数divisorsがある場合、その後さらにdividenddivisorsで順に除します。各引数は数かマーカーです。

すべての引数が整数の場合、結果は各除算の後に商を0へ向かって丸めることにより得られる整数になります。

(/ 6 2)
     ⇒ 3
(/ 5 2)
     ⇒ 2
(/ 5.0 2)
     ⇒ 2.5
(/ 5 2.0)
     ⇒ 2.5
(/ 5.0 2.0)
     ⇒ 2.5
(/ 25 3 2)
     ⇒ 4
(/ -17 6)
     ⇒ -2

整数を整数0で除すると、Emacsはarith-errorエラー(Errorsを参照してください)をシグナルします。浮動小数の除算においては、0でない数を0で除することにより、正の無限大または負の無限大を得ます(Floating-Point Basicsを参照してください)。

Function: % dividend divisor

この関数は、dividenddivisorで除した後、その剰余を整数でreturnします。引数は整数かマーカーでなければなりません。

任意の2つの整数dividenddivisorにたいして、

(+ (% dividend divisor)
   (* (/ dividend divisor) divisor))

は、divisorが非0の場合は常にdividendと等しくなります。

(% 9 4)
     ⇒ 1
(% -9 4)
     ⇒ -1
(% 9 -4)
     ⇒ 1
(% -9 -4)
     ⇒ -1
Function: mod dividend divisor

この関数はdividenddivisorにたいするmodulo、言い換えるとdividenddivisorで除した後の剰余(ただし符号はdivisorと同じ)えおreturnします。引数は数かマーカーでなければなりません。

%とは異なり、modは浮動小数の引数を許容します。これは商を整数に下方(負の無限大に向かって)へ丸めて、剰余を計算するのにこの商を使用します。

divisorが0のときmodは、両方の引数が整数の場合はarith-errorエラーをシグナルし、それ以外はNaNをreturnします。

(mod 9 4)
     ⇒ 1
(mod -9 4)
     ⇒ 3
(mod 9 -4)
     ⇒ -3
(mod -9 -4)
     ⇒ -1
(mod 5.5 2.5)
     ⇒ .5

任意の2つの数dividenddivisorにたいして、

(+ (mod dividend divisor)
   (* (floor dividend divisor) divisor))

は常にdividendになります(ただし引数のどちらかが浮動小数の場合は丸め誤差の範囲内で等しく、dividendが整数でdivisorが0の場合はarith-errorとなります)。floorについては、Numeric Conversionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.7 Rounding Operations

関数ffloorfceilingfroundftruncateは、浮動小数の引数をとり、値が近くの整数であるような浮動少数をreturnします。ffloorは一番近い下方の整数、fceilingは一番近い上方の整数、ftruncateは0に向かう方向で一番近い整数、froundは一番近い整数をreturnします。

Function: ffloor float

この関数はfloatを次に小さい整数値に丸めて、その値を浮動小数点数としてreturnします。

Function: fceiling float

この関数はfloatを次に大きい整数値に丸めて、その値を浮動小数点数としてreturnします。

Function: ftruncate float

この関数はfloatを0方向の整数値に丸めて、その値を浮動小数点数としてreturnします。

Function: fround float

この関数はfloatを一番近い整数値に丸めて、その値を浮動小数点数としてreturnします。2つの整数値との距離が等しい値にたいする丸めでは、偶数の整数をreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.8 Bitwise Operations on Integers

コンピューターの中では、整数はビット(bit: 0か1の数字)のシーケンスである、2進数で表されます。ビット演算は、そのようなシーケンスの中の個々のビットに作用します。たとえば、シフト(shifting)はシーケンス全体を1つ以上左または右に移動して、“移動された”のと同じパターンを再生します。

Emacs Lispのビット演算は、整数だけに適用されます。

Function: lsh integer1 count

lshlogical shiftの略で、integer1のビットを左にcount個シフトします。countが負の場合は右にシフトし、シフトにより空きになったビットには0がセットされます。count isが負の場合、lshは左端(最上位)に0をシフトするので、integer1が負の場合でも、正の結果が生成されます。これと対照的なのが、以下で説明するashです。

以下に、lshでビットパターンの位置を1つ左にシフトする例を2つ紹介します。ここでは下位8ビットの2進パターンだけを表示しており、残りのビットはすべて0です。

(lsh 5 1)
     ⇒ 10
;; 10進の5は、10進の10になります。
00000101 ⇒ 00001010

(lsh 7 1)
     ⇒ 14
;; 10進の7は、10進の14になります。
00000111 ⇒ 00001110

この例が説明するように、ビットパターンを左に1シフトすると、生成される数は、元の数の2倍になります。

ビットパターンを左に2シフトすると、以下(8ビット2進数)の結果が生成されます:

(lsh 3 2)
     ⇒ 12
;; 10進の3は、10進の12になります。
00000011 ⇒ 00001100

一方、右に1シフトすると、以下のようになります:

(lsh 6 -1)
     ⇒ 3
;; 10進の6は10進の3になります。
00000110 ⇒ 00000011

(lsh 5 -1)
     ⇒ 2
;; 10進の5は、10進の2になります。
00000101 ⇒ 00000010

例が明かにするように、右に1シフトすることにより、正の整数の値が2で除され、下方に丸められます。

関数lshは、他のEmacs Lisp算術関数と同様、オーバーフローをチェックしないので、左にシフトすることにより上位ビットが捨てられ、その数の符号が変化するかもしれません。たとえば30ビットの実装では、536,870,911を左にシフトすると、-2が生成されます。

(lsh 536870911 1)          ; 左シフト
     ⇒ -2

2進では、この引数は以下のようになります:

;; 10進の536,870,911
0111...111111 (全部で30ビット)

これを左にシフトすると、以下のようになります:

;; 10進の-2
1111...111110 (全部で30ビット)
Function: ash integer1 count

ash (算術シフト(arithmetic shift))は、integer1の中のビット位置を左にcountシフトします。countが負の場合は右にシフトします。

ashlshと同じ結果を与えますが、例外はinteger1countがとみに負の場合です。この場合、lshは左にできる空きビットに0を置きますが、ashは1を置きます。

したがってashでビットパターンの位置を右に1シフトすると、以下のようになります:

(ash -6 -1) ⇒ -3
;; 10進の-6は、10進の-3になります
1111...111010 (30 bits total)
     ⇒
1111...111101 (30 bits total)

対照的に、lshでビットパターンの位置を1右にシフトすると、以下のようになります:

(lsh -6 -1) ⇒ 536870909
;; 10進の-6は、10進の536,870,909になります。
1111...111010 (30 bits total)
     ⇒
0111...111101 (30 bits total)

他にも例を示します:

                   ;         30ビットの2進数

(lsh 5 2)          ;   5  =  0000...000101
     ⇒ 20         ;      =  0000...010100
(ash 5 2)
     ⇒ 20
(lsh -5 2)         ;  -5  =  1111...111011
     ⇒ -20        ;      =  1111...101100
(ash -5 2)
     ⇒ -20
(lsh 5 -2)         ;   5  =  0000...000101
     ⇒ 1          ;      =  0000...000001
(ash 5 -2)
     ⇒ 1
(lsh -5 -2)        ;  -5  =  1111...111011
     ⇒ 268435454
                   ;      =  0011...111110
(ash -5 -2)        ;  -5  =  1111...111011
     ⇒ -2         ;      =  1111...111110
Function: logand &rest ints-or-markers

この関数は、引数の“論理積(logical and)”をreturnします。すべての引数のn番目のビットがセットされている場合に限り、結果のn番目のビットがセットされます(“セット”とは、そのビットの値が0ではなく1であることを意味します)。

たとえば、13と12の“論理積”は — 4ビット2進数を使用すると1101と1100の論理積は1100を生成します。この2進数では両方とも、左の2ビットがセット(つまり1)されているので、returnされる値の左2ビットがセットされます。しかし右の2ビットにたいしては、少なくとも1つの引数でそのビットが0なので、returnされる値の右2ビットは0になります。

したがって、

(logand 13 12)
     ⇒ 12

logandに何の引数も綿さない場合は、値-1がreturnされます。-1を2進数で表すとすべてのビットが1なので、-1はlogandにたいする単位元(identity element)です。

                   ;        30ビット2進数

(logand 14 13)     ; 14  =  0000...001110
                   ; 13  =  0000...001101
     ⇒ 12         ; 12  =  0000...001100

(logand 14 13 4)   ; 14  =  0000...001110
                   ; 13  =  0000...001101
                   ;  4  =  0000...000100
     ⇒ 4          ;  4  =  0000...000100

(logand)
     ⇒ -1         ; -1  =  1111...111111
Function: logior &rest ints-or-markers

この関数は、引数の“論理和(inclusive or)”をreturnします。少なくとも1つの引数でn番目のビットがセットされていれば、結果のn番目のビットがセットされます。引数を与えない場合の結果は、この処理にたいする単位元である0です。logiorに渡す引数が1つだけの場合、その引数がreturnされます。

                   ;        30ビット2進数

(logior 12 5)      ; 12  =  0000...001100
                   ;  5  =  0000...000101
     ⇒ 13         ; 13  =  0000...001101

(logior 12 5 7)    ; 12  =  0000...001100
                   ;  5  =  0000...000101
                   ;  7  =  0000...000111
     ⇒ 15         ; 15  =  0000...001111
Function: logxor &rest ints-or-markers

この関数は、引数の“排他的論理和(exclusive or)”をreturnします。n番目のビットがセットされている引数の数が奇数個の場合だけ、結果のn番目のビットがセットされます。引数を与えない場合の結果は、この処理の単位元である0となります。logxorに渡す引数が1つだけの場合、その引数がreturnされます。

                   ;        30ビット2進数

(logxor 12 5)      ; 12  =  0000...001100
                   ;  5  =  0000...000101
     ⇒ 9          ;  9  =  0000...001001

(logxor 12 5 7)    ; 12  =  0000...001100
                   ;  5  =  0000...000101
                   ;  7  =  0000...000111
     ⇒ 14         ; 14  =  0000...001110
Function: lognot integer

この関数は引数の論理的な補数(logical complement)をreturnします。integern番目のビットが0の場合に限り、結果のn番目のビットが1になります。逆も成り立ちます。

(lognot 5)
     ⇒ -6
;;  5  =  0000...000101 (全部で30ビット)
;; becomes
;; -6  =  1111...111010 (全部で30ビット)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.9 Standard Mathematical Functions

これらの数学的関数は、引き数として整数と同様に浮動小数点数も許容します。

Function: sin arg
Function: cos arg
Function: tan arg

これらは三角関数です、引数argはラジアン単位です。

Function: asin arg

(asin arg)の値は、sinの値がargとなるような -pi/2 から pi/2 (境界値を含む)の数です。argが範囲外([-1, 1]の外)の場合、asinはNaNをreturnします。

Function: acos arg

(acos arg)の値は、cosの値がargとなるような、0から pi (境界値を含む)の数です。argが範囲外([-1, 1]の外)の場合、acosはNaNをreturnします。

Function: atan y &optional x

(atan y)の値は、tanの値がyとなるような、 -pi/2 から pi/2 (境界値を含まない)の数です。オプションの第2引数xが与えられた場合、(atan y x)の値はベクトル[x, y]X軸が成す角度のラジアン値です。

Function: exp arg

これは指数関数です。この関数はeの指数argをreturnします。

Function: log arg &optional base

この関数は底をbaseとするargの対数をreturnします。baseを指定しない場合、自然底(natural base)eが使用されます。argまたhbaseが負の場合、logはNaNをreturnします。

Function: expt x y

この関数はxyを乗じてreturnします。引数が両方とも整数で、yが正の場合、結果は整数になります。この場合オーバーフローによる切り捨てが発生するので、注意してください。xが有限の負数で、yが有限の非整数の場合、exptはNaNをreturnします。

Function: sqrt arg

これはargの平方根をreturnします。argが有限で0より小さい場合、sqrtはNaNをreturnします。

加えて、Emacsは以下の数学的な定数を定義します:

Variable: float-e

自然対数e(2.71828…)。

Variable: float-pi

円周率pi(3.14159…)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.10 Random Numbers

決定論的なコンピュータープログラムでは、真の乱数を生成することはできません。しかしほとんどの目的には、疑似乱数(pseudo-random numbers)で充分です。一連の疑似乱数は、決定論的な手法により生成されます。真の乱数ではありませんが、それらにはランダム列を模する特別な性質があります。たとえば疑似ランダム系では、すべての可能な値は、均等に発生します。

疑似乱数は“シード(seed: 種)”から生成されます。与えられた任意のシードから開始することにより、random関数は常に同じ数列を生成します。デフォルトでは、Emacsは開始時に乱数シードを初期化することにより、それぞれのEmacsの実行において、randomの値シーケンスは(ほとんど確実に)異なります。

再現可能な乱数シーケンスが欲しい場合もあります。たとえば乱数シーケンスに依存するプログラムをデバッグする場合、プログラムの各実行において同じ挙動を得ることが助けになります。再現可能なシーケンスを作成するには、(random "")を実行します。これは特定のEmacsの実行可能ファイルにたいして、シードに定数値をセットします(しかし、この実行可能ファイルは、その他のEmacsビルドと異なるものになるでしょう)。シード値として、他のさまざまな文字列を使用することができます。

Function: random &optional limit

この関数は疑似乱数の整数をreturnします。繰り返し呼び出すと、一連の疑似乱数の整数をreturnします。

limitが正の整数の場合、値は負ではないlimit未満の値から選択されます。それ以外では、値はmost-negative-fixnumからmost-positive-fixnumの間の、Lispで表現可能な任意の整数(Integer Basicsを参照してください)になるでしょう。

limittの場合は、Emacsを再起動したときに、新しいシードを選択することを意味します。

limitが文字列の場合、その文字列定数にもとづいた新しいシードを選択することを意味します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4 Strings and Characters

Emacs Lispの文字列は、文字列の順序列(ordered sequence)を含む配列です。文字列はシンボル、バッファー、ファイルの名前に使用されます。その他にも、ユーザーにたいしてメッセージを送ったりバッファー間でコピーする文字列を保持したり等の、他の多くの目的にたいして使用されます。文字列は特に重要なので、Emacs Lispは特別に文字列を操作するための、多くの関数をもちます。Emacs Lispプログラムは、個々の文字より、文字列を多用します。

キーボードの文字イベントの文字列にたいする特別な考慮は、Putting Keyboard Events in Stringsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 String and Character Basics

文字(character)とは、テキスト内の1つの文字を表すLispオブジェクトです。Emacs Lispでは、文字は単なる整数です。ある整数が文字か文字でないかを区別するのは、それが使用される方法だけです。Emacsでの文字表現についての詳細は、Character Codesを参照してください。

文字列(string)とは、固定された文字シーケンスです。これは配列(array)と呼ばれるシーケンス型で、配列長が固定で、1度作成したら変更できないことを意味します(Sequences, Arrays, and Vectorsを参照してください)。Cとは異なり、Emacs Lispの文字列は文字コードを判断することにより終端されません

文字列は配列であり、したがって同様にシーケンスでもあるので、Sequences, Arrays, and Vectorsにドキュメントされている一般的な配列関数やシーケンス関数で、文字列を処理できます。たとえば、文字列内の特定の文字にアクセスしたり変更することができますしかし表示された文字列の幅を計算するために、lengthを使用するべきではないことに注意してください。かわりにstring-widthを使用してください(Size of Displayed Textを参照してください)。

Emacs文字列での非ASCIIにたいすテキスト表現は2つ — ユニバイト(unibyte)とマルチバイト(multibyte)がありますほとんどのLispプログラミングでは、これら2つの表現を気にする必要はありません。詳細は、Text Representationsを参照してください。

キーシーケンスがユニバイト文字列で表されることがあります。ユニバイト文字列がキーシーケンスの場合、範囲128から255までの文字列要素は、範囲128から255の文字コードではなく、メタ文字(これは非常に大きな整数です)を表します。文字列はhyper、super、altで修飾された文字を保持できません。文字列はASCIIコントロール文字を保持できますが、それは他のコントロール文字です。文字列はASCIIコントロール文字の大文字小文字を区別できません。そのような文字をシーケンスに保存したい場合は、文字列ではなくベクターを使用しなければなりません。キーボード入力文字についての情報は、Character Typeを参照してください。

文字列は正規表現を保持するために便利です。string-match (Regular Expression Searchingを参照してください)を使用して、文字列にたいして正規表現をマッチすることもできます。関数match-string (Simple Match Data Accessを参照してください)と、replace-match (see section Replacing the Text that Matched)は、文字列にたいして正規表現をマッチした後に、文字列を分解、変更するのに便利です。

バッファーのように、文字列は文字列内の文字自身と、その文字にたいするテキストプロパティーを含みます。Text Propertiesを参照してください。文字列からバッファーや他の文字列にテキストをコピーする、すべてのLispプリミティブ(Lisp primitives)は、コピーされる文字のプロパティーもコピーします。

文字列を表示したり、バッファーにコピーする関数についての情報は、Textを参照してください。文字または文字列の構文についての情報は、Character TypeString Typeを参照してください。異なるテキスト表現間で変換したり、文字コードをエンコード、デコードする関数については、Non-ASCII Charactersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 Predicates for Strings

一般的なシーケンスや配列にたいする述語についての情報は、Sequences, Arrays, and Vectors、およびArraysを参照してください。

Function: stringp object

この関数はobjectが文字列の場合はt、それ以外はnilをreturnします。

Function: string-or-null-p object

この関数は、objectが文字列またはnilの場合はt、それ以外はnilをreturnします。

Function: char-or-string-p object

この関数は、objectが文字列または文字(たとえば整数)の場合はt、それ以外はnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 Creating Strings

以下の関数は、新たに文字列を作成したり、文字列同士を結合して文字列を作成したり、文字列の一部から文字列を作成する関数です。

Function: make-string count character

この関数は、charactercount回繰り返すことにより作成された文字列をreturnします。countが負の場合は、エラーをシグナルします。

(make-string 5 ?x)
     ⇒ "xxxxx"
(make-string 0 ?x)
     ⇒ ""

この関数に対応する他の関数にはmake-vector (Vectorsを参照してください)、およびmake-list (Building Cons Cells and Listsを参照してください)が含まれます。

Function: string &rest characters

この関数は、文字charactersを含む文字列をreturnします。

(string ?a ?b ?c)
     ⇒ "abc"
Function: substring string start &optional end

この関数は、stringから、インデックスstartの文字(その文字を含む)から、endまでの文字(その文字は含まない)の範囲の文字から構成される、新しい文字列をreturnします。文字列の最初の文字がインデックス0になります。

(substring "abcdefg" 0 3)
     ⇒ "abc"

上記の例では、‘a’のインデックスは0、‘b’のインデックスは1、‘c’のインデックスは2です。インデックス3 — この文字列の4番目の文字 — は、部分文字列がコピーされる文字位置までをマークします。したがって文字列"abcdefg"から、‘abc’がコピーされます。

負のかすは、文字列の最後から数えることを意味するので、-1は文字列の最後の文字のインデックスです。たとえば:

(substring "abcdefg" -3 -1)
     ⇒ "ef"

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

endnilが使用された場合、それは文字列の長さを意味します。したがって、

(substring "abcdefg" -3 nil)
     ⇒ "efg"

引数endを省略した場合、それはnilを指定したのと同じです。(substring string 0)は、stringのすべてをコピーしてreturnします。

(substring "abcdefg" 0)
     ⇒ "abcdefg"

しかし、この目的のためにはcopy-sequenceを推奨します(see section Sequences)。

stringからコピーされた文字がテキストプロパティーをもつ場合、そのプロパティーは新しい文字列へもコピーされます。Text Propertiesを参照してください。

substringの最初の引数にはベクターも指定できます。たとえば:

(substring [a b (c) "d"] 1 3)
     ⇒ [b (c)]

startが整数でない場合、またはendが整数でもnilでもない場合は、wrong-type-argumentエラーがシグナルされます。startendの後の文字を指す場合、またはstringにたいして範囲外の整数をどちらかに指定した場合は、args-out-of-rangeエラーがシグナルされます。

この関数に対応するのはbuffer-substring (Examining Buffer Contentsを参照してください)で、これはカレントバッファー内のテキストの一部を含む文字列をreturnします。文字列の先頭はインデックス0ですが、バッファーの先頭はインデックス1です。

Function: substring-no-properties string &optional start end

これはsubstringと同じようにL機能しますが、値からすべてのテキストプロパティーを破棄します。startを省略したり、nilを指定することができ、この場合0に等しくなります。したがって(substring-no-properties string)は、すべてのテキストプロパティーが削除されたstringのコピーをreturnします。

Function: concat &rest sequences

この関数は、渡された引数内の文字からなる、新しい文字列をreturnします(もしあればテキストプロパティーも)。引数には文字列、数のリスト、数のベクターを指定できます。引数は変更されません。concatに引数を指定しない場合、空文字列をreturnします。

(concat "abc" "-def")
     ⇒ "abc-def"
(concat "abc" (list 120 121) [122])
     ⇒ "abcxyz"
;; nilhあ空のシーケンス。
(concat "abc" nil "-def")
     ⇒ "abc-def"
(concat "The " "quick brown " "fox.")
     ⇒ "The quick brown fox."
(concat)
     ⇒ ""

この関数は常に、任意の既存の文字列にたいしてeqではない、新しい文字列を構築しますが、結果が空文字列の時は例外です(スペースを省くために、Emacsは空のマルチバイト文字列を1つだけ作成します)。

他の結合関数(concatenation functions)についての情報は、Mapping FunctionsmapconcatFunctions for VectorsvconcatBuilding Cons Cells and Listsappendを参照してください。シェルコマンドで使用される文字列の中に、個々のコマンドライン引数を結合するには、combine-and-quote-stringsを参照してください。

Function: split-string string &optional separators omit-nulls trim

この関数は、正規表現separators(Regular Expressionsを参照してください)にもとづいて、stringを部分文字列に分解します。separatorsにたいする各マッチは、分割位置を定義します。分割位置の間にある部分文字列を、リストにまとめてreturnします。

omit-nullsnil(または省略)の場合、連続する2つのseparatorsへのマッチ、またはstringの最初か最後にマッチしたときの空文字列が結果に含まれます。omit-nullstの場合、これらの空文字列は結果から除外されます。

separatorsnil(または省略)の場合、デフォルトはsplit-string-default-separatorsの値になります。

特別なケースとして、separatorsnil(または省略)の場合、常に結果から空文字列が除外されます。したがって:

(split-string "  two words ")
     ⇒ ("two" "words")

結果は、ほとんど有用ではないであろう("" "two" "words" "")という結果ではありません。このような結果が必要な時は、separatorsに明示的な値を使用します:

(split-string "  two words "
              split-string-default-separators)
     ⇒ ("" "two" "words" "")

他にも例を示します:

(split-string "Soup is good food" "o")
     ⇒ ("S" "up is g" "" "d f" "" "d")
(split-string "Soup is good food" "o" t)
     ⇒ ("S" "up is g" "d f" "d")
(split-string "Soup is good food" "o+")
     ⇒ ("S" "up is g" "d f" "d")

空のマッチはカウントされます。例外は、空でないマッチを使用することにより、すでに文字列の最後に到達しているとき、またはstringが空の時で、この場合split-stringは最後の空マッチを探しません。

(split-string "aooob" "o*")
     ⇒ ("" "a" "" "b" "")
(split-string "ooaboo" "o*")
     ⇒ ("" "" "a" "b" "")
(split-string "" "")
     ⇒ ("")

しかし、separatorsが空文字列にマッチできるとき、通常はomit-nullstにすれば、前の3つの例の不明瞭さは、ほとんど発生しません:

(split-string "Soup is good food" "o*" t)
     ⇒ ("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d")
(split-string "Nice doggy!" "" t)
     ⇒ ("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!")
(split-string "" "" t)
     ⇒ nil

空でないマッチより空のマッチを優先するような、一部の“非貪欲(non-greedy)”な値をseparatorsに指定することにより、幾分奇妙(しかし予見可能)な振る舞いが発生する場合があります。繰り返しますが、そのような値は実際にはまれです:

(split-string "ooo" "o*" t)
     ⇒ nil
(split-string "ooo" "\\|o+" t)
     ⇒ ("o" "o" "o")

オプションの引数trimが非nilの場合、その値は各部分文字列の最初と最後からトリムするテキストにマッチする正規表現を指定します。トリムにより、その部分文字列が空になるような場合、それは空文字列として扱われます。

文字列を分割して、call-processstart-processに適した、個々のコマンドライン引数のリストにする必要がある場合は、split-string-and-unquoteを参照してください。

Variable: split-string-default-separators

split-stringseparatorsにたいするデフォルト値です。通常の値は、"[ \f\t\n\r\v]+"です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4 Modifying Strings

既存の文字列の内容を変更するもっとも基本的な方法は、aset (see section Functions that Operate on Arrays)を使用する方法です。(aset string idx char)は、stringのインデックスidxに、charを格納します。それぞれの文字は1文字以上を占有しますが、すでにインデックスの場所にある文字のバイト数が、charが要するバイト数と異なる場合、asetはエラーをシグナルします。

より強力な関数はstore-substringです:

Function: store-substring string idx obj

この関数は、インデックスidxで開始される位置にobjを格納することにより、文字列stringの内容の一部を変更します。objは文字、または(stringより小さい)文字列です。

既存の文字列の長さを変更するのは不可能なので、stringの実際の長さにobjが収まらない場合、またはstringのその位置に現在ある文字のバイト数が、新しい文字に必要なバイト数と異なる場合はエラーになります。

パスワードを含む文字列をクリアーするときは、clear-stringを使用します:

Function: clear-string string

これはstringをユニバイト文字列として、内容を0にクリアーします。これによりstringの長さも変更されるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5 Comparison of Characters and Strings

Function: char-equal character1 character2

この関数は引数が同じ文字を表す場合はt、それ以外はnilをreturnします。case-fold-searchが非nilの場合、この関数は大文字小文字の違いを無視します。

(char-equal ?x ?x)
     ⇒ t
(let ((case-fold-search nil))
  (char-equal ?x ?X))
     ⇒ nil
Function: string= string1 string2

この関数は、2つの文字列の文字が正確にマッチする場合は、tをreturnします。引数にシンボルを指定することもでき、この場合はシンボル名が使用されます。case-fold-searchとは無関係に、大文字小文字は常に意味をもちます。

この関数は、equalで2つの文字列を比較するのと等価です(Equality Predicatesを参照してください)。特に、2つの文字列のテキストプロパティーは無視されます。テキストプロパティーだけが異なる文字列を区別する必要がある場合は、equal-including-propertiesを使用します。しかしequalとは異なり、どちらかの引数が文字列でもシンボルでもない場合、string=はエラーをシグナルします。

(string= "abc" "abc")
     ⇒ t
(string= "abc" "ABC")
     ⇒ nil
(string= "ab" "ABC")
     ⇒ nil

技術的な理由により、ユニバイト文字列とマルチバイト文字列がequalなのは、それらが同じ文字コードのシーケンスを含み、それらすべてのコードが0から127(ASCII)か、160から255(eight-bit-graphic)のときだけです。しかしユニバイト文字列をマルチバイト文字列に変更する際、コードが160から255の範囲にあるすべての文字はより高いコードに変換され、ASCII文字は変換されないまま残ります。したがってユニバイト文字列と、それを変換したマルチバイト文字列は、その文字列のすべてがASCIIのときだけequalです。マルチバイト文字列中で、もし文字コード160から255の文字があったとしても、それは完全に正しいとは言えません。結果として、すべてがASCIIではないユニバイト文字列とマルチバイト文字列がequalであるという状況は、もしかしたらEmacs Lispプロプラマーが直面するかもしれない、とても希少な偽術的に不可解な状況だといえます。Text Representationsを参照してください。

Function: string-equal string1 string2

string-equalstring=に対する別名です。

Function: string< string1 string2

この関数は、2つの文字列を1文字づつ比較します。この関数は、同時に2つの文字列をスキャンして、対応する文字同士がマッチしない最初のペアを探します。2つの文字列内で、小さいほうの文字がstring1の文字の場合、string1が小さいことになり、この関数はtをreturnします。小さいほうの文字がstring2の文字の場合、string1が大きいことになり、この関数はnilをreturnします。2つの文字列が完全にマッチした場合、値はnilになります。

文字のペアは、文字コードで比較されます。ASCII文字セットでは、小文字英字は大文字英字より、高い数値をもつことに留意してください。数字および多くの句読点文字は、大文字英字より低い数値をもちます。ASCII文字は、任意の非ASCII文字より小さくなります。ユニバイト非ASCII文字は、任意のマルチバイト非ASCII文字より、常に小さくなります(Text Representationsを参照してください)。

(string< "abc" "abd")
     ⇒ t
(string< "abd" "abc")
     ⇒ nil
(string< "123" "abc")
     ⇒ t

文字列の長さが異なり、string1の長さまでマッチする場合、結果はtになります。string2の長さまでマッチする場合、結果はnilになります。文字を含まない文字列は、他の任意の文字列より小さくなります。

(string< "" "abc")
     ⇒ t
(string< "ab" "abc")
     ⇒ t
(string< "abc" "")
     ⇒ nil
(string< "abc" "ab")
     ⇒ nil
(string< "" "")
     ⇒ nil

引数としてシンボルを指定することもでき、この場合はシンボルのプリント名が使用されます。

Function: string-lessp string1 string2

string-lesspstring<にたいする別名です。

Function: string-prefix-p string1 string2 &optional ignore-case

この関数は、string1string2のプレフィクス(接頭辞)の場合(たとえばstring2string1で始まる場合)、非nilをreturnします。オプションの引数ignore-caseが非nilの場合、比較において大文字小文字の違いは無視されます。

Function: string-suffix-p suffix string &optional ignore-case

この関数は、suffixstringのサフィックス(接尾辞)の場合(たとえばstringsuffixで終わる場合)、非nilをreturnします。オプションの引数ignore-caseが非nilの場合、比較において大文字小文字の違いは無視されます。

Function: compare-strings string1 start1 end1 string2 start2 end2 &optional ignore-case

この関数は、string1の指定された部分を、string2の指定された部分と比較します。string1の指定された部分とは、インデックスstart1(その文字を含む)から、インデックスend1(その文字を含まない)までです。start1nilを指定すると文字列の最初という意味になり、end1nilを指定すると文字列の長さを意味します同様に、string2の指定された部分とは、インデックスstart2からインデックスend2までです。

文字列は、文字列内の文字の数値により比較されます。たとえば、str1str2は、最初に異なる文字でstr1の文字の数値が小さいときに、“小さい”と判断されます。ignore-caseが非nilの場合、文字は比較を行なう前に小文字に変換されます。比較のためにユニバイト文字列はマルチバイト文字列に変換されるので(Text Representationsを参照してください)、ユニバイト文字列と、それを変換したマルチバイト文字列は、常に等しくなります。

2つの文字列の指定された部分がマッチした場合、値はtになります。それ以外では、値は整数で、これは何文字が一致して、どちらの文字が小さいかを示します。この値の絶対値は、2つの文字列の先頭から一致した文字数に1加えた値になります。string1(または指定された部分)のほうが小さい場合、符号は負になります。

Function: assoc-string key alist &optional case-fold

この関数はassocと同様に機能しますが、keyは文字列かシンボルでなければならず、比較はcompare-stringsを使用して行なわれます。テストする前にシンボルは文字列に変換されます。case-foldが非nilの場合、大文字小文字の違いは無視されます。assocとは異なり、この関数はコンスではない文字列またはシンボルのalist要素もマッチできます。特に、alistは実際のalistではなく、文字列またはリストでも可能です。Association Listsを参照してください。

バッファー内のテキストを比較する方法として、Comparing Textの関数compare-buffer-substringsも参照してください。文字列にたいして正規表現のマッチを行なう関数string-matchも、ある種の文字列比較に使用することができます。Regular Expression Searchingを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.6 Conversion of Characters and Strings

このセクションでは文字、文字列、整数の間で変換を行なう関数を説明します。format (Formatting Stringsを参照してください)、およびprin1-to-string (Output Functionsを参照してください)も、Lispオブジェクトを文字列に変換できます。read-from-string (Input Functionsを参照してください)は、Lispオブジェクトの文字列表現を、オブジェクトに“変換”できます。関数string-to-multibyteおよびstring-to-unibyteは、テキスト表現を文字列に変換します(Converting Text Representationsを参照してください)。

テキスト文字と一般的なインプットイベントにたいするテキスト説明を生成する関数(single-key-descriptionおよびtext-char-description)については、Documentationを参照してください。これらの関数は主にヘルプメッセージを作成するために使用されます。

Function: number-to-string number

この関数はnumberの10進プリント表現からなる文字列をreturnします。引数が負の場合、return値はマイナス記号から開始されます。

(number-to-string 256)
     ⇒ "256"
(number-to-string -23)
     ⇒ "-23"
(number-to-string -23.5)
     ⇒ "-23.5"

int-to-stringは、この関数にたいする半ば廃れた(semi-obsolete)エイリアスです。

Formatting Stringsの関数formatも参照してください。

Function: string-to-number string &optional base

この関数はstring内の文字の数値的な値をreturnします。baseが非nilの場合、値は2以上16以下でなければならず、整数はその基数に変換されます。basenilの場合、基数に10が使用されます。浮動少数の変換は基数が10のときだけ機能します。わたしたちは浮動小数点数にたいして他の基数を実装していません。なえならこれには多くの作業が必要で、その割にその機能が有用には思えないからです。stringが整数のように見えるが、その値がLispの整数に収まらないほど大きな値の場合、string-to-numberは浮動小数の結果をreturnします。

解析ではstringの先頭にあるスペースとタブはスキップして、それから与えられた基数で数字として解釈できるところまでstringを読み取ります(スペースとタブだけではなく、先頭にある他の空白文字を無視するシステムもあります)。stringを数字として解釈できない場合、この関数は0をreturnします。

(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-number "1e5")
     ⇒ 100000.0

string-to-intは、この関数にたいする半ば廃れたエイリアスです。

Function: char-to-string character

この関数は、1つの文字characterを含む新しい文字列をreturnします。関数stringのほうがより一般的なので、この関数は半ば廃れています。Creating Stringsを参照してください。

Function: string-to-char string

この関数は、stringの最初の文字をreturnします。これはほとんど(aref string 0)と同じで、例外は文字列が空のときに0をreturnすることです(文字列の最初の文字がASCIIコード0のヌル文字のときも、0をreturnします)。この関数は、残すのに充分なほど有用と思えない場合、将来削除されるかもしれません。

以下は、文字列へ/からの変換に使用できる、その他の関数です:

concat

この関数はベクターまたはリストから文字列に変換します。Creating Stringsを参照してください。

vconcat

この関数は文字列をベクターに変換します。Functions for Vectorsを参照してください。

append

この関数は文字列をリストに変換します。Building Cons Cells and Listsを参照してください。

byte-to-string

この関数は文字データのバイトをユニバイト文字列に変換します。Converting Text Representationsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.7 Formatting Strings

フォーマット(formatting)とは、定数文字列内のなまざまな場所を、計算された値で置き換えることにより、文字列を構築することを意味します。この定数文字列は、他の値がプリントされる方法、同様にどこに表示するかを制御します。これはフォーマット文字列(format string)と呼ばれます。

フォーマットは、表示されるメッセージを計算するために便利なことがしばしばあります。実際に、関数messageおよびerrorは、ここで説明する機能と同じフォーマットを提供します。これらの関数とformatの違いは、フォーマットされた結果を使用する方法だけです。

Function: format string &rest objects

この関数は、stringをコピーしてから、対応するobjectsをエンコードする、コピー内の任意のフォーマット指定(format specification)を置換することにより作成される、新しい文字列をreturnします。引数objectsは、フォーマットされる計算された値です。

string内のフォーマット指定以外の文字は、(もしあれば)テキストプロパティーを含め、出力に直接コピーされます。

フォーマット指定は、‘%’で始まる文字シーケンスです。したがってstring内に‘%d’があれば、formatはそれを、フォーマットされる値の1つ(引数objectsのうちの1つ)にたいするプリント表現で置き換えます。たとえば:

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

formatは文字‘%’をフォーマット指定と解釈するので、決して最初の引数に不定な文字列(arbitrary string)を渡すべきではありません。これは特に何らかのLispコードにより生成された文字列の場合に当てはまります。その文字列が決して文字‘%’を含まないと確信できないときは、以下で説明するように最初の引数に"%s"を渡して、不定な文字列を2番目の引数として渡します:

  (format "%s" arbitrary-string)

stringに複数のフォーマット指定が含まれる場合、フォーマット指定はobjectsから連続して値を引き当てます。つまり、string内の1番目のフォーマット指定は1番目の値、2番目のフォーマット指定は2番目の値、...を使用します。余分なフォーマット指定(対応する値がない場合)は、エラーとなります。フォーマットされる値が余分にある場合は、無視されます。

ある種のフォーマット指定は、特定の型の値を要求します。その要求に適合しない値を与えた場合、エラーがシグナルされます。

以下は有効なフォーマット指定の表です:

%s

フォーマット指定を、クォートなし(つまりprin1ではなくprincを使用して。Output Functionsを参照してください)の、オブジェクトのプリント表現で置き換えます。したがって、文字列は‘"’文字なしの、文字列内容だけが表示され、シンボルは‘\’文字なしで表されます。

オブジェクトが文字列の場合、文字列のプロパティーは出力にコピーされます。‘%s’のテキストプロパティー自身もコピーされますが、オブジェクトのテキストプロパティーが優先されます。

%S

フォーマット指定を、クォートあり(つまりprin1を使用して。Output Functionsを参照してください)の、オブジェクトのプリント表現で置き換えます。したがって、文字列は‘"’文字で囲まれ、必要となる特別文字の前に‘\’文字が表示されます。

%o

フォーマット指定を8進表現の整数で置き換えます。

%d

フォーマット指定を10進表現の整数で置き換えます。

%x
%X

フォーマット指定を16進表現の整数で置き換えます。‘%x’の場合は小文字、‘%X’の場合は大文字が使用されます。

%c

フォーマット指定を、与えられた値の文字で置き換えます。

%e

フォーマット指定を、浮動小数点数の指数表現で置き換えます。

%f

フォーマット指定を、浮動小数点数にたいする10進少数表記で置き換えます。

%g

フォーマット指定を、指数または10進少数のどちらか短いほうの表記を使用した浮動小数点数で置き換えます。

%%

フォーマット指定を1つの‘%’で置き換えます。このフォーマット指定は、値を使用しません。たとえば、(format "%% %d" 30)"% 30"をreturnします。

他のフォーマット文字は、‘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."

フォーマット指定はフィールド幅(width)をもつことができ、これは‘%’とフォーマット指定文字(specification character)の間の10進の数字です。そのオブジェクトのプリント表現が、このフィールド幅より少ない文字で構成される場合、formatはパディングしてフィールド幅に拡張します。フォーマット指定‘%%’では、フィールド幅の指定は無視されます。シールド幅指定により行なわれるパディングは通常、左側にスペースを挿入します。

(format "%5d is padded on the left with spaces" 123)
     ⇒ "  123 is padded on the left with spaces"

フィールド幅が小さすぎる場合でも、formatはオブジェクトのプリント表現を切り詰めません。したがって、情報を失う危険を犯すことなく、フィールドの最小幅を指定することができます。以下の2つの例では、‘%7s’は最小幅に7を指定します。1番目の例では、‘%7s’に挿入される文字列は3文字だけなので、4つのブランクスペースによりパディングされます。2番目の例では、文字列"specification"は13文字ですが、切り詰めはされません。

(format "The word `%7s' has %d letters in it."
        "foo" (length "foo"))
     ⇒ "The word `    foo' has 3 letters in it."
(format "The word `%7s' has %d letters in it."
        "specification" (length "specification"))
     ⇒ "The word `specification' has 13 letters in it."

%’の直後、オプションのフィールド幅指定の前に、フラグ文字(flag characters)を置くこともできます。

フラグ‘+’は、正数の前にプラス符号を挿入するので、数には常に符号がつきます。フラグとしてスペースを指定すると、正数の前に1つのスペースが挿入されます(それ以外は、正数は最初の数字から開始されます)。これらのフラグは、正数と負数が同じ列数を使用することを確実にするのに便利です。これらは‘%d’、‘%e’、‘%f’、‘%g’以外では無視され、両方が指定された場合は、‘+’が優先されます。

フラグ‘#’は“代替形式(alternate form)”を指定し。これは使用するフォーマットに依存します。‘%o’にたいしては、結果を‘0’で開始させます。‘%x’と‘%X’にたいしては、結果のプレフィクスは‘0x’または‘0X’になります。‘%e’、‘%f’、‘%g’にたいしては、‘#’フラグは、少数部が0のときも小数点が含まれることを意味します。

フラグ‘0’は、スペースの代わりに文字‘0’でパディングします。このフラグは‘%s’、‘%S’、‘%c’のような、非数値のフォーマット指定文字では無視されます。もれらのフォーマット指定文字で‘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 "The word `%-7s' actually has %d letters in it."
        "foo" (length "foo"))
     ⇒ "The word `foo    ' actually has 3 letters in it."

すべてのフォーマット指定文字には、その文字の前(フィールド幅がある場合は、その後)に、オプションで精度(precision)を指定できます。精度は小数点‘.’と、その後に桁文字列(digit-string)を指定します。浮動少数のフォーマット指定(‘%e’、‘%f’、‘%g’)では、精度は表示する小数点以下の桁数を指定します。0の場合は小数点も省略されます。‘%s’と‘%S’にたいしては、文字列を精度で指定された幅に切り詰めます。したがって‘%.3s’では、objectにたいするプリント表現の最初の3文字だけが表示されます。他のフォーマット指定文字にたいしては、精度は効果がありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.8 Case Conversion in Lisp

大文字小文字変換関数(character case functions)は、1つの文字または文字列の内容の大文字小文字を変換します。関数は通常、アルファベット文字(英字‘A’から‘Z’と‘a’から‘z’、同様に非ASCIIの英字)だけを変換し、それ以外の文字は変換しません。大文字小文字テーブル(case table。The Case Tableを参照してください)で指定することにより大文字小文字の変換に異なるマッピングを指定できます。

これらの関数は、引数として渡された文字列は変更しません。

以下の例では文字‘X’と‘x’を使用し、これらのASCIIコードは88と120です。

Function: downcase string-or-char

この関数は、string-or-char(文字か文字列)を小文字に変換します。

string-or-charが文字列の場合、この関数は引数の大文字を小文字に変換した、新しい文字列をreturnします。string-or-charが文字の場合、この関数は対応する小文字(正数)をreturnします。元の文字が小文字の場合、または英字でない場合、return値は元の文字と同じです。

(downcase "The cat in the hat")
     ⇒ "the cat in the hat"

(downcase ?X)
     ⇒ 120
Function: upcase string-or-char

この関数は、string-or-char(文字か文字列)を大文字に変換します。

string-or-charが文字列の場合、この関数は引数の小文字を大文字に変換した、新しい文字列をreturnします。string-or-charが文字の場合、この関数は対応する大文字(正数)をreturnします。元の文字が大文字の場合、または英字でない場合、return値は元の文字と同じです。

(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の各単語がキャピタライズされた新しいコピーをreturnします。これは各単語の最初の文字が大文字に変換され、残りは小文字に変換されることを意味します。

単語の定義は、カレント構文テーブル(current syntax table)の単語構成構文クラス(word constituent syntax class)に割り当てられた、連続する文字の任意シーケンスです(Table of Syntax Classesを参照してください)。

string-or-charが文字の場合、この関数はupcaseと同じことを行ないます。

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

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

(capitalize ?x)
     ⇒ 88
Function: upcase-initials string-or-char

この関数は、string-or-charが文字列の場合、string-or-charの中の単語の頭文字をキャピタライズし、頭文字以外の文字は変更しません。この関数は、string-or-charの各単語の頭文字が大文字に変換された新しいコピーをreturnします。

単語の定義は、カレント構文テーブル(current syntax table)の単語構成構文クラス(word constituent syntax class)に割り当てられた、連続する文字の任意シーケンスです(Table of Syntax Classesを参照してください)。

upcase-initialsの引数が文字の場合、upcase-initialsの結果はupcaseと同じになります。

(upcase-initials "The CAT in the hAt")
     ⇒ "The CAT In The HAt"

文字列を比較する関数(大文字小文字の違いを無視するものや、オプションで大文字小文字の違いを無視できるもの)については、Comparison of Characters and Stringsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.9 The Case Table

特別な大文字小文字テーブル(case table)をインストールすることにより、大文字小文字の変換をカスタマイズできます。大文字小文字テーブルは大文字と小文字の間のマッピングを指定します。大文字小文字テーブルはLispオブジェクトにたいする大文字小文字変換関数(前のセクションを参照してください)と、バッファー内のテキストに適用される関数の両方に影響します。それぞれのバッファーには大文字小文字テーブルがあります。新しいバッファーの大文字小文字テーブルを初期化するために使用される、標準の大文字小文字テーブル(standard case table)もあります。

大文字小文字テーブルは、サブタイプがcase-tableの文字テーブル(char-table。Char-Tablesを参照してください)です。この文字テーブルは、それぞれの文字を対応する小文字にマップします。大文字小文字テーブルは、関連するテーブルを保持する、3つの追加スロットをもちます:

upcase

upcase(大文字)テーブルは、それぞれの文字を対応する大文字にマップします。

canonicalize

canonicalize(正準化)テーブルは、大文字小文字に関連する文字セットのすべてを、その文字セットの特別なメンバーにマップします。

equivalences

equivalence(同値)テーブルは、大の字小文字に関連した文字セットのそれぞれを、そのセットの次の文字にマップします。

単純な例では、小文字へのマッピングを指定することだけが必要です。3つの関連するテーブルは、このマッピングから自動的に計算されます。

大文字と小文字が1対1で対応しない言語もいくつかあります。これらの言語では、2つの異なる小文字が、同じ大文字にマップされます。このような場合、大文字と小文字の両方にたいするマップを指定する必要があります。

追加のcanonicalizeテーブルは、それぞれの文字を、正準化された等価文字にマップします。大文字小文字に関連する任意の2文字は、同じ正準等価文字(canonical equivalent character)をもちます。たとえば‘a’と‘A’は大文字小文字変換に関係があるので、これらの文字は同じ正準等価文字(両方の文字が‘a’、または両方の文字が‘A’)をもつべきです。

追加のequivalencesテーブルは、各等価クラスの文字(同じ正準等価文字をもつ文字)を循環的にマップします(通常のASCIIでは、これは‘a’を‘A’に‘A’を‘a’にマップし、他の等価文字セットにたいしても同様にマップします)。

大文字小文字テーブルを構築する際は、canonicalizenilを指定できます。この場合、Emacsは大文字と小文字のマッピングで、このスロットを充填します。equivalencesにたいしてnilを指定することもできます。この場合、Emacsはcanonicalizeから、このスロットを充填します。実際に使用される大文字小文字テーブルでは、これらのコンポーネントは非nilです。canonicalizeを指定せずにequivalencesを指定しないでください。

以下は大文字小文字テーブルに作用する関数です:

Function: case-table-p object

この述語は、objectが有効な大文字小文字テーブルの場合は、非nilをreturnします。

Function: set-standard-case-table table

この関数は、tableを標準大文字小文字テーブルにして、これ以降に作成される任意のバッファーにたいしてこのテーブルが使用されます。

Function: standard-case-table

これは標準大文字小文字テーブル(standard case table)をreturnします。

Function: current-case-table

この関数は、カレントバッファーの大文字小文字テーブルをreturnします。

Function: set-case-table table

これはカレントバッファーの大文字小文字テーブルを、tableにセットします。

Macro: with-case-table table body…

with-case-tableマクロはカレント大文字小文字テーブルを保存してから、tableをカレント大文字小文字テーブルにセットし、その後にbodyフォームを評価してから、最後に大文字小文字テーブルをリストアします。return値は、bodyの最後のフォームの値です。throwまたはエラー(Nonlocal Exitsを参照してください)により異常終了した場合でも、大文字小文字テーブルはリストアされます。

ASCII文字の大文字小文字変換を変更する言語環境(language environment)がいくつかあります。たとえばTurkishの言語環境では、ASCII文字の‘I’にたいする小文字は、Turkishの“dotless i”です。これは、(ASCIIベースのネットワークプロトコル実装のような)ASCIIの通常の大文字小文字変換を要求するコードに干渉する可能性があります。このような場合は、変数ascii-case-tableにたいしてwith-case-tableマクロを使用します。これにより、変更されていないASCII文字セットの大文字小文字テーブルが保存されます。

Variable: ascii-case-table

ASCII文字セットにたいする大文字小文字テーブルです。すべての言語環境セッティングにおいて、これを変更するべきではありません。

以下の3つの関数は、非ASCII文字セットを定義するパッケージにたいして便利なサブルーチンです。これらはcase-tableに指定された大文字小文字テーブルを変更します。これは標準構文テーブルも変更します。Syntax Tablesを参照してください。通常これらの関数は、標準大文字小文字テーブルを変更するために使用されます。

Function: set-case-syntax-pair uc lc case-table

この関数は、対応する文字のペア(一方は大文字、もう一方は小文字)を指定します。

Function: set-case-syntax-delims l r case-table

この関数は文字lrを、大文字小文字不変区切り(case-invariant delimiter)mpマッチングペアにします。

Function: set-case-syntax char syntax case-table

この関数はcharを、構文syntaxの、大文字小文字不変(case-invariant)とします。

Command: describe-buffer-case-table

このコマンドは、カレントバッファーの大文字小文字テーブルの内容にたいする説明を表示します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5 Lists

リスト(list)は0個以上の要素(任意のLispオブジェクト)のシーケンスを表します。リストとベクターの重要な違いは、、2つ以上のリストが、構造の一部を共有できることです。加えて、リスト全体をコピーすることなく、要素の挿入、削除ができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.1 Lists and Cons Cells

Lispでのリストは基本データ型ではありません。リストはコンスセル(cons cells)から構築されます(Cons Cell and List Typesを参照してください)。コンスセルは、順序つきペアを表現するデータオブジェクトです。つまり、コンスセルは2つのスロットをもち、それぞれのスロットはLispオブジェクトを保持(holds)、または参照(refers to)します。1つのスロットはCAR、もう1つはCDRです(これらの名前は歴史的なものです。Cons Cell and List Typesを参照してください)。CDRは“could-er(クダー)”と発音されます。

わたしたちは、コンスセルのCARスロットに現在保持されているオブジェクトが何であれ、“このコンスセルのCARは、...”のような言い方をします。これはCDRの場合も同様です。

リストとは、“互いにつながった(chained together)”一連のコンスセルであり、各セルは次のセルを参照します。リストの各要素にたいして、それぞれ1つのコンスセルがあります。慣例により、コンスセルのCARはリストの要素を保持し、CDRはリストをチェーンするのに使用されます(CARCDRの間の非対称性は完全に慣例的なものです。コンスセルのレベルでは、CARスロットとCDRスロットは同じようなプロパティーをもちます)。したがって、リスト内の各コンスセルのCDRスロットは、次のコンスセルを参照します。

これも慣例的なものですが、リスト内の最後のコンスセルのCDRnilです。わたしたちは、このようなnilで終端された構造を、真リスト(true list)と呼びます。Emacs Lispでは、シンボルnilは、シンボルであり、要素なしのリストでもあります。便宜上、シンボルnilは、そのCDR(およびCAR)にnilをもつと考えます。

したがって真リストのCDRは、常に真リストです。空でない真リストのCDRは、1番目の要素以外を含む真リストです。

リストの最後のコンスセルのCDRnil以外の何らかの値の場合、このリストのプリント表現はドットペア表記(dotted pair notation。Dotted Pair Notationを参照してください)を使用するので、わたしたちはこの構造をドットリスト(dotted list)と呼びます。他の可能性もあります。あるコンスセルのCDRが、そのリストのそれより前にある要素を指すかもしれません。わたしたちは、この構造を循環リスト(circular list)と呼びます。

ある目的にたいしては、そのリストが真リストか、循環リストなのか、ドットリストなのかが問題にならない場合もあります。そのプログラムが、リストを充分に下って最後のコンスセルのCDRを確認しようとしないなら、これは問題になりません。しかし、リストを処理するの関数のいくつかは、真リストを要求し、ドットリストの場合はエラーをシグナルします。リストの最後を探そうと試みる関数のほとんどは、循環リストを与えると無限ループに突入します。

ほとんどのコンスセルはリストの一部として使用されるので、わたしたちはコンスセルで構成される任意の構造を、リスト構造(list structure)と呼びます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.2 Predicates on Lists

以下の述語は、あるLispオブジェクトがアトムなのか、コンスセルなのか、それともリストなのか、またはオブジェクトがnilかどうかテストします(これらの述語の多くは、他の述語で定義することもできますが、多用されるので、定義する価値があるのです)。

Function: consp object

この関数は、objectがコンスセルの場合はt、それ以外はnilをreturnします。たとえnilはリストですが、コンスセルではありません。

Function: atom object

この関数は、objectがアトムの場合はt、それ以外はnilをreturnします。シンボルnilはアトムであり、リストでもあります。そのようなLispオブジェクトはnilだけです。

(atom object) ≡ (not (consp object))
Function: listp object

この関数は、objectがコンスセルかnilの場合はtをreturnします。それ以外はnilをreturnします。

(listp '(1))
     ⇒ t
(listp '())
     ⇒ t
Function: nlistp object

この関数はlistpの反対です。objectがリストでない場合はtをreturnします。それ以外はnilをreturnします。

(listp object) ≡ (not (nlistp object))
Function: null object

この関数は、objectnilの場合はt、それ以外はnilをreturnします。この関数はnotと等価ですが、明解にするために、objectをリストだと考えるときはnull、真偽値だと考えるときはnotを使用します(Constructs for Combining Conditionsnotを参照してください)。

(null '(1))
     ⇒ nil
(null '())
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.3 Accessing Elements of Lists

Function: car cons-cell

この関数は、コンスセルcons-cellの1番目のスロットにより参照される値をreturnします。他の言い方をすると、この関数はcons-cellCARをreturnします。

特別なケースとして、cons-cellnilの場合、この関数はnilをreturnします。したがって、リストはすべて引数として有効です。引数がコンスセルでもnilでもない場合、エラーがシグナルされます。

(car '(a b c))
     ⇒ a
(car '())
     ⇒ nil
Function: cdr cons-cell

この関数は、コンスセルcons-cellの2番目のスロットにより参照される値をreturnします。他の言い方をすると、この関数はcons-cellCDRをreturnします。

特別なケースとして、cons-cellnilの場合、この関数はnilをreturnします。したがって、リストはすべて引数として有効です。引数がコンスセルでもnilでもない場合、エラーがシグナルされます。

(cdr '(a b c))
     ⇒ (b c)
(cdr '())
     ⇒ nil
Function: car-safe object

この関数により、他のデータ型によるエラーを起こさずに、コンスセルのCARを取得できます。この関数は、objectがコンスセルの場合はobjectCAR、それ以外はnilをreturnします。この関数は、objectがリスとでないときはエラーをシグナルするcarとは対象的です。

(car-safe object)
≡
(let ((x object))
  (if (consp x)
      (car x)
    nil))
Function: cdr-safe object

この関数により、他のデータ型によるエラーを起こさずに、コンスセルのCDRを取得できます。この関数は、objectがコンスセルの場合はobjectCDR、それ以外はnilをreturnします。この関数は、objectがリスとでないときはエラーをシグナルするcdrとは対象的です。

(cdr-safe object)
≡
(let ((x object))
  (if (consp x)
      (cdr x)
    nil))
Macro: pop listname

このマクロはリストのCARを調べて、それをリストから取り去るのを1度に行なう便利な方法を提供します。この関数はlistnameに格納されたリストにたいして処理を行ないます。この関数はリストから1番目の要素を削除して、CDRlistnameに保存し、その後で削除した要素をreturnします。

1番単純なケースは、リストに名前をつけるためのクォートされていないシンボルの場合です。この場合、このマクロは(prog1 (car listname) (setq listname (cdr listname)))と等価です。

x
     ⇒ (a b c)
(pop x)
     ⇒ a
x
     ⇒ (b c)

より一般的なのは、listnameが汎変数(generalized variable)の場合です。この場合、このマクロはsetfを使用してlistnameに保存します。Generalized Variablesを参照してください。

リストに要素を追加するpushマクロについては、Modifying List Variablesを参照してください。

Function: nth n list

この関数は、listn番目の要素をreturnします。要素は0から数えられるので、listCARは要素0になります。listの長さがn以下の場合、値はnilです。

(nth 2 '(1 2 3 4))
     ⇒ 3
(nth 10 '(1 2 3 4))
     ⇒ nil

(nth n x) ≡ (car (nthcdr n x))

関数eltは似ていますが、これは任意の種類のシーケンスに適用されます。歴史的な理由により、この関数は逆の順序で引数を受け取ります。Sequencesを参照してください。

Function: nthcdr n list

この関数は、listn番目のCDRをreturnします。他の言い方をすると、この関数はlistの最初のn個のリンクをスキップしてから、それ以降をreturnします。

nが0の場合、nthcdrlist全体をreturnします。listの長さがn以下の場合、nthcdrnilをreturnします。

(nthcdr 1 '(1 2 3 4))
     ⇒ (2 3 4)
(nthcdr 10 '(1 2 3 4))
     ⇒ nil
(nthcdr 0 '(1 2 3 4))
     ⇒ (1 2 3 4)
Function: last list &optional n

この関数は、listの最後のリンクをreturnします。このリンクのcarは、このリストの最後の要素です。listがnullの場合、nilがreturnされます。nが非nilの場合、n番目から最後までのリンクがreturnされます。nlistの長さより大きい場合は、list全体がreturnされます。

Function: safe-length list

この関数は、エラーや無限ループの危険なしで、listの長さをreturnします。この関数は一般的に、リスト内のコンスセルの個数をreturnします。しかし循環リストでは、単に上限値が値となるため、非常に大きくなる場合があります。

listnilでもコンスセルでもない場合、safe-lengthは0をreturnします。

循環リストを考慮しなくてもよい場合に、リストの長さを計算するもっとも一般的な方法は、lengthを使うことです。Sequencesを参照してください。

Function: caar cons-cell

これは、(car (car cons-cell))と同じです。

Function: cadr cons-cell

これは、(car (cdr cons-cell))または(nth 1 cons-cell)と同じです。

Function: cdar cons-cell

これは、(cdr (car cons-cell))と同じです。

Function: cddr cons-cell

これは、(cdr (cdr cons-cell))または(nthcdr 2 cons-cell)と同じです。

Function: butlast x &optional n

この関数は、リストxから、最後の要素、または最後のn個の要素を削除してreturnします。nが0より大きい場合、この関数はリストのコピーを作成するので、元のリストに影響はありません。一般的に、(append (butlast x n) (last x n))は、xと等しいリストをreturnします。

Function: nbutlast x &optional n

この関数は、リストのコピーを作成するのではなく、cdrを適切な要素に変更することにより破壊的に機能するバージョンのbutlastです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.4 Building Cons Cells and Lists

リストはLispの核にあるので、リストを構築する多くの関数があります。consはリストを構築する基本的な関数です。しかしEmacsのソースコードでは、consよりlistのほうが多く使用されているのは興味深いことです。

Function: cons object1 object2

この関数は、新しいリスト構造を構築するための、もっとも基本的な関数です。この関数は、object1CARobject2CDRとする、新しいコンスセルを作成して、それから新しいコンスセルをreturnします。引数object1object2は、任意のLispオブジェクトを指定できますが、ほとんどの場合、object2はリストです。

(cons 1 '(2))
     ⇒ (1 2)
(cons 1 '())
     ⇒ (1)
(cons 1 2)
     ⇒ (1 . 2)

リストの先頭に1つの要素を追加するために、consがよく使用されます。これは、リストに要素をコンスすると言います。2たとえば:

(setq list (cons newelt list))

この例で使用されているlistという名前の変数と、以下で説明するlistという名前の関数は、競合しないことに注意してください。任意のシンボルは、両方の役割を果たすことができます。

Function: list &rest objects

この関数は、objectsを要素とするリストを作成します。結果となるリストは、常にnil終端されます。objectsを指定しない場合、空リストがreturnされます。

(list 1 2 3 4 5)
     ⇒ (1 2 3 4 5)
(list 1 2 '(3 4 5) 'foo)
     ⇒ (1 2 (3 4 5) foo)
(list)
     ⇒ nil
Function: make-list length object

この関数は、各要素がobjectの、length個の要素からなるリストを作成します。make-listmake-string(Creating Stringsを参照してください)を比較してみてください。

(make-list 3 'pigs)
     ⇒ (pigs pigs pigs)
(make-list 0 'pigs)
     ⇒ nil
(setq l (make-list 3 '(a b)))
     ⇒ ((a b) (a b) (a b))
(eq (car l) (cadr l))
     ⇒ t
Function: append &rest sequences

この関数は、sequencesのすべての要素を服務リストをreturnします。sequencesには、リスト、ベクター、ブールベクター、文字列も指定できますが、通常は最後にリストを指定するべきです。最後の引数を除くすべての引数はコピーされるので、変更される引数はありません(コピーを行なわずにリストを結合する方法については、Functions that Rearrange Listsnconcを参照してください)。

より一般的には、appendにたいする最後の引数は、任意のLispオブジェクトかもしれません。最後の引数は、コピーまたは変換されません。最後の引数は、新しいリストの最後のコンスセルのCDRになります。最後の引数もリストならば、このリストの要素は、実質的には結果リストの要素になります。最後の要素がリストでない場合、最後のCDRが(真リストで要求される)nilではないので、結果はドットリストになります。

以下はappendを使用した例です:

(setq trees '(pine oak))
     ⇒ (pine oak)
(setq more-trees (append '(maple birch) trees))
     ⇒ (maple birch pine oak)

trees
     ⇒ (pine oak)
more-trees
     ⇒ (maple birch pine oak)
(eq trees (cdr (cdr more-trees)))
     ⇒ t

appendがどのように機能するか、ボックスダイアグラムで見ることができます。変数treesはリスト(pine oak)にセットされ、それから変数more-treesにリスト(maple birch pine oak)がセットされます。しかし変数treesは継続して元のリストを参照します:

more-trees                trees
|                           |
|     --- ---      --- ---   -> --- ---      --- ---
 --> |   |   |--> |   |   |--> |   |   |--> |   |   |--> nil
      --- ---      --- ---      --- ---      --- ---
       |            |            |            |
       |            |            |            |
        --> maple    -->birch     --> pine     --> oak

空のシーケンスは、appendによりreturnされる値に寄与しません。この結果、最後の引数にnilを指定すると、それより前の引数のコピーを強制することになります。

trees
     ⇒ (pine oak)
(setq wood (append trees nil))
     ⇒ (pine oak)
wood
     ⇒ (pine oak)
(eq wood trees)
     ⇒ nil

これは関数copy-sequenceが導入される以前は、リストをコピーする通常の方法でした。Sequences, Arrays, and Vectorsを参照してください。

以下は、appendの引数としてベクターと文字列を使用する例です:

(append [a b] "cd" nil)
     ⇒ (a b 99 100)

apply (Calling Functionsを参照してください)の助けを借りることにより、リストのリストの中の、すべてのリストをappendできます。

(apply 'append '((a b c) nil (x y z) nil))
     ⇒ (a b c x y z)

sequencesが与えられない場合、nilがreturnされます:

(append)
     ⇒ nil

以下は、最後の引数がリストでない場合の例です:

(append '(x y) 'z)
     ⇒ (x y . z)
(append '(x y) [z])
     ⇒ (x y . [z])

2番目の例は、最後の引数はシーケンスですがリスとではない場合で、このシーケンスの要素は、結果リストの要素にはなりません。かわりに、最後の引数がリストでないときと同様、シーケンスが最後のCDRになります。

Function: reverse list

この関数は、要素はlistの要素ですが、順序が逆の新しいリストを作成します。元の引数listは、変更されません

(setq x '(1 2 3 4))
     ⇒ (1 2 3 4)
(reverse x)
     ⇒ (4 3 2 1)
x
     ⇒ (1 2 3 4)
Function: copy-tree tree &optional vecp

この関数はツリーtreeのコピーをreturnします。treeがコンスセルの場合、同じCARCDRをもつ新しいコンスセルを作成してから、同じ方法によりCARCDRを再帰的にコピーします。

通常、treeがコンスセル以外の場合、copy-treeは単にtreeをreturnします。しかし、vecpが非nilの場合、この関数はベクターでもコピーします(そしてベクターの要素を再帰的に処理します)。

Function: number-sequence from &optional to separation

これは、fromからseparationづつインクリメントして、toの直前で終わる、数字のリストをreturnします。separationには正または負の数を指定でき、デフォルトは1です。tonil、または数的にfromと等しい場合、値は1要素のリスト(from)になります。separationが正でtofromより小さい場合、またはseparationが負でtofromより大きい場合、これらの引数は空のシーケンスを指示することになるので、値はnilになります。

separationが0で、tonilでもなく、数的にfromとも等しくない場合、これらの引数は無限シーケンスを指示することになるので、エラーがシグナルされます。

引数はすべて数字です。浮動少数の計算は正確ではないので、浮動少数の引数には用心する必要があります。たとえばマシンに依存して、(number-sequence 0.4 0.8 0.2)が3要素のリストをreturnするのに、(number-sequence 0.4 0.6 0.2)が1要素のリスト(0.4)をreturnすることがよく起こります。リストのn番目の要素は、厳密に(+ from (* n separation))という式により計算されます。したがって、リストに確実にtoが含まれるようにするには、この式に適切な型のtoを渡すことができます。別の方法として、toを少しだけ大きな値(separationが負の場合は、少しだけ小さな値)に置き換えることもできます。

いくつか例を示します:

(number-sequence 4 9)
     ⇒ (4 5 6 7 8 9)
(number-sequence 9 4 -1)
     ⇒ (9 8 7 6 5 4)
(number-sequence 9 4 -2)
     ⇒ (9 7 5)
(number-sequence 8)
     ⇒ (8)
(number-sequence 8 5)
     ⇒ nil
(number-sequence 5 8 -1)
     ⇒ nil
(number-sequence 1.5 6 2)
     ⇒ (1.5 3.5 5.5)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.5 Modifying List Variables

これらの関数、および1つのマクロは、変数に格納されたリストを変更する便利な方法を提供します。

Macro: push element listname

このマクロは、CARelementで、CDRlistnameで指定されたリストであるような新しいリストを作成して、そのリストをlistnameに保存します。単純なのは、listnameはリストに名前をつけるクォートされていないシンボルのときで、この場合マクロは(setq listname (cons element listname))と等価です。

(setq l '(a b))
     ⇒ (a b)
(push 'c l)
     ⇒ (c a b)
l
     ⇒ (c a b)

より一般的なのは、listnameが汎変数の場合です。この場合、このマクロは(setf listname (cons element listname))と等価です。Generalized Variablesを参照してください。

リストから1番目の要素を取り出すpopマクロについては、Accessing Elements of Listsを参照してください。

以下の2つの関数は、変数の値であるリストを変更します。

Function: add-to-list symbol element &optional append compare-fn

この関数は、elementsymbolの値のメンバーでない場合は、symbolelementをコンスすることにより、変数symbolをセットします。この関数は、リストが更新されているかに関わらず、結果のリストをreturnしますsymbolの値は、呼び出し前にすでにリストであることが望ましいです。elementがリストの既存メンバーか比較するために、add-to-listcompare-fnを使用します。compare-fnnilの場合は、equalを使用します。

elementが追加される場合は通常、symbolの前に追加されますが、オプションの引数appendが非nilの場合は、最後に追加されます。

引数symbolは、暗黙にクォートされません。setqとは異なり、add-to-listsetのような通常の関数です。クォートしたい場合は自分で引数をクォートします。

以下はadd-to-listを使用する方法をシナリオで示します:

(setq foo '(a b))
     ⇒ (a b)

(add-to-list 'foo 'c)     ;; cを追加。
     ⇒ (c a b)

(add-to-list 'foo 'b)     ;; 効果なし。
     ⇒ (c a b)

foo                       ;; fooが変更された。
     ⇒ (c a b)

以下は(add-to-list 'var value)と等価な式です:

(or (member value var)
    (setq var (cons value var)))
Function: add-to-ordered-list symbol element &optional order

この関数は、古い値(リストでなければなりません)のorderで指定された位置に、elementを挿入することにより、変数symbolをセットします。elementがすでにこのリストのメンバーである場合、リスト内の要素の位置はorderにしたがって調整されます。メンバーかどうかは、eqを使用してテストされます。この関数は、更新されているかどうかに関わらず、結果のリストをreturnします。

orderは通常、数字(正数か浮動小数)で、リストの要素は、その数字の昇順で並べられます。

orderを省略またはnilにすることもできます。これにより、リストにelementがすでに存在する場合、elementの数字順序は変更されません。それ以外では、elementは数字順序をもちません。リストの数字順序をもたない要素は、リストの最後に配され、特別な順序はつきません。

orderに他の値を指定した場合、elementがすでに数字順序をもつときは数字順序が削除されます。それ以外は、nilと同じです。

引数symbolは、暗黙にクォートされません。add-to-ordered-listは、setqなどとは異なり、setのような通常の関数です。必要な場合は引数を自分でクォートしてください。

順序の情報は、symbollist-orderプロパティーのハッシュテーブルに保存されます。

以下にadd-to-ordered-listを使用する方法をシナリオで示します:

(setq foo '())
     ⇒ nil

(add-to-ordered-list 'foo 'a 1)     ;; aを追加。
     ⇒ (a)

(add-to-ordered-list 'foo 'c 3)     ;; cを追加。
     ⇒ (a c)

(add-to-ordered-list 'foo 'b 2)     ;; bを追加。
     ⇒ (a b c)

(add-to-ordered-list 'foo 'b 4)     ;; bを移動。
     ⇒ (a c b)

(add-to-ordered-list 'foo 'd)       ;; dを後に追加。
     ⇒ (a c b d)

(add-to-ordered-list 'foo 'e)       ;; eを追加。
     ⇒ (a c b e d)

foo                       ;; fooが変更された。
     ⇒ (a c b e d)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6 Modifying Existing List Structure

基本関数setcarおよびsetcdrにより、コンスセルのCARおよびCDRの内容を変更できます。わたしたちは、これらが既存のリスト構造を変更することから、これらを“破壊的”処理と呼びます。

Common Lispに関する注意: Common Lispはリスト構造の変更にrplacaおよびrplacdを使用します。これらはsetcarsetcdrと同じ方法でリスト構造を変更しますが、setcarsetcdrは新しいCARまたはCDRをreturnするのにたいし、Common Lispの関数はコンスセルをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6.1 Altering List Elements with setcar

コンスセルのCARの変更は、setcarにより行なわれます。リストにたいして使用された場合、setcarはリストの1つの要素を、他の要素に置き換えます。

Function: setcar cons object

この関数は、以前のCARを置き換えて、consの新しいCARobjectを格納します。他の言い方をすると、この関数はconsCARスロットを、objectを参照するように変更します。この関数は値objectをreturnします。たとえば:

(setq x '(1 2))
     ⇒ (1 2)
(setcar x 4)
     ⇒ 4
x
     ⇒ (4 2)

コンスセルが、複数のリストが共有された構造の一部の場合、コンスに新しいCARを格納することにより、これら共有されたリストの各1つの要素を変更します。以下は例です:

;; 部分的に共有された2つのリストを作成。
(setq x1 '(a b c))
     ⇒ (a b c)
(setq x2 (cons 'z (cdr x1)))
     ⇒ (z b c)

;; 共有されたリンクのCARを置き換え。
(setcar (cdr x1) 'foo)
     ⇒ foo
x1                           ; 両方のリストが変更された。
     ⇒ (a foo c)
x2
     ⇒ (z foo c)

;; 共有されていないリンクのCARを置き換え。
(setcar x1 'baz)
     ⇒ baz
x1                           ; 1つのリストだけが変更された。
     ⇒ (baz foo c)
x2
     ⇒ (z foo c)

なぜbを置き換えると両方が変更されるのかを説明するために、変数x1x2の2つのリストによる共有構造を視覚化してみましょう:

        --- ---        --- ---      --- ---
x1---> |   |   |----> |   |   |--> |   |   |--> nil
        --- ---        --- ---      --- ---
         |        -->   |            |
         |       |      |            |
          --> a  |       --> b        --> c
                 |
       --- ---   |
x2--> |   |   |--
       --- ---
        |
        |
         --> z

同じ関係を別のボックス図で示すと、以下のようになります:

x1:
 --------------       --------------       --------------
| car   | cdr  |     | car   | cdr  |     | car   | cdr  |
|   a   |   o------->|   b   |   o------->|   c   |  nil |
|       |      |  -->|       |      |     |       |      |
 --------------  |    --------------       --------------
                 |
x2:              |
 --------------  |
| car   | cdr  | |
|   z   |   o----
|       |      |
 --------------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6.2 Altering the CDR of a List

CDRを変更するもっとも低レベルの基本関数は、setcdrです:

Function: setcdr cons object

この関数は前のCDRを置き換えて、consの新しいCDRobjectを格納します。他の言い方をすると、この関数はconsCDRを、objectを参照するように変更します。この関数は値objectをreturnします。

以下はリストのCDRを、他のリストに置き換える例です。1番目の要素以外のすべての要素は、別のシーケンスまたは要素のために取り除かれます。1番目の要素はリストのCARなので変更されず、CDRを通じて到達することもできないからです。

(setq x '(1 2 3))
     ⇒ (1 2 3)
(setcdr x '(4))
     ⇒ (4)
x
     ⇒ (1 4)

リスト内のコンスセルのCDRを変更することにより、リストの途中から要素を削除できます。たとえば以下では、1番目のコンスセルのCDRを変更することにより、2番目の要素bを、リスト(a b c)から削除します。

(setq x1 '(a b c))
     ⇒ (a b c)
(setcdr x1 (cdr (cdr x1)))
     ⇒ (c)
x1
     ⇒ (a c)

以下に結果をボックス表記で示します:

                   --------------------
                  |                    |
 --------------   |   --------------   |    --------------
| car   | cdr  |  |  | car   | cdr  |   -->| car   | cdr  |
|   a   |   o-----   |   b   |   o-------->|   c   |  nil |
|       |      |     |       |      |      |       |      |
 --------------       --------------        --------------

以前は要素bを保持していた2番目のコンスセルは、依然として存在して、そのCARbのままですが、すでにこのリストの一部を形成していません。

CDRを変更して、新しい要素を挿入するのも、同じくらい簡単です:

(setq x1 '(a b c))
     ⇒ (a b c)
(setcdr x1 (cons 'd (cdr x1)))
     ⇒ (d b c)
x1
     ⇒ (a d b c)

以下に結果をボックス表記で示します:

 --------------        -------------       -------------
| car  | cdr   |      | car  | cdr  |     | car  | cdr  |
|   a  |   o   |   -->|   b  |   o------->|   c  |  nil |
|      |   |   |  |   |      |      |     |      |      |
 --------- | --   |    -------------       -------------
           |      |
     -----         --------
    |                      |
    |    ---------------   |
    |   | car   | cdr   |  |
     -->|   d   |   o------
        |       |       |
         ---------------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.6.3 Functions that Rearrange Lists

以下では、リストの構成要素であるコンスセルのCDRを変更することにより、リストを“破壊的”に再配置する関数をいくつか示します。これらの関数が“破壊的”だという理由は、これらの関数が引数として渡された元のリストを処理して、return値となる新しいリストを形成するために、リストのコンスセルを再リンクするからです。

コンスセルを変更する他の関数については、Using Lists as Setsdelqを参照してください。

Function: nconc &rest lists

この関数は、listsの要素すべてを含むリストをreturnします。append (Building Cons Cells and Listsを参照してください)とは異なり、listsはコピーされません。かわりにlistsの各リストの最後のCDRが、次のリストを参照するように変更されます。listsの最後のリストは、変更されません。たとえば:

(setq x '(1 2 3))
     ⇒ (1 2 3)
(nconc x '(4 5))
     ⇒ (1 2 3 4 5)
x
     ⇒ (1 2 3 4 5)

nconcの最後の引数は変更されないので、上記の例のように、'(4 5)のような定数リストを使用するのが理に適っています。また、同じ理由により、最後の引数がリスとである必要はありません。

(setq x '(1 2 3))
     ⇒ (1 2 3)
(nconc x 'z)
     ⇒ (1 2 3 . z)
x
     ⇒ (1 2 3 . z)

しかし、(最後を除くすべての)他の引数はリストでなければなりません。

一般的な落とし穴としては、nconcにたいしてクォートされたリスト定数を、最後以外の引数として使用したときです。これを行なう場合、実行するごとにプログラムはリスト定数を変更するでしょう! 何が起こるのかを以下に示します:

(defun add-foo (x)            ; この関数ではfoo
  (nconc '(foo) x))           ;   を引数の前に追加させたい。

(symbol-function 'add-foo)
     ⇒ (lambda (x) (nconc (quote (foo)) x))

(setq xx (add-foo '(1 2)))    ; 動いているように見える。
     ⇒ (foo 1 2)
(setq xy (add-foo '(3 4)))    ; 何が起きているのか?
     ⇒ (foo 1 2 3 4)
(eq xx xy)
     ⇒ t

(symbol-function 'add-foo)
     ⇒ (lambda (x) (nconc (quote (foo 1 2 3 4) x)))
Function: nreverse list

この関数は、listの要素の順番を逆転します。reverseとは異なり、nreverseはリストを形成するCDR内のコンスセルを逆転することにより、引数を変更します。listの最後に使用されているコンスセルは、最初のコンスセルになります。

たとえば:

(setq x '(a b c))
     ⇒ (a b c)
x
     ⇒ (a b c)
(nreverse x)
     ⇒ (c b a)
;; 最初のコンスセルが最後になった。
x
     ⇒ (a)

わたしたちは通常、混乱を避けるために、nreverseの結果を、元のリストを保持していたのと同じ変数に格納します:

(setq x (nreverse x))

以下は、(a b c)を視覚的に表した、nreverseの例です:

元のリストの先頭:                         逆転されたリスト:
 -------------        -------------        ------------
| car  | cdr  |      | car  | cdr  |      | car | cdr  |
|   a  |  nil |<--   |   b  |   o  |<--   |   c |   o  |
|      |      |   |  |      |   |  |   |  |     |   |  |
 -------------    |   --------- | -    |   -------- | -
                  |             |      |            |
                   -------------        ------------
Function: sort list predicate

この関数は、listを安定的(しかし破壊的)にソートして、ソートされたリストをreturnします。この関数はpredicateを使用して要素を比較します。安定ソート(stable sort)では、同じソートキーをもつ要素が、ソートの前後で相対的に同じ順序が維持されます。安定性は、異なる条件によりソートするために要素を並び替えるために、連続したソートが使用されるときに重要です。

引数predicateは、2つの引数をとる関数でなければなりません。この関数はlistの2つの要素を引数として呼び出されます。昇順のソートを得るためのpredicateは、1番目の引数が、2番目の引数より“小さい”ときは非nil、それ以外はnilをreturnするようにします。

比較関数predicateは、少なくとも単独のsort呼び出しにおいて、任意の与えられた引数にたいして信頼できる結果を与えなければありません。比較関数は非対称的(antisymmetric) — つまりabより小さいとき、baより小さくない — でなければなりません。比較関数は推移的(transitive) — つまりabより小さく、bcより小さい場合、caより小さい — でなければなりません。これらの要求を満たさない比較関数を使用した場合、sortの結果は予測できません。

sortの破壊的な側面は、CDRを変更することにより、listを形成するコンスセルを再配置することです。非破壊的なソート関数の場合は、ソートされた要素を格納するために、あたらしいコンスセルを作成します。元のリストを破壊せずにソートされたコピーを作成したい場合は、copy-sequenceで最初にコピーしてから、それをソートします。

ソートはlist内のコンスセルのCARは変更しません。list内でCARに要素aを保持していたコンスセル、ソート後にもaを保持しますが、CDRは変更されるので、ソート後の位置は異なります。たとえば:

(setq nums '(1 3 2 6 5 4 0))
     ⇒ (1 3 2 6 5 4 0)
(sort nums '<)
     ⇒ (0 1 2 3 4 5 6)
nums
     ⇒ (1 2 3 4 5 6)

警告: numsのリストには0が含まれていないことに注意してください。これは前と同じコンスセルですが、リストの1番目ではなくなります。引数を保持するように形成された変数が、ソートされたリストでも保持されると仮定しないでください! かわりにsortの結果を保存して、それを使用してください。元のリストを保持していた変数に、結果を書き戻すことはよく行なわれます。

(setq nums (sort nums '<))

ソート処理を行なう他の関数については、Sorting Textを参照してください。sortの有用な例は、Access to Documentation Stringsdocumentationを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.7 Using Lists as Sets

リストは順序なしの数学的集合 — リスト内に要素があれば集合の要素の値とされ、リスト内の順序は無視される — を表すことができます。2つの集合を結合(union)するには、(重複する要素を気にしない場合は)appendを使用します。equalである重複を取り除くには、delete-dupsを使用します。集合にたいする他の有用な関数には、memqdelq、およびこれらのequalバージョンであるmemberdeleteが含まれます。

Common Lispに関する注意: 集合を処理するために、Common Lispには(要素の重複がない)関数unionがあります。これらの関数は標準のGNU Emacs Lispにはありませんが、cl-libはこれらを提供します。Lists as Sets in Common Lisp Extensionsを参照してください。

Function: memq object list

この関数は、objectlistのメンバーかどうかをテストします。メンバーの場合、memqobjectで最初に見つかった要素から開始されるリストをreturnします。メンバーでない場合は、nilをreturnします。memqの文字‘q’は、この関数がobjectとリスト内の要素の比較に、eqを使用することを示します。たとえば:

(memq 'b '(a b c b a))
     ⇒ (b c b a)
(memq '(2) '((1) (2)))    ; (2)(2)eqではない。
     ⇒ nil
Function: delq object list

この関数listからはobjecteqなすべての要素を破壊的に取り除いて、結果のリストをreturnします。delqの文字‘q’は、この関数がobjectとリスト内の要素の比較に、eqを使用することを示します(memqremqと同様)。

delqを呼び出すときは通常、元のリストを保持していた変数にreturn値を割り当てて使用する必要があります(理由は以下参照)。

delq関数がリストの銭湯にある要素を削除する場合は、単にリストを読み進めて、この要素の後から開始される部分リストをreturnします。つまり:

(delq 'a '(a b c)) ≡ (cdr '(a b c))

リストの途中にある要素を削除するときは、必要なCDR(Altering the CDR of a Listを参照してください)を変更することにより削除します。

(setq sample-list '(a b c (4)))
     ⇒ (a b c (4))
(delq 'a sample-list)
     ⇒ (b c (4))
sample-list
     ⇒ (a b c (4))
(delq 'c sample-list)
     ⇒ (a b (4))
sample-list
     ⇒ (a b (4))

(delq 'a sample-list)は何も取り除きませんが(これは単に短いリストをreturnします)、(delq 'c sample-list)は3番目の要素を取り除いて、sample-listを変更することに注意してください。引数listを保持するように形成された変数が、実行後にもっと少ない要素になる、または元のリストを保持すると仮定しないでください! かわりにdelqの結果を保存して、それを使用してください。元のリストを保持していた変数に、結果を書き戻すことはよく行なわれます。

(setq flowers (delq 'rose flowers))

以下の例では、delqが比較しようとしている(4)と、sample-list内の(4)は、eqではありません:

(delq '(4) sample-list)
     ⇒ (a c (4))

与えられた値とequalな要素を削除したい場合は、delete(以下参照)を使用してください。

Function: remq object list

この関数は、objecteqなすべての要素が除かれた、listのコピーをreturnします。remqの文字‘q’は、この関数がobjectとリスト内の要素の比較に、eqを使用することを示します。

(setq sample-list '(a b c a b c))
     ⇒ (a b c a b c)
(remq 'a sample-list)
     ⇒ (b c b c)
sample-list
     ⇒ (a b c a b c)
Function: memql object list

関数memqlは、eql(浮動少数の要素は値で比較される)を使用してメンバーとeqlを比較することにより、objectlistのメンバーかどうかをテストします。objectがメンバーの場合、memqllist内で最初に見つかった要素から開始されるリストをreturnします。それ以外はnilをreturnします。

これをmemqと比較してみましょう:

(memql 1.2 '(1.1 1.2 1.3))  ; 1.21.2eql
     ⇒ (1.2 1.3)
(memq 1.2 '(1.1 1.2 1.3))  ; 1.21.2eqではない。
     ⇒ nil

以下の3つの関数はmemqdelqremqと似ていますが、要素の比較にeqではなく、equalを使用します。Equality Predicatesを参照してください。

Function: member object list

関数memberは、メンバーとobjectequalを使用して比較して、objectlistのメンバーかどうかをテストします。objectがメンバーの場合、memberlistで最初に見つかったところから開始されるリストをreturnします。それ以外はnilを参照してください。

これをmemqと比較してみましょう:

(member '(2) '((1) (2)))  ; (2) and (2) are equal.
     ⇒ ((2))
(memq '(2) '((1) (2)))    ; (2)(2)eqではない。
     ⇒ nil
;; 同じ内容の2つの文字列はequal
(member "foo" '("foo" "bar"))
     ⇒ ("foo" "bar")
Function: delete object sequence

この関数は、sequenceからobjectequalな要素を取り除いて、結果のシーケンスをreturnします。

sequenceがリストの場合、deletedelqに対応するように、membermemqに対応します。つまり、この関数はmemberと同様、要素とobjectの比較にequalを使用します。マッチする要素が見つかったら、delqが行なうように、その要素を取り除きます。delqと同様、通常は元のリストを保持していた変数にreturn値を割り当てて使用します。

sequenceがベクターまたは文字列の場合、deleteobjectequalなすべての要素を取り除いた、sequenceのコピーをreturnします。

たとえば:

(setq l '((2) (1) (2)))
(delete '(2) l)
     ⇒ ((1))
l
     ⇒ ((2) (1))
;; lの変更に信頼性を要するときは
;; (setq l (delete '(2) l))と記述する。
(setq l '((2) (1) (2)))
(delete '(1) l)
     ⇒ ((2) (2))
l
     ⇒ ((2) (2))
;; このケースではlのセットの有無に違いはない
;; しかし他のケースに倣ってセットするべき。
(delete '(2) [(2) (1) (2)])
     ⇒ [(1)]
Function: remove object sequence

この関数は、deleteに対応する非破壊的な関数です。この関数は、objectequalな要素を取り除いた、sequence(リスト、ベクター、文字列)のコピーをreturnします。たとえば:

(remove '(2) '((2) (1) (2)))
     ⇒ ((1))
(remove '(2) [(2) (1) (2)])
     ⇒ [(1)]

Common Lispに関する注意: GNU Emacs Lispの関数memberdeleteremoveは、Common Lispではなく、Maclispを継承しています。Common Lispでは、比較にequalを使用しません。

Function: member-ignore-case object list

この関数は、memberと同様ですが、objectが文字列で、大文字小文字とテキスト表現の違いを無視します。文字の大文字と小文字は等しいものとして扱われ、比較に先立ちユニバイト文字列はマルチバイト文字列に変換されます。

Function: delete-dups list

この関数は、listからすべてのequalな重複を、破壊的に取り除いて。、結果をlistに保管して、それをreturnします。list内の要素にequalな要素がいくつかある場合、delete-dupsは最初の要素を残します。

変数に格納されたリストに要素を追加したり、それを集合として使用する方法については、Modifying List Variablesの関数add-to-listも参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.8 Association Lists

連想配列(association list。短くはalist)は、キーと値のマッピングを記録します。これは連想(associations)と呼ばれるコンスセルのリストです。各コンスセルにおいて、CARキー(key)で、CDR連想値(associated value)になります。3

以下はalistの例です。キーpineは、値conesに関連付けられます。キーoakは、acornsに関連付けられます。キーmapleは、seedsに関連付けられます。

((pine . cones)
 (oak . acorns)
 (maple . seeds))

alist内の値とキーには、任意のLispオブジェクトを指定できます。たとえば以下のalist0では、シンボルaは数字1に、文字列"b"リスト(2 3)(alist要素のCDR)に関連付けられます。

((a . 1) ("b" 2 3))

要素のCDRCARに連想値を格納するようにalistデザインするほうがよい場合があります。以下は、そのようなalistです。

((rose red) (lily white) (buttercup yellow))

この例では、redroseに関連付けられる値だと考えます。この種のalistの利点は、CDRCDRの中に、他の関連する情報 — 他のアイテムのリストでさえ — を格納することができることです。不利な点は、与えられた値を含む要素を見つけるためにrassq(以下参照)を使用できないことです。これらを検討することが重要でない場合には、任意の与えられたalistにたいして一貫している限り、選択は好みの問題といえます。

上記で示したのと同じalistは、要素のCDRに連想値をもつと考えることができます。この場合、roseに関連付けられる値は、リスト(red)になるでしょう。

連想リストは、新しい連想を簡単にリストの先頭に追加できるので、スタックに保持したいような情報を記録するのによく使用されます。連想リストから与えられたキーにたいする連想を検索する場合、それが複数ある場合は、最初に見つかったものがreturnされます。

Emacs Lispでは、連想リストがコンスセルではない場合、それはエラーではありません。alist検索関数は、単にそのような要素を無視します。多くの他のバージョンのLいspでは、このような場合はエラーをシグナルします。

いくつかの観点において、プロパティーリストは連想リストと似ていることに注意してください。それぞれのキーが1度だけ出現するような場合、プロパティーリストは連想リストと同様に振る舞います。プロパティーリストと連想リストの比較については、Property Listsを参照してください。

Function: assoc key alist

この関数は、alist要素にたいしてkeyを比較するのにequalを使用して、alist内からkeyをもつ最初の連想をreturnします。CARkeyequalの連想がalistにない場合、この関数はnilをreturnします。たとえば:

(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
     ⇒ ((pine . cones) (oak . acorns) (maple . seeds))
(assoc 'oak trees)
     ⇒ (oak . acorns)
(cdr (assoc 'oak trees))
     ⇒ acorns
(assoc 'birch trees)
     ⇒ nil

以下はキーと値がシンボルでない場合の例です:

(setq needles-per-cluster
      '((2 "Austrian Pine" "Red Pine")
        (3 "Pitch Pine")
        (5 "White Pine")))

(cdr (assoc 3 needles-per-cluster))
     ⇒ ("Pitch Pine")
(cdr (assoc 2 needles-per-cluster))
     ⇒ ("Austrian Pine" "Red Pine")

関数assoc-stringassocと似ていますが、文字列間の特定の違いを無視する点が異なります。Comparison of Characters and Stringsを参照してください。

Function: rassoc value alist

この関数は、alistの中から、値valueをもつ最初の連想をreturnします。CDRvalueequalの連想がalistにない場合、この関数はnilをreturnします。

rassocassocと似ていますが、CARではなく、alistの連想のCDRを比較します。この関数を、与えられた値に対応するキーを探す、“reverse assoc”と考えることができます。

Function: assq key alist

この関数は、alistからkeyをもつ最初の連想をreturnする点はassocと同様ですが、比較にequalではなくeqを使用します。CARkeyeqな連想がalist内に存在しない場合、assqnilをreturnします。eqequalより早く、ほとんどのalistはキーにシンボルを使用するので、この関数はassocより多用されます。Equality Predicatesを参照してください。

(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))
     ⇒ ((pine . cones) (oak . acorns) (maple . seeds))
(assq 'pine trees)
     ⇒ (pine . cones)

反対に、キーがシンボルではないalistでは通常、assqは有用ではありません:

(setq leaves
      '(("simple leaves" . oak)
        ("compound leaves" . horsechestnut)))

(assq "simple leaves" leaves)
     ⇒ nil
(assoc "simple leaves" leaves)
     ⇒ ("simple leaves" . oak)
Function: rassq value alist

この関数は、alist内から値valueをもつ最初の連想をreturnします。alist内にCDRvalueeqな連想が存在しない場合は、nilをreturnします。

rassqassqと似ていますが、CARではなく、alistの各連想のCDRを比較します。この関数を、与えられた値に対応するキーを探す、“reverse assq”と考えることができます。

たとえば:

(setq trees '((pine . cones) (oak . acorns) (maple . seeds)))

(rassq 'acorns trees)
     ⇒ (oak . acorns)
(rassq 'spores trees)
     ⇒ nil

rassqは、要素のCDRCARに保管された値の検索はできません:

(setq colors '((rose red) (lily white) (buttercup yellow)))

(rassq 'white colors)
     ⇒ nil

この場合、連想(lily white)CDRwhiteではなく、リスト(white)です。これは連想をドットペア表記で記述すると明確になります:

(lily white) ≡ (lily . (white))
Function: assoc-default key alist &optional test default

この関数は、keyにたいするマッチをalistから検索します。alistの各要素にたいして、この関数は、keyと要素(アトムの場合)、または要素のCAR(コンスの場合)を比較します。比較はtestに2つの引数 — 要素(または要素のCAR)とkey — を与えて呼び出すことにより行なわれます。引数はこの順番で渡されるので、正規表現(Regular Expression Searchingを参照してください)を含むalistでは、string-matchを使用することにより有益な結果を得ることができます。testが省略されているかnilの場合は、比較にequalが使用されます。

alistの要素がこの条件によりkeyとマッチした場合、assoc-defaultはこの要素の値をreturnします。要素がコンスの場合、値は要素のCDRです。それ以外の場合、return値はdefaultです。

keyにマッチする要素がalistに存在しない場合、assoc-defaultnilをreturnします。

Function: copy-alist alist

この関数は、深さ2がレベルのalistのコピーをreturnします。この関数は各連想の新しいコピーを作成するので、元のalistを変更せずに、新しいalistを変更できます。

(setq needles-per-cluster
      '((2 . ("Austrian Pine" "Red Pine"))
        (3 . ("Pitch Pine"))
        (5 . ("White Pine"))))
⇒
((2 "Austrian Pine" "Red Pine")
 (3 "Pitch Pine")
 (5 "White Pine"))

(setq copy (copy-alist needles-per-cluster))
⇒
((2 "Austrian Pine" "Red Pine")
 (3 "Pitch Pine")
 (5 "White Pine"))

(eq needles-per-cluster copy)
     ⇒ nil
(equal needles-per-cluster copy)
     ⇒ t
(eq (car needles-per-cluster) (car copy))
     ⇒ nil
(cdr (car (cdr needles-per-cluster)))
     ⇒ ("Pitch Pine")
(eq (cdr (car (cdr needles-per-cluster)))
    (cdr (car (cdr copy))))
     ⇒ t

以下の例は、どのようにしてcopy-alistが他に影響を与えずにコピーの連想を変更可能なのかを示します:

(setcdr (assq 3 copy) '("Martian Vacuum Pine"))
(cdr (assq 3 needles-per-cluster))
     ⇒ ("Pitch Pine")
Function: assq-delete-all key alist

この関数は、alistから、(delqを使用した場合は、そのような要素を1つずつ削除するのにたいして)CARkeyeqな要素すべてを削除します。この関数は短くなったalistをreturnし、alistの元のリスト構造を変更することもよくあります。正しい結果を得るために、alistに保存された値ではなく、assq-delete-allのreturn値を使用してください。

(setq alist '((foo 1) (bar 2) (foo 3) (lose 4)))
     ⇒ ((foo 1) (bar 2) (foo 3) (lose 4))
(assq-delete-all 'foo alist)
     ⇒ ((bar 2) (lose 4))
alist
     ⇒ ((foo 1) (bar 2) (lose 4))
Function: rassq-delete-all value alist

この関数は、alistからCDRvalueeqなすべての要素を削除します。この関数は短くなったリストをreturnし、alistの元のリスト構造を変更することもよくあります。rassq-delete-allassq-delete-allと似ていますが、CARではなくalistの各連想のCDRを比較します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.9 Property Lists

プロパティーリスト(property list。短くはplist)は、ペアになった要素のリストです。各ペアはプロパティー名(通常はシンボル)とプロパティー値を対応づけます。以下はプロパティーリストの例です:

(pine cones numbers (1 2 3) color "blue")

このプロパティーリストは、pineconesnumbers(1 2 3)color"blue"に関連づけます。プロパティー名とプロパティー値には任意のLispオブジェクトを指定できますが、通常プロパティー名は(この例のように)シンボルです。

いくつかのコンテキストでプロパティーリストが使用されます。たとえば、関数put-text-propertyはプロパティーリストを引数にとり、文字列またはバッファー内のテキストにたいして、テキストプロパティーと、テキストに適用するプロパティー値を指定します。Text Propertiesを参照してください。

プロパティーリストが頻繁に使用される他の例は、シンボルプロパティーの保管です。すべてのシンボルは、シンボルに関する様々な情報を記録するために、プロパティーのリストを処理します。これらのプロパティーはプロパティーリストの形式で保管されます。Symbol Propertiesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.9.1 Property Lists and Association Lists

連想リスト(Association Listsを参照してください)は、プロパティーリストとよく似ています。連想リストとは対照的に、プロパティー名は一意でなければならないので、プロパティーリスト内でペアの順序に意味はありません。

様々なLisp関数や変数に情報を付加するためには、連想リストよりプロパティーリストの方が適しています。プログラムでこのような情報すべてを1つの連想リストに保持する場合、特定のLisp関数や変数にたいする連想をチェックする度に、リスト全体を検索する必要が生じ、それにより遅くなる可能性があります。対照的に、関数名や変数自体のプロパティーリストに同じ情報を保持すれば、検索ごとにそのプロパティーリストの長さだけを検索するようになり、通常はこちらの方が短い時間で済みます。変数のドキュメントがvariable-documentationという名前のプロパティーに記録されているのは、これが理由です。同様にバイトコンパイラーも、特別に扱う必要がある関数を記録するためにプロパティーを使用します。

連想リストにも独自の利点があります。アプリケーションに依存しますが、プロパティーを更新するより、連想リストの先頭に連想を追加する方が速いでしょう。シンボルにたいするすべてのプロパティーは同じプロパティーリストに保管されるので、プロパティー名を異なる用途のために使用すると衝突の可能性があります(この理由により、そのプログラムで通常の変数や関数の名前につけるプレフィクスをプロパティー名の先頭につけることにより、一意と思われるプロパティー名を選ぶのはよいアイデアです)。連想リストは、連想をリストの先頭にpushし、後にある連想は無視されるので、スタックと同様に使用できます。これはプロパティーリストでは不可能です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.9.2 Property Lists Outside Symbols

以下の関数はプロパティーリストを操作するために使用されます。これらの関数はすべて、プロパティー名の比較にeqを使用します。

Function: plist-get plist property

この関数は、プロパティーリストplistに保管された、プロパティーpropertyの値をreturnします。この関数には、変形された(malformed)plist引数を指定できます。plistpropertyが見つからなかった場合、この関数はnilをreturnします。たとえば、

(plist-get '(foo 4) 'foo)
     ⇒ 4
(plist-get '(foo 4 bad) 'foo)
     ⇒ 4
(plist-get '(foo 4 bad) 'bad)
     ⇒ nil
(plist-get '(foo 4 bad) 'bar)
     ⇒ nil
Function: plist-put plist property value

この関数は、プロパティーリストplistに、プロパティーpropertyの値として、valueを保管します。この関数はplistを破壊的に変更するかもしれず、元のリスト構造を変更せずに新しいリストを構築することもあります。この関数は変更されたプロパティーリストをreturnするので、plistを取得した場所に書き戻すことができます。たとえば、

(setq my-plist '(bar t foo 4))
     ⇒ (bar t foo 4)
(setq my-plist (plist-put my-plist 'foo 69))
     ⇒ (bar t foo 69)
(setq my-plist (plist-put my-plist 'quux '(a)))
     ⇒ (bar t foo 69 quux (a))
Function: lax-plist-get plist property

plist-getと同様ですが、プロパティーの比較にeqではなくequalを使用します。

Function: lax-plist-put plist property value

plist-putと同様ですが、プロパティーの比較にeqではなくequalを使用します。

Function: plist-member plist property

この関数は与えられたpropertyplistに含まれる場合は、非nilをreturnします。plist-getとは異なり、この関数は存在しないプロパティーと、値がnilのプロパティーを区別できます。実際にreturnされる値は、carpropertyで始まる、plistの後尾部分です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6 Sequences, Arrays, and Vectors

シーケンス(sequence)型は、2つの異なるLisp型 — リストと配列 — を結合した型です。他の言い方をすると、任意のリストはシーケンスであり、任意の配列はシーケンスです。すべてのシーケンスがもつ共通な属性は、それぞれが順序づけされた要素のコレクションであることです。

配列(array)は各スロットが要素である、固定長のオブジェクトです。すべての要素に一定時間でアクセスできます。配列の4つの型として、文字列、ベクター、文字テーブル、ブールベクターがあります。

リストは要素のシーケンスですが、要素は単一の基本オブジェクトではありません。リストはコンスセルにより作られ、要素ごとに1つのセルをもちます。n番目の要素を探すには、n個のコンスセルを走査する必要があるので、先頭から離れた要素ほどアクセスに時間を要します。しかしリストは要素の追加や削除が可能です。

以下の図は、これらの型の関連を表します:

          _____________________________________________
         |                                             |
         |          Sequence                           |
         |  ______   ________________________________  |
         | |      | |                                | |
         | | List | |             Array              | |
         | |      | |    ________       ________     | |
         | |______| |   |        |     |        |    | |
         |          |   | Vector |     | String |    | |
         |          |   |________|     |________|    | |
         |          |  ____________   _____________  | |
         |          | |            | |             | | |
         |          | | Char-table | | Bool-vector | | |
         |          | |____________| |_____________| | |
         |          |________________________________| |
         |_____________________________________________|

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.1 Sequences

このセクションでは、任意の種類のシーケンスを許す関数を説明します。

Function: sequencep object

この関数は、objectがリスト、ベクター、文字列、ブールベクター、文字テーブルの場合はt、それ以外はnilをreturnします。

Function: length sequence

この関数は、sequence内の要素の数をreturnします。sequenceがドットリストの場合、wrong-type-argumentエラーがシグナルされます。循環リストは無限ループを引き起こします。文字テーブルでは、Emacsの最大文字コードより、常に1大きい値がreturnされます。

関連する関数safe-lengthについては、Definition of safe-lengthを参照してください。

(length '(1 2 3))
    ⇒ 3
(length ())
    ⇒ 0
(length "foobar")
    ⇒ 6
(length [1 2 3])
    ⇒ 3
(length (make-bool-vector 5 nil))
    ⇒ 5

Text Representationsstring-bytesも参照してください。

ディスプレー上での文字列の幅を計算する必要がある場合、文字数だけを数えて各文字のディスプレー幅を計算しないlengthではなく、string-width (Size of Displayed Textを参照してください)を使用するべきです。

Function: elt sequence index

この関数は、indexによりインデックスづけされた、sequenceの要素をreturnします。indexの値として妥当なのは、0からsequenceの長さより1小さい数までの範囲の整数です。sequenceがリストの場合、範囲外の値はnthと同じように振る舞います。Definition of nthを参照してください。それ以外の場合、範囲外の値はargs-out-of-rangeエラーを引き起こします。

(elt [1 2 3 4] 2)
     ⇒ 3
(elt '(1 2 3 4) 2)
     ⇒ 3
;; eltがどの文字をreturnするか明確にするためにstringを使用。
(string (elt "1234" 2))
     ⇒ "3"
(elt [1 2 3 4] 4)
     error→ Args out of range: [1 2 3 4], 4
(elt [1 2 3 4] -1)
     error→ Args out of range: [1 2 3 4], -1

この関数は、aref (Functions that Operate on Arraysい)とnth (Definition of nthを参照してください)を一般化したものです。

Function: copy-sequence sequence

この関数は、sequenceのコピーをreturnします。コピーは元のシーケンスと同じ型で、同じ要素が同じ順番でもちます。

コピーに新しい要素を格納するのは、元のsequenceに影響を与えず、その逆も真です。しかし新しいシーケンス内の要素がコピーされたものでない場合は、元のシーケンスの要素と同一(eq)になります。したがって、コピーされたシーケンスを通じて見つかった要素を変更すると、この変更は元のシーケンスでも見ることができます。

シーケンスがテキストプロパティーをともなう文字列の場合、コピー内のプロパティーリスト自身もコピーとなり、元のシーケンスのプロパティーリストと共有はされません。しかし、プロパティーリストの実際の値は共有されます。Text Propertiesを参照してください。

この関数は、ドットリストでは機能しません。循環リストのコピーは、無限ループを起こすでしょう。

シーケンスをコピーする別の方法は、Building Cons Cells and ListsappendCreating StringsconcatFunctions for Vectorsvconcatも参照してください。

(setq bar '(1 2))
     ⇒ (1 2)
(setq x (vector 'foo bar))
     ⇒ [foo (1 2)]
(setq y (copy-sequence x))
     ⇒ [foo (1 2)]

(eq x y)
     ⇒ nil
(equal x y)
     ⇒ t
(eq (elt x 1) (elt y 1))
     ⇒ t

;; 一方のシーケンスの要素を置き換え。
(aset x 0 'quux)
x ⇒ [quux (1 2)]
y ⇒ [foo (1 2)]

;; 共有された要素の内部を変更。
(setcar (aref x 1) 69)
x ⇒ [quux (69 2)]
y ⇒ [foo (69 2)]

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 Arrays

配列(array)オブジェクトは、いくつかのLispオブジェクトを保持するスロットをもち、これらのオブジェクトは配列の要素と呼ばれます。配列内の任意の要素は、一定時間でアクセスされます。対照的に、リスト内の要素のアクセスに要する時間は、その要素がリスト内のどの位置にあるかに比例します。

Emacsは4つの配列型 —文字列(strings。String Typeを参照してください)ベクター(vectors。Vector Typeを参照してください)ブールベクター(bool-vectors。Bool-Vector Typeを参照してください)文字テーブル(char-tables。Char-Table Typeを参照してください) — を定義し、これらはすべて1次元です。ベクターと文字テーブルは任意の型の要素を保持できますが、文字列は文字だけ、ブールベクターはtnilしか保持できません。

4種のすべての配列は、これらの特性を共有します:

配列を作成したとき、文字テーブル以外では、長さを指定しなければなりません。文字テーブルの長さは、文字コードの範囲により決定されるので、長さを指定できません。

原則として、テキスト文字の配列が欲しい場合は、文字列とベクターのどちらかを使用できます。実際のところ、そのような用途にたいしては、4つの理由により、わたしたちは常に文字列を選択します:

対照的に、(キーシーケンスのような)キーボード入力文字の配列では、多くのキーボード入力文字は、文字列に収まる範囲の外にあるので、ベクターが必要になるでしょう。Key Sequence Inputを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.3 Functions that Operate on Arrays

このセクションでは、すべての型の配列に適用される関数を説明します。

Function: arrayp object

この関数は、objectが配列(ベクター、文字列、ブールベクター、文字テーブル)の場合は、tをreturnします。

(arrayp [a])
     ⇒ t
(arrayp "asdf")
     ⇒ t
(arrayp (syntax-table))    ;; 文字テーブル。
     ⇒ t
Function: aref array index

この関数は、arrayindex番目の要素をreturnします。1番目の要素のインデクスは0です。

(setq primes [2 3 5 7 11 13])
     ⇒ [2 3 5 7 11 13]
(aref primes 4)
     ⇒ 11
(aref "abcdefg" 1)
     ⇒ 98           ; b’のASCIIコードは98。

Sequencesの関数eltも参照してください。

Function: aset array index object

この関数は、arrayindex番目の要素を、objectにセットします。この関数はobjectをeturnします。

(setq w [foo bar baz])
     ⇒ [foo bar baz]
(aset w 0 'fu)
     ⇒ fu
w
     ⇒ [fu bar baz]

(setq x "asdfasfd")
     ⇒ "asdfasfd"
(aset x 3 ?Z)
     ⇒ 90
x
     ⇒ "asdZasfd"

arrayが文字列でobjectが文字でない場合、結果はwrong-type-argumentエラーになります。この関数は、文字列の挿入で必要な場合は、ユニバイト文字列をマルチバイト文字列に変換します。

Function: fillarray array object

この関数は配列arrayobjectで充填するので、arrayのすべての要素はobjectになります。この関数はarrayをreturnします。

(setq a [a b c d e f g])
     ⇒ [a b c d e f g]
(fillarray a 0)
     ⇒ [0 0 0 0 0 0 0]
a
     ⇒ [0 0 0 0 0 0 0]
(setq s "When in the course")
     ⇒ "When in the course"
(fillarray s ?-)
     ⇒ "------------------"

arrayが文字列でobjectが文字でない場合、結果はwrong-type-argumentエラーになります。

配列と判っているオブジェクトにたいしては、一般的なシーケンス関数copy-sequenceおよびlengthが有用なときが多くあります。Sequencesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4 Vectors

ベクター(vector)とは、任意のLispオブジェクトを要素にもつことができる、一般用途のための配列です(対照的に、文字列の要素は文字だけですStrings and Charactersを参照してください)。Emacsではベクターは、キーシーケンス(Key Sequencesを参照してください)、シンボル検索用のテーブル(Creating and Interning Symbolsを参照してください)、バイトコンパイルされた関数表現の一部(Byte Compilationを参照してください)など、多くの目的で使用されます。

他の配列と同様、ベクターは0基準のインデックスづけを使用し、1番目の要素はインデックス0になります。

ベクターは、角カッコ(square brackets)で囲まれた要素としてプリントされます。したがって、シンボルabaを要素にもつベクターは、[a b a]とプリントされます。Lisp入力として、同じ方法でベクターを記述できます。

文字列や数値と同様に、ベクターは定数として評価され、評価された結果は同じベクターになります。ベクターの要素は評価も確認もされません。Self-Evaluating Formsを参照してください。

以下はこれらの原理を表す例です:

(setq avector [1 two '(three) "four" [five]])
     ⇒ [1 two (quote (three)) "four" [five]]
(eval avector)
     ⇒ [1 two (quote (three)) "four" [five]]
(eq avector (eval avector))
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.5 Functions for Vectors

ベクターに関連した関数をいくつか示します:

Function: vectorp object

この関数は、objectがベクターの場合は、tをreturnします。

(vectorp [a])
     ⇒ t
(vectorp "asdf")
     ⇒ nil
Function: vector &rest objects

この関数は、引数objectsを要素にもつベクターを作成してreturnします。

(vector 'foo 23 [bar baz] "rats")
     ⇒ [foo 23 [bar baz] "rats"]
(vector)
     ⇒ []
Function: make-vector length object

この関数は、objectに初期化されたlength個の要素からなる、新しいベクターをreturnします。

(setq sleepy (make-vector 9 'Z))
     ⇒ [Z Z Z Z Z Z Z Z Z]
Function: vconcat &rest sequences

この関数は、sequencesのすべての要素を含む、新しいベクターをreturnします。引数sequencesは真リスト、ベクター、文字列、ブールベクターです。sequencesが与えられない場合、空のベクターがreturnされます。

値は空のベクター、または任意の既存のベクターとeqではない、新しい空ではないベクターのどちらかです。

(setq a (vconcat '(A B C) '(D E F)))
     ⇒ [A B C D E F]
(eq a (vconcat a))
     ⇒ nil
(vconcat)
     ⇒ []
(vconcat [A B C] "aa" '(foo (6 7)))
     ⇒ [A B C 97 97 foo (6 7)]

vconcat関数は、引数としてバイトコード関数オブジェクトもとることができます。これは、バイトコード関数オブジェクトの内容全体にアクセスするのを容易にするための、特別な機能です。Byte-Code Function Objectsを参照してください。

結合を行なう他の関数については、Mapping FunctionsmapconcatCreating StringsconcatBuilding Cons Cells and Listsappendを参照してください。

append関数は、ベクターを同じ要素をもつリストに変換する方法も提供します:

(setq avector [1 two (quote (three)) "four" [five]])
     ⇒ [1 two (quote (three)) "four" [five]]
(append avector nil)
     ⇒ (1 two (quote (three)) "four" [five])

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.6 Char-Tables

文字テーブル(char-table)はベクターとよく似ていますが、文字テーブルは文字コードによりインデックスづけされます。文字テーブルのインデックスには、修飾キーをともなわない任意の有効な文字コードを使用できます。他の配列と同様に、arefasetで、文字テーブルの要素にアクセスできます。加えて、文字テーブルは、追加のデータを保持するために、特定の文字コードに関連づけられていない、エキストラスロット(extra slots)をもつことができます。ベクターと同様、文字テーブルは、定数として評価され、任意の型の要素を保持できます。

文字テーブルはそれぞれサブタイプ(subtype)をもち、これは2つの目的を担うシンボルです:

文字テーブルは親(parent)をもつことができ、これは他の文字テーブルです。文字テーブルが親をもつ場合、その文字テーブルで特定の文字cにたいしてnilが指定されているときは、親として指定された文字テーブルで指定された値を継承します。言い方を変えると、文字テーブルchar-tablecnilが指定されている場合、(aref char-table c)char-tableの親の値をreturnします。

文字テーブルはデフォルト値(default value)をもつこともできます。デフォルト値をもつとき、文字テーブルchar-tablecにたいしてnil値を指定すると、(aref char-table c)はデフォルト値をreturnします。

Function: make-char-table subtype &optional init

サブタイプsubtype(シンボル)をもつ、新たに作成された文字テーブルをreturnします。各要素はinitに初期化され、デフォルトはnilです。文字テーブルが作成された後で、文字テーブルのサブタイプを変更することはできません。

すべての文字テーブルは、インデックスとなる任意の有効な文字テーブルのための空間をもつので、文字テーブルの長さを指定する引数はありません。

subtypechar-table-extra-slotsシンボルプロパティーをもつ場合、それはその文字列テーブル内のエキストラスロットの数を指定します。値には0から10の整数を指定し、これ以外の場合make-char-tableはエラーとなります。subtypechar-table-extra-slotsシンボルプロパティー(Property Listsを参照してください)をもたない場合、その文字テーブルはエキストラスロットをもちません。

Function: char-table-p object

この関数は、objectが文字テーブルの場合はt、それ以外はnilをreturnします。

Function: char-table-subtype char-table

この関数は、char-tableのサブタイプのシンボルをreturnします。

文字テーブルのデフォルト値にアクセスするための、特別な関数は存在しません。これを行なうには、char-table-rangeを使用します(以下参照)。

Function: char-table-parent char-table

この関数は、char-tableの親をreturnします。親は常に、nil、または他の文字テーブルです。

Function: set-char-table-parent char-table new-parent

この関数は、char-tableの親を、new-parentにセットします。

Function: char-table-extra-slot char-table n

このガン数は、char-tableのエキストラスロットnの内容をreturnします。文字テーブルのエキストラスロットの数は、文字テーブルのサブタイプにより決定されます。

Function: set-char-table-extra-slot char-table n value

この関数は、char-tableのエキストラスロットnに、valueを格納します。

文字テーブルは、1つの文字コードにたいして、1つの要素値(element value)を指定できます。文字テーブルは文字セット全体にたいして値を指定することもできます。

Function: char-table-range char-table range

この関数は、文字範囲rangeにたいして、char-tableで指定された値をreturnします。可能なrangeは以下のとおりです:

nil

デフォルト値への参照。

char

文字charにたいする要素への参照(charは有効な文字コードであると仮定)。

(from . to)

包括的な範囲‘[from..to]’内のすべての文字を参照するコンスセル。

Function: set-char-table-range char-table range value

この関数は、char-table内の文字範囲rangeにたいして値をセットします。可能なrangeは、以下のとおりです:

nil

デフォルト値への参照。

t

文字コード範囲の全体を参照。

char

文字charにたいする要素への参照(charは有効な文字コードであると仮定)。

(from . to)

包括的な範囲‘[from..to]’内のすべての文字を参照するコンスセル。

Function: map-char-table function char-table

この関数は、char-tableの非nil値ではない各要素にたいして、引数functionを呼び出します。functionの呼び出しでは、2つの引数(keyとvalue)が指定されます。keyはchar-table-rangeにたいする可能なrange — 有効な文字か、同じ値を共有する文字範囲を指定するコンスセル(from . to)です。valueは、(char-table-range char-table key)がreturnする値です。

全体的に見て、functionに渡されるkey-valueのペアは、char-tableに格納されたすべての値を表します。

return値はm常にnilです。map-char-table呼び出しを有用にするために、functionは副作用をもつべきです。たとえば、以下は構文テーブルを調べる方法です:

(let (accumulator)
   (map-char-table
    #'(lambda (key value)
        (setq accumulator
              (cons (list
                     (if (consp key)
                         (list (car key) (cdr key))
                       key)
                     value)
                    accumulator)))
    (syntax-table))
   accumulator)
⇒
(((2597602 4194303) (2)) ((2597523 2597601) (3))
 ... (65379 (5 . 65378)) (65378 (4 . 65379)) (65377 (1))
 ... (12 (0)) (11 (3)) (10 (12)) (9 (0)) ((0 8) (3)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.7 Bool-vectors

ブールベクター(bool-vector)はベクターとよく似ていますが、値にtnilしか格納できません。ブールベクターの要素に非nil値の格納を試みた場合、そこにtが格納されます。すべての配列と同様、ブールベクターのインデックスは0から開始され、1度ブールベクターが作成されたら、長さを変更することはできません。ブールベクターは定数として評価されます。

ブールベクターを処理する、特別な関数が2つあります。その関数意外にも、他の種類の配列に使用されるのと同じ関数で、ブールベクターを操作できます。

Function: make-bool-vector length initial

initialに初期化された、length要素の新しいブールベクターをreturnします。

Function: bool-vector-p object

この関数は、objectがブールベクターであればt、それ以外はnilをreturnします。

以下で説明するように、ブールベクターのセット処理を行なう関数がいくつかあります:

Function: bool-vector-exclusive-or a b &optional c

ブールベクターabの、ビットごとの排他的論理和(bitwise exclusive or)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-union a b &optional c

ブールベクターabの、ビットごとの論理和(bitwise or)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-intersection a b &optional c

ブールベクターabの、ビットごとの論理積(bitwise and)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-set-difference a b &optional c

ブールベクターabの、差集合(set difference)をreturnします。オプション引数cが与えられた場合、この処理の結果はcに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-not a &optional b

ブールベクターaの、補集合(set complement)をreturnします。オプション引数bが与えられた場合、この処理の結果はbに格納されます。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-subsetp a b

a内のすべてのt値が、bでもt値の場合はt、それ以外はnilをreturnします。引数はすべて、同じ長さのブールベクターを指定します。

Function: bool-vector-count-consecutive a b i

iから始まるaの、bと等しい連続する要素の数をreturnします。aはブールベクターで、btniliaのインデックスです。

Function: bool-vector-count-population a

ブールベクターaの、tの要素の数をreturnします。

以下はブールベクターを作成、確認、更新する例です。長さ8以下のブール値のプリント表記は、1つの文字で表されることに注意してください。

(setq bv (make-bool-vector 5 t))
     ⇒ #&5"^_"
(aref bv 1)
     ⇒ t
(aset bv 3 nil)
     ⇒ nil
bv
     ⇒ #&5"^W"

control-_の2進コードは11111、control-Wは10111なので、この結果は理解できるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.8 Managing a Fixed-Size Ring of Objects

リング(ring)は、挿入、削除、ローテーション、剰余(modulo)でインデックスづけされた参照と走査(traversal)をサポートする、固定長のデータ構造です。ringパッケージにより、効率的なリングデータ構造が実装されています。このパッケージは、このセクションにリストされた関数を提供します。

killリングやマークリングのような、Emacsにあるいくつかの“リング”は、実際には単なるリストとして実装されていることに注意してください。したがって、これらのリングにたいしては、以下の関数は機能しないでしょう。

Function: make-ring size

この関数は、sizeオブジェクトを保持できる、新しいリングをreturnします。sizeは整数です。

Function: ring-p object

この関数は、objectがリングの場合はt、それ以外はnilをreturnします。

Function: ring-size ring

この関数は、ringの最大の要素数をreturnします。

Function: ring-length ring

この関数は、ringに現在含まれている、オブジェクトの数をreturnします。値は、ring-sizeでreturnされる値を超えることはありません。

Function: ring-elements ring

この関数は、ring内のオブジェクトのリストをreturnします。リストの順序は、新しいオブジェクトが先頭になります。

Function: ring-copy ring

個の関数は、ringのコピーを新しいリングとしてreturnします。新しいリングは、ringと同じ(eqな)オブジェクトを含みます。

Function: ring-empty-p ring

この関数は、ringが空の場合はt、それ以外はnilをreturnします。

リング内の1番新しい要素は、常にインデックス0をもちます。より大きいインデックスは、より古い要素に対応します。インデックスは、リング長のmoduloにより計算されます。インデックス-1は1番古い要素、-2は次に古い要素、...となります。

Function: ring-ref ring index

この関数はインデックスindexにあるring内のオブジェクトをreturnします。indexには負、またはリング長より大きい数を指定できます。ringがからの場合、ring-refはエラーをシグナルします。

Function: ring-insert ring object

この関数は、1番新しい要素としてobjectringに挿入し、objectをreturnします。

リングが一杯の場合、新しい要素のための空きを作るため、挿入により1番古い要素が削除されます。

Function: ring-remove ring &optional index

ringからオブジェクトを削除して、そのオブジェクトをreturnします。引数indexは、どのアイテムを削除するかを指定します。これがnilの場合、それは1番古いアイテムを削除することを意味します。ringが空の場合、ring-removeはエラーをシグナルします。

Function: ring-insert-at-beginning ring object

この関数は、1番古い要素として、objectringに挿入します。return値は、意味をもちません。

リングが一杯の場合、この関数は挿入される要素のための空きを作るために、1番新しい要素を削除します。

リングサイズを超えることを気にしない場合、そのリングをFIFO(first-in-first-out: 先入れ先出し)のキューとして使用することができます。たとえば:

(let ((fifo (make-ring 5)))
  (mapc (lambda (obj) (ring-insert fifo obj))
        '(0 one "two"))
  (list (ring-remove fifo) t
        (ring-remove fifo) t
        (ring-remove fifo)))
     ⇒ (0 t one t "two")

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7 Hash Tables

ハッシュテーブル(hash table)は、非常に高速なルックアップテーブルの一種で、キーを対応する値にマップするという点では、alist(Association Listsを参照してください)に似ています。ハッシュテーブルは、以下の点でalistと異なります:

Emacs Lispは、それらを処理する一連の関数とともに、一般的な用途のハッシュテーブルデータ型を提供します。ハッシュテーブルは特別なプリント表現をもち、それは‘#s’と、その後にハッシュテーブルのプロパティーと内容お指定するリストが続きます。Creating Hash Tablesを参照してください。(用語“ハッシュ表記(hash notation)”は、プリント表現の最初に‘#’を使用する、入力構文をもたないオブジェクトのことを指し、これは用語“ハッシュテーブル(hash table)”にたいしては使用されません。Printed Representation and Read Syntaxを参照してください。)

obarray(オブジェクト配列)もハッシュテーブルの一種ですが、これらは異なる型のオブジェクトで、intern(インターン)されたシンボルを記録するためだけに使用されます(Creating and Interning Symbolsを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.1 Creating Hash Tables

ハッシュテーブルを作成する基本的な関数は、make-hash-tableです。

Function: make-hash-table &rest keyword-args

この関数は、指定された引数に対応する、新しいハッシュテーブルを作成します。引数は、キーワード(特別に認識される独自のシンボル)と、それに対応する値を交互に指定することにより構成されます。

make-hash-tableでは、いくつかのキーワードが意味をもちますが、実際に知る必要があるのは、:test:weaknessの2つだけです。

:test test

これは、このハッシュテーブルにたいしてキーを照合する方法を指定します。デフォルトはeqlであり、他の代替としてはeqequalがあります:

eql

キーが数字の場合、それらがequalであれば、つまり、それらの値が等しく、どちらも整数、あるいはどちらも浮動少数の場合は“同一”です。それ以外では、2つの別々のオブジェクトは、決して“同一”になりません。

eq

2つの個別のLispオブジェクトはすべて、“別”のキーです。

equal

2つの個別のLispオブジェクトにたいして、それらがequalの場合、“同一”のキーです。

testにたいして追加の選択肢を定義するために、define-hash-table-test (Defining Hash Comparisonsを参照してください)を使用することができます。

:weakness weak

ハッシュテーブルのweakness(強度)は、ハッシュテーブル内に存在するキーと値を、ガーベージコレクションから保護するかどうかを指定します。

weakは、nilkeyvaluekey-or-valuekey-and-value、またはt(key-and-valueのエイリアス)のうちの1つを指定しなければなりません。weakkeyの場合、そのハッシュテーブルは、(キーが他の場所で参照されていなければ)ハッシュテーブルのキーがガーベージコレクトされるのを妨げません。ある特定のキーがガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。

weakvalueの場合、そのハッシュテーブルは、(値が他の場所で参照されていなければ)ハッシュテーブルの値がガベージコレクトされるのを妨げません。あるP特定の値がガーベージコレクトされた場合、それに対応する連想は、ハッシュテーブルから削除されます。

weakkey-and-value(またはt)の場合、その連想を保護するために、キーと値の両方が生きていなければなりません。したがって、そのハッシュテーブルは、キーと値のどちらかをガーベージコレクトから守ることはしません。キーか値のどちらか一方がガーベージコレクトされたら、その連想は削除されます。

weakkey-or-valueの場合、キーか値のどちらか一方で、その連想を保護することができます。したがって、キーと値の両方がガベージコレクトされたときだけ(それがハッシュテーブル自体にたいする参照でなければ)、ハッシュテーブルからその連想が削除されます。

weakにたいするデフォルトはnilなので、ハッシュテーブルから参照されているキーと値のすべては、ガーベージコレクションから保護されます。

:size size

これは、そのハッシュテーブルに連想を保管しようと計画している、連想の数にたいするヒントを指定します。数が概算で判っている場合、この方法でそれを指定することにより、処理を少し効率的にすることができます。小さすぎるサイズを指定した場合、そのハッシュテーブルは必要に応じて自動的に拡張子マスが、これを行なうには時間が余計にかかります。

デフォルトのサイズは65です。

:rehash-size rehash-size

ハッシュテーブルに連想を追加するとき、そのテーブルが“一杯(full)”の場合、テーブルは自動的に拡張します。この値は、そのときどれだけハッシュテーブルを拡張するかを指定します。

rehash-sizeが整数の場合(それは正であるべきです)、通常のサイズにrehash-sizeを加えることにより、ハッシュテーブルが拡張されます。rehash-sizeが浮動小数の場合(1より大きい方がよい)は、古いサイズにその数を乗じることにより、ガッシュテーブルが拡張されます。

デフォルト値は1.5です。

:rehash-threshold threshold

これは、ハッシュテーブルが“一杯(full)”(なのでもっと大きく拡張する必要がある)だと判断される基準を指定します。thresholdの値は、1以下の、正の浮動小数点数であるべきです。実際のエントリー数が、通常のサイズにたいする指定した割合を超えた場合、そのハッシュテーブルは“一杯”になります。thresholdのデフォルトは、0.8です。

Function: makehash &optional test

この関数はmake-hash-tableと同じですが、異なるスタイルの引数リストを指定します。引数testは、キーを照合する方法を指定します。

この関数は時代遅れです。かわりにmake-hash-tableを使用してください。

ハッシュテーブルのプリント表現を使用して、新しいハッシュテーブルを作成することもできます。指定されたハッシュテーブル内の各要素が、有効な入力構文(Printed Representation and Read Syntaxを参照してください)をもっていれば、Lispリーダーをこのプリント表現を読み取ることができます。たとえば以下は、値val1(シンボル)と300(数字)に関連づけられた、キーkey1key2(両方ともシンボル)を、新しいハッシュテーブルを指定します。

#s(hash-table size 30 data (key1 val1 key2 300))

ハッシュテーブルのプリント表現は、‘#s’と、その後の‘hash-table’で始まるリストにより構成されます。このリストの残りの部分は、そのハッシュテーブルのプロパティーと初期内容を指定する、0個以上のプロパティーと値のペアで構成されるべきです。プロパティーと値は、そのまま読み取られます。有効なプロパティー名は、sizetestweaknessrehash-sizerehash-threshold、およびdataです。dataプロパティーは、初期ないようにたいするキーと値のペアのリストであるべきです。他のプロパティーは、上記で説明したmake-hash-tableのキーワード(:size:testなど)と同じ意味をもちます。

バッファーやフレームのような、入力構文をもたないオブジェクトを含む初期内容をもつハッシュテーブルを指定できないことに注意してください。そのようなオブジェクトは、ハッシュテーブルが作成された後に追加します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.2 Hash Table Access

このセクションでは、ハッシュテーブルにアクセスしたり、連想を保管する関数を説明します。一般的に、比較方法による制限がない限り、任意のLispオブジェクトをハッシュキーとして使用できます。

Function: gethash key table &optional default

この関数はtablekeyを照合して、それに関連づけられたvaluetable内にkeyをもつ連想が存在しない場合はdefault — をreturnします。

Function: puthash key value table

この関数は、table内に、値valueをもつkeyの連想を挿入します。tableがすでにkeyの連想をもつ場合、valueにより古い連想値が置き換えられます。

Function: remhash key table

この関数は、tablekeyの連想がある場合は、それを削除します。keyが連想をもたない場合、remhashは何も行ないません。

Common Lispに関する注意: Common Lispでは、remhashが実際に連想を削除したときは非nil、それ以外はnilをreturnします。Emacs Lispでは、remhashは常にnilをreturnします。

Function: clrhash table

この関数は、ハッシュテーブルtableからすべての連想を削除するので、そのハッシュテーブルは空になります。これはハッシュテーブルのクリーニング(clearing)とも呼ばれます。

Common Lispに関する注意: Common Lispでは、clrhashは空のtableをreturnします。Emacs Lispではnilをreturnします。

Function: maphash function table

この関数は、table内の各連想にたいして、1度ずつfunctionを呼び出します。関数functionは2つの引数 — tableにリストされたkeyと、それに関連づけられたvalue — をとるべきです。maphashnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.3 Defining Hash Comparisons

define-hash-table-testにより、キーを照合する新しい方法を定義できます。この機能を使用するには、ハッシュテーブルの動作方法と、ハッシュコード(hash code)の意味を理解する必要があります。

概念的にはハッシュテーブルを、1つの連想を保持できるスロットがたくさんある巨大な配列として考えることができます。キーを照合するには、まずgethashが、キーから整数のハッシュコード(hash code)を計算します。配列内のインデックスを生成するために、gethashは、配列の長さにより、この整数のmoduloを得ます。それからキーが見つかったかどうか確認するために、そのスロット、もし必要なら近くのスロットを探します。

したがってキー照合の新しい方法を定義するためには、キーからハッシュコードを計算する関数と、2つのキーを直接比較する関数の両方が必要です。

Function: define-hash-table-test name test-fn hash-fn

この関数は、nameという名前の、新たなハッシュテーブルテストを定義します。

この方法でnameを定義した後では、make-hash-tableの引数testにこれを使用することができます。それを行なう場合、そのハッシュテーブルはキー値の比較にtest-fn、キー値から“ハッシュコード”を計算するためにhash-fnを使用することになります。

関数test-fnは2つの引数(2つのキー)をとり、それらが“同一”と判断されたときは非nilをreturnします。

関数hash-fnは1つの引数(キー)をとり、そのキーの“ハッシュコード”(整数)をreturnします。よい結果を得るために、この関数は負の整数を含む整数の全範囲を、ハッシュコードに使用するべきです。

指定された関数は、プロパティーhash-table-testの配下の、nameというプロパティーリストに格納されます。そのプロパティーの値形式は、(test-fn hash-fn)です。

Function: sxhash obj

この関数は、Lispオブジェクトobjにたいするハッシュコードをreturnします。return値は、objと、それが指す別のLispオブジェクトの内容を表す整数です。

2つのオブジェクトobj1obj2がequalの場合、(sxhash obj1)(sxhash obj2)は同じ整数になります。

2つのオブジェクトがequalでない場合、通常はsxhashがreturnする値は異なりますが、常に異なるとは限りません。稀にですが(運次第)、sxhashが同じ結果を与える、2つの異なって見えるオブジェクトに遭遇するかもしれません。

以下は、大の字小文字を区別しない、文字列のキーをもつハッシュテーブルを作成する例です。

(defun case-fold-string= (a b)
  (eq t (compare-strings a nil nil b nil nil t)))
(defun case-fold-string-hash (a)
  (sxhash (upcase a)))

(define-hash-table-test 'case-fold
  'case-fold-string= 'case-fold-string-hash)

(make-hash-table :test 'case-fold)

以下は、事前に定義されたテスト値equalと等価なテストを行なうハッシュテーブルを定義できるという例です。キーは任意のLispオブジェクトで、equalに見えるオブジェクトは、同じキーと判断されます。

(define-hash-table-test 'contents-hash 'equal 'sxhash)

(make-hash-table :test 'contents-hash)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.4 Other Hash Table Functions

以下は、ハッシュテーブルに機能する他の関数です。

Function: hash-table-p table

この関数は、tableがハッシュテーブルオブジェクトの場合は、非nilをreturnします。

Function: copy-hash-table table

この関数は、tableのコピーを作成してreturnします。そのテーブル自体がコピーされたものである場合だけ、キーと値が共有されます。

Function: hash-table-count table

この関数はtable内の実際のエントリー数をreturnします。

Function: hash-table-test table

この関数は、ハッシュを行なう方法と、キーを比較する方法を指定するために、tableが作成されたときに与えられたtestの値をreturnします。Creating Hash Tablesmake-hash-tableを参照してください。

Function: hash-table-weakness table

この関数は、ハッシュテーブルtableに指定されたweakの値をreturnします。

Function: hash-table-rehash-size table

この関数は、tableのrehash-sizeをreturnします。

Function: hash-table-rehash-threshold table

この関数は、tableのrehash-thresholdをreturnします。

Function: hash-table-size table

この関数は、tableの現在の定義されたサイズをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8 Symbols

シンボル(symbol)は、一意な名前をもつオブジェクトです。このチャプターでは、シンボル、シンボルの構成要素やプロパティーリスト、およびシンボルを作成、インターンする方法を説明します。別のチャプターでは、シンボルを変数として使用したり、関数名として使用する方法が説明されています。VariablesFunctionsを参照してください。シンボルの正確な入力構文については、Symbol Typeを参照してください。

任意のLispオブジェクトがシンボルかどうかを、symbolpでテストできます:

Function: symbolp object

この関数は、objectがシンボルの場合はt、それ以外はnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.1 Symbol Components

各シンボルは4つの構成要素(もしくは“セル”)をもち、各構成要素はそれぞれ別のオブジェクトを参照します:

プリント名(print name)

そのシンボルの名前。

値(value)

そのシンボルの、変数としての現在の値。

関数(function)

そのシンボルの関数定義。これはシンボル、キーマップ、キーボードマクロも保持できる。

プロパティーリスト(property list)

そのシンボルのプロパティーリスト。

プリント名のセルは常に文字列を保持し、それを変更することはできません。他の3つのセルには、任意のLispオブジェクトをセットすることができます。

プリントメイのセルは、シンボルの名前となる文字列を保持します。シンボルは、シンボル名によりテキストとして表されるので、2つのシンボルが同じな前をもたないことが重要です。Lispリーダーは、シンボルを読み取るごとに、新たにそれを作成する前に、指定されたシンボルがすでに存在するか調べます。シンボルの名前を得るには、関数symbol-name(Creating and Interning Symbolsを参照してください)を使用します。

値のセルは、シンボルの変数としての値(そのシンボル自身がLisp式として評価されたときに得る値)を保持します。ローカルバインディング(local binding)スコーピングルール(scoping rules)などのような複雑なものを含め、変数がセットされたり、取得される方法については、See section Variablesを参照してください。ほとんどのシンボルは、値として任意のLispオブジェクトをもつことができますが、一部の特別なシンボルは変更できない値をもちます。これらには、nilt、および名前が‘:’で始まる任意のシンボル(キーワード(keyword)と呼ばれます)が含まれます。Variables that Never Changeを参照してください。

関数のセルは、シンボルの関数定義を保持します。実際は、fooの関数セルの中に保管されている関数を意味するとき、“関数foo”といってそれを参照することがよくあります。わたしたちは、必要な土岐だけ、これを明確に区別することにします。関数セルは通常、関数(Functionsを参照してください)か、マクロ(Macrosを参照してください)を保持するために使用されます。しかし、関数セルはシンボル(Symbol Function Indirectionを参照してください)、キーボードマクロ(see section Keyboard Macros)、キーマップ(see section Keymaps)、またはオートロードオブジェクト(Autoloadingを参照してください)を保持するためにも使用できます。シンボルの関数セルの内容を得るには、関数symbol-function (Accessing Function Cell Contentsを参照してください)を使用します。

プロパティーリストのセルは通常、正しくフォーマットされたプロパティーリストを保持するべきです。シンボルのプロパティーリストを得るには、関数symbol-plistを使用します。Symbol Propertiesを参照してください。

巻子失せると値セルが、void(空)のときもあります。voidとは、そのセルがどのオブジェクトも参照していないことを意味します(これは、シンボルvoidを保持することとは異なり、シンボルnilを保持することとも異なります)。voidの関数セルまたは値セルを調べようとすると、結果は‘Symbol's value as variable is void’のようなエラーとなります。

それぞれのシンボルは値セルと関数セルを別個にもつので、変数名と関数名が衝突することはありません。たとえば、シンボルbuffer-file-nameが、値(カレントバッファーでvisitされているファイルの名前)をもち、同様に関数定義(ファイルの名前をreturnする基本関数)をもつことができます:

buffer-file-name
     ⇒ "/gnu/elisp/symbols.texi"
(symbol-function 'buffer-file-name)
     ⇒ #<subr buffer-file-name>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.2 Defining Symbols

定義(definition)とは、特別な方法で使用を意図することを宣言する、特別な種類のLisp式です。定義とは通常、シンボルにたいする値を指定するか、シンボルにたいする1つの種類の使用についての意味と、この方法で使用するときのシンボルの意味にたいするドキュメントを指定します。したがって、シンボルを変数として定義した場合、その変数の初期値と、加えてその変数のドキュメントを提供できます。

defvarおよびdefconstは、グローバル変数(global variable) — Lispプログラムの任意の箇所からアクセスできる変数 — として定義するスペシャルフォームです。変数についての詳細は、Variablesを参照してください。カスタマイズ可能な変数を定義するには、defcustom(これはサブルーチンとしてdefvarも呼び出します)を使用します(Customization Settingsを参照してください)。

原則として、最初にシンボルが変数として定義されていなくても、setqで任意のシンボルに値を割り当てることができます。しかし、使用したいそれぞれのグローバル変数にたいして、変数定義を記述するべきです。さもないと、レキシカルスコープ(Scoping Rules for Variable Bindingsを参照してください)が有効なときに変数が評価された場合、あなたのLispプログラムは正しく動作しないでしょう。

defunは、ラムダ式(lambda expression)を生成して、そのシンボルの関数セルにそれを格納することにより、シンボルを関数として定義します。したがって、このシンボルの関数定義は、このラムダ式になります(関数セルの内容を意味する用語“関数定義(function definition)”は、defunがシンボルに関数としての定義を与えるというアイデアに由来します)。Functionsを参照してください。

defmacroは、シンボルをマクロとして定義します。これはマクロオブジェクトを作成して、そのシンボルの関数セルにそれを格納します。シンボルにはマクロと関数を与えることができますが、マクロと関数定義はどちらも関数セルに保持されるのにたいし、関数セルに保持できるのは常にただ1つのLispオブジェクトなので、両方1度にそれを行なうことはできないことに注意してください。Macrosを参照してください。

前に注記したように、Emacs Lispではシンボルを(たとえばdefvarで)変数として定義して、同じシンボルを(たとえばdefunで)関数やマクロとして、両方定義することができます。このような定義は衝突しません。

これらの定義は、プログラミングツールのガイドを果たすこともできます。たとえば、C-h fおよびC-h vコマンドは、関係ある変数、関数、マクロ定義へのリンクを含むヘルプバッファーを作成します。Name Help in The GNU Emacs Manualを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.3 Creating and Interning Symbols

GNU Emacs Lispでシンボルが作成される方法を理解するには、Lispがシンボルを読み取る方法を理解しなければなりません。Lispは、同じ文字綴りを読み取ったら、毎回同じシンボルを見つけることを保証しなければなりません。これに失敗すると、完全な混乱を招くでしょう。

Lispリーダーがシンボルに出会うと、Lispリーダーは名前のすべての文字を読み取ります。その後Lispリーダーは、obarray(オブジェクト配列)と呼ばれるテーブル内のインデックスを決めるために、これらの文字を“ハッシュ(hash)”します。ハッシュ化(hashing)は何かを照合するのに効果的な方法です。たとえば、Jan Jonesを見つけるときは、電話帳を表紙から1頁ずつ探すのではなく、Jから探し始めます。これは簡単なバージョンのハッシュ化です。obarrayの各要素は、与えられたハッシュコードとともにすべてのシンボルを保持する、バケット(bucket)です。与えられた名前を探すためには、バケットの中からその名前のハッシュコードのすべてのシンボルを探すのが効果的です(同じアイデアは一般的なEmacsのハッシュテーブルでも使用されていますが、これらは異なるデータ型です。Hash Tablesを参照してください)。

探している名前のシンボルが見つかったら、リーダーはそのシンボルを使用します。obarrayにその名前のシンボルが含まれない場合、リーダーは新しいシンボルを作成して、それをobarrayに追加します。特定の名前のシンボルを探して追加することを、インターン(intern)すると言い、これが行なわれた後、そのシンボルはインターンされたシンボル(interned symbol)と呼ばれます。

インターンすることにより、ある特定の名前のシンボルは、それぞれのobarrayに1つだけであることが保証されます。同じ名前のシンボルは他に存在するかもしれませんが、同じobarrayではありません。したがってリーダーは、(同じobarrayを読みつづける限り)同じ名前にたいして、同じシンボルを取得します。

インターンは通常、リーダー内で自動的に発生しますが、他のプログラムがこれを行なう必要がある場合もあります。たとえば、M-xコマンドは、その後ミニバッファーを使用してコマンド名を文字列として取得し、その文字列をインターンして、インターンされたその名前のシンボルを得ます。

すべてのシンボルを含むobarrayはありません。実際、どのobarrayにも含まれないシンボルがいくつかあります。これらは、インターンされていないシンボル(uninterned symbols)と呼ばれます。インターンされていないシンボルも、他のシンボルと同じく4つのセルをもちます。しかし、インターンされていないシンボルへのアクセスを得る唯一の方法は、他の何らかのオブジェクトとして探すか、変数の値として探す方法だけです。

インターンされていないシンボルの作成は、Lispコードを生成するとき有用です。なぜなら、作成されたコード内で変数として使用されているインターンされていないシンボルは、他のLispプログラムで使用されている任意の変数と競合することはありえないからです。

Emacs Lispでは、obarrayはベクターです。ベクター内の各要素がバケットになります。要素の値は、名前がそのバケットにハッシュされるインターンされたシンボル、またはバケットが空のときは0です。インターンされたシンボルは、そのバケット内の次のシンボルへの、内部リンク(ユーザーからは見えない)をもちます。これらのリンクは不可視なので、mapatomsを使用する方法をのぞき(以下参照)、obarray内のすべてのシンボルを探す方法はありません。バケット内のシンボルの順番に、意味はありません。

空のobarrayでは、すべての要素が0なので、(make-vector length 0)でobarrayを作成することができます。obarrayを作成する有効な方法は、これだけです。長さに素数を指定すると、よいハッシュ化がされる傾向があります。2の累乗から1減じた長さも、よい結果を生む傾向があります。

自分でobarrayにシンボルを置かないでください。これはうまくいきません — obarrayに正しくシンボルを入力できるのは、internだけです。

Common Lispに関する注意: Common Lispとは異なり、Emacs Lispは1つのシンボルを複数のobarrayにインターンする方法を提供しません。

以下の関数のほとんどは、引数に名前とobarrayをとります。名前が文字列ではない、またはobarrayがベクターでない場合は、wrong-type-argumentエラーがシグナルされます。

Function: symbol-name symbol

この関数は、symbolの名前を文字列としてreturnします。たとえば:

(symbol-name 'foo)
     ⇒ "foo"

警告: 文字の置き換えにより文字列を変更すると、それはシンボルの名前を変更しますが、obarrayの更新には失敗するので、行なわないでください!

Function: make-symbol name

この関数は、新たに割り当てられた、名前がname(文字列でなかればならない)のインターンされていないシンボルをreturnします。このシンボルの値と関数はvoidで、プロパティーリストはnilです。以下の例では、symの値はfooeqではありません。なぜなら、これは名前が‘foo’のインターンされていないシンボルだからです。

(setq sym (make-symbol "foo"))
     ⇒ foo
(eq sym 'foo)
     ⇒ nil
Function: intern name &optional obarray

この関数は、名前がnameの、インターンされたシンボルをreturnします。オブジェクト配列obarrayの中にそのようなシンボルが存在しない場合、internはあたらしいシンボルを作成してobarrayに追加し、それをreturnします。obarrayが省略された場合、グローバル変数obarrayの値が使用されます。

(setq sym (intern "foo"))
     ⇒ foo
(eq sym 'foo)
     ⇒ t

(setq sym1 (intern "foo" other-obarray))
     ⇒ foo
(eq sym1 'foo)
     ⇒ nil

Common Lispに関する注意: Common Lispでは、既存のシンボルをobarrayにインターンできます。Emacs Lispでは、internの引数はシンボルではなく文字列なので、これを行なうことはできません。

Function: intern-soft name &optional obarray

この関数は、obarray内の名前がnameのシンボル、obarrayにその名前のシンボルが存在しない場合はnilをreturnします。したがって、与えられた名前のシンボルがすでにインターンされているかテストするために、intern-softを使用することができます。obarrayが省略された場合は、グローバル変数obarrayの値が使用されます。

引数nameにはシンボルも使用できます。この場合、指定されたobarrayにnameがインターンされていればname、それ以外はnilをreturnします。

(intern-soft "frazzle")        ; そのようなシンボルは存在しない。
     ⇒ nil
(make-symbol "frazzle")        ; インターンされていないシンボルを作成する。
     ⇒ frazzle
(intern-soft "frazzle")        ; そのようなシンボルは見つからない。
     ⇒ nil
(setq sym (intern "frazzle"))  ; インターンされたシンボルを作成する。
     ⇒ frazzle
(intern-soft "frazzle")        ; シンボルが見つかった!
     ⇒ frazzle
(eq sym 'frazzle)              ; そして、それは同じシンボル。
     ⇒ t
Variable: obarray

この変数は、internおよびreadで使用される、標準のobarrayです。

Function: mapatoms function &optional obarray

この関数は、オブジェクト配列obarrayの中のシンボルに1つにたいして、1度ずつfunctionを呼び出し、その後nilをreturnします。obarrayが省略された場合は、通常のシンボルにたいする標準のオブジェクト配列obarrayの値がデフォルトになります。

(setq count 0)
     ⇒ 0
(defun count-syms (s)
  (setq count (1+ count)))
     ⇒ count-syms
(mapatoms 'count-syms)
     ⇒ nil
count
     ⇒ 1871

mapatomsを使用する他の例については、Access to Documentation Stringsdocumentationを参照してください。

Function: unintern symbol obarray

この関数は、オブジェクト配列obarrayから、symbolを削除します。obarrayの中にsymbolが存在しない場合、uninternは何も行ないません。obarraynilの場合は、現在のobarrayが使用されます。

symbolにシンボルではなく文字列を与えた場合、それはシンボルの名前を意味します。この場合、uninternは、(もしあれば)obarrayからその名前のシンボルを削除します。そのようなシンボルが存在する場合、uninternは何も行ないません。

uninternがシンボルを削除した場合はt、それ以外はnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4 Symbol Properties

シンボルは、そのシンボルについての様々な情報を記録するために使用される、任意の数のシンボルプロパティー(symbol properties)をもつことができます。たとえば、シンボルのrisky-local-variableプロパティーがnilの場合は、その変数の名前が、危険なファイルローカル変数(File Local Variablesを参照してください)であることを意味します。

シンボルのプロパティーとプロパティー値はそれぞれ、、シンボルのプロパティーリストセル(Symbol Componentsを参照してください)に、プロパティーリスト形式(Property Listsを参照してください)で格納されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4.1 Accessing Symbol Properties

以下の関数は、シンボルプロパティーへのアクセスに使用できます。

Function: get symbol property

この関数は、symbolのプロパティーリスト内の、propertyという名前のプロパティーの値をreturnします。そのようなプロパティーが存在しない場合は、nilをreturnします。したがって、値がnilのときと、プロパティーが存在しない場合の違いはありません。

名前propertyは、eqを使用して既存のプロパティーと比較されるので、任意のオブジェクトはプロパティーとして適正です。

例はputを参照してください。

Function: put symbol property value

この関数は、symbolのプロパティーリストの、プロパティー名propertyvalueを配して、以前のプロパティー値を置き換えます。put関数は、valueをreturnします。

(put 'fly 'verb 'transitive)
     ⇒'transitive
(put 'fly 'noun '(a buzzing little bug))
     ⇒ (a buzzing little bug)
(get 'fly 'verb)
     ⇒ transitive
(symbol-plist 'fly)
     ⇒ (verb transitive noun (a buzzing little bug))
Function: symbol-plist symbol

この関数は、symbolののののプロパティーリストをreturnします。

Function: setplist symbol plist

この関数は、symbolのプロパティーリストを、plistにセットします。plistは通常、適正なプロパティーリストであるべきですが、これは強制ではありません。return値はplistです。

(setplist 'foo '(a 1 b (2 3) c nil))
     ⇒ (a 1 b (2 3) c nil)
(symbol-plist 'foo)
     ⇒ (a 1 b (2 3) c nil)

通常の用途には使用されない、特別なobarray内のシンボルでは、非標準的で方法でプロパティーリストセルを使用することに意味があるかもしれません。実際に、abbrev(Abbrevs and Abbrev Expansionを参照してください)のメカニズムは、これを行なっています。

以下のように、setplistplist-putにより、putを定義できます:

(defun put (symbol prop value)
  (setplist symbol
            (plist-put (symbol-plist symbol) prop value)))
Function: function-get symbol property

この関数は、getと同じですが、symbolが関数エイリアス(function alias)の場合は、実際の関数の名づけるシンボルのプロパティーリストを参照します。Defining Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.4.2 Standard Symbol Properties

以下に、Emacsで特別な目的のために使用されるシンボルプロパティーをリストします。以下の表で、“名づけられた関数(the named function)”と言うときは、関数名がそのシンボルである関数を意味します。“名づけられた変数(the named variable)”などの場合も、同様です。

:advertised-binding

このプロパティーリストは、名づけられた関数のドキュメントを表示するときの、優先されるキーバインディングを指定します。Substituting Key Bindings in Documentationを参照してください。

char-table-extra-slots

値が非nilの場合は、名づけられた文字テーブル型の追加スロットの数を指定します。Char-Tablesを参照してください。

customized-face
face-defface-spec
saved-face
theme-face

これらのプロパティーは、フェイスの標準のフェイススペック(face specs)、およびフォントスペックsaved-fase、customized-face、themed-faceを記録するために使用されます。これらのプロパティーを直接セットしないでください。これらのプロパティーはdefface、および関連する関数により管理されます。Defining Facesを参照してください。

customized-value
saved-value
standard-value
theme-value

これらのプロパティーは、カスタマイズ可能な変数のstandard-value、saved-value、customized-value(しかし保存はされない)、themed-valueを記録するために使用されます。これらのプロパティーを直接セットしないでください。これらはdefcustom、および関連する関数により管理されます。Defining Customization Variablesを参照してください。

disabled

値が非nilの場合、名づけられた関数はコマンドとして無効になります。Disabling Commandsを参照してください。

face-documentation

値には、名づけられたフェイスのドキュメント文字列が格納されます。これは、deffaceにより自動的にセットされます。Defining Facesを参照してください。

history-length

値が非nilの場合、名づけられたヒストリーリスト変数の、ミニバッファーヒストリーの最大長を指定します。Minibuffer Historyを参照してください。

interactive-form

この値は、名づけられた関数の、インタラクティブ形式です。通常、これを直接セットするべきではありません。かわりに、スペシャルフォームinteractiveを使用してください。Interactive Callを参照してください。

menu-enable

この値は、名づけられたメニューアイテムが、メニュー内で有効であるべきかを決定するための式です。Simple Menu Itemsを参照してください。

mode-class

値がspecialの場合、名づけられたメジャーモードは“special(特別)”です。Major Mode Conventionsを参照してください。

permanent-local

値が非nilの場合、名づけられた変数はバッファーローカル変数となり、変数の値はメジャーモードの変更によりリセットされません。Creating and Deleting Buffer-Local Bindingsを参照してください。

permanent-local-hook

値が非nilの場合、名づけられた変数はメジャーモードを変更したとき、フック変数のローカル値から削除されません。Setting Hooksを参照してください。

pure

値が非nilの場合、名づけられた関数は、副作用の影響を受けないとみなされます。定数の引数で呼び出された場合、コンパイル時に評価することができます。これは、実行時のエラーをコンパイル時へとシフトします。

risky-local-variable

値が非nilの場合、名づけられた変数は、ファイルローカル変数としては危険だとみなされます。File Local Variablesを参照してください。

safe-function

値が非nilの場合、名づけられた関数は、評価において一般的に安全だとみなされます。Determining whether a Function is Safe to Callを参照してください。

safe-local-eval-function

値が非nilの場合、名づけられた関数は、ファイルローカルの評価フォーム内で、安全に呼び出すことができます。File Local Variablesを参照してください。

safe-local-variable

値は、名付けられた変数の、安全なファイルローカル値を決定する関数を指定します。File Local Variablesを参照してください。

side-effect-free

nil値は、関数の安全性(Determining whether a Function is Safe to Callを参照してください)、およびバイトコンパイラーの最適化を決定するために、名づけられた関数が副作用から自由であることを示します。これをセットしないでください。

variable-documentation

nilの場合、それは名づけられた変数のドキュメント文字列を指定します。ドキュメント文字列は、defvarおよび関連する関数により、自動的にセットされます。Defining Facesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9 Evaluation

Emacs Lispでの式の評価(evaluation)は、Lispインタープリター — 入力としてLispオブジェクトを受け取り、それの式としての値(value as an expression)を計算します — により処理されます。評価を行なう方法は、そのオブジェクトのデータ型に依存し、それはこのチャプターで説明するルールにより行なわれます。インタープリターは、プログラムの一部を評価するために自動的に実行されますが、Lisp基本関数のevalを通じて、明示的に呼び出すこともできます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.1 Introduction to Evaluation

Lispインタープリター(またはLispエバリュエーター)は、Emacsの一部で、与えられた式の値を計算します。Lispで記述された関数が呼び出されるとき、エバリュエーターはその関数のbody(本文)の中の式を評価することにより、その関数の値を計算します。したがって、Lispプログラムを実行するとは、実際にはLispインタープリターを実行することを意味します。

評価されることを意図したLispオブジェクトは、フォーム(form)、または式(expression)と呼ばれます4。フォームはデータオブジェクトであり、単なるテキストではないというのは、Lisp風の言語と、通常のプログラミング言語との間にある、基本的な相違の1つです。任意のオブジェクトを評価できますが、実際に評価される事が非常に多いのは数字、シンボル、リスト、文字列です。

以降のセクションでは、各種フォームにたいして、それを評価することが何を意味するかの詳細を説明します。

Lispフォームを読み取り、それからそのフォームを評価するのは、非常に一般的なアクティビティーですが、読み取りと評価は別のアクティビティーであり、どちらか一方を単独で処理することができます。読み取りだけでは、何も評価されません。読み取りはLispオブジェクトのプリント表現を、そのオブジェクト自体に変換します。このオブジェクトは評価されるべきフォームなのか、そのれともまったく違う目的をもつかを指定するのは、readの呼び出し元の役目ですInput Functionsを参照してください。

評価とは再帰的な処理であり、あるフォームを評価することにより、そのフォームの一部が評価されるといったことがよくあります。たとえば、(car x)のような関数呼び出し(function call)のフォームを評価する場合、Emacsは最初にその引数(サブフォームx)を評価します。引数を評価した後、Emacsはその関数(car)を実行(executes)します。その関数がLispで記述されている場合は、関数のbody(本文)を評価することにより、実行が行なわれます(しかし、この例で使用しているcarはLisp関数ではなく、Cで実装された基本関数です)。関数と関数呼び出しについての情報は、Functionsを参照してください。

評価は、環境(environment)と呼ばれるコンテキストの内部で行なわれます。環境は、すべてのLisp変数(Variablesを参照してください)のカレント値とバインディングにより構成されます。5フォームが新たなバインディングを作成することなく、変数を参照するとき、その変数はカレントの環境により与えられる値に評価されます。フォームの評価は、変数のバインディングにより、一時的にその環境を変更することもあります(Local Variablesを参照してください)。

フォームの評価が、永続する変更を行なうこともあります。これらの変更は、副作用(side effects)と呼ばれます。副作用を生成するフォームの例は、(setq foo 1)です。

コマンドキー解釈にたいする評価と混同しないでください。エディターのコマンドループは、アクティブなキーマップを使用して、キーボード入力をコマンド(インタラクティブに呼び出すことができる関数)に変換してから、そのコマンドを実行するためにcall-interactivelyを使用します。そのコマンドはLispで記述されている場合、コマンドの実行は通常、評価を伴います。しかし、このステップはコマンドキー解釈の一部とは考えません。Command Loopを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2 Kinds of Forms

評価される事を意図したLispオブジェクトは、フォーム(form)または式(expression))と呼ばれます。Emacsがフォームを評価する方法は、フォームのデータ型に依存します。Emacsは、3種の異なるフォーム — シンボル、リスト、および“その他すべての型” — を持ち、それらは評価される方法は異なります。このセクションでは、まず最初は自己評価フォームの“その他すべての型”から開始して、3つの種類をすべて1つずつ説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.1 Self-Evaluating Forms

自己評価フォーム(self-evaluating form)は、リストやシンボルではない、任意のフォームです。自己評価フォームは、フォーム自身を評価します。評価の結果は、評価されたのと同じオブジェクトです。したがって、数字の25は25に評価され、文字列"foo"は文字列"foo"に評価されます。同様に、ベクターの評価では、ベクターの要素の評価は起こりません — 内容が変更されずに同じベクターがreturnされます。

'123               ; 評価されずに表示される数字。
     ⇒ 123
123                ; 通常どおり評価され、同じものがreturnされる。
     ⇒ 123
(eval '123)        ; “手動”による評価 — 同じものがreturnされる。
     ⇒ 123
(eval (eval '123)) ; 2度評価しても何も変わらない。
     ⇒ 123

事項評価されるという事実による利点から、数字、文字、文字列、そしてベクターでさえ、Lispコード内で記述されるのは一般的です。しかし、入力構文がない型にたいしてこれを行なうのは極めて異例です。なぜなら、これらをテキスト的に記述する方法がないからです。Lispプログラムを使用して、これらの型を含むLisp式を構築するのは、可能です。以下は例です:

;; バッファーオブジェクトを含む式を構築する。
(setq print-exp (list 'print (current-buffer)))
     ⇒ (print #<buffer eval.texi>)
;; それを評価する。
(eval print-exp)
     -| #<buffer eval.texi>
     ⇒ #<buffer eval.texi>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.2 Symbol Forms

シンボルが評価されるときは、変数として扱われます。それが値をもつ場合、結果はその変数の値になります。そのシンボルが変数としての値をもたない場合、Lispインタープリターはエラーをシグナルします。変数の使用法についての情報は、Variablesを参照してください。

以降の例では、setqでシンボルに値をセットしています。その後シンボルを評価してから、その値をsetqに戻します。

(setq a 123)
     ⇒ 123
(eval 'a)
     ⇒ 123
a
     ⇒ 123

シンボルniltは特別に扱われるので、nilの値は常にnilになり、tの値は常にtになります。これらに他の値をセットしたり、他の値にバインドすることはできません。したがって、この2つのシンボルは、(たとえevalがそれらを他の任意のシンボルと同じように扱うとはいえ)自己評価フォームと同じように振る舞います。名前が‘:’で始まるシンボルも、同じ方法で自己評価されます。そして、(通常は)値を変更できない点も同じです。Variables that Never Changeを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.3 Classification of List Forms

空ではないリストフォームは、関数呼び出し、マクロ呼び出し、スペシャルフォームのいずれかで、それは1番目の引数にしたがいます。これら3種のフォームは、以下で説明するように、異なる方法で評価されます。残りの要素は関数、マクロ、またはスペシャルフォームにたいする引数(arguments)を構成します。

空ではないリストを評価する最初のステップは、1番目の要素の確認です。この要素は単独で、そのリストがどの種類のフォームか、そして残りの引数をどのように処理するがを決定します。SchemeのようなLisp方言とは異なり、1番目の要素は評価されません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.4 Symbol Function Indirection

リストの最初の要素がシンボルの場合、評価はそのシンボルの関数セルを調べて、元のシンボルの代わりに、関数セルの内容を使用します。その内容が他のシンボルの場合、シンボルではないものが得られるまで、このプロセスが繰り返されます。このプロセスをシンボル関数インダイレクション(symbol function indirection: indirectionは間接の意)と呼びます。シンボル関数インダイレクションについての情報は、Naming a Functionを参照してください。

このプロセスの結果、シンボルの関数競るが同じシンボルを参照する場合、無限ループを起こす可能性があります。それ以外は、最終的には非シンボルにたどりつき、これは関数か、他の適切なオブジェクトであるはずです。

より正確に言うと、それはLisp関数(ラムダ式)、バイトコード関数、基本関数、Lispマクロ、スペシャルフォーム、またはオートロードオブジェクトであるべきです。これらの型のそれぞれについては、以降のセクションで説明します。これらの型以外のオブジェクトの場合、emacsはinvalid-functionエラーをシグナルします。

以下の例は、シンボルインダイレクションのプロセスを説明するものです。わたしたちは、シンボルの関数セルに関数をセットするのにfset、関数セルの内容(Accessing Function Cell Contentsを参照してください)を得るためにsymbol-functionを使用します。具体的に言うと、firstの関数セルにシンボルcarを格納し、シンボルfirstersteの関数セルに格納します。

;; この関数セルのリンクを構築する:
;;   -------------       -----        -------        -------
;;  | #<subr car> | <-- | car |  <-- | first |  <-- | erste |
;;   -------------       -----        -------        -------
(symbol-function 'car)
     ⇒ #<subr car>
(fset 'first 'car)
     ⇒ car
(fset 'erste 'first)
     ⇒ first
(erste '(1 2 3))   ; ersteにより参照される関数を呼び出す。
     ⇒ 1

対照的に、以下の例はシンボル関数インダイレクションを使用せずに関数を呼び出します。なぜなら、1番目の要素はシンボルではなく、無名Lisp関数(anonymous Lisp function)だからです。

((lambda (arg) (erste arg))
 '(1 2 3))
     ⇒ 1

関数自身を実行すると、その関数のbodyを評価します。これは、ersteを呼び出すとき、シンボル関数インダイレクションが行なわれます。

このフォームが使用されるのは稀で、今では推奨されません。かわりに以下のように記述するべきです:

(funcall (lambda (arg) (erste arg))
         '(1 2 3))

または単に

(let ((arg '(1 2 3))) (erste arg))

ビルトイン関数のindirect-functionは、明示的にシンボル関数インダイレクションを処理するための、簡単な方法を提供します。

Function: indirect-function function &optional noerror

この関数は、functionが意味するものを、関数としてreturnします。functionがシンボルの場合は、functionの関数定義を探して、その値で最初からやり直します。functionがシンボルでない場合は、function自身をreturnします。

この関数は、最後のシンボルがバインドされておらず、オプション引数noerrorが省略されているかnilの場合は、void-functionエラーをシグナルします。それ以外は、noerrorが非nilの場合は、最後のシンボルがバインドされていなければnilをreturnします。

特定のシンボル内にループがある場合、この関数はcyclic-function-indirectionエラーをシグナルします。

以下は、Lispでindirect-functionを定義できるという例です:

(defun indirect-function (function)
  (if (symbolp function)
      (indirect-function (symbol-function function))
    function))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.5 Evaluation of Function Forms

リストの1番目の要素がLispの関数オブジェクト。バイトコードオブジェクト、基本関数オブジェクトと評価された場合、そのリストは関数呼び出し(function call)になります。たとえば、以下は関数+を呼び出します:

(+ 1 x)

関数呼び出しを評価する最初のステップは、そのリストの残りの要素を左から右に評価します。結果は引数の実際の値で、リストの各要素にたいして1つの値となります。次のステップは、関数apply(Calling Functionsを参照してください)を使用して、引数のリストでその関数を呼び出します。関数がLispで記述されている場合、引数はその関数の引数変数にバインドするために使用されます。その後、関数body内のフォームが順番に評価され、listのbodyフォームの値は、関数呼び出しの値になります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.6 Lisp Macro Evaluation

リストの最初の要素がマクロオブジェクトと評価された場合、そのリストはマクロ呼び出し(macro call)になります。マクロ呼び出しが評価されるとき、リストの残りの要素は、最初は評価されません。そのかわり、これらの要素自体が、マクロの引数に使用されます。そのマクロ定義は、これは元のフォームの場所で評価される、置き換えのフォームを計算します。これは、マクロの展開(expansion)と呼ばれます。展開した結果は、任意の種類のフォーム — 自己評価定数、シンボル、リストになります。展開した結果自体がマクロ呼び出しの場合、結果が他の種類のフォームになるまで、繰り返し展開処理が行なわれます。

通常のマクロ展開は、その展開形を評価することにより終了します。しかし、他のプログラムもマクロ呼び出しを展開し、それらが展開形を評価するかもしれないし、評価しないかもしれないので、そのマクロ展開がすぐに、または最終的に評価される必要がない場合があります。

引き数式は通常、マクロ展開の計算の一部としては評価されませんが、展開の部分として現れるので、展開形が評価されるとき計算されます。

たとえば、以下のようなマクロ定義が与えられたとします:

(defmacro cadr (x)
  (list 'car (list 'cdr x)))

(cadr (assq 'handler list))のような式はマクロ呼び出しであり、展開形は以下のようになります:

(car (cdr (assq 'handler list)))

引数(assq 'handler list)が、展開形に含まれることに注意してください。

Emacs Lispマクロの完全な説明は、Macrosを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.7 Special Forms

スペシャルフォーム(special form)は特別だとマークされた基本関数で、その引数のすべては評価されません。もっともスペシャルなフォームは、制御構造の定義や、変数バインディングの処理など、関数ではできないことを行ないます。

スペシャルフォームはそれぞれ、どの引数が評価されて、どの引数が評価されないかについて、独自のルールをもちます。特定の引数が評価されるかどうかは、他の引数を評価した結果に依存します。

式の最初のシンボルがスペシャルフォームの場合、その式はそのスペシャルフォームのルールにしたがう必要があります。それ以外では、Emacsの挙動は(たとえクラッシュしなくても)定義されていません。たとえば((lambda (x) x . 3) 4)は、lambdaで始まるサブ式を含みますが、これは適正なlambda式ではないので、Emacsはエラーをシグナルするか、3、または4、またはnil、もしかしたら他の挙動を示すかもしれません。

Function: special-form-p object

この述語は、引数がスペシャルフォームかをテストし、スペシャルフォームならt、それ以外はnilをreturnします。

以下に、Emacs Lispのスペシャルフォームすべてと、それらがどこで説明されているかのリファレンスとともに、アルファベット順でリストします。

and

see section Constructs for Combining Conditions

catch

see section Explicit Nonlocal Exits: catch and throw

cond

see section Conditionals

condition-case

see section Writing Code to Handle Errors

defconst

see section Defining Global Variables

defvar

see section Defining Global Variables

function

see section Anonymous Functions

if

see section Conditionals

interactive

see section Interactive Call

lambda

see section Lambda Expressions

let
let*

see section Local Variables

or

see section Constructs for Combining Conditions

prog1
prog2
progn

see section Sequencing

quote

see section Quoting

save-current-buffer

see section The Current Buffer

save-excursion

see section Excursions

save-restriction

see section Narrowing

setq

see section Setting Variable Values

setq-default

see section Creating and Deleting Buffer-Local Bindings

track-mouse

see section Mouse Tracking

unwind-protect

see section Nonlocal Exits

while

see section Iteration

Common Lispに関する注意: ここで、GNU Emacsのスペシャルフォームと、Common Lispのスペシャルフォームを比較してみます。setqifcatchは、Emacs LispとCommon Lispの両方でスペシャルフォームです。save-excursionはEmacs Lispではスペシャルフォームですが、Common Lispには存在しません。throwはCommon Lispではスペシャルフォーム(なぜなら複数の値をthrowできなければならない)ですが、Emacs Lispでは(複数の値をもたない)関数です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.2.8 Autoloading

オートロード(autoload)機能により、関数定義がだEmacsにロードされていない関数(またはマクロ)を呼び出すことができます。オートロードは、定義がどのファイルに含まれるかを指定します。オートロードオブジェクトがシンボルの関数定義にある場合、関数としてそのシンボルを呼び出すことにより、自動的に指定されたファイルがロードされます。その後、ファイルからロードされた実際の定義を呼び出します。シンボル内の関数定義としてオートロードオブジェクトをアレンジする方法は、Autoloadで説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.3 Quoting

スペシャルフォームquoteは、単一の引数を、記述されたとおり、評価せずにreturnします。これはプログラムに、自己評価オブジェクトではない、定数シンボルや定数リストを含める方法を提供します(数字、文字列、ベクターのような自己評価オブジェクトをクォートする必要はありません)。

Special Form: quote object

このスペシャルフォームは、評価せずにobjectをreturnします。

プログラム中でquoteはよく使用されるので、Lispはそれにたいする便利な入力構文を提供します。アポストロフィー文字(‘'’)に続けてLispオブジェクト(の入力構文)を記述すると、それは1番目の要素がquoteで、2番目の要素がそのオブジェクトであるリストに展開されます。したがって、入力構文'xは、(quote x)の略記になります。

以下に、quoteを使用した式の例をいくつか示します:

(quote (+ 1 2))
     ⇒ (+ 1 2)
(quote foo)
     ⇒ foo
'foo
     ⇒ foo
''foo
     ⇒ (quote foo)
'(quote foo)
     ⇒ (quote foo)
['foo]
     ⇒ [(quote foo)]

他のクォート構成には、コンパイル用にLispで記述された無名のラムダ式の元になるfunction(Anonymous Functionsを参照してください)、および、リストを計算して置き換える際に、リストの一部だけをクォートするのに使用される‘`’(Backquoteを参照してください)があります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.4 Backquote

バッククォート構成(backquote constructs)を使用することにより、リストをクォートして、そのリストのある要素を選択的に評価することができます。もっとも簡単な使い方では、スペシャルフォームquoteと同じです (前のセクションで説明しています。Quotingを参照してください)。 たとえば、以下の2つのフォームは同じ結果を生みます:

`(a list of (+ 2 3) elements)
     ⇒ (a list of (+ 2 3) elements)
'(a list of (+ 2 3) elements)
     ⇒ (a list of (+ 2 3) elements)

バッククォートする引数の内側でスペシャルマーカー‘,’を使用すると、それは値が定数でないことを示します。Emacs Lispエバリュエーターは‘,’がついた引数を放火して、リスト構造内にその値を配します:

`(a list of ,(+ 2 3) elements)
     ⇒ (a list of 5 elements)

,’による置き換え、リスト構造のより深いレベルでも使用できます。たとえば:

`(1 2 (3 ,(+ 4 5)))
     ⇒ (1 2 (3 9))

スペシャルマーカー‘,@’を使用すれば、評価された値を結果リストに継ぎ足す(splice)こともできます。継ぎ足されたリストの要素は、結果リスト内の他の要素を同じレベルになります。‘`’を使用しない等価なコードは、しばしば読むのが困難です。以下にいくつかの例を示します:

(setq some-list '(2 3))
     ⇒ (2 3)
(cons 1 (append some-list '(4) some-list))
     ⇒ (1 2 3 4 2 3)
`(1 ,@some-list 4 ,@some-list)
     ⇒ (1 2 3 4 2 3)

(setq list '(hack foo bar))
     ⇒ (hack foo bar)
(cons 'use
  (cons 'the
    (cons 'words (append (cdr list) '(as elements)))))
     ⇒ (use the words foo bar as elements)
`(use the words ,@(cdr list) as elements)
     ⇒ (use the words foo bar as elements)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.5 Eval

ほとんどの場合、実行されるプログラム内に出現することにより、フォームは自動的に評価されます。稀に、実行時 — たとえば編集されているテキストや、プロパティーリストから取得したフォームを読み取った後 — に計算されるように、フォームを評価するコードを記述する必要があるかもしれません。このようなときは、eval関数を使用します。evalが不必要だったり、かわりに他の何かを使用すべきときが、しばしばあります。たとえば、変数から値を取得するには、evalも機能しますが、symbol-valueのほうが適しています。evalで評価するためにプロパティーリストに式を格納するより、かわりにfuncallに渡すように関数を格納した方がよいでしょう。

このセクションで説明する関数と変数は、フォームの評価、評価処理の制限の指定、最後にreturnされた値の記録を行なうものです。ファイルのロードでも評価が行なわれます(Loadingを参照してください)。

データ構造に式を格納してそれを評価するより、データ構造に関数を格納して、それをfuncallapplyで呼び出すほうが、より明解かつ柔軟です。関数を使用することにより、引数に情報を渡す能力が提供されます。

Function: eval form &optional lexical

これは、式を評価する、基本的な関数です。この関数は、カレント環境内でformを評価して、その結果をreturnします。formオブジェクトの型は、それが評価される方法を決定します。Kinds of Formsを参照してください。

引数lexicalは、ローカル変数にたいするスコープ規則(Scoping Rules for Variable Bindingsを参照してください)を指定します。これが省略されるかnilの場合、デフォルトのダイナミックスコープ規則を使用してformを評価することを意味します。tの場合は、レキシカルスコープ規則が使用されることを意味します。lexicalの値には、レキシカルバインディングにたいする特定のレキシカル環境(lexical environment)を指定する、空ではないalistも指定できます。しかし、この機能はEmacs Lispデバッガーのような、特別な目的にたいしてのみ有用です。Lexical Bindingを参照してください。

evalは関数なので、eval呼び出しに現れる引数式は2回 — 1度はevalが呼び出される前の準備、そしてeval関数自身によりもう1度 — 評価されます。以下は例です:

(setq foo 'bar)
     ⇒ bar
(setq bar 'baz)
     ⇒ baz
;; evalが引数fooを受け取る。
(eval 'foo)
     ⇒ bar
;; evalが、fooの値である、引数barを受け取る。
(eval foo)
     ⇒ baz

evalにより現在アクティブな呼び出しの数は、max-lisp-eval-depthに制限されます(以下参照)。

Command: eval-region start end &optional stream read-function

この関数は、カレントバッファー内の、位置startendで定義されるリージョン内のフォームを評価します。この関数はそのリージョンからフォームを読み取り、それらにたいしevalを呼び出します。これは、リージョンの最後に達するまで、または処理されないエラーがシグナルされるまで行なわれます。

デフォルトでは、eval-regionは何の出力も生成しません。しかし、streamが非nilの場合、出力関数(Output Functionsを参照してください)で生成された任意の出力、同様にリージョン内の式を評価した結果の値は、streamを使用してプリントされます。Output Streamsを参照してください。

read-functionが非nilの場合、readのかわりに1つずつ式を読み取るために使用する関数を指定します。これは、入力を読み取るストリームを指定する、1つの引数で呼び出される関数です。この関数を指定するために変数load-read-function(How Programs Do Loadingを参照してください)も使用できますが、引数read-functionを使用するほうが確実です。

eval-regionはポイントを移動しません。つねにnilをreturnします。

Command: eval-buffer &optional buffer-or-name stream filename unibyte print

この関数はeval-regionと似ていますが、引数は異なるオプション機能を提供します。eval-bufferは、バッファーbuffer-or-nameのアクセス可能な部分全体を処理します。buffer-or-nameにはバッファー名(文字列)を指定でき、nil(または省略)のときはカレントバッファーを意味します。streamnilかつprintが非nilでない場合、eval-regionのようにstreamが使用されます。この場合、式の評価による結果の値は依然として破棄されますが、出力関数による出力はエコーエリアにプリントされます。filenameは、load-history(Unloadingを参照してください)に使用されるファイル名で、デフォルトはbuffer-file-name(Buffer File Nameを参照してください)です。unibyteが非nilの場合、可能な限りreadは文字列をユニコードに変換します。

eval-current-bufferは、このコマンドのエイリアスです。

User Option: max-lisp-eval-depth

この変数は、エラー(エラーメッセージは"Lisp nesting exceeds max-lisp-eval-depth")がシグナルされる前に、evalapplyfuncallの呼び出しで許される最大の深さを定義します。

制限を超えたときのエラーをもつこの制限は、Emacs Lispで誤って定義された関数による無限再帰を避ける方法の1つです。max-lisp-eval-depthの値を過大に増加させた場合、そのようなコードはかわりにスタックオーバーフローを起こすでしょう。

たとえば、Lisp式に記述された関数の呼び出し、関数呼び出しの引数と、関数bodyフォームにたいする再帰評価、Lispコード内での明示的な呼び出しなどにたいして、深さ制限を数えるために、内部的にevalapplyfuncallを使用します。

この変数のデフォルト値は400です。この値を100未満にセットした場合、値が与えられた値に達すると、Lispはそれを100にリセットします。空きが少ない場合、デバッガー自身を実行するために空きが必要になるので、Lispデバッガーに入ったときは、この値が増加されます。

max-specpdl-sizeはネストの他の制限を提供します。Local Variablesを参照してください。

Variable: values

この変数の値は、読み取り、評価、プリントを行なった標準的なEmacsコマンドにより、バッファー(ミニバッファーを含む)からreturnされる値のリストです(これには*ielm*バッファーでの評価や、lisp-interaction-modeでのC-jを使用した評価は含まれないことに注意してください)。要素の順番は、もっとも最近のものが最初になります。

(setq x 1)
     ⇒ 1
(list 'A (1+ 2) auto-save-default)
     ⇒ (A 3 t)
values
     ⇒ ((A 3 t) 1 …)

この変数は、最近評価されたフォームの値を後で参照するのに便利です。values自体の値をプリントするのは、それがおそらく非常に長くなるので、通常は悪いアイデアです。かわりに、以下のように特定の要素を調べます:

;; もっとも最近評価された結果を参照する。
(nth 0 values)
     ⇒ (A 3 t)
;; これは新たな要素をputするので、
;;   すべての要素が1つ後に移動する。
(nth 1 values)
     ⇒ (A 3 t)
;; これは次に新しい、この例の前の次に新しい要素を取得する。
(nth 3 values)
     ⇒ 1

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10 Control Structures

Lispプログラムは、一連の式(expressions)、あるいはフォーム(forms)(Kinds of Formsを参照してください)により形成されます。これらのフォームの実行順は、それらを制御構造(control structures)で囲むことにより制御します。制御構造とは、その制御構造が含むフォームをいつ、どのような条件で、何回実行するかを制御する、スペシャルフォームです。

もっとも単純な実行順は、1番目はa、2番目はb、...という、シーケンシャル実行(sequential execution: 順番に実行)です。これは、関数のbody内の連続する複数のフォームや、Lispコードのファイル内のトップレベルを記述したときに発生します — つまり、フォームは記述した順に実行されます。わたしたちはこれをテキスト順(textual order)と呼びます。たとえば、関数のbodyが2つのフォームabから構成される場合、関数の評価は、最初にaを評価し、次にbを評価します。bを評価した結果が、その関数の値となります。

明示的に制御構造を使用することにより、シーケンシャルではない順番での実行が可能になります。

Emacs Lispは、他の様々な順序づけ、条件、繰り返し、(制御された)ジャンプを含む、複数の種類の制御構造を提供し、以下ではそれらすべてを記述します。ビルトインの制御構造は、制御構造のサブフォームが評価される必要がなかったり、順番に評価される必要がないので、スペシャルフォームです。独自の制御構造を構築するためにマクロを使用することができます(Macrosを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.1 Sequencing

フォームが出現する順番に評価するのは、あるフォームから別のフォームに制御を渡す、もっとも一般的な制御です。関数のbodyのような、あるコンテキストにおいては、自動的にこれが行なわれます。他の場所では、これを行なうために制御構造を使用しなければなりません。Lispで一単純な制御構造は、prognです。

スペシャルフォームprognは、以下のようなものです:

(progn a b c …)

これは、順番にabc、...を実行するよう指定します。これらはprognフォームのbodyと呼ばれます。body内の最後のフォームの値が、progn全体の値になります。(progn)nilをreturnします。

初期のLispでは、prognは、連続で複数のフォームを実行して最後のフォームの値を使用する、唯一の方法でした。しかしプログラマーは、関数のbodyの、(その時点では)1つのフォームだけが許される場所で、prognを使用する必要が多いことに気づきました。そのため、関数のbodyを“暗黙のprogn”にして、prognのbodyのように複数のフォームを記述出きるようにしました。他の多くの制御構造も、同様に暗黙のprognを含みます。結果として、昔ほどprognは多用されなくなりました。現在では、prognが必要になるのは、unwind-protectandorifthenパートの中がほとんどです。

Special Form: progn forms…

このスペシャルフォームは、formsのすべてをテキスト順に評価して、のフォームの結果をreturnします。

(progn (print "The first form")
       (print "The second form")
       (print "The third form"))
     -| "The first form"
     -| "The second form"
     -| "The third form"
⇒ "The third form"

他の2つの構成は、一連のフォームを同様に評価しますが、異なる値をreturnします:

Special Form: prog1 form1 forms…

このスペシャルフォームは、form1formsのすべてをテキスト順に評価して、form1の結果をreturnします。

(prog1 (print "The first form")
       (print "The second form")
       (print "The third form"))
     -| "The first form"
     -| "The second form"
     -| "The third form"
⇒ "The first form"

以下の例は、変数xのリストから1番目の要素を削除して、削除した1番目の要素の値をreturnします:

(prog1 (car x) (setq x (cdr x)))
Special Form: prog2 form1 form2 forms…

このスペシャルフォームは、form1form2、その後のformsのすべてをテキスト順で評価して、form2の結果をreturnします。

(prog2 (print "The first form")
       (print "The second form")
       (print "The third form"))
     -| "The first form"
     -| "The second form"
     -| "The third form"
⇒ "The second form"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.2 Conditionals

条件による制御構造は、候補の中から選択を行ないます。Emacs Lispは4つの条件フォームをもちます。ifは他の言語のものとほとんど同じです。whenunlessは、ifの変種です。condは一般化されたcase命令です。

Special Form: if condition then-form else-forms…

ifは、conditionの値にもとづいて、then-formelse-formsを選択します。評価されたconditionが非nilの場合は、then-formが評価されて、その結果がreturnされます。それ以外は、else-formsがテキスト順に評価されて、最後のフォームの値がreturnされます(ifelseパートは、暗黙のprognの例です。Sequencingを参照してください)。

conditionの値がnilで、else-formsが与えられない場合、ifnilをreturnします。

選択されなかったブランチは決して評価されない — 無視される — ので、ifはスペシャルフォームです。したがって、以下の例ではprintは呼び出されることはないので、trueはプリントされません。

(if nil
    (print 'true)
  'very-false)
⇒ very-false
Macro: when condition then-forms…

これは、else-formsがなく、複数のthen-formsがあるかもしれない、ifの変種です。特に、

(when condition a b c)

は以下と完全に等価です

(if condition (progn a b c) nil)
Macro: unless condition forms…

これはthen-formがない、ifの変種です:

(unless condition a b c)

は以下と完全に等価です

(if condition nil
   a b c)
Special Form: cond clause…

condは、任意の数の候補から選択を行ないます。cond内の各clauseは、リストでなければなりません。このリストのCARconditionで、(もしあれば)残りの要素はbody-formsです。したがって、条項は以下のようになります:

(condition body-forms…)

condは、各条項のconditionを評価することにより、テキスト順で条項を試験します。conditionの値が非nilの場合、その条項は“成り立ち”ます。その後、condは、その条項のbody-formsを評価して、body-formsの最後の値をreturnします。残りの条項は無視されます。

conditionの値がnilの場合、その条項は“成り立たず”、condは次の条項に移動して、その条項のconditionを試験します。

以下のようなものも、条項になります:

(condition)

conditionがテストされたときに非nilなら、condフォームはconditionの値をreturnします。

すべてのconditionnilに評価された場合 — つまりすべての条項が不成立の場合、condnilをreturnします。

以下の例は4つの条項をもち、xの値が数字か、文字列化、バッファーか、シンボルかをテストします:

(cond ((numberp x) x)
      ((stringp x) x)
      ((bufferp x)
       (setq temporary-hack x) ; 1つの条項に
       (buffer-name x))        ; 複数bodyフォーム。
      ((symbolp x) (symbol-value x)))

前の条項が不成立のとき、最後の条項を実行したいときがよくあります。これを行なうには、(t body-forms)のように、conditionの最後の条項にtを使用します。フォームttに評価され、決してnilにならないので、この条項が不成立になることはなく、最終的にcondはこの条項に到達します。たとえば:

(setq a 5)
(cond ((eq a 'hack) 'foo)
      (t "default"))
⇒ "default"

このcond式は、aの値がhackの場合はfoo、それ以外は文字列"default"をreturnします。

任意の条件構成は、condifで表すことができます。したがって、どちらを選択するかは、スタイルの問題です、たとえば:

(if a b c)
≡
(cond (a b) (t c))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.2.1 Pattern matching case statement

特定の値を、可能なさまざまの場合にたいして比較するには、マクロpcaseが便利です。これは以下のフォームをとります:

(pcase exp branch1 branch2 branch3 …)

branchは、(upattern body-forms…)というフォームです。

これは最初にexpを評価してから、どのbranchを使用するか、その値を各upatternと比較して、その後で対応するbody-forms実行します。一般的なのは、少数の異なる定数値を区別するために使用される場合です:

(pcase (get-return-code x)
  (`success       (message "Done!"))
  (`would-block   (message "Sorry, can't do it now"))
  (`read-only     (message "The shmliblick is read-only"))
  (`access-denied (message "You do not have the needed rights"))
  (code           (message "Unknown return code %S" code)))

最後の条項のcodeは、(get-return-code x)からreturnされた値にバインドされる変数です。

もっと複雑な例として、以下のような小さな式言語のための単純なインタープリターを示します(この例ではレキシカルバインディングが必要なことに注意してください):

(defun evaluate (exp env)
  (pcase exp
    (`(add ,x ,y)       (+ (evaluate x env) (evaluate y env)))
    (`(call ,fun ,arg)  (funcall (evaluate fun env) (evaluate arg env)))
    (`(fn ,arg ,body)   (lambda (val)
                          (evaluate body (cons (cons arg val) env))))
    ((pred numberp)     exp)
    ((pred symbolp)     (cdr (assq exp env)))
    (_                  (error "Unknown expression %S" exp))))

`(add ,x ,y)は、expがシンボルaddで始まる3要素のリストかチェックして、その後2番目と3番目の要素を抽出し、それらを変数xyにバインドするパターンです。(pred numberp)expが数字かを単にチェックし、_はすべてのものにマッチするcatch-allパターンです。

以下に、いくつかの例を評価した結果とともに示します:

(evaluate '(add 1 2) nil)                 ;=> 3
(evaluate '(add x y) '((x . 1) (y . 2)))  ;=> 3
(evaluate '(call (fn x (add 1 x)) 2) nil) ;=> 3
(evaluate '(sub 1 2) nil)                 ;=> error

pcaseに関係する2種類のパターンがあり、それらはU-patternsQ-patternsと呼ばれます。上述のupatternはU-patternsで、以下の形式をもつことができます:

`qpattern

これは、もっとも一般的なパターンの1つです。このパターンの意図は、バッククォートマクロの模倣です。このパターンは、バッククォート式により構築されるような値にマッチします。わたしたちが行なうのは値の構築ではなくパターンマッチングなので、非クォートは式をどこに挿入するか示すのではなく、かわりにその位置で値にマッチすべき1つのU-patternを指定します。

より具体的には、Q-patternは以下のフォームをもつことができます:

(qpattern1 . qpattern2)

このパターンは、carqpattern1cdrpattern2にマッチする、任意のコンスセルにマッチします。

atom

このパターンは、atomequalな任意のアトムにマッチします。

,upattern

このパターンは、upatternにマッチする任意のオブジェクトにマッチします。

symbol

U-pattern内の単なるシンボルはすべてにマッチし、さらにマッチした値にそのシンボルをバインドするので、body-formsや皇族のパターンから、それを参照することができます。

_

このパターン — いわゆるdon’t careパターン — はシンボルパターンと同様、すべてのものにマッチしますが、シンボルパターンとは異なり、変数へのバインドを行ないません。

(pred pred)

このパターンは、マッチされるオブジェクトで関数predが呼び出したとき、非nilをreturnするものにマッチします。

(or upattern1 upattern2…)

このパターンは、引数のパターンから最初に成立したパターンにマッチします。すべての引数パターンは、同じ変数にバインドされるべきです。

(and upattern1 upattern2…)

このパターンは、すべての引数パターンが成立したときだけマッチします。

(guard exp)

このパターンは調べられるオブジェクトを無視して、expが非nilに評価されたときは成立、それ以外は不成立となります。これは通常、andパターンの内部で使用されます。たとえば、(and x (guard (< x 10)))は10より小さい任意の数字にマッチして、それを変数xにバインドします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.3 Constructs for Combining Conditions

このセクションは、複雑な条件を表現するために、ifcondとともによく使用される3つの構成を記述します。andorの構成は、ある種の複数条件の構成として、個別に使用することもできます。

Function: not condition

この関数は、conditionが偽であることをテストします。この関数はconditionnilの場合はt、それ以外はnilをreturnします。関数notnullと等価で、わたしたちは空のリストをテストする場合は、nullの使用を推奨します。

Special Form: and conditions…

スペシャルフォームandは、すべてのconditionsが真かどうかをテストします。この関数は、conditionsを記述された順に1つずつ評価することにより機能します。

あるconditionsnilに評価された場合、残りのconditionsに関係なく、andnilをreturnしなければなりません。この場合、andは即座にnilをreturnし、残りのconditionsは無視されます。

すべてのconditionsが非nilの場合、それらの最後の値がandフォームの値になります。conditionsのない単独の(and)は、tをreturnします。なぜなら、すべてのconditionsが非nilとなるので(考えてみてください。そうでないのはどれですか?)、これは適切です。

以下に例を示します。1番目の条件は整数1をretuenし、これはnilではありません。同様に2番目の条件は整数2をreturnし、これもnilではありません。3番目の条件はnilなので、のこりの条件が評価されることは決してありません。

(and (print 1) (print 2) nil (print 3))
     -| 1
     -| 2
⇒ nil

以下は、andを使用した、より現実的な例です:

(if (and (consp foo) (eq (car foo) 'x))
    (message "foo is a list starting with x"))

(consp foo)nilをreturnした場合、(car foo)は実行されないので、エラーにならないことに注意してください。

ifcondのどちらかを使用して、and式を記述することもできます。以下はその方法です:

(and arg1 arg2 arg3)
≡
(if arg1 (if arg2 arg3))
≡
(cond (arg1 (cond (arg2 arg3))))
Special Form: or conditions…

スペシャルフォームorは、少なくとも1つのconditionsが真かどうかをテストします。この関数は、すべてのconditionsを1つずつ、記述された順に評価することにより機能します。

あるconditionsが非nil値に評価された場合、orの結果は非nilでなければなりません。この場合、orは即座にreturnし、残りのconditionsは無視されます。この関数がreturnする値は、非nil値に評価された条件の値そのものです。

すべてのconditionsnilになった場合、or式はnilをreturnします。conditionsのない単独の(or)は、nilをreturnします。なぜなら、すべてのconditionsnilになるので(考えてみてください。そうでないのはどれですか?)、これは適切です。

たとえば、この式はxnilまたは整数0かどうかをテストします:

(or (eq x nil) (eq x 0))

and構成と同様に、orcondに置き換えて記述することができます。たとえば:

(or arg1 arg2 arg3)
≡
(cond (arg1)
      (arg2)
      (arg3))

ほとんどの場合、orifに置き換えて記述できますが、完全ではありません:

(if arg1 arg1
  (if arg2 arg2
    arg3))

これは完全に同一ではありません。なぜならarg1またはarg2を2回評価するかもしれないからです。対照的に、(or arg1 arg2 arg3)は2回以上引数を評価することは、決してありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.4 Iteration

繰り返し(iteration)とは、プログラムの一部を繰り返し実行することを意味します。たとえば、リストの各要素、または0からnの整数にたいして、1度ずつ繰り返し何らかの計算をおこないたいとしましょうEmacs Lispでは、スペシャルフォームwhileでこれを行なうことができます:

Special Form: while condition forms…

whileは、最初にconditionを評価します。結果が非nilの場合は、formsをテキスト順に評価します。その後conditionを再評価して、結果が非nilの場合、再度formsを評価します。この処理は、conditionnilに評価されるまで繰り返されます。

繰り返し回数に制限はありません。このループは、conditionnilに評価されるか、エラーとなるか、throwで抜け出す(Nonlocal Exitsを参照してください)まで計測されるでしょう

whileフォームの値は、常にnilです。

(setq num 0)
     ⇒ 0
(while (< num 4)
  (princ (format "Iteration %d." num))
  (setq num (1+ num)))
     -| Iteration 0.
     -| Iteration 1.
     -| Iteration 2.
     -| Iteration 3.
     ⇒ nil

各繰り返しごとに何かを実行して、その後も終了テストを行なう“repeat...until”ループを記述するには、以下のようにwhileの1番目の引数として、bodyの後に終了テストを記述して、それをprognの中に配します:

(while (progn
         (forward-line 1)
         (not (looking-at "^$"))))

これは1行前方に移動して、空行に達するまで行単位の移動を継続します。独特なのは、whileがbodyをもたず、終了テスト(これはポイント移動の実処理も行ないます)だけという点です。

マクロdolistおよびdotimesは、2つの一般的な種類のループを記述する、便利な方法を提供します。

Macro: dolist (var list [result]) body…

この構成は、listの各要素にたいして1度bodyを実行し、カレント要素をローカルに保持するように、変数varにバインドします。その後、resultを評価した値、またはresultが省略された場合はnilをreturnします。たとえば、以下はreverse関数を定義するために、dolistを使用する方法の例です:

(defun reverse (list)
  (let (value)
    (dolist (elt list value)
      (setq value (cons elt value)))))
Macro: dotimes (var count [result]) body…

この構成は、0以上count未満の各整数にたいして1度bodyを実行し、その繰り返しでの整数を、変数varにバインドします。その後、resultの値、またはresultが省略された場合はnilをreturnします。以下は、dotimesを使用して、何らかの処理を100回行なう例です:

(dotimes (i 100)
  (insert "I will not obey absurd orders\n"))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5 Nonlocal Exits

非ローカル脱出(nonlocal exit)とは、プログラム内のある位置から、別の離れた位置へ、制御を移します。Emacs Lispでは、エラーの結果として非ローカル脱出が発生することがあります。明示的な制御の下で非ローカル脱出を使用することもできます。非ローカル脱出は、脱出しようとしている構成により作成された、すべての変数バインディングのバインドを外します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.1 Explicit Nonlocal Exits: catch and throw

ほとんどの制御構造は、そのコンストラクト自身内部の制御フローだけに影響します。関数throwは、通常のプログラム実行でのこのルールの例外です。これは、リクエストにより非ローカル脱出を行ないます(他にも例外はありますが、それらはエラー処理だけのものです)。throwcatchの内部で試用され、catchに制御を戻します。たとえば:

(defun foo-outer ()
  (catch 'foo
    (foo-inner)))

(defun foo-inner ()
  …
  (if x
      (throw 'foo t))
  …)

throwフォームが実行された場合は、対応するcatchに制御を移し、catchは即座にreturnします。throwの後のコードは実行されません。throwの2番目の引数は、catchのreturn値として使用されます。

関数throwは、1番目の引数にもとづいて、それにマッチするcatchを探します。throwは、1番目の引数が、throwで指定されたものとeqcatchを検索します。複数の該当するcatchがある場合、最内のものが優先されます。したがって、上記の例ではthrowfooを指定し、foo-outer内のcatchが同じシンボルを指定しているので、(この間に他のマッチするcatchは存在しないと仮定すると)catchが該当します。

throwの実行により、マッチするcatchまでのすべてのリスプ構成(関数呼び出しを含む)を脱出します。この方法によりletや関数呼び出しのようなバインディング構成を脱出する場合、これらの構成を正常にexitしたときのように、そのバインディングは解かれます(Local Variablesを参照してください)。同様にthrowは、save-excursion(Excursionsを参照してください)により保存されたバッファーと位置を復元します。throwが、スペシャルフォームunwind-protectを脱出した場合、unwind-protectにより設定されたいくつかのクリーンアップも実行します。

ジャンプ先となるcatch内にレキシカル(局所的)である必要はありません。throwは、catch内で呼び出された別の関数から、同じようにに呼び出すことができます。throwが行なわれたのが、順序的に、catchに入った後でexitする前である限り、そのthrowcatchにアクセスできます。エディターのコマンドループから戻るexit-recursive-editのようなコマンドで、throwが使用されるのは、これが理由です。

Common Lispに関する注意: Common Lispを含む、他のほとんどのバージョンのLispは、非シーケンシャルに制御を移す、いくつかの方法 — たとえばreturnreturn-fromgo — をもちます。Emacs Lispの場合は、throwだけです。cl-libライブラリーは、これらのうちいくつかを提供します。Blocks and Exits in Common Lisp Extensionsを参照してください。

Special Form: catch tag body…

catchは、throw関数にたいするreturn位置を確立します。return位置はtagにより、そのような他のreturn位置と区別されます。tagは、nil以外の任意のLispオブジェクトです。引数tagはreturn位置が確立される前に、通常どおり評価されます。

return位置が効果をもつことにより、catchbodyのフォームをテキスト順に評価します。フォームが(エラーは非ローカル脱出なしで)通常に実行された場合、bodyの最後のフォームの値が、catchからreturnされます。

bodyの実効の間にthrowが実行された場合、tagと同じ値を指定すると、catchフォームは即座にexitします。returnされる値は、それが何であれ、throwの2番目の引数に指定された値です。

Function: throw tag value

throwの目的は、以前にcatchにより確立されたreturn位置に戻ることです。引数tagは、既存のさまざまなreturn位置からrturn位置を選択するために使用されます。複数のreturn位置がtagにマッチする場合、最内のものが使用されます。

引数valueは、catchからreturnされる値として使用されます。

タグtagのreturn位置が存在しない場合、データ(tag value)とともに、no-catchエラーがシグナルされます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.2 Examples of catch and throw

2重にネストされたループから脱出する1つの方法は、catchthrowを使うことです(ほとんどの言語では、これは“goto”により行なわれるでしょう)。ここでは、ijを、0から9に変化させて(foo i j)を計算します:

(defun search-foo ()
  (catch 'loop
    (let ((i 0))
      (while (< i 10)
        (let ((j 0))
          (while (< j 10)
            (if (foo i j)
                (throw 'loop (list i j)))
            (setq j (1+ j))))
        (setq i (1+ i))))))

fooが非nilをreturnした場合、即座に処理を止めて、ijのリストをreturnしています。fooが常にnilをreturnする場合、catchは通常どおりreturnし、その値はwhileの結果であるnilとなります。

以下では、2つのreturn位置を1度に表す、微妙に異なるトリッキーな例を2つ示します。最初に、同じタグhackにたいする2つのreturn位置があります:

(defun catch2 (tag)
  (catch tag
    (throw 'hack 'yes)))
⇒ catch2

(catch 'hack
  (print (catch2 'hack))
  'no)
-| yes
⇒ no

どちらのreturn位置もthrowにマッチするタグをもつので、内側のもの、つまりcatch2で確立されたものにgotoします。したがってcatch2は通常どおり値yesをreturnするので、その値がプリントされます。最後に外側のcatchの2番目のbody、つまり'noが評価されて、外側のcatchからそれがreturnされます。

ここで、catch2に与える引数を変更してみます:

(catch 'hack
  (print (catch2 'quux))
  'no)
⇒ yes

この場合も2つのreturn位置がありますが、今回は外側だけがタグhackをもち、内側のものは、かわりにタグquuxをもちます。したがって、throwにより、外側のcatchが値yesをreturnします。関数printが呼び出されることはなく、bodyのフォーム'noも決して評価されません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3 Errors

Emacs Lispが、何らかの理由により評価できないようなフォームの評価を試みた場合には、エラー(error)シグナル(signal)されます。

エラーがシグナルされた場合、エラーメッセージの表示とカレントこまんどの実行の終了が、Emacsデフォルトの反応です。たとえばバッファーの最後でC-fとタイプしたときのように、ほとんどの場合、これは正しい反応です。

複雑なプログラムでは、単なる終了が望ましくない場合もあるでしょう。たとえば、そのプログラムはデータ構造に一時的に変更を行なっていたり、プログラム終了前に削除すべき一時バッファーを作成しているかもしれません。このような場合、エラー時に評価されるクリーンアップ式(cleanup expressions)を設定するために、unwind-protectを使用するでしょう(Cleaning Up from Nonlocal Exitsを参照してください)。サブルーチン内のエラーにもかかわらずに、プログラムの実行を継続したいときがあるかもしれません。この場合、エラー時のリカバリーを制御するためのエラーハンドラー(error handlers)を設定するために、condition-caseを使用するでしょう。

エラーハンドリングを使用せずに、プログラムの一部から別の部分へ制御を移すためには、catchthrowを使用します。Explicit Nonlocal Exits: catch and throwを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3.1 How to Signal an Error

エラーのシグナリング(signaling)とは、エラーの処理を開始することを意味します。エラー処理は通常、実行中のプログラムのすべて、または一部をアボート(abort)して、エラーをハンドルするためにセットアップされた位置にreturnします。ここでは、エラーをシグナルする方法を記述します。

ほとんどのエラーは、たとえば、整数にたいしてCARを求めたり、バッファーの最後で1文字前方に移動したときなどのように、他の目的のために呼び出したLisp基本関数の中で、“自動的”にシグナルされます。関数errorsignalで、明示的にエラーをシグナルすることもできます。

ユーザーがC-gをタイプしたときに発生するquitは、エラーとは判断されませんが、ほとんどはエラーと同様に扱われます。Quittingを参照してください。

すべてのエラーメッセージはそれぞれ、何らかのエラーメッセージを指定します。そのメッセージは、何が悪いのか(“File does not exist”)、物事がどうしてそうあるべきではない(“File must exist”)かを示すべきです。Emacs Lispの監修では、エラーメッセージは大文字で開始され、句読点で終わるべきではありません。

Function: error format-string &rest args

この関数は、format-stringargsにたいして、format(Formatting Stringsを参照してください)を適用することにより構築されたエラーメッセージとともに、エラーをシグナルします。

以下は、errorを使用する典型的な例です:

(error "That is an error -- try something else")
     error→ That is an error -- try something else

(error "You have committed %d errors" 10)
     error→ You have committed 10 errors

2つの引数 — エラーシンボルerrorと、formatによりreturnされる文字列を含むリスト — でsignalを呼び出すことにより、errorは機能します。

警告: エラーメッセージとして固定の文字列を使用したい場合、単に(error string)とは記述しないでください。もしstringが‘%’を含む場合、それはフォーマット指定子(format specifier)として解釈されてしまうので、望む結果は得られません。かわりに、(error "%s" string)を使用してください。

Function: signal error-symbol data

この関数は、error-symbolにより命名されるエラーをシグナルします。引数dataは、エラーの状況に関連する追加のLispオブジェクトのリストです。

引数error-symbolは、エラーシンボル(error symbol)define-errorにより定義されYたシンボル — でなければなりません。これはEmacs Lispが異なる種類のエラーをクラス分けする方法です。エラーシンボル(error symbol)、エラーコンディション(error condition)、コンディション名(condition name)の説明については、Error Symbols and Condition Namesを参照してください。

エラーが処理されない場合、エラーメッセージをプリントするために2つの引数が使用されます。このエラーメッセージは通常、error-symbolerror-messageプロパティーにより提供されます。dataが非nilの場合、その後にコロンと、dataの評価されていない要素を、カンマで区切ったリストが続きます。errorが発生した場合、エラーメッセージは、dataCAR(文字列でなければなりません)です。file-errorのサブカテゴリーは、特別に処理されます。

data内のオブジェクトの数と重要性は、error-symbolに依存します。たとえば、wrong-type-argumentエラーでは、リスト内には2つのオブジェクト — 期待する型を記述する述語と、その型への適合に失敗したオブジェクト — であるべきです。

エラーを処理する任意のエラーハンドラーにたいして、error-symboldataの両方を利用できます。condition-caseは、ローカル変数を(error-symbol . data)というフォームでバインドします(Writing Code to Handle Errorsを参照してください)。

関数signalは、決してreturnしません。

(signal 'wrong-number-of-arguments '(x y))
     error→ Wrong number of arguments: x, y

(signal 'no-such-error '("My unknown error condition"))
     error→ peculiar error: "My unknown error condition"
Function: user-error format-string &rest args

この関数は、errorとまったく同じように振る舞いますが、errorではなく、user-errorというエラーシンボルを使用します。名前が示唆するように、このエラーはコード自身のエラーではなく、ユーザーパートのエラーの報告を意図しています。たとえば、Infoの閲覧履歴の開始を超えて履歴を遡るためにコマンドInfo-history-back (l)を使用した場合、Emacsはuser-errorをシグナルします。このようなエラーでは、たとえdebug-on-errorが非nilであっても、デバッガーへのエントリーは発生しません。Entering the Debugger on an Errorを参照してください。

Common Lispに関する注意: Emacs Lispには、Common Lispのような継続可能なエラーのような概念は存在しません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3.2 How Emacs Processes Errors

エラーがシグナルされたとき、signalは、そのエラーにたいするアクティブなハンドラー(handler)を検索します。ハンドラーとは、Lispプログラムの一部でエラーが発生したときに実行するよう意図された、Lisp式のシーケンスです。そのエラーが適切なハンドラーをもつ場合、そのハンドラーが実行され、そのハンドラーの後から実行が再開されます。ハンドラーは、そのハンドラーが設定されたcondition-caseの環境内で実行されます。condition-case内のすべての関数呼び出しはすでに終了しているので、ハンドラーがそれらにreturnすることはありません。

そのエラーにたいする適切なハンドラーが存在しない場合は、カレントコマンドを終了して、エディターのコマンドループに制御をreturnします(コマンドループは、すべての種類のエラーにたいする暗黙のハンドラーをもちます)。コマンドループのハンドラーは、エラーメッセージをプリントするために、エラーシンボルと、関連付けられたデータを使用します。変数command-error-functionを使用して、これが行なわれる方法を制御できます:

Variable: command-error-function

この変数は、もし非nilの場合はEmacsのコマンドループに制御をreturnしたエラーの処理に使用する関数を指定します。この関数は3つの引数をとります。1つ目はdataで、condition-caseが自身の変数にバインドするのと同じフォームです。2つ目はcontextで、これはエラーが発生した状況を記述する文字列、またはnil(よくある)です。3つ目はcallerで、これはエラーをシグナルした基本関数を呼び出したLisp関数です。

明示的なハンドラーのないエラーは、Lispデバッガーを呼び出すかもしれません。変数debug-on-error (Entering the Debugger on an Errorを参照してください)が非nilの場合、デバッガーが有効です。エラーハンドラーとは異なり、デバッガーはそのエラーの環境内で実行されるので、エラー時の変数の値を正確に調べることができます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3.3 Writing Code to Handle Errors

エラーをシグナルすることによる通常の効果は、実行されていたコマンドを終了して、Emacsエディターのコマンドループに即座にreturnすることです。スペシャルフォームcondition-caseを使用して、エラーハンドラーを設定することにより、プログラム内の一部で発生するエラーのをトラップを調整することができます。以下は単純な例です:

(condition-case nil
    (delete-file filename)
  (error nil))

これは、filenameという名前のファイルを削除して、任意のエラーをcatchして、エラーが発生した場合はnilを参照してください(このような単純なケースでは、マクロignore-errorsを使用することもできます。以下を参照してください)。

condition-case構成は、insert-file-contents呼び出しでのファイルオープンの失敗のような、予想できるエラーをトラップするために多用されます。condition-case構成は、ユーザーからの読み取った式を評価するプログラムのような、完全に予測できないエラーのトラップにも使用されます。

condition-caseの2番目の引数は、保護されたフォーム(protected form)と呼ばれます(上記の例では、保護されたフォームは、delete-fileの呼び出しです)。このフォームの実行が開始されると、エラーハンドラーは効果をもち、このフォームがreturnすると不活性になります。その間のすべてにおいて、エラーハンドラーは効果をもちます。特に、このフォームで呼び出された関数、およびそのサブルーチンなどを実行する間、エラーハンドラーは効果をもちます。厳密にいうと、保護されたフォーム自身ではなく、保護されたフォームにより呼び出されたLisp基本関数(signalerrorを含む)だけがシグナルされるというのは、よいことです。

保護されたフォームの後の引数はハンドラーです。各ハンドラーは、どのエラーを処理するかを指定する、1つ以上のコンディション名(condition names)(シンボル)をリストします。エラーがシグナルされたとき、エラーシンボルはコンディション名のリストも定義します。エラーが共通の条件名をもつ場合、そのハンドラーはそのエラーに適用されます。上記の例では、1つのハンドラーがあり、それはすべてのエラーをカバーする条件名errorを指定しています。

適切なハンドラーの検索は、もっとも最近に設定されたハンドラーから開始して、設定されたすべてのハンドラーをチェックします。したがって、ネストされたcondition-caseフォームに同じエラー処理がある場合、内側のハンドラーがそれを処理します。

何らかのcondition-caseによりエラーが処理された場合、debug-on-errorでエラーによりデバッガーが呼び出されるようにしていても、通常はデバッガーの実行が抑制されます。

condition-caseにより補足されるようなエラーをデバッグできるようにしたい場合は、変数debug-on-signalに非nil値をセットします。以下のようにコンディションの中にdebugを記述することにより、最初にデバッガーを実行するような、特定のハンドラーを指定することもできます:

(condition-case nil
    (delete-file filename)
  ((debug error) nil))

ここでのdebugの効果は、デバッガー呼び出しを抑制するcondition-caseを防ぐことだけです。debug-on-errorおよびその他のフィルタリングメカニズムがデバッガーを呼び出すように指定されているときだけ、エラーによりデバッガーが呼び出されます。Entering the Debugger on an Errorを参照してください。

Macro: condition-case-unless-debug var protected-form handlers…

マクロcondition-case-unless-debugは、そのようなフォームのデバッギングを処理する、別の方法を提供します。このマクロは、変数debug-on-errornilの場合、つまり任意のエラーを処理しないようなケース以外は、condition-caseとまったく同様に振る舞います。

特定のハンドラーがそのエラーを処理するとEmacsが判断すると、Emacsは制御をそのハンドラーにreturnします。これを行うために、Emacsはそのとき脱出しつつあるバインディング構成により作成されたすべての変数のバインドを解き、そのとき脱出しつつあるすべてのunwind-protectフォームを実行します。制御がそのハンドラーに達すると、そのハンドラーのbodyが通常どおり実行されます。

そのハンドラーのbodyを実行した後、condition-caseフォームから実行がreturnされます。保護されたフォームは、そのハンドラーの実行の前に完全にexitしているので、そのハンドラーはそのエラーの位置から実行を再開することはできず、その保護されたフォーム内で作られた変数のバインディングを調べることもできません。ハンドラーが行なえることは、クリーンアップと、処理を進行させることだけです。

エラーのシグナルとハンドルには、throwcatch(Explicit Nonlocal Exits: catch and throw)に類似する点がいくつかありますが、これらは完全に別の機能です。エラーはcatchでキャッチできず、throwをエラーハンドラーで処理することはできません(しかし対応するcatchが存在しないときにthrowを仕様することによりシグナルされるエラーは、処理できます)。

Special Form: condition-case var protected-form handlers…

このスペシャルフォームは、protected-formの実行を囲い込むエラーハンドラーhandlersを確立します。エラーなしでprotected-formが実行された場合、returnされる値はcondition-caseフォームの値になります。この場合、condition-caseは効果をもちません。protected-formの間にエラーが発生した場合、condition-caseは違いをもちます。

それぞれのhandlersは、(conditions body…)というフォームのリストです。ここでconditionsは、ハンドルされるエラーコンディション名、またはそのハンドラーの前にデバッガーを実行するためのコンディション名(debugを含みます)です。bodyは、このハンドラーがエラーを処理するときに実行される、1つ以上のLisp式です。

(error nil)

(arith-error (message "Division by zero"))

((arith-error file-error)
 (message
  "Either division by zero or failure to open a file"))

発生するエラーはそれぞれ、それが何の種類のエラーかを記述するエラーシンボル(error symbol)をもち、これはコンディション名のリストも記述します(Error Symbols and Condition Namesを参照してください)。Emacsは、1つ以上のコンディション名を指定するハンドラーにたいして、すべてのアクティブなcondition-caseフォームを検索します。condition-caseの最内のマッチは、そのエラーを処理します。このcondition-caseでは、最初に適合したハンドラーが、そのエラーを処理します。

ハンドラーのbodyを実行した後、condition-caseは通常どおりreturnし、ハンドラーのbodyの最後の値を、ハンドラー全体の値として使用します。

引数varは変数です。protected-formを実行するとき、condition-caseはこの変数をバインドせず、エラーを処理するときだけバインドします。その場合は、varエラー記述(error description)にバインドします。これはエラーの詳細を与えるリストです。このエラー記述は、(error-symbol . data)というフォームをもちます。ハンドラーは、何を行なうか決定するために、このリストを参照することができます。たとえば、ファイルオープンの失敗にたいするエラーの場合、ファイル名がdata(エラー記述の3番目の要素)の2番目の要素になります。

varnilの場合、それはバインドされた変数がないことを意味します。この場合、エラーシンボルおよび関連するデータは、そのハンドラーでは利用できません。

より外側のレベルのハンドラーにcatchさせるために、condition-caseによりcatchされたシグナルを再度throwする必要がある場合もあります。以下はこれを行なう方法です:

  (signal (car err) (cdr err))

ここでerrはエラー記述変数(error description variable)で、condition-caseの1番目の引数は、再throwしたいエラーコンディションです。Definition of signalを参照してください。

Function: error-message-string error-descriptor

この関数は、与えられたエラー記述子(error descriptor)にたいするエラーメッセージ文字列をreturnします。これは、そのエラーにたいする通常のエラーメッセージをプリントすることにより、エラーを処理したい場合に有用です。Definition of signalを参照してください。

以下は、0除算の結果によるエラーを処理するために、condition-caseを使用する例です。このハンドラーは、(beepなしで)エラーメッセージを表示して、非常に大きい数をreturnします。

(defun safe-divide (dividend divisor)
  (condition-case err
      ;; 保護されたフォーム。
      (/ dividend divisor)
    ;; ハンドラー。
    (arith-error                        ; Condition.
     ;; このエラーにたいする、通常のメッセージを表示する。
     (message "%s" (error-message-string err))
     1000000)))
⇒ safe-divide

(safe-divide 5 0)
     -| Arithmetic error: (arith-error)
⇒ 1000000

このハンドラーはコンディション名arith-errorを指定するので、division-by-zero(0除算)エラーだけを処理します。他の種類のエラーは(このcondition-caseによっては)、処理されません。したがって:

(safe-divide nil 3)
     error→ Wrong type argument: number-or-marker-p, nil

以下は、errorによるエラーを含む、すべての種類のエラーをcatchするcondition-caseです:

(setq baz 34)
     ⇒ 34

(condition-case err
    (if (eq baz 35)
        t
      ;; 関数errorの呼び出し
      (error "Rats!  The variable %s was %s, not 35" 'baz baz))
  ;; フォームではないハンドラー。
  (error (princ (format "The error was: %s" err))
         2))
-| The error was: (error "Rats!  The variable baz was 34, not 35")
⇒ 2
Macro: ignore-errors body…

これは、その実行中に発生する任意のエラーを無視して、bodyの実行を構築します。その実行にエラーがなかった場合、ignore-errorsbody内の最後のフォームの値をreturnし、それ以外はnilをreturnします。

以下は、このセクションの最初の例を、ignore-errorsを使用して記述する例です:

  (ignore-errors
   (delete-file filename))
Macro: with-demoted-errors format body…

このマクロは、いわばignore-errorsの穏やかなバージョンです。これはエラーを完全に抑止するのではなく、エラーをメッセージに変換します。これはメッセージのフォーマットに、文字列formatを使用します。formatは、"Error: %S"のように、単一の‘%’シーケンスを含むべきです。エラーをシグナルすると予測されないが、もし発生した場合は堅牢であるべきようなコードの周囲に、with-demoted-errorsを使用します。このマクロは、condition-caseではなく、condition-case-unless-debugを使用することに注意してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.3.4 Error Symbols and Condition Names

エラーをシグナルするとき、想定するエラーの種類を指定するために、エラーシンボル(error symbol)を指定します。エラーはそれぞれ、それをカテゴリー分けするために、ただ1つのエラーシンボルをもちます。これはEmacs Lisp言語で定義されるエラーの、もっとも良い分類方法です。

これら狭義の分類は、エラー条件(error conditions)と呼ばれる、より広義のクラス階層にグループ化され、それらはコンディション名(condition names)により識別されます。そのようなもっとも狭義なクラスは、エラーシンボル自体に属します。つまり各エラーシンボルは、コンディション名でもあるのです。すべての種類のエラー(quitを除く)を引き受けるコンディション名errorに至る、より広義のクラスにたいするコンディション名も存在します。したがって、各エラーは1つ以上のコンディション名をもちます。つまり、errorerrorとは区別されるエラーシンボル、もしかしたらその中間に分類されるものかもしれません。

Function: define-error name message &optional parent

シンボルをエラーシンボルとするために、シンボルは親コンディションをとるdefine-errorで定義されなければなりません。この親は、この種のエラーが属するコンディションを定義します。親の推移的な集合は、常にそのエラーシンボルと、シンボルerrorを含みます。quitはエラーと判断されないので、quitの親の集合は、単なる(quit)です。

親のコンディションに加えて、エラーシンボルはメッセージ(message)をもち、これは処理されないエラーがシグナルされたときプリントされる文字列です。そのメッセージが有効でない場合、エラーメッセージ‘peculiar error’が使用されます。Definition of signalを参照してください。

内部的には、親の集合はエラーシンボルのerror-conditionsプロパティーに格納され、メッセージはエラーシンボルのerror-messageプロパティーに格納されます。

以下は、新しいエラーシンボルnew-errorを定義する例です:

(define-error 'new-error "A new error" 'my-own-errors)

このエラーは複数のコンディション名 — もっとも狭義の分類new-error、より広義の分類を想定するmy-own-errors、およびmy-own-errorsのコンディションすべてを含むerrorで、これはすべての中でもっとも広義なものです。

エラー文字列は大文字で開始されるべきですが、ピリオドで終了すべきではありません。これはEmacsの他の部分との整合性のためです。

もちろんEmacs自身がnew-errorをシグナルすることはありません。あなたのコード内で明示的にsignal(Definition of signalを参照してください)を呼び出すことにより、これを行なうことができるのです。

(signal 'new-error '(x y))
     error→ A new error: x, y

このエラーは、エラーの任意のコンディション名により処理することができます。以下の例は、new-errorとクラスmy-own-errors内の他の任意のエラーを処理します:

(condition-case foo
    (bar nil t)
  (my-own-errors nil))

エラーが分類される有効な方法は、コンディション名による方法で、その名前はハンドラーのエラーのマッチに使用されます。エラーシンボルは、意図されたエラーメッセージと、コンディション名のリストを指定する便利な方法であるという役割だけです。1つのエラーシンボルではなく、コンディション名のリストをsignalに与えるのは、面倒でしょう。

対照的に、コンディション名を伴わずにエラーシンボルだけを使用した場合、それはcondition-caseの効果を著しく減少させるでしょう。コンディション名は、エラーハンドラーを記述するとき、一般性のさまざまなレベルにおいて、エラーをカテゴリー分けすることを可能にします。エラーシンボルを単独で使用することは、もっとも狭義なレベルの分類を除くすべてを捨てることです。

主要なエラーシンボルと、それらのコンディションについては、Standard Errorsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.5.4 Cleaning Up from Nonlocal Exits

unwind-protect構成は、データ構造を一時的に不整合な状態に置くときは、重要です。これはエラーやthrouのイベントにより、再びデータを整合された状態にすることができます(バッファー内容の変更だけに使用される、他のクリーンアップ構成は、アトミックな変更グループです。Atomic Change Groupsを参照してください)。

Special Form: unwind-protect body-form cleanup-forms…

unwind-protectは、制御がbody-formを離れる場合に、cleanup-formsが評価されるという保証の下、なにが起こった可に関わらず、body-formを実行します。body-formは通常どおり完了するかもしれず、unwind-protectの外でthrowが実行されたり、エラーが発生するかもしれませんが、cleanup-formsは評価されます。

body-formが正常に終了した場合、unwind-protectcleanup-formsを評価した後で、body-formの値をreturnします。body-formが終了しなかった場合、unwind-protectは通常の意味における値は、returnしません。

unwind-protectにより保護されるのは、body-formだけです。cleanup-forms自体の任意のフォームが、(throwまたはエラーにより)非ローカルにexitした場合、unwind-protectは残りのフォームが評価されることを保証しませんcleanup-formsの中の1つが失敗することが問題となる場合は、そのフォームの周囲に他のunwind-protectを配して保護します。

現在アクティブなunwind-protectフォーム数と、ローカルの変数バインディング数の和は、max-specpdl-size(Local Variablesを参照してください)により制限されます。

たとえば、以下は一時的な使用のために不可視のバッファーを作成して、終了する前に確実にそのバッファーをkillする例です:

(let ((buffer (get-buffer-create " *temp*")))
  (with-current-buffer buffer
    (unwind-protect
        body-form
      (kill-buffer buffer))))

(kill-buffer (current-buffer))のように記述して、変数bufferを使用せずに、同様のことを行えると思うかもしれません。しかし上の例は、別のバッファーにスイッチしたときにbody-formでエラーが発生した場合、より安全なのです(一時的なバッファーをkillするとき、そのバッファーがカレントとなることを確実にするために、かわりにbody-formの周囲にsave-current-bufferを記述することもできます)。

Emacsには、上のコードとおおよそ等しいコードに展開される、with-temp-bufferという標準マクロが含まれます(Current Bufferを参照してください)。このマニュアル中で定義されるいくつかのマクロは、この方法でunwind-protectを使用します。

以下は、FTPパッケージ由来の、実際の例です。これは、リモートマシンへの接続の確立を試みるために、プロセス(Processesを参照してください)を作成します。関数ftp-loginは、関数のライター(writer)が予想できないことによる多くの問題から非常に影響を受けるので、失敗イベントでプロセスの削除を保証するフォームで保護されています。そうしないと、Emacsは無用なサブプロセスで一杯になってしまうでしょう。

(let ((win nil))
  (unwind-protect
      (progn
        (setq process (ftp-setup-buffer host file))
        (if (setq win (ftp-login process host user password))
            (message "Logged in")
          (error "Ftp login failed")))
    (or win (and process (delete-process process)))))

この例には小さなバグがあります。ユーザーがquitするためにC-gとタイプした場合、関数ftp-setup-bufferがreturnした後、即座にquitが発生しますが、それは変数processがセットされる前なので、そのプロセスはkillされないでしょう。このバグを簡単に訂正する方法はありませんが、少なくともこれは非常に稀なことだと言えます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11 Variables

変数(variable)とは、プログラム内で値を表すために使用される名前です。Lispでは、変数はそれぞれLispシンボルとして表されます(Symbolsを参照してください)。変数名は単にそのシンボルの名前であり、変数の値はそのシンボルの値セル(value cell)に格納されます6Symbol Componentsを参照してください。Emacs Lispでは、シンボルを変数として使用することは、同じシンボルを関数名として使用することと関係ありません。

このマニュアル中で前に記したとおり、Lispプログラムはまず第1にLispオブジェクトとして表され、副次的にテキストとして表現されます。Lispプログラムのテキスト的な形式は、そのプログラムを構成するLispオブジェクトの入力構文により与えられます。したがって、Lispプログラム内の変数のテキスト的な形式は、その変数を表すシンボルの入力構文を使用して記述されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.1 Global Variables

変数を使用するための一番シンプルな方法は、グローバル(globally)に使用する方法です。これは、ある時点でその変数はただ1つの値をもち、その値が(少なくともその時点では)Lispシステム全体で効果をもつことを意味します。あらたな値を指定するまで、その値が効果をもちます。新しい値で古い値を置き換えるとき、古い値を追跡する情報は変数内に残りません。

シンボルの値はsetqで指定します。たとえば、

(setq x '(a b))

これは、変数xに値(a b)を与えます。setqはスペシャルフォームであることに注意してください。これは1番目の引数(変数の名前)は評価しませんが、2番目の引数(新しい値)は評価します。

変数が1度値をもつと、そのシンボル自身を式として使用することにより、参照することができます。したがって、

x ⇒ (a b)

これは上記のsetqフォームが実行された場合です。

同じ変数を再びセットした場合、新しい値は古い値を置き換えます:

x
     ⇒ (a b)
(setq x 4)
     ⇒ 4
x
     ⇒ 4

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2 Variables that Never Change

Emacs Lispでは、特定のシンボルは、通常は自分自身に評価されます。これらのシンボルにはnilt、同様に名前が‘:’で始まる任意のシンボル(これらはキーワードと呼ばれます)が含まれます。これらのシンボルは、リバインドや、値の変更はできません。niltへのセットやリバインドは、setting-constantエラーをシグナルします。これはキーワード(名前が‘:’で始まるシンボル)についても当てはまります。ただしキーワードが標準のobarrayにinternされている場合、そのようなシンボルを自分自身にセットしてもエラーになりません。

nil ≡ 'nil
     ⇒ nil
(setq nil 500)
error→ Attempt to set constant symbol: nil
Function: keywordp object

この関数は、objectが‘:’で始まる名前のシンボルで、標準のobarrayにinternされているの場合はt、それ以外はnilをreturnします。

これらの定数はスペシャルフォームdefconst(Defining Global Variablesを参照してください)を使用して定義された“定数(constant)”とは、根本的に異なります。defconstフォームは、人間の読み手に値の変更を意図しない変数であることを知らせる役目は果たしますが、実際にそれを変更しても、Emacsはエラーを起こしません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.3 Local Variables

グローバル変数は、新しい値で明示的に置き換えるまで値が持続します。変数にローカル値(local value) — Lispプログラム内の特定の部分で効果をもつを与えると便利なときがあります。変数がローカル値をもつとき、わたしたちは変数がその値にローカルにバインド(locally bound)と言い、その変数をローカル変数(local variable)と呼びます。

たとえば、関数が呼び出されるとき、関数の引数となる変数はローカル値(その関数の呼び出しにおいて実際の引数に与えられた値)を受け取ります。これらのローカルバインディングは、その関数のbody内で効果をもちます。他にも、たとえばスペシャルフォームletは特定の変数にたいして明示的にローカルなバインディングを確立し、これはletフォームのbody内で効果を持ちます。

これにたいしてグローバルなバインディング(global binding)とは、(概念的には)グローバルな値が保持される場所です。

ローカルバインディングを確立すると、その変数の以前の値は他の場所に保存されます(または失われます)。わたしたちはこれを、以前の値がシャドーされた(shadowed)と言います。シャドーはグローバル変数とローカル変数の両方で発生し得ます。ローカルバインディングが効果を持つとき、ローカル変数にsetqを使用することにより、ローカルバインディングに指定された値を格納します。ローカルバインディングが効果を持たなくなったとき、以前にシャドーされた値が復元されます(または失われます)。

変数は同時に複数のローカルバインディングを持つことができます(たとえばその変数をバインドするネストされたlet)。カレントバインディング(current binding)とは、実際に効果を持つローカルバインディングのことです。カレントバインディングは、その変数の評価によりreturnされる値を決定し、setqにより影響を受けるバインディングです。

ほとんどの用途において、“最内(innermost)”のローカルバインディング、ローカルバインディングがないときはグローバルバインディングを、カレントバインディングと考えることができます。より正確に言うと、スコープルール(scoping rule)と呼ばれるルールは、プログラム内でローカルバインディングが効果を持つ任意の与えられた場所を決定します。Emacs Lispのスコープルールはダイナミックスコープ(dynamic scoping)と呼ばれ、これは単に実行中のプログラム内の与えられた位置でのカレントバインディングを示し、その変数がまだ存在する場合は、その変数にたいしてもっとも最近作成されたバインディングです。ダイナミックスコープについての詳細と、その代替であるレキシカルスコープ(lexical scoping)と呼ばれるスコープルールについては、Scoping Rules for Variable Bindingsを参照してください。

スペシャルフォームletおよびlet*は、ローカルバインディングを作成するために存在します:

Special Form: let (bindings…) forms…

このスペシャルフォームは、bindingsにより指定される特定の変数セットにたいするローカルバインディングをセットアップしてから、formsのすべてをテキスト順に評価します。これはforms内の最後のフォームの値をreturnします。

bindingsの各バインディングは2つの形式のどちらかです。(i) シンボルの場合。この場合、そのシンボルはnilにローカルにバインドされます。(ii) フォーム(symbol value-form)のリストの場合。この場合symbolvalue-formを評価した結果にローカルにバインドされます。value-formが省略された場合は、nilが使用されます。

bindings内のすべてのvalue-formは、シンボルがそれらにバインドされるに、記述された順番に評価されます。以下は例では、zyの新しい場合(つまり1)にではなく、古い値(つまり2)にバインドされます。

(setq y 2)
     ⇒ 2

(let ((y 1)
      (z y))
  (list y z))
     ⇒ (1 2)
Special Form: let* (bindings…) forms…

このスペシャルフォームはletと似ていますが、次の変数値にたいするローカル値を計算する前に、ローカル値を計算してそれを変数にバインドします。したがて、bindings内の式は、このlet*フォーム内の前のシンボルのバインドを参照できます。以下の例を、上記letの例と比較してください。

(setq y 2)
     ⇒ 2

(let* ((y 1)
       (z y))    ; yの値に今計算されたばかりの値を使用する。
  (list y z))
     ⇒ (1 1)

以下は、ローカルバインディングを作成する、他の機能のリストです:

変数はバッファーローカルなバインディングを持つこともできます(Buffer-Local Variablesを参照してください)。数は多くありませんが、端末ローカル(terminal-local)なバインディングをもつ変数もあります(Multiple Terminalsを参照してください)これらの種類のバインディングは、通常のローカルバインディングのように機能することもありますが、これらはEmacs内の“どこ”であるかに依存してローカライズされます。

User Option: max-specpdl-size

この変数は、ローカルな変数バインディングと、unwind-protectにゆるクリーンアップ(Cleaning Up from Nonlocal Exitsの総数にたいする制限を定義し、この変数を越えるとEmacsはエラー(データに関するエラー"Variable binding depth exceeds max-specpdl-size")をシグナルします。

このリミットは、もし超過したときにエラーが関連付けられている場合には、誤って定義された関数による無限再起を避けるための1つの方法になります。ネストの深さにたいする他の制限としては、max-lisp-eval-depthがあります。Evalを参照してください。

デフォルト値は1300です。Lispデバッガーのエントリーしたとき、もし残りが少ないときは、デバッガーを実行するための空きを作るために、値は増加されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.4 When a Variable is “Void”

シンボルの値セル(Symbol Componentsを参照してください)に値が割り当てられていない場合、その変数はvoid(空)であると言います。

Emacs Lispのデフォルトであるダイナミックスコープルール(see section Scoping Rules for Variable Bindings)の下では、値セルはその変数のカレント値(ローカルまたはグローバル)を保持します。値が割り当てられていない値セルは、値セルにnilをもつのとは異なることに注意してください。シンボルnilはLispオブジェクトであり、他のオブジェクトと同様に変数の値となることができます。nilは値なのです。変数がvoidの場合、その変数の評価を試みると、値をreturnするかわりに、void-variableエラーがシグナルされます。

オプションであるレキシカルスコープルール(lexical scoping rule)の下では、値セル保持できるのは、その変数のグローバル値 — 任意のレキシカルバインディング構造の外側の値だけです。変数がレキシカルにバインドされている場合、ローカル値はそのレキシカル環境により決定されます。したがって、これらのシンボルの値セルに値が割り当てられていなくても、変数はローカル値を持つことができます。

Function: makunbound symbol

この関数は、symbolの値セルを空にして、その変数をvoidにします。この関数はsymbolをreturnします。

symbolがダイナミックなローカルバインディングを持つ場合、makunboundはカレントのバインディングをvoidにし、そのローカルバインディングが効果を持つ限りvoidにします。その後、前にシャドーされたローカル値(またはグローバル値)が再び有効になり、再び有効になった値がvoidでなければ、その変数はvoidでなくなります。

いくつか例を示します(ダイナミックバインディングが有効だとします):

(setq x 1)               ; グローバルバインディングに値をセットする。
     ⇒ 1
(let ((x 2))             ; それをローカルにバインドする。
  (makunbound 'x)        ; ローカルバインディングをvoidにする。
  x)
error→ Symbol's value as variable is void: x
x                        ; グローバルバインディングは変更されない。
     ⇒ 1

(let ((x 2))             ; ローカルにバインドする。
  (let ((x 3))           ; もう1度。
    (makunbound 'x)      ; 最内のローカルバインディングをvoidにする。
    x))                  ; それを参照すると、void。
error→ Symbol's value as variable is void: x

(let ((x 2))
  (let ((x 3))
    (makunbound 'x))     ; 内側のバインディングをvoidにしてから取り除く。
  x)                     ; 外側のletバインディングが有効になる。
     ⇒ 2
Function: boundp variable

この関数はvariable(シンボル)がvoidでなければtをreturnし、voidのときはnilをreturnします。

いくつか例を示します(ダイナミックバインディングが有効だとします):

(boundp 'abracadabra)          ; 最初はvoid。
     ⇒ nil
(let ((abracadabra 5))         ; ローカルにバインドする。
  (boundp 'abracadabra))
     ⇒ t
(boundp 'abracadabra)          ; グローバルではまだvoid。
     ⇒ nil
(setq abracadabra 5)           ; グローバルで非voidにする。
     ⇒ 5
(boundp 'abracadabra)
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.5 Defining Global Variables

変数定義(variable definition)とは、そのシンボルをグローバル変数として使用する意図を表明する構成です。これには以下で説明するスペシャルフォームdefvardefconstが使用されます。

変数宣言は3つの目的をもちます。1番目は、コードを読む人にたいして、そのシンボルが特定の方法(変数として)使用されることを意図したものだと知らせることです。2番目は、Lispシステムにたいして、オプションで初期値とドキュメント文字列を与えて、これを知らせることです。3番目は、etagsのようなプログラミングツールにたいして、その変数が定義されている場所を見つけられるように、情報を提供することです。

defconstdefvarの違いは主に、人間の読み手に、値が変更されるかどうかを知らせることにあります。Emacs Lispは実際、defconstで定義された変数の値の変更を妨げません。この2つのフォームの特筆すべき違いは、defconstは無条件で変数を初期化し、defvarは変数が元々voidのときだけ初期化することです。

マスタマイズ可能な変数を定義する場合は、defcustomを使用するべきです(これはサブルーチンとしてdefvarを呼び出します)。Defining Customization Variablesを参照してください。

Special Form: defvar symbol [value [doc-string]]

このスペシャルフォームは、変数としてsymbolを定義します。symbolは評価されないことに注意してください。シンボルはdefvarフォーム内に明示的に表記して定義される必要があります。この変数は特別だとマークされ、これは常にそれがダイナミックにバインドされることを意味します(Scoping Rules for Variable Bindingsを参照してください)。

valueが指定されていてsymbolがvoid(たとえばこのシンボルがダイナミックにバインドされた値を持たないとき。When a Variable is “Void”を参照してください)、valueが評価されて、その結果がsymbolにセットされます。しかしsymbolがvoidでな場合、valueは評価されず、symbolの値は変更されません。valueが省略された場合、いかなる場合もsymbolの値は変更されません。

symbolがカレントバッファー内でバッファーローカルなバインディングをもつ場合、defvarはデフォルト値に作用します。デフォルト値はバッファーローカルなバインディングではなく、バッファーにたいして独立しています。デフォルト値がvoidのときはデフォルト値をセットします。Buffer-Local Variablesを参照してください。

すでにsymbolがレキシカルにバインドされている場合(たとえばレキシカルバインドが有効な状態でletフォーム内にdefvarがあるような場合)、defvarはダイナミックな値をセットします。バインディング構造を抜けるまで、レキシカルバインディングは効果をもちます。Scoping Rules for Variable Bindingsを参照してください。

Emacs Lispモード(eval-defun)でトップレベルのdefvarを評価するとき、eval-defunの特別な機能は、その値がvoidであるかテストすることなく、その変数を無条件にセットします。

引数doc-stringが与えられた場合、それは変数にたいするドキュメント文字列を指定します(そのシンボルのvariable-documentationプロパティーに格納されます)。Documentationを参照してください。

以下にいくつか例を示します。これはfooを定義しますが、初期化は行いません:

(defvar foo)
     ⇒ foo

この例はbarの値を23に初期化して、ドキュメント文字列を与えます:

(defvar bar 23
  "The normal weight of a bar.")
     ⇒ bar

defvarフォームはsymbolをreturnしますが、通常これは値が問題にならないファイル内のトップレベルで使用されます。

Special Form: defconst symbol value [doc-string]

このスペシャルフォームは、ある値としてsymbolを定義して、それを初期化します。これはコードを読む人に、symbolがここで設定される標準的なグローバル値をもち、ユーザーや他のプログラムがそれを変更すべきではないことを知らせます。symbolは評価されないことに注意してください。このシンボルは、defconst内に明示的に記されなければなりません。

defvarと同様、defconstは、変数を特別 — この変数が常にダイナミックにバインドされているという意味 — だとマークします(Scoping Rules for Variable Bindingsを参照してください)。加えて、これはその変数を危険であるとマークします(File Local Variablesを参照してください)。

defconstは常にvalueを評価して、その結果をsymbolの値にセットします。カレントバッファー内でsymbolがバッファーローカルなバインディングをもつ場合、defconstはデフォルト値ではなく、バッファーローカルな値をセットします(しかし、defconstで定義されたシンボルにたいしてバッファーローカルなバインディングを作るべきではありません)。

defconstの使い方の例は、Emacsのfloat-pi — (たとえIndiana State Legislatureが何を試みようと)何者かにより変更されるべきではない、数学定数piにたいする定義です。しかし2番目のdefconstの例のように、これは単にアドバイス的なものです。

(defconst float-pi 3.141592653589793 "The value of Pi.")
     ⇒ float-pi
(setq float-pi 3)
     ⇒ float-pi
float-pi
     ⇒ 3

警告: 変数がローカルバインディングをもつとき(letにより作成された、または関数の引数の場合)に、スペシャルフォームdefconstまたはdefvarを使用すると、これらのフォームはグローバルバインディングではなく、ローカルバインディングをセットします。これは通常、あなたが望むことではないはずです。これを防ぐには、これらのスペシャルフォームをファイル内のトップレベルで使用します。この場所は通常、何のローカルバインディングも効果をもたないので、その変数にたいするローカルバインディングが作成される前にファイルがロードされることが確実だからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.6 Tips for Defining Variables Robustly

値が関数(または関数のリスト)であるような変数を定義するとき、変数の名前の最後に‘-function’(または‘-functions’)を使います。

他にも、変数名に関する慣習があります。以下はその完全なリストです:

…-hook

変数はノーマルフックです(Hooksを参照してください)。

…-function

値は関数です。

…-functions

値は関数のリストです。

…-form

値はフォーム(式)です。

…-forms

値はフォーム(式)のリストです。

…-predicate

値は述語(predicate) — 1つの引数をとる関数 — で、引数が“正しい(good)”"場合は非nil、“正しくない(bad)”場合はnilをreturnします。

…-flag

nilか、そうでないかだけが意味をもつような値です。そのような変数は結局、やがては多くの値をもつことが多いので、この慣習を強く推奨はしません。

…-program

値はプログラム名です。

…-command

値は完全なシェルコマンドです。

…-switches

値はコマンドにたいして指定するオプションです。

変数を定義するときは、その変数を“安全(safe)”とマークすべきか、それとも“危険(risky)”とマークすべきかを常に考慮してください。File Local Variablesを参照してください。

複雑な値を保持する変数(バインディングをもつkeymapなど)を定義、または初期化するとき、以下のように値の計算をすべてdefvarの中に配置するのが最良です:

(defvar my-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "\C-c\C-a" 'my-command)
    …
    map)
  docstring)

この方法にはいくつかの利点があります。1つ目は、ファールをロード中にユーザーが中断した場合、変数はまだ初期化されていないか、初期化されているかのどちらかで、その中間ということはありません。まだ初期化されていない場合、ファイルをリロードすれば正しく初期化されます。2つ目は、1度初期化された変数は、ファイルをリロードしても変更されないことです。コンテンツの一部を変更(たとえばキーのリバインド)するフックをユーザーが実行した場合などに、これは重要です。3つ目は、C-M-xdefvarを評価すると、そのマップは完全に再初期化されることです。

defvarフォーム内に多すぎるコードを配置することには不利な点が1つあります。ドキュメント文字列が変数の名前から離れた場所に配置されることです。これを避ける安全な方法は以下の方法です:

(defvar my-mode-map nil
  docstring)
(unless my-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "\C-c\C-a" 'my-command)
    …
    (setq my-mode-map map)))

これは初期化をdefvarの内側に配置した場合とまったく同じ利点をもちますが、変数を再度初期化したい場合は、各フォームにたいして1回ずつ、2度C-M-xをタイプしなければならない点が異なります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.7 Accessing Variable Values

変数を参照する通常の方法は、それに名前をつけるシンボルを記述する方法です。The usual way to reference a variable is to write the symbol which names it. Symbol Formsを参照してください。

時には、実行時にのみ決定される変数を参照したいときがあるかもしれません。そのような場合、プログラム中のテキストで、変数名を指定することはできません。その値を抽出するために、symbol-valueを使うことができます。

Function: symbol-value symbol

この関数は、symbolの値セルに格納された値をreturnします。これには、その変数の(ダイナミックな)カレント値が格納された場所です。その変数がローカルバインディングをもたない場合は、単にその変数のグローバル値になります。変数がvoidの場合、void-variableはエラーをシグナルします。

その変数がレキシカルにバインドされている場合、symbol-valueにより報告される値は、その変数のレキシカル値と同じである必要はありません。レキシカル値はそのシンボルの値セルではなく、レキシカル環境により決定されます。Scoping Rules for Variable Bindingsを参照してください。

(setq abracadabra 5)
     ⇒ 5
(setq foo 9)
     ⇒ 9

;; ここでシンボルabracadabra
;;   値がテストされるシンボル。
(let ((abracadabra 'foo))
  (symbol-value 'abracadabra))
     ⇒ foo

;; ここでは、abracadabraの値、
;;   つまりfooが、
;;   値をテストされるシンボル。
(let ((abracadabra 'foo))
  (symbol-value abracadabra))
     ⇒ 9

(symbol-value 'abracadabra)
     ⇒ 5

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.8 Setting Variable Values

ある変数の値を変更する通常の方法は、スペシャルフォームsetqを使用する方法です。実行時に変数選択を計算する必要がある場合は、関数setを使用します。

Special Form: setq [symbol form]…

このスペシャルフォームは、変数の値を変更するための、もっとも一般的な方法です。symbolにはそれぞれ、新しい値(対応するformが評価された結果)を与えられます。そのシンボルのカレントバインディングは変更されます。

setqsymbolを評価せず、記述されたシンボルをセットします。この引数のことを、自動的にクォートされた(automatically quoted)と呼びます。setqの‘q’は、“quoted(クォートされた)”が由来です。

setqフォームの値は、最後のformの値となります。

(setq x (1+ 2))
     ⇒ 3
x                   ; ここでxはグローバル値をもつ。
     ⇒ 3
(let ((x 5))
  (setq x 6)        ; xのローカルバインディングをセット。
  x)
     ⇒ 6
x                   ; グローバル値は変更されない。
     ⇒ 3

1番目のformが評価されてから1番目のsymbolがセットされ、次に2番目のformが評価されてからsymbolが評価されて、...となることに注意してください:

(setq x 10          ; ここで、xがセットされるのは
      y (1+ x))     ;   yの計算前であることに注目。
     ⇒ 11
Function: set symbol value

この関数は、symbolの値セルにvalueを配置します。これはスペシャルフォームではなく関数なので、シンボルにセットするために、symbolに記述された式は評価されます。return値はvalueです。

ダイナミックな変数バインドが有効な場合(デフォルト)、setは自身の引数symbolを評価しますが、setqは評価しないという点を除き、setsetqと同じ効果をもちます。しかし、変数がレキシカルバインドの場合、setは変数のダイナミックな値に影響し、setqは変数のカレント値(レキシカル値)に影響します。Scoping Rules for Variable Bindingsを参照してください。

(set one 1)
error→ Symbol's value as variable is void: one
(set 'one 1)
     ⇒ 1
(set 'two 'one)
     ⇒ one
(set two 2)         ; twoは、シンボルoneに評価される。
     ⇒ 2
one                 ; したがってoneがセットされる。
     ⇒ 2
(let ((one 1))      ; oneのこのバインディングがセットされるのであって
  (set 'one 3)      ;   グローバル値はセットされない。
  one)
     ⇒ 3
one
     ⇒ 2

symbolが実際のシンボルでない場合、wrong-type-argumentエラーがシグナルされます。

(set '(x y) 'z)
error→ Wrong type argument: symbolp, (x y)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9 Scoping Rules for Variable Bindings

ある変数にたいするローカルバインディングを作成するとき、そのバインディングはプログラムの限られた一部だけに効果をもちます(see section Local Variables)。このセクションでは、これが正確には何を意味するかについて説明します。

ローカルバインディングはそれぞれ、個別にスコープ(scope: 範囲という意味)エクステント(extent: これも範囲を意味する)をもちます。スコープは、そのバインディングにアクセスできるのが、テキストのソースコードのどこ(where)であるかを示します。エクステントは、プログラムの実行中に、そのバインディングが存在するのがいつ(when)であるかを示します。

デフォルトでは、Emacsが作成したローカルバインディングは、ダイナミックバインディング(dynamic binding)です。このようなバインディングは、ダイナミックスコープ(dynamic scope)をもち、それはプログラムの任意の範囲が、その変数バインディングにアクセスするかもしれないことを意味します。これはダイナミックエクステント(dynamic extent)ももちます。これはそのバインディング構造(letフォームのbodyなど)が実行される間だけ、そのバインディングが存続することを意味します。

Emacsはオプションでレキシカルバインディング(lexical binding)を作成することができます。レキシカルバインディングはレキシカルスコープ(lexical scope)をもち、これはその変数にたいする任意の参照が、バインディング構造内にテキスト的に配置されなければならないことを意味します7。レキシカルバインディングは不定エクステント(indefinite extent)ももちます。これは、ある状況下において、クロージャー(closures)と呼ばれるスペシャルオブジェクトにより、バインディング構造が実行を終えた後でさえも、存続を続けることを意味します。

以降のサブセクションでは、ダイナミックバインディングとレキシカルバインディング、およびEmacs Lispプログラムでレキシカルバインディングを有効にする方法について、より詳細に説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.1 Dynamic Binding

デフォルトでは、Emacsにより作成されるローカル変数のバインディングは、ダイナミックバインディングです。ある変数がダイナミックにバインドされていると、Lispプログラムの実行における任意のポイントでのカレントバインディングは、単にそのシンボルにたいしてもっとも最近作成されたダイナミックなローカルバインディングか、そのようなローカルバインディングが存在しない場合はグローバルバインディングになります。

以下の例のように、ダイナミックバインディングはダイナミックスコープとダイナミック<エクステントをもちます:

(defvar x -99)  ; xは初期値として-99を受け取る。

(defun getx ()
  x)            ; この関数内では、xは“自由”に使用される。

(let ((x 1))    ; xはダイナミックにバインドされている。
  (getx))
     ⇒ 1

;; letフォームが終了した後、
;; xは前の値-99にリバートされる。

(getx)
     ⇒ -99

関数getxxを参照します。defun構造自体の中にxにたいするバインディングが存在しないと意味において、これは“自由”な参照です。xが(ダイナミックに)バインドされているletフォーム内からgetxを呼び出すと、ローカル値(つまり1)が取得されます。しかし、その後letフォームの外側からgetxを呼び出すと、グローバル値(つまり-99)が取得されます。

以下は、setqを使用してダイナミックに変数をバインドする、例をです:

(defvar x -99)      ; xは初期値として-99を受け取る。

(defun addx ()
  (setq x (1+ x)))  ; xに1追加して、新しい値をreturnする。

(let ((x 1))
  (addx)
  (addx))
     ⇒ 3           ; addxを2回呼び出すと、xに2回追加される。

;; letフォームが終了した後、
;; xは前の値-99にリバートされる。

(addx)
     ⇒ -98

Emacs Lispでは、ダイナミックバインディングは、シンプルな方法で実装されています。それぞれのシンボルは、シンボルのカレントのダイナミック値(または値の不在)を指定する値セルをもちます。Symbol Componentsを参照してください。あるシンボルがダイナミックなローカル値を与えられたとき、Emacsは値セルの内容(または値の不在)をスタックに記録し、新しいローカル値を値セルに格納します。バインディング構造が実行を終えたとき、Emacsはスタックから古い値をpopして、値セルにそれを置きます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.2 Proper Use of Dynamic Binding

ダイナミックバインディングは、プログラムにたいしてテキスト的なローカルスコープ内で定義されていない変数を参照することを許す、強力な機能です。しかし、無制限に使用した場合は、プログラムの理解しにくくしてしまうこともあります。このテクニックを使用するために、2つの明解な方法があります:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.3 Lexical Binding

Emacsのバージョン24.1から、オプションの機能としてレキシカルバインディングが導入されました。わたしたちは、この機能の重要さが、将来において重要になることを期待します。レキシカルバインディングは最適化の機会をより広げるので、この機能を使用するプログラムはおそらく、将来のEmacsバージョンで高速に実行されるようになるでしょう。レキシカルバインディングは、わたしたちがEmacsに将来追加したいと考える並列性(concurrency)とも互換をもっています。

レキシカルにバインドされた変数はレキシカルスコープ(lexical scope)をもいます。 これは、その変数にたいする参照は、そのバインディング構造内にテキスト的に配置されなければならないことを意味します。以下は例です (実際にレキシカルバインディングを有功にする方法は、Using Lexical Bindingを参照してください):

(let ((x 1))    ; xはレキシカルにバインドされる。
  (+ x 3))
     ⇒ 4

(defun getx ()
  x)            ; この関数内では、xは“自由”に使用される。

(let ((x 1))    ; xはレキシカルにバインドされる。
  (getx))
error→ Symbol's value as variable is void: x

ここでは、xはグローバル値をもちません。letフォーム内でレキシカルにバインドされたとき、この変数はletのテキスト境界内で使用できます。しかし、このlet内から呼び出されるgetx関数からは、getxの関数定義がletフォームの外側にあるので、使用することができません

レキシカルバインディングが機能する方法を説明します。各バインディング構造は、その構造および構造のローカル値でバインドされるシンボルを指定することにより、レキシカル環境(lexical environment)を定義します。Lispの評価機能(Lisp evaluator)がある変数のカレント値を得たいときは、最初にレキシカル環境内を探します。そこで変数が指定されていなければ、ダイナミック値が格納されるシンボルの値セルを探します。

(内部的には、レキシカル環境はシンボルと値がペアになったalistで、alistの最後の要素はコンスセルではなく、シンボルtです。そのようなalistは、フォームを評価するためのレキシカル環境を指定するために、eval関数の2番目の引数として渡すことができます。Evalを参照してください。しかし、ほとんどのEmacs Lispプログラムは、この方法で直接レキシカル環境を使用するべきではありません。デバッガーのような特化されたプログラムだけが使用すべきです。)

レキシカルバインディングは、不定エクステント(indefinite extent)をもちます。バインディング構造が終了した後でも、そのレキシカル環境はクロージャー(closures)と呼ばれるLispオブジェクト内に“保持”されます。クロージャーは、レキシカルバインディングが有効な、名前つきまたは無名(anonymous)の関数が作成されたときに作成されます。詳細は、Closuresを参照してください。

クロージャーが関数として呼び出されたとき、その関数の定義内のレキシカル変数にたいする任意の参照は、レキシカル環境を維持するために使用されます。以下は例です:

(defvar my-ticker nil)   ; クロージャーを格納するために
                         ; この変数を使用する。

(let ((x 0))             ; xはレキシカルにバインドされる。
  (setq my-ticker (lambda ()
                    (setq x (1+ x)))))
    ⇒ (closure ((x . 0) t) ()
          (setq x (1+ x)))

(funcall my-ticker)
    ⇒ 1

(funcall my-ticker)
    ⇒ 2

(funcall my-ticker)
    ⇒ 3

x                        ; xはグローバル値をもたないことに注意。
error→ Symbol's value as variable is void: x

letバインディングは、内部に変数xをもつレキシカル環境を定義し、これは0にローカルにバインドされます。このバインディング構造内で、xを1層化し、増加された値をreturnするクロージャーを定義しています。このラムダ式は自動的にクロージャーになり、たとえlet構造を抜けた後でも、その内部ではレキシカル環境が存続します。クロージャーを評価するときは毎回、レキシカル環境内のxのバインディングが使用され、xが増加されます。

symbol-valueboundpsetのような関数は、変数のダイナミックバインディング(つまりそのシンボルの値セル)だけを取得(または変更)することに注意してください。defun(またはdefmacro)のbody内のコードも、周囲のレキシカル変数は参照できません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.9.4 Using Lexical Binding

Emacs Lispファイルをロードしたり、Lispバッファーを評価するとき、バッファーローカルな変数lexical-bindingが非nilの場合は、レキシカルバインディングが有効になります:

Variable: lexical-binding

このバッファーローカルな変数が非nilの場合、Emacs Lispファイルおよびバッファーは、ダイナミックバインディングではなくレキシカルバインディングを使用して評価されます(しかし、特別な変数はダイナミックにバインドされたままです。以下を参照してください)。nilの場合、すべてのローカル変数にたいしてダイナミックバインディングが使用されます。この変数は通常、ファイルローカル変数として、Emacs Lispファイル全体にたいしてセットされます(File Local Variablesを参照してください)。他のファイルローカル変数などとは異なり、ファイルの最初の行でセットされなければならないことに注意してください。

eval呼び出しを使用して、Emacs Lispコードを直接評価するとき、evallexical引数が非nilの場合は、レキシカルバインディングが有効になります。Evalを参照してください。

レキシカルバインディングが有効な場合でも、特定の変数はダイナミックにバインドされたままです。これらはスペシャル変数(special variable)と呼ばれます。defvardefcustomdefconstで定義されたすべての変数は、スペシャル変数です(Defining Global Variablesを参照してください)。その他のすべての変数はレキシカルバインディングの対象になります。

Function: special-variable-p symbol

この関数は、symbolがスペシャル変数(つまり変数がdefvardefcustomdefconstによる定義をもつ)の場合は非nilをreturnします。それ以外では、return値はnilになります。

関数内での通常の引数としてスペシャル変数を使用することは、推奨されません。レキシカルバインディングモードが有効なときにこれを行うと、不定な動作が起こります(あるときはレキシカルバインディング、またあるときはダイナミックバインディングのように)。

Emacs Lispプログラムをレキシカルバインディングに変換するのは簡単です。最初にEmacs Lispソースファイルのヘッダー行でlexical-bindingtして、ファイルローカル変数を追加します(File Local Variablesを参照してください)。次に、意図せずレキシカルにバインドしてしまわないように、ダイナミックなバインドをもつ必要がある変数が変数定義をもつことを、各変数ごとにチェックします。

どの変数が変数定義をもつ必要があるか見つけるシンプルな方法は、ソースファイルをバイトコンパイルすることです。Byte Compilationを参照してください。letフォームの外で非スペシャル変数が使用されている場合、バイトコンパイラーは“free variable”にたいする参照または割り当てについて警告するでしょう。非スペシャル変数がバインドされているが、letフォーム内で使用されていない場合、バイトコンパイラーは“unused lexical variable”に関して警告するでしょう。バイトコンパイラーは、スペシャル変数を関数の引数として使用している場合も、問題を警告します。

(使用されていない変数についての警告を抑制するためには、単に変数名をアンダースコアーで開始します。そうすれば、バイトコンパイラーはこれを、変数が使用されないことを示すと解釈します。)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.10 Buffer-Local Variables

グローバルおよびボーカルな変数バインディングは、1つの形式、または別の形式で、ほとんどのプログラミング言語で見つけることができます。しかしEmacsは、1つのバッファーだけに適用されるバッファーローカル(buffer-local)なバインディングの用に、普通にはない種類の変数バインディングもサポートします。ある変数にたいして異なるバッファーごとに別の亜Q体をもつのは、重要なカスタマイズ方法です(変数は端末ごとにローカルなバインディングをもつこともできます。Multiple Terminalsを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.10.1 Introduction to Buffer-Local Variables

バッファーローカル変数は、特定のバッファーに関連づけられた、バッファーローカルなバインディングをもちます。このバインディングは、そのバッファーがカレントのときに効果をもち、カレントでないときは効果がありません。バッファーローカルなバインディングが効力をもつときにその変数をセットした場合、そのバインディングは新しい値をもちますが、他のバインディングは変更されません。これは、バッファーローカルなバインディングを作成したバッファーだけで変更が見えることを意味します。

その変数にたいする特定のバッファーに関連づけられていない通常のバインディングは、デフォルトバインディング(default binding)と呼ばれます。ほとんどの場合、これはグローバルバインディングです。

変数は、あるバッファーではバッファーローカルなバインディングをもつことができ、他のバッファーではもたないことができます。デフォルトバインディングは、その変数にたいして自身のバインディングをもたない、すべてのバッファーで共有されます(これには、新たに作成されたバッファーが含まれます)。ある変数にたいしてバッファーローカルなバインディングをもたないバッファーでその変数をセットすると、デフォルトバインディングがセットされるので、それはデフォルトバインディングを参照するすべてのバッファーで新しい値を見ることができます。

バッファーローカルなバインディングのもっとも一般的な使用は、目はーモードがコマンドの動作を制御するために変数を変更する場合です。たとえばCモードやLispモードは、空行だけがパラグラフの区切りになるように、変数paragraph-startをセットします。これらのモードは、CモードやLispモードになるようなバッファー内でこの変数をバッファーローカルにすることによりこれを行い、その後そのモードにたいして新しい値をセットします。Major Modesを参照してください。

バッファーローカルなバインディングを作成する通常の方法は、make-local-variableによる方法で、これは通常メジャーモードが使用します。これはカレントバッファーだけに効果があります。その他すべてのバッファー(まだ作成されていないバッファーを含む)は、それらのバッファー自身が明示的にバッファーローカルなバインディングを与えられるまで、デフォルト値の共有を続けます。

変数を自動的にバッファーローカルになるようにマークする、より強力な操作は、make-variable-buffer-localを呼び出すことにより行われます。これは、たとえその変数がまだ作成されていなくても、変数をすべてのバッファーにたいしてローカルにすると考えることができます。より正確には、変数を自動的にセットすることにより、その変数がカレントバッファーにたいしてローカルでなくても、変数をローカルにする効果があります。すべてのバッファーは最初は通常のようにデフォルト値を共有しますが、この変数をセットすることによりカレントバッファーにたいしてバッファーローカルなバインディングを作成します。新たな値はバッファーローカルなバインディングに格納され、デフォルトバインディングは変更されずに残ります。これは、任意のバッファーでsetqによりデフォルト値を変更できないことを意味します。変更する唯一の方法は、setq-defaultだけです。

警告: ある変数が1つ以上のバッファーでバッファーローカルなバインディングをもつとき、letはそのとき効果をもつ変数のバインディングをリバインドします。たとえばq、カレントバッファーがバッファーローカルな値をもつ場合、letは一時的にそれをリバインドします。効果をもつバッファーローカルなバインディングが存在しない場合、letはデフォルト値をリバインドします。letの内部で、別のバインディングが効力をもつ別のバッファーをカレントバッファーにすると、それ以上letバインディングを参照できなくなります。他のバッファーにいる間にletを抜けると、(たとえそれが正しくても)バインディングの解消を見ることはできません。以下にこれを示します:

(setq foo 'g)
(set-buffer "a")
(make-local-variable 'foo)
(setq foo 'a)
(let ((foo 'temp))
  ;; foo ⇒ 'temp  ; バッファー‘a’内でのletバインディング
  (set-buffer "b")
  ;; foo ⇒ 'g     ; fooは‘b’にたいしてローカルではないためグローバル値
  body…)
foo ⇒ 'g        ; exitによりバッファー‘a’のローカル値が復元されるが、
                 ; バッファー‘b’では見ることができない
(set-buffer "a") ; ローカル値が復元されたことを確認
foo ⇒ 'a

body内のfooにたいする参照は、バッファー‘b’のバッファーローカルなバインディングにアクセスすることに注意してください。

あるファイルがローカル変数の値をセットする場合、これらの変数はファイルをvisitするときバッファーローカルな値になります。File Variables in The GNU Emacs Manualを参照してください。

バッファーローカル変数を、端末ローカル(terminal-local)にすることはできません(Multiple Terminalsを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.10.2 Creating and Deleting Buffer-Local Bindings

Command: make-local-variable variable

この関数はカレントバッファー内で、variable(シンボル)にたいして、バッファーローカルなバインディングを作成します。他のバッファーは影響を受けません。returnされる値は、variableです。

variableのバッファーローカルな値は最初、以前にvariableがもっていた値と同じ値をもちます。variableがvoidのときは、voidのままです。

;; バッファー‘b1’で行う:
(setq foo 5)                ; すべてのバッファーに影響する。
     ⇒ 5
(make-local-variable 'foo)  ; b1’内でローカルになった。
     ⇒ foo
foo                         ; 値は変更されない。
     ⇒ 5
(setq foo 6)                ; b1’内で値を変更。
     ⇒ 6
foo
     ⇒ 6

;; バッファー‘b2’では、値は変更されていない。
(with-current-buffer "b2"
  foo)
     ⇒ 5

変数をletバインディングでバッファーローカルにしても、letへの出入り時の両方で、これを行うバッファーがカレントでない場合は、信頼性がありません。これはletがバインディングの種類を区別しないからです。letはバインディングを作成される変数だけを知るからです。

変数が端末ローカル(Multiple Terminalsを参照してください)の場合、この関数はエラーをシグナルします。そのような変数は、バッファーローカルなバインディングをもつことができません。

警告: フック変数にたいしてmake-local-variableを使用しないでください。フック変数は、add-hookまたはremove-hooklocal引数を使用した場合、必要に応じて自動的にバッファーローカルになります。

Macro: setq-local variable value

このマクロはカレントバッファー内でvariableにたいしてバッファーローカルなバインディングを作成して、それにバッファーローカルな値valueを与えます。このマクロはmake-local-variableに続けてsetqを呼び出すのと同じです。variableはクォートされていないシンボルです。

Command: make-variable-buffer-local variable

このコマンドは、variable(シンボル)が自動的にバッファーローカルになるようにマークするので、それ以降にその変数へのセットを試みると、その時点でカレントのバッファーにローカルになります。しばしば混乱を招くmake-local-variableとは異なり、これが取り消されることはなく、すべてのバッファー内での変数の挙動に影響します。

この機能に特有の欠点は、(letまたはその他のバインディング構造による)変数のバインディングが、その変数にたいするバッファーローカルなバインディングを作成しないことです。(setまたはsetqによる)変数のセットだけは、その変数がカレントバッファーで作成されたletスタイルのバインディングをもたないので、ローカルなバインディングを作成します。

variableがデフォルト値をもたない場合、このコマンドの呼び出しはnilのデフォルト値を与えます。variableがすでにデフォルト値をもつ場合、その値は変更されずに残ります。それ以降にvariableにたいしてmakunboundを呼び出すと、バッファーローカル値をvoidにして、デフォルト値は影響を受けずに残ります。

return値はvariableです。

警告: ユーザーオプション変数にたいしては、ユーザーは異なるバッファーにたいして異なるカスタマイズを望むかもしれないので、make-variable-buffer-localを使うべきだと決め込むべきではありません。ユーザーは、望むなら任意の変数をローカルにできます。それらの選択の余地を残すほうがよいでしょう。

make-variable-buffer-localを使用すべきときは、複数のバッファーが同じバインディングを共有しないことが自明な場合です。たとえば、バッファーごとに個別な値をもつことに依存するLispプログラム内の内部プロセスにたいして変数が使用されるときは、make-variable-buffer-localの使用が最善の解決策になるかもしれません。

Macro: defvar-local variable value &optional docstring

このマクロはvariableを、初期値valueおよびdocstringの変数として定義して、それを自動的にバッファーローカルとマークします。これはdefvarの後につづけてmake-variable-buffer-localを呼び出すのと同じです。variableはクォートされていないシンボルです。

Function: local-variable-p variable &optional buffer

これはvariableがバッファーbuffer(デフォルトはカレントバッファー)内でバッファーローカルのときはt、それ以外はnilをreturnします。

Function: local-variable-if-set-p variable &optional buffer

これはvariableがバッファーbuffer内でバッファーローカル値をもつか、自動的にバッファーローカルになる場合は、tをreturnします。それ以外はnilをreturnします。bufferが省略またはnilの場合のデフォルトは、カレントバッファーです。

Function: buffer-local-value variable buffer

この関数は、バッファーbuffer内の、variable(シンボル)のバッファーローカルなバインディングをreturnします。variableがバッファーbuffer内でバッファーローカルなバインディングをもたない場合は、かわりにvariableのデフォルト値(The Default Value of a Buffer-Local Variable)をreturnします。

Function: buffer-local-variables &optional buffer

この関数はバッファーbuffer内のバッファーローカル変数を表すリストをreturnします(bufferが省略された場合はカレントバッファーが使用されます)。リストの各要素は通常、(sym . val)という形式をもちます。ここでsymはバッファーローカル変数(シンボル)、valはバッファーローカル値です。しかしbuffer内の、ある変数のバッファーローカルなバインディングがvoidのtきは、その変数に対応するリスト要素は単にsymになります。

(make-local-variable 'foobar)
(makunbound 'foobar)
(make-local-variable 'bind-me)
(setq bind-me 69)
(setq lcl (buffer-local-variables))
    ;; 最初はすべてのバッファー内でローカルなビルトイン変数:
⇒ ((mark-active . nil)
    (buffer-undo-list . nil)
    (mode-name . "Fundamental")
    …
    ;; 次にビルトインでないバッファーローカル変数。
    ;; This one is buffer-local and void:
    foobar
    ;; これはバッファーローカルでvoidではない:
    (bind-me . 69))

このリスト内のコンスセルのCDRに新たな値を格納しても、その変数のバッファーローカル値は変化しないことに注意してください。

Command: kill-local-variable variable

この関数はカレントバッファー内のvariable(シンボル)にたいするバッファーローカルなバインディング(もしあれば)を削除します。その結果として、このバッファー内でvariableのデフォルトバインディングが可視になります。これは通常、variableの値を変更します。デフォルト値は削除されたバッファーローカル値とは異なるのが普通だからです。

セットしたとき自動的にバッファーローカルになる変数のバッファーローカルなバインディングをkillした場合は、これによりカレントバッファーな意でデフォルト値が可視になります。しかし、変数を再度セットすると、その変数にたいするバッファーローカルなバインディングが再作成されます。

kill-local-variablevariableをreturnします。

この関数はコマンドです。なぜなら、バッファーローカル変数のインタラクティブな作成が有用な場合があるように、あるバッファーローカル変数のインタラクティブなkillが有用な場合があるからです。

Function: kill-all-local-variables

この関数は、“permanent(永続的)”とマークされた変数、およびpermanent-local-hookプロパティーに非nilをもつローカルフック関数(Setting Hooks)を除き、カレントバッファーのすべてのバッファーローカルなバインディングを解消します。結果として、そのバッファーはほとんどの変数のデフォルト値を参照するようになります。

この関数は、そのバッファーに関係のあるその他の特定の情報もリセットします。これはローカルキーマップ(local keymap)をnil、構文テーブル(syntax table)を(standard-syntax-table)の値、大文字小文字テーブル(case table)を(standard-case-table)、abbrevテーブル(abbrev table)をfundamental-mode-abbrev-tableの値にセットします。

この関数が1番最初に行うのは、ノーマルフックchange-major-mode-hook(以下参照)の実行です。

各メジャーモードコマンドは、Fundamentalモードにスイッチする効果をもち、以前のメジャーモードのほとんどの効果を消去する、この関数を呼び出すことにより開始されます。この関数が処理を行うのを確実にするために、メジャーモードがセットする変数はpermanentとマークすべきではありません。

kill-all-local-variables returns nil.

Variable: change-major-mode-hook

関数kill-all-local-variablesは、何か他のことを行う前に、まずこのノーマルフックを実行します。この関数はメジャーモードにたいして、ユーザーが他のメジャーモードにスイッチした場合に行われる、何か特別なことを準備する方法を与えます。この関数は、ユーザーがメジャーモードを変更した場合に忘れられるべき、バッファー固有のマイナーモードにたいしても有用です。

最善の結果を得るために、この変数をバッファーローカルにすれば、処理が終了したときに消えるので、以降のメジャーモードに干渉しなくなります。Hooksを参照してください。

変数名(シンボル)が非nilpermanent-localプロパティーをもつ場合、バッファーローカル変数はpermanent(永続的)です。そのような変数はkill-all-local-variablesの影響を受けず、したがってメジャーモードの変更によりそれらのローカルバインディングは作成されません。permanentなローカル変数は、ファイルの内容を編集する方法などより、どこから読み込んだファイルか、あるいはどのように保存するかといったことに関連するデータに適しています。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.10.3 The Default Value of a Buffer-Local Variable

バッファーローカルなバインディングをもつ変数のグローバル値も、デフォルト値(default)値と呼ばれます。なぜなら、その変数にたいしてカレントバッファーも選択されたフレームもバインディングをもたない場合には、その値が常に効果をもつからです。

関数default-valueおよびsetq-defaultは、カレントバッファーがバッファーローカルなバインディングをもつかどうかに関わらず、その変数のデフォルト値にアクセスまたは変更します。たとえば、ほとんどのバッファーにたいして、paragraph-startのデフォルトのセッティングを変更するために、setq-defaultを使用できます。そして、この変数にたいするバッファーローカルな値をもつCモードやLispモードにいるときでさえ、これは機能します。

スペシャルフォームdefvarおよびdefconstも、バッファーローカルな値ではなく、(もし変数にセットする場合は)デフォルト値をセットします。

Function: default-value symbol

この関数は、symbolのデフォルト値をreturnします。これは、この変数にたいして独自の値をもたないバッファーやフレームから参照される値です。symbolがバッファーローカルでない場合、これはsymbol-value(Accessing Variable Valuesを参照してください)と同じです。

Function: default-boundp symbol

関数default-boundpは、symbolのデフォルト値がvoidでないか報告します。(default-boundp 'foo)nilをreturnした場合、(default-value 'foo)はエラーになります。

default-boundpdefault-valueんびたいして、boundpsymbol-valueにたいする述語です。

Special Form: setq-default [symbol form]…

このスペシャルフォームは、各symbolに、対応するformを評価した結果を新たなデフォルト値として与えます。これはsymbolを評価しませんが、formは評価します。setq-defaultフォームの値は、最後のformの値です。

カレントバッファーにたいしてsymbolがバッファーローカルでなく、自動的にバッファーローカルにマークされない場合、setq-defaultsetqと同じ効果をもちます。カレントバッファーにたいしてsymbolがバッファーローカルな場合、これは他のバッファーから参照できる値を変更します(それらのバッファーがバッファーローカルな値をもたない限り)が、それはカレントバッファーから参照される値ではありません。

;; バッファー‘foo’で行う:
(make-local-variable 'buffer-local)
     ⇒ buffer-local
(setq buffer-local 'value-in-foo)
     ⇒ value-in-foo
(setq-default buffer-local 'new-default)
     ⇒ new-default
buffer-local
     ⇒ value-in-foo
(default-value 'buffer-local)
     ⇒ new-default

;; (新しい)バッファー‘bar’で行う:
buffer-local
     ⇒ new-default
(default-value 'buffer-local)
     ⇒ new-default
(setq buffer-local 'another-default)
     ⇒ another-default
(default-value 'buffer-local)
     ⇒ another-default

;; バッファー‘foo’に戻って行う:
buffer-local
     ⇒ value-in-foo
(default-value 'buffer-local)
     ⇒ another-default
Function: set-default symbol value

この関数はsetq-defaultと似ていますが、symbolは通常の引数として評価されます。

(set-default (car '(a b c)) 23)
     ⇒ 23
(default-value 'a)
     ⇒ 23

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.11 File Local Variables

ファイルにローカル変数の値を指定できます。そのファイルをvisitしているバッファー内で、これらの変数にたいしてバッファーローカルなバインディングを作成するために、Emacsはこれらを使用します。ファイルローカル変数の基本的な情報については、Local Variables in Files in The GNU Emacs Manualを参照してください。このセクションはファイルローカル変数が処理される方法に影響する関数と変数を説明します。

ファイルローカル変数が勝手に関数や、後で呼び出されるLisp式を指定できる場合、ファイルのvisitによりEmacsが乗っ取られてしまうかもしれません。Emacsは、指定された値が安全だと既知のファイルローカル変数だけを自動的にセットすることにより、この危険から保護します。これ以外のファイルローカル変数は、ユーザーが同意した場合のみセットされます。

追加の安全策として、Emacsがファイルローカル変数を読み込むとき、一時的にread-circlenilにバインドされます(Input Functionsを参照してください)。これはLispリーダー循環および共有されたLisp構造(Read Syntax for Circular Objectsを参照してください)を認識することを防ぎます。

User Option: enable-local-variables

この変数はファイルローカル変数を処理するかどうかを制御します。以下の値が利用できます:

t(デフォルト)

安全な変数をセットして、安全でない変数については問い合わせます(1回)。

:safe

安全な変数だけをセットして、問い合わせはしません。

:all

問い合わせをせずに、すべての変数をセットします。

nil

変数をセットしません。

その他

すべての変数にたいして問い合わせます(1回)。

Variable: inhibit-local-variables-regexps

これは正規表現のリストです。ファイルがこのリストの要素にマッチする名前をもつ場合、任意のファイルローカル変数のフォームはスキャンされません。どんなときにこれを使いたいかの例は、See section How Emacs Chooses a Major Modeを参照してください。

Function: hack-local-variables &optional mode-only

この関数は、カレントバッファーの内容により指定された任意のローカル変数として、必要に応じてバインドと評価を行います。変数enable-local-variablesは、ここでも効果をもちます。しかし、この関数は‘-*-行の、‘mode:’ローカル変数を探しません。set-auto-modeはこれを行い、enable-local-variablesも考慮されます(How Emacs Chooses a Major Modeを参照してください)。

この関数は、file-local-variables-alist内に格納されたalistを調べて、各ローカル変数を順に適用することにより機能します。この関数は、変数に適用する前(または後)に、before-hack-local-variables-hook(またはhack-local-variables-hook)を呼び出します。alistが非nilの場合のみ、事前のフック(before-hook)を呼び出し、その他のフックは常に呼び出します。この関数は、そのバッファーがすでにもつメジャーモードと同じメジャーモードが指定された場合には、‘mode’要素を無視します。

オプションの引数mode-onlyが非nilの場合、この関数が行うのはメジャーモードを指定するシンボルをreturnするのがすべてで、‘-*-行またはローカル変数リストがメジャーモードを指定していればそのモード、それ以外はnilをreturnします。この関数はモードや他のファイルローカル変数をセットしません。

Variable: file-local-variables-alist

このバッファーローカルな変数は、ファイルローカル変数のセッティングのalistを保持します。alistの各要素は(var . value)という形式で、varはローカル変数のシンボル、valueはその値です。Emacsがファイルをvisitするとき、最初にすべてのファイルローカル変数をこのalistに収集して、その後に変数1つずつに関数hack-local-variablesを適用します。

Variable: before-hack-local-variables-hook

Emacsは、file-local-variables-alistに格納されたファイルローカル変数を適用する直前に、このフックを呼び出します。

Variable: hack-local-variables-hook

Emacsは、file-local-variables-alistに格納されたファイルローカル変数を適用し終えた直後に、このフックを呼び出します。

ある変数にたいしてsafe-local-variableプロパティーにより、安全な値を指定できます。このプロパティーは引数を1つとる関数です。与えられた値にたいして、その関数が非nilをreturnした場合、その値は安全です。一般的に目にするファイル変数の多くは、safe-local-variableプロパティーをもちます。これらのファイル変数には、fill-columnfill-prefixindent-tabs-modeが含まれます。ブーリーン値の変数にたいしては、プロパティーの値にbooleanpを使用します。

defcustomを使用してユーザーオプションを定義するとき、defcustomに引数:safe functionを追加することにより、safe-local-variableプロパティーをセットできます(Defining Customization Variablesを参照してください)。

User Option: safe-local-variable-values

この変数は、ある変数の値が安全であることをマークする、別の方法を提供します。これはコンスセル(var . val)のリストで、varは変数名、valはその変数にたいして安全な値です。

Emacsが一連のファイルローカル変数にしたがうかどうかユーザーに尋ねるとき、ユーザーはそれらの変数が安全だとマークすることができます。安全だとマークするとsafe-local-variable-valuesにこれらのvariable/valueペアーが追加され、ユーザーのカスタムファイルに保存します。

Function: safe-local-variable-p sym val

この関数は、上記の条件に基づき、symに値valを与えても安全な場合は、非nilをreturnします。

いくつかの変数は危険(risky)だと判断されます。ある変数が危険な場合、その変数が自動的にsafe-local-variable-valuesに追加されることはありません。ユーザーがsafe-local-variable-valuesを直接カスタマイズすることにより、明示的に値を許さない限り、危険な変数をセットする前にEmacsは常に確認を求めます。

名前が非nilrisky-local-variableプロパティーをもつ任意の変数は、危険だと判断されます。defcustomを使用してユーザーオプションを定義するとき、defcustomに引数:risky valueを追加することにより、ユーザーオプションにrisky-local-variableプロパティーをセットできます。それに加えて名前が‘-command’、‘-frame-alist’、‘-function’、‘-functions’、‘-hook’、‘-hooks’、‘-form’、‘-forms’、‘-map’、‘-map-alist’、‘-mode-alist’、‘-program’、‘-predicate’で終わる任意の変数は、自動的に危険だと判断されます。後に数字をともなう変数‘font-lock-keywords’および‘font-lock-keywords’、さらに‘font-lock-syntactic-keywords’も危険だと判断されます。

Function: risky-local-variable-p sym

この関数は、symが上記の条件にもとづき危険な変数の場合は、非非nilをreturnします。

Variable: ignored-local-variables

この変数はファイルによりローカル値を与えられるべきではない変数のリストを保持します。これらの変数に指定された任意の値は、完全に無視されます。

Eval:’“変数”も抜け道になる可能性があるので、Emacsは通常、それを処理する前に確認を求めます。

User Option: enable-local-eval

この変数は‘-*-’行中、またはvisitされるファイル内のローカル変数リストの、‘Eval:’にたいする処理を制御します。値tは、無条件に実行することを意味します。nilは、それらを無視することを意味します。それ以外は、各ファイルにたいして何を行うか、ユーザーに確認を求めることを意味します。デフォルト値は、maybeです。

User Option: safe-local-eval-forms

この変数は、ファイルローカル変数リスト内の‘Eval:’“変数”の中、評価しても安全な式のリストを保持します。

その式が関数呼び出しで、その関数がsafe-local-eval-functionプロパティーをもつ場合、そのプロパティー値はその式の評価が安全かどうかを決定します。プロパティー値は、その式をテストするための述語(predicate)、そのような述語のリスト(成功した述語があれば安全)、またはt(引数が定数である限り常に安全)を指定できます。

テキストプロパティーは、それらの値に関数呼び出しを含めることができるので、抜け道になる可能性があります。したがって、Emacsはファイルローカル変数にたいして指定された文字列値から、テキストプロパティーを取り除きます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.12 Directory Local Variables

ディレクトリーは、そのディレクトリー内のすべてのファイルに共通なローカル変数値を指定することができます。Emacsは、そのディレクトリー内の任意のファイルをvisitしているバッファー内で、それらの変数にたいするバッファーローカルなバインディングを作成するために、これを使用します。これは、そのディレクトリー内のファイルが何らかのプロジェクトに属していて、同じローカル変数を共有するときなどに有用です。

ディレクトリーローカル変数を指定するために、2つの異なる方法があります: 1つは特別なファイルにそれを記述する方法、もう1つはそのディレクトリーにプロジェクトクラス(project class)を定義する方法です。

Constant: dir-locals-file

この定数は、Emacsがディレクトリーローカル変数が見つけることができる期待する、ファイルの名前です。ファイル名は、.dir-locals.el8です。ディレクトリー内でその名前をもつファイルにより、Emacsはディレクトリー内の任意のファイル、または任意のサブディレクトリー(オプションでサブディレクトリーを除外できます。以下を参照してください)にセッティングを適用します。独自に.dir-locals.elをもつサブディレクトリーがある場合、Emacsはサブディレクトリーで見つかった1番深いファイルのディレクトリーからディレクトリーツリーを上方に移動しながら、1番深いファイルのセッティングを使用します。このファイルは、ローカル変数をフォーマットされたリストとして指定します。詳細は、Per-directory Local Variables in The GNU Emacs Manualを参照してください。

Function: hack-dir-local-variables

この関数は.dir-locals.elファイルを読み込み、そのディレクトリー内の任意のファイルをvisitしているバッファーにたいしてローカルなfile-local-variables-alist内に、それらを適用することなくディレクトリーローカル変数を格納します。この関数はディレクトリーローカルなセッティングもdir-locals-class-alist(.dir-locals.elファイルが見つかったディレクトリーにたいする特別なクラスを定義する)内に格納します。この関数は、以下で説明するように、dir-locals-set-class-variablesおよびdir-locals-set-directory-classを呼び出すことにより機能します。

Function: hack-dir-local-variables-non-file-buffer

この関数はディレクトリーローカル変数を探して、即座にそれらをカレントバッファーに適用します。これはDiredバッファーのような、非ファイルバッファーをディレクトリーローカル変数のセッティングにしたがわせるために、モードコマンド呼び出しの中から呼び出されることを意図したものです。非ファイルバッファーにたいしては、Emacsはdefault-directoryと、その親ディレクトリーの中から、ディレクトリーローカル変数を探します。

Function: dir-locals-set-class-variables class variables

この関数は、classという名前がつけられたシンボルにたいして、一連の変数セッティングを定義します。その後このクラスを1つ以上のディレクトリーに割り当てることができ、するとEmacsはこれらの変数セッティングを、それらのディレクトリー内のすべてのファイルに適用します。variables内のリストは、2つの形式 — (major-mode . alist)または(directory . list) — のうち1つをもつことができます。1番目の形式では、そのファイルのバッファーがmajor-modeを継承するモードに切り替わるときに、連想リストalist内のすべての変数が適用されます。alistは、(name . value)という形式です。major-modeにたいする特別な値nilは、そのセッティングが任意のモードに適用できることを意味します。alist内では、特別なnameとして、subdirsを使用することができます。連想値がnilの場合、alistは関連するディレクトリー内のファイルだけに適用され、それらのサブディレクトリーには適用されません。

variablesの2番目の形式では、directoryがそのファイルのディレクトリーの最初のサブディレクトリーの場合、上記のルールにしたがって、listが再帰的に適用されます。listは、この関数のvariablesで指定できる2つの形式のうち、1つを指定します。

Function: dir-locals-set-directory-class directory class &optional mtime

この関数はdirectoryおよびサブディレクトリー内のすべてのファイルにclassを割り当てます。その後、classにたいして指定されたすべての変数セッティングは、directoryおよびその子ディレクトリー内でvisitされた任意のファイルに適用されます。classは事前にdir-locals-set-class-variablesで定義されていなければなりません。

Emacsは、.dir-locals.elファイルからディレクトリー変数をロードするとき、内部的にこの関数を使用します。その場合、オプションの引数mtimeは、ファイルの修正日時(modification time。file-attributesによりreturnされる)を保持します。Emacsは、記憶されたローカル変数がまだ有効化チェックするために、この日時を使用します。ファイルを通じ手ではなく直接クラスを割り当てる場合、この引数はnilになります。

Variable: dir-locals-class-alist

このalistはクラスシンボル(class symbol)と連想変数セッティング(associated variable settings)を保持します。これはdir-locals-set-class-variablesにより更新されます。

Variable: dir-locals-directory-cache

このalistはディレクトリー名、それらに割り当てられたクラス名、およびこのエントリーに関連するディレクトリーローカル変数ファイルの修正日時を保持します。関数dir-locals-set-directory-classは、このlistを更新します。

Variable: enable-dir-local-variables

nilの場合、ディレクトリーローカル変数は無視されます。この変数は、ファイルローカル変数(File Local Variablesを参照してください)にしたがい、ディレクトリーローカル変数は無視したいモードにたいして有用かもしれません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.13 Variable Aliases

シノニムとして2つの変数を作成するのが有用なときがあります。2つの変数は常に同じ値をもち、、どちらか一方を変更すると、もう一方も変更されます。変数の名前を変更 — 古い名前はよく考慮して選択されたものではなかった、あるいは変数の意味が部分的に変更された等の理由で — するとき、互換性のために新しい名前のエイリアス(alias)として古い名前を維持するのが有用なときがあるかもしれません。defvaraliasにより、これを行うことができます。

Function: defvaralias new-alias base-variable &optional docstring

この関数はシンボルbase-variableのエイリアスとして、シンボルnew-aliasを定義します。これはnew-aliasから値を取得すると、base-variableの値がreturnされ、new-aliasの値を変更すると、base-variableの値が変更されることを意味します。エイリアスされた2つの変数名は、常に同じ値と同じバインディングを共有します。

docstring引数が非nilの場合、それはnew-aliasのドキュメント文字列を指定します。それ以外では、エイリアスは(もしあれば)base-variableと同じドキュメント文字列となります。ただし、それはbase-variable自体がエイリアスではない場合で、エイリアスの場合、new-aliasはエイリアスチェーンの最後の変数のドキュメント文字列になります。

この関数はbase-variableをreturnします。

変数のエイリアスは、変数にたいする古い名前を新しい名前に置き換える、便利な方法です。make-obsolete-variableは古い名前を陳腐化(obsolete)していると宣言し。それが将来のある時点で削除されるかもしれないことを宣言します。

Function: make-obsolete-variable obsolete-name current-name when &optional access-type

この関数は、倍とコンパイラーに変数obsolete-nameが陳腐化していると警告させます。current-nameがシンボルの場合、それはこの変数の新たな名前です。その後、obsolete-nameのかわりにcurrent-nameを使用するよう、警告メッセージを伝えます。current-nameが文字列の場合、これはメッセージで、置き換えられる変数はありません。whenは、その変数が最初に陳腐化するのがいつかを示す文字列です(通常はバージョン番号文字列)。

オプションの引数access-typeは、非nilの場合は陳腐化の警告を引き起こすアクセスの種類を指定します。getまたはsetを指定できます。

2つの変数シノニムを作成して、マクロdefine-obsolete-variable-aliasを使用することにより同時に1つが陳腐化していると宣言できます。

Macro: define-obsolete-variable-alias obsolete-name current-name &optional when docstring

このマクロは変数obsolete-nameが陳腐化しているとマークして、それを変数current-nameにたいするエイリアスにします。これは以下と等価です:

(defvaralias obsolete-name current-name docstring)
(make-obsolete-variable obsolete-name current-name when)
Function: indirect-variable variable

この関数は、variableのエイリアスチェーンの最後の変数をreturnします。variableがシンボルでない場合、またはvariableがエイリアスとして定義されていない場合、この関数はvariableをreturnします。

この関数は、シンボルのチェーンがループしているときは、cyclic-variable-indirectionエラーをシグナルします。

(defvaralias 'foo 'bar)
(indirect-variable 'foo)
     ⇒ bar
(indirect-variable 'bar)
     ⇒ bar
(setq bar 2)
bar
     ⇒ 2
foo
     ⇒ 2
(setq foo 0)
bar
     ⇒ 0
foo
     ⇒ 0

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.14 Variables with Restricted Values

通常のLisp変数には、有効なLispオブジェクトである任意の値を割り当てることができます。しかし、LispではなくCで定義されたLisp変数もあります。これらの変数のほとんどは、DEFVAR_LISPを使用してCコードで定義されています。Lispで定義された変数と同様、これらは任意の値をとることができます。しかし、いくつかの変数はDEFVAR_INTDEFVAR_BOOLを使用して定義されています。C実装の概要的な議論は、Writing Emacs Primitives、特にタイプsyms_of_filenameの関数の説明を参照してください。

タイプがDEFVAR_BOOLの変数は、値にniltしかとることができません。他の値の割り当てを試みると、tはセットされます:

(let ((display-hourglass 5))
  display-hourglass)
     ⇒ t
Variable: byte-boolean-vars

この変数は、タイプDEFVAR_BOOLのすべての変数のリストを保持します。

タイプがDEFVAR_INTの変数は、整数値だけをとることができます。他の値の割り当てを試みると、結果はエラーになります:

(setq undo-limit 1000.0)
error→ Wrong type argument: integerp, 1000.0

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.15 Generalized Variables

ジェネリック変数(generalized variable: 汎変数)またはplace formは、値が格納されるLispメモリー内の多くの場所のうちの1つです。1番シンプルなplace formは、通常のLisp変数です。しかし、リストのCARCDR、配列の要素、シンボルのプロパティー、その他多くのロケーション(location)も、Lisp値が格納される場所です。

ジェネリック変数は、C言語の“lvalues(左辺値)”と類似しています。C言語のlvalueでは、‘x = a[i]’で配列から要素を取得し、同じ表記を使用して、‘a[i] = x’で要素を格納します。a[i]のような特定のフォームが、Cではlvalueになれるように、Lispでジェネリック変数になることができる一連のフォームが存在します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.15.1 The setf Macro

setfマクロは、ジェネリック変数を操作する、もっとも基本的な方法です。setfフォームはsetqと似ていますが、シンボルだけでなく、左辺の任意のplace formを受け入れます。たとえば(setf (car a) b)aのcarをbにセットして、(setcar a b)と同じ操作を行いますが、すべてのplaceのタイプにセットおよびアクセスするために2つの別個の関数を覚える必要はありません。

Macro: setf [place form]…

このマクロはformを評価して、それをplaceに格納します。placeは有効なジェネリック変数フォームでなければなりません。複数のplace/formペアーがある場合、割り当てはsetqのときと同様です。setfは最後のformの値をreturnします。

以下のLispフォームはジェネリック変数として機能するので、setfplace引数にすることができます:

どのように処理すれば良いか知られていないplaceフォームを渡した場合、setfはエラーをシグナルします。

nthcdrの場合、関数のリスト引数は、それ自体が有効なplaceフォームでなければならないことに注意してください。たとえば、(setf (nthcdr 0 foo) 7)は、foo自体に7をセットするでしょう。

マクロpush(Modifying List Variablesを参照してください)、およびpop(Accessing Elements of Listsを参照してください)は、リストだけでなくジェネリック変数を操作できます。(pop place)は、place内に格納されたリストの最初の要素を削除してreturnします。これは(prog1 (car place) (setf place (cdr place)))と類似していますが、すべてのサブフォームを1度だけ評価します。(push x place)は、place内に格納されたリストの1番前に、xを挿入します。これは(setf place (cons x place))と類似していますが、サブフォームの評価を除きます。nthcdr placeへのpushおよびpopは、リスト内の任意の位置での挿入および削除に使用できることに注意してください。

cl-libライブラリーは、追加のsetf placeを含む、ジェネリック変数ニタイスルサマザマナ拡張を定義します。Generalized Variables in Common Lisp Extensionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.15.2 Defining new setf forms

このセクションでは、setfが操作できる新たなフォームを定義する方法を説明します。

Macro: gv-define-simple-setter name setter &optional fix-return

このマクロは、単純なケースにたいしてsetfメソッドを簡単に定義することを可能にします。nameは、関数、マクロ、スペシャルフォームの名前です。nameが、それを更新するための対応するsetter関数をもつときは、このマクロを使用できます(たとえば(gv-define-simple-setter car setcar))。

このマクロをフォーム以下の呼び出しを

(setf (name args…) value)

以下のように変換します。

(setter argsvalue)

setfのような呼び出しは、valueをreturnするようにドキュメントされます。これに問題はありません。たとえばcarsetcarでは、setcarはそれがセットする値をreturnするからです。setter関数がvalueをreturnしない場合は、gv-define-simple-setterfix-return引数に、非nil値を使用してください。これは以下のようなものに展開されます

(let ((temp value))
  (setter args… temp)
  temp)

これで正しい結果がreturnされることが保証されます。

Macro: gv-define-setter name arglist &rest body

このマクロは、上述のフォームより複雑なsetf展開を可能にします。たとえば、呼び出すべきシンプルなsetter関数が存在しないときや、もしそれが存在してもplace formとは異なる引数を要求する場合には、このフォームを使う必要があるかもしれません。

このマクロは最初にsetf引数フォーム(value args…)arglistにバインドして、その後bodyを実行することにより、フォーム(setf (name args…) value)を展開します。bodyは割り当てを行うLispフォームをreturnし、最後にセットされた値をreturnするべきです。以下はこのマクロの使用例です:

(gv-define-setter caar (val x) `(setcar (car ,x) ,val))

展開をさらに制御するには、マクロgv-define-expanderを参照してください。マクロgv-letplaceは、setfのように処理を行うマクロを定義するのに有用です。詳細は、gv.elのソースファイルを参照してください。

Common Lispに関する注意: Common Lispは関数のsetf、すなわち“setf関数”の挙動を指定するための別の方法を定義します。setf関数の名前はシンボルではなく。リスト(setf name)です。たとえば(defun (setf foo) …)は、setffooに適用されるときに使用される関数を定義します。Emacsはこれをサポートしません。適切な展開が定義されていないフォームにsetfを使用すると、コンパイル時にエラーとなります。Common Lispでは、関数(setf func)が後で定義されるので、エラーにはなりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12 Functions

Lispプログラムは主にLisp関数で構成されます。このチャプターは、関数とは何か、引数を受け取る方法、関数を定義する方法を説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.1 What Is a Function?

一般的な意味では、関数とは引数(arguments)と呼ばれる与えられた入力値の計算を担うルールです。計算の結果は、その関数の値(value)、またはreturn値(return value)と呼ばれます。計算は、変数の値やデータ構造の内容を変更する等の副作用をもつこともできます。

ほとんどのコンピューター言語では、関数はそれぞれ名前をもちます。しかしLispでは、厳密な意味において、関数は名前をもちません。関数はオブジェクトであり、関数の名前の役割を果たすシンボルに関連づけることができますが(たとえばcar)、それはオプションです。Naming a Functionを参照してください。関数が名前を与えられたとき、通常はそのシンボルを“関数”として参照します(たとえば、関数carのように参照します)。このマニュアルでは、関数名と関数オブジェクト自身との間の区別は、通常は重要ではありませんが、それが意味をもつような場合は注記します。

スペシャルフォーム(special form)マクロ(macro)と呼ばれる、関数likeなオブジェクトがいくつかあり、それらも引数を受け受け、計算を担います。しかし以下で説明するように、Emacs Lispではこれらは関数とは考えられません。

以下は関数および関数likeなオブジェクトにたいする、重要な条件です:

lambda expression

Lispで記述された関数(厳密には関数オブジェクト)です。これらについては、以降のセクションで説明します。 Lambda Expressionsを参照してください。

primitive

Lispから呼び出すことができますが、実際にはCで記述されています。プリミティブは、ビルトイン関数(built-in functions)や、サブルーチン(subr)といった呼ばれかたもします。それらの例には関数likeなcarappendが含まれます。加えて、すべてのスペシャルフォーム(以下参照)もプリミティブと考えられます。

関数はLispの基礎となる部分(たとえばcar)であり、オペレーティングシステムのサービスにたいして値レベルのインターフェースを与え、高速に実行される必要があるため、通常はプリミティブとして実装されています。Lispで定義された関数とは異なり、プリミティブの修正や追加には、Cソースの変更とEmacsのリコンパイルが必要です。Writing Emacs Primitivesを参照してください。

special form

プリミティブは関数と似ていますが、すべての引数が通常の方法で評価はされません。いくつかの引数だけが評価されるかもしれず、通常ではない順序で、複数回評価されるかもしれません。プリミティブの例には、ifandwhileが含まれます。Special Formsを参照してください。

macro

あるLisp式を、オリジナルの式のかわりに評価される別の式に変換する、関数とは別のLispで定義された構造です。マクロは、スペシャルフォームが行う一連のことを、Lispプログラマーが行うのを可能にします。Macrosを参照してください。

command

command-executeプリミティブを通じて呼び出すことができるオブジェクトで、通常はそのコマンドにバインドされたキーシーケンスを、ユーザーがタイプすることにより呼び出されます。Interactive Callを参照してください。コマンドは通常、関数です。その関数がLispで記述されている場合は、関数の定義内のinteractiveフォームによりコマンドとなります(Defining Commandsを参照してください)。関数であるコマンドは、他の関数と同様、Lisp式から呼び出すこともできます。

キーボードマクロ(文字列およびベクター)は関数ではありませんが、これらもコマンドです。Keyboard Macrosを参照してください。シンボルの関数セルにコマンドが含まれている場合、わたしたちはそのシンボルをコマンドと言います(Symbol Componentsを参照してください)。そのような名前つきコマンド(named command)は、M-xで呼び出すことができます。

closure

ラムダ式とよく似た関数オブジェクトですが、クロージャーはレキシカル変数バインディングの“環境”にも囲まれています。Closuresを参照してください。

byte-code function

バイトコンパイラーによりコンパイルされた関数です。Byte-Code Function Typeを参照してください。

autoload object

実際の関数のプレースホルダーです。autoloadオブジェクトが呼び出された場合、Emacsは実際の関数の定義を含むファイルをロードした後、実際の関数を呼び出します。Autoloadを参照してください。

関数functionpを使用して、あるオブジェクトが関数かどうかテストできます:

Function: functionp object

この関数はobjectが任意の種類の関数(たとえばfuncallに渡すことができる)の場合は、tをreturnします。functionpは関数を名づけるシンボルにたいしてはt、スペシャルフォームにたいしてはnilをreturnすることに注意してください。

functionpとは異なり、以下の3つの関数は、シンボルをそれの関数定義としては扱いません

Function: subrp object

この関数は、objectがビルトイン関数(たとえばLispプリミティブ)の場合は、tをreturnします。

(subrp 'message)            ; messageはシンボルであり、
     ⇒ nil                 ;   subrオブジェクトではない。
(subrp (symbol-function 'message))
     ⇒ t
Function: byte-code-function-p object

この関数は、objectがバイトコード関数の場合は、tをreturnします。たとえば:

(byte-code-function-p (symbol-function 'next-line))
     ⇒ t
Function: subr-arity subr

この関数はプリミティブsubrの引数リストについての情報を提供します。retrun値は、(min . max)というペアーです。minは引数の最小数です。maxは最大数、または引数&restを伴う関数にたいしてはシンボルmanysubrがスペシャルフォームの場合はシンボルunevalledです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2 Lambda Expressions

ラムダ式(lambda expression)は、Lispで記述された関数オブジェクトです。以下は例です:

(lambda (x)
  "Xの双曲線コサインをreturnする。"
  (* 0.5 (+ (exp x) (exp (- x)))))

Emacs Lispでは、このようなリストは、関数オブジェクトに評価される、有効な式です。

ラムダ式自身は名前をもたない、無名関数(anonymous function)です。ラムダ式をこの方法で使用できますが(Anonymous Functionsを参照してください)、名前付き関数(named functions)を作成するためにシンボルに関連付けられる方が一般的です(see section Naming a Function)。これらの詳細に触れる前に、以下のサブセクションではラムダ式の構成要素と、それらが行うことについて説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.1 Components of a Lambda Expression

ラムダ式は、以下のようなリストです:

(lambda (arg-variables…)
  [documentation-string]
  [interactive-declaration]
  body-forms…)

ラムダ式の1番目の要素は常にシンボルlambdaです。これは、そのリストが関数を表すことを示します。lambdaで関数定義を開始する理由は、他の目的のたまえの使用が意図された他のリストが、意図せず関数として評価されないようにするためです。

2番目の要素は、シンボル — 引数変数名のリストです。これはラムダリスト(lambda list)と呼ばれます。Lisp関数が呼び出されたとき、引数値はラムダリスト内の変数と対応付けされます。ラムダリストは、与えられた値にたいするローカルバインディングが付与されます。Local Variablesを参照してください。

ドキュメント文字列(documentation string)はEmacs Lispのヘルプ機能にたいしてその、関数を説明する、関数定義に配されたLisp文字列オブジェクトです。Documentation Strings of Functionsを参照してください。

インタラクティブ宣言(interactive declaration)は、(interactive code-string)という形式のリストです。これは、この関数が対話的に使用された場合に引数を提供する方法を宣言します。この宣言をもつ関数は、コマンド(command)と呼ばれます。コマンドはM-xを使用したり、キーにバインドして呼び出すことができます。この方法で呼び出されることを意図しない関数は、インタラクティブ宣言を持つべきではありません。インタラクティブ定義を記述する方法は、See section Defining Commandsを参照してください。

残りの要素は、その関数のbody(本体) — その関数が処理を行うためのLispコード(Lispプログラマーは“評価されるLispフォームのリスト”と言うでしょう)です。この関数からreturnされる値は、bodyの最後の要素によりreturnされる値です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.2 A Simple Lambda Expression Example

以下の例を考えてみてください:

(lambda (a b c) (+ a b c))

以下のように、funcallに渡すことにより、この関数を呼び出すことができます:

(funcall (lambda (a b c) (+ a b c))
         1 2 3)

この呼び出しは、変数aに1、bに2、cに3をバインドして、ラムダ式のbodyを評価します。bodyの評価により、これら3つの数が加算されて、6が結果として生成されます。したがってこの関数呼び出しにより、6がreturnされます。

以下のように、引数は他の関数の結果であってもよいことに注意してください:

(funcall (lambda (a b c) (+ a b c))
         1 (* 2 3) (- 5 4))

これは引数1(* 2 3)(- 5 4)を左から右に評価します。その後、ラムダ式に引数1、6、1を適用して、値8が生成されます。

これらの例が示すように、ローカル変数を作成して、それらに値を与えるフォームとして、CARがラムダ式であるようなフォームを使用することができます。古い時代のLispでは、この方法がローカル変数をバインドして初期化する唯一の方法でした。しかし現在では、この目的にはフォームletを使用するほうが明解です(Local Variablesを参照してください)。ラムダ式は主に、他の関数の引数として渡される無名関数(Anonymous Functionsを参照してください)として、あるいは名前つき関数(Naming a Functionを参照してください)を生成するためにシンボルの関数定義に格納するために使用されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.3 Other Features of Argument Lists

シンプルなサンプル関数(lambda (a b c) (+ a b c))は、3つの引数変数を指定しているので、3つの引数で呼び出されなければなりません。引数を2つしか指定しなかったり4つ指定した場合は、wrong-number-of-argumentsエラーとなります。

特定の引数を省略できる関数を記述できると便利なこともあります。たとえば関数substringは3つの引数 — 文字列、開始インデックス、終了インデックス — を受け取りますが、3つ目の引数を省略した場合、デフォルトでその文字列のlengthとなります。関数list+が行うように、特定の関数にたいして不定個の引数を指定できると便利なときもあります。

関数が呼び出されるとき省略されるかもしれないオプションの引数を指定するには、オプションの引数の前にキーワード&optionalを含めるだけです。0個以上の追加引数のリストを指定するには、最後の引数の前にキーワード&restを含めます。

したがって、引数リストの完全な構文は以下のようになります:

(required-vars[&optional optional-vars]
 [&rest rest-var])

角カッコ(square bracket)は、&optional&rest、およびそれらに続く変数が省略できることを示します。

この関数の呼び出しには、required-varsのそれぞれにたいして、実際の引数が要求されます。0個以上のoptional-varsにたいして実際の引数があるかもしれませんが、ラムダ式が&restを使用していなければ、その個数を超えて実際の引数を記述することはできません。&restが記述されている場合、追加で任意個の実際の引数があるかもしれません。

optionaやrest変数にたいして実際の引数が省略された場合、それらのデフォルトは常にnilになります。関数にたいして引数に明示的にnilが使用されたのか、引数が省略されたのかを区別することはできません。しかし関数のbodyが、nilを他の有意な値が省略されたと判断することは自由です。これはsubstringが行っていることです。substringの3つ目の引数がnilの場合、それは文字列の長さを使用することを意味します。

Common Lispに関する注意: Common Lispでは、オプションの引数が省略されたときに使用するデフォルト値を指定できます。Emacs Lispは、引数が明示的に渡されたかを調べる、“supplied-p”変数はサポートしません。

例えば、引数リストは以下のようになります:

(a b &optional c d &rest e)

これはabは最初の2つの実引数となり、これらは必須です。さらに1つまたは2つの引数が指定された場合、それらは順番にcdにバインドされます。1つ目から4つ目の引数の後の引数は、リストにまとめられて、eにそのリストがバインドされます。2つしか引数が指定されなかった場合、cnilになります。2つまたは3つの引数の場合、dnilです。引数が4つ以下の場合、enilになります。

オプションの引数の後ろに必須の引数を指定する方法はありません — これは意味を成さないからです。なぜそうなるかは、この例でcがオプションでdが必須な場合を考えてみてください。実際に3つの引数が与えられたとします。3番めの引数は何を指定したのでしょうか? この引数はcなのでしょうか、それともdに使用されるのでしょうか? 両方の場合が考えられます。同様に、&rest引数の後に、さらに引数(必須またはオプション)をもつことも意味を成しません。

以下に引数リストと、それを正しく呼び出す例をいくつか示します:

(funcall (lambda (n) (1+ n))        ; 1つの必須:
         1)                         ; これは正確に1つの引数を要求する。
     ⇒ 2
(funcall (lambda (n &optional n1)   ; 1つは必須で、1つはオプション:
           (if n1 (+ n n1) (1+ n))) ; 1つまたは2つの引数。
         1 2)
     ⇒ 3
(funcall (lambda (n &rest ns)       ; 1つは必須で、後は残り:
           (+ n (apply '+ ns)))     ; 1つ以上の引数。
         1 2 3 4 5)
     ⇒ 15

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.2.4 Documentation Strings of Functions

ラムダ式は、ラムダリストの食後に、オプションでドキュメント文字列(documentation string)をもつことができます。この文字列は、その関数の実行に影響を与えません。これはコメントの一種ですが、Lisp機構に内在するシステム化されたコメントであり。Emacsのヘルプ機能で使用できます。ドキュメント文字列にアクセスする方法は、Documentationを参照してください。

たとえその関数があなたのプログラム内だけで呼び出される関数だとしても、すべての関数にドキュメント文字列を与えるのはよいアイデアです。ドキュメント文字列はコメントと似ていますが、コメントより簡単にアクセスできます。

ドキュメント文字列の1行目は、関数自体にもとづくものであるべきです。なぜならaproposは、最初の1行目だけを表示するからです。ドキュメント文字列の1行目は、その関数の目的を要約する、1つまたは2つの完全なセンテンスで構成されるべきです。

ドキュメント文字列の開始は通常、ソースファイル内ではインデントされていますが、ドキュメント文字列の開始のダブルクォート文字の前にインデントのスペースがあるので、インデントはドキュメント文字列の一部にはなりません。ドキュメント文字列の残りの行がプログラムソース内で揃うようにインデントする人がいます。これは、間違いです。後続の行のインデントは文字列の内部にあります。これはソースコード内での見栄えはよくなりますが、ヘルプコマンドで表示したとき見栄えが悪くなります。

ドキュメント文字列がなぜオプションになるのか不思議に思うかもしれません。なぜなら、ドキュメント文字列の後には必須となる関数の構成要素であるbodyが続くからです。文字列を評価するとその文字列自身がれつrnされるので、それがbody内の最後のフォームでない限りなんの効果もありません。したがって、実際はbodyの1行目とドキュメント文字列で混乱が生じることはありません。bodyの唯一のフォームが文字列の場合、それはreturn値とドキュメントの両方の役目を果たします。

ドキュメント文字列の最後の行には、実際の関数引数とは異なる呼び出し規約を指定できます。これは以下のようなテキストを記述します

\(fn arglist)

ただし、このテキストの前に空行があり、テキスト自身が行頭から記述されていて、ドキュメント文字列内でこのテキストの後に改行が続かない場合です(‘\’はEmacsの移動コマンドが混乱するのを避けるために使用されます)。この方法で指定された呼び出し規約は、ヘルプメッセージ内で関数の実引数から生成される呼び出し例と同じ場所に表示されます。

マクロ定義内に記述された引数は、ユーザーがマクロ呼び出しの一部だと考える方法と合致しない場合がしばしばあるので、この機能はマクロ定義で特に有用です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.3 Naming a Function

シンボルは関数の名前となることができます。これは、そのシンボルの関数セル(function cell: Symbol Componentsを参照してください)が、関数オブジェクト(たとえばラムダ式)を含むときに起こります。するとそのシンボル自身が呼び出し可能な有効な関数、つまりそのシンボルの関数セルの関数と等価になります。

関数セルの内容は、そのシンボルの関数定義(function definition)と呼ぶこともできます。そのシンボルのかわりに、シンボルの関数定義を使う手続きのことをシンボル関数インダイレクション(symbol function indirection)と呼びます。Symbol Function Indirectionを参照してください。与えられたシンボルに関数定義がない場合、シンボルの関数セルはvoidと呼ばれ、それを関数として使用することはできません。

実際のところ、ほとんどすべての関数は名前をもち、その名前により参照されます。ラムダ式を定義することにより名前つきのLisp関数を作成、それを関数セル(Accessing Function Cell Contentsを参照してください)に置くことができます。しかし、さらに一般的なのはdefunスペシャルフォーム(次のセクションで説明します)を使う方法です。 Defining Functionsを参照してください。

わたしたちは関数名を与えるのは、Lisp式内で関数を名前で参照するのが便利だからです。また、名前つきの関数は簡単に自分自身を —再帰的(recursive)に参照することができます。さらに、プリミティブはテキスト的な名前だけで参照することができます。なぜならプリミティブ関数は入力構文(read syntax)をもたないオブジェクトだからです(Primitive Function Typeを参照してください)。

関数は一意な名前をもつ必要はありません。与えられた関数オブジェクトは、通常は1つのシンボルの関数セルだけに存在しますが、これは単に慣習的なものです。fsetを使用して、関数を複数のシンボルに格納するのは簡単です。それらのシンボルはそれぞれ、同じ関数にたいする有効な名前となります。

関数として使用されているシンボルを、変数としても利用できることに注意してください。シンボルのこれら2つの利用法は独立しており、競合はしません(これはSchemaのような他のいくつかのLisp方言には当てはまりません)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.4 Defining Functions

わたしたちは通常、関数を最初に作成したときに名前を与えます。これは関数の定義(defining a function)と呼ばれ、defunマクロにより行われます。

Macro: defun name args [doc] [declare] [interactive] body…

defunは新たなLisp関数を定義する通常の方法です。これは、引数リストargs、およびbodyにより与えられるbodyフォームとともに、シンボルnameを関数として定義します。nameargsを、クォートする必要はありません。

docが与えられた場合、それはその関数のドキュメント文字列を指定する文字列であるべきです(Documentation Strings of Functionsを参照してください)。declareが与えられた場合、それは関数のメタデータを指定する、declareフォームであるべきです(The declare Formを参照してください)。interactiveが与えられた場合、それは関数が対話的に呼び出される方法を指定するinteractiveフォームであるべきです(Interactive Callを参照してください)。

defunのreturn値は定義されていません。

以下にいくつか例を示します:

(defun foo () 5)
(foo)
     ⇒ 5

(defun bar (a &optional b &rest c)
    (list a b c))
(bar 1 2 3 4 5)
     ⇒ (1 2 (3 4 5))
(bar 1)
     ⇒ (1 nil nil)
(bar)
error→ Wrong number of arguments.

(defun capitalize-backwards ()
  "Upcase the last letter of the word at point."
  (interactive)
  (backward-word 1)
  (forward-word 1)
  (backward-char 1)
  (capitalize-word 1))

意図せず既存の関数を再定義しないように、注意してください。defuncarのようなプリミティブ関数でさえ、躊躇なく問い合わせもなしに再定義します。Emacsががががこれを妨げることはありません。なぜなら関数の再定義は故意に行われることがあり、そのような意図した再定義を、意図しない再定義と見分ける方法はないからです。

Function: defalias name definition &optional doc

この関数は、定義definition(任意の有効なLisp関数)とともに、シンボルnameを関数として定義します。この関数のreturn値は未定義です。

docが非nilの場合、それは関数nameのドキュメントになります。それ以外は、definitionにより提供されるドキュメントが使用されます。

内部的には、defaliasは通常、定義のセットにfsetを使用します。しかしnamedefalias-fset-functionプロパティーをもつ場合、fsetを呼び出すかわりに、それに割り当てられた値が使用されます。

defaliasを使う正しい場所は、特定の関数名がまさに定義される場所 — 特にソースファイルがロードされるとき明示的にその名前が出現する場所です。これはdefaliasが、defunと同じように、どれが関数を定義するファイルなのか記録するからです(Unloadingを参照してください)。

それとは対象的に、他の目的のために関数を操作するプログラムでは、そのような記録を保持しないfsetを使用するほうがよいでしょう。Accessing Function Cell Contentsを参照してください。

defundefaliasで新たなプリミティブ関数を作成することはできませんが、任意の関数定義を変更するのに使用することができ、通常の定義がプリミティブであるcarx-popup-menuのような関数でさえ変更することができます。しかし、これは危険なことです。たとえば、Lispの完全性を損なうことなく、carを再定義するのはほとんど不可能だからです。それほど有名ではないx-popup-menuのような関数の再定義では、危険は減るものの、それでも期待したとおりに機能しないかもしれません。Cコードにこのプリミティブの呼び出しがある場合、それは直接そのプリミティブのC定義を呼び出すので、シンボル定義を変更しても、それらに影響はありません。

defsubstも参照してください。これはdefunのように関数を定義して、それのインライン展開を処理するようLispコンパイラーに指示します。Inline Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.5 Calling Functions

関数を定義しただけでは、半分しか終わっていません。関数はそれを呼び出す(call) — たとえば実行(run)するまでは、何も行いません。関数のcallは、invocationとしても知られています。

関数を呼び出すもっとも一般的な方法は、リストの評価による方法です。たとえば、リスト(concat "a" "b")を評価することにより、関数concatが引数"a""b"で呼び出されます。評価については、Evaluationを参照してください。

プログラム内で式としてリストを記述するときは、プログラム内にテキストで、どの関数を呼び出すか、いくつの引数を与えるかを指定します。通常は、これが行いたいことです。どの関数を呼び出すかを、実行時に計算する必要がある場合もあります。これを行うには、関数funcallを使用します。実行時にいくつの引数を渡すか決定する必要があるときは、applyを使用します。

Function: funcall function &rest arguments

funcallは、関数functionを引数argumentsで呼び出し、functionがreturnした値をreturnします。

funcallは関数なので、functionを含むすべての引数は、funcallの呼び出し前に評価されます。これは、呼び出される関数を得るための任意の式を使用できることを意味します。これはまた、funcallargumentsに記述した式ではなく、その値だけを見ることを意味します。これらの値はfunction呼び出し中では、2回目は評価されませんfuncallの処理は、関数の通常の呼び出し手続きと似ており、すでに評価された引数は評価されません。

引数functionは、Lisp関数、またはプリミティブ関数でなければなりません。つまりスペシャルフォームやマクロは、“評価されていない”引数式を与えられたときだけ意味があるので、指定することはできません。上述したように、funcallは最初に指定された評価前の引数を提供することはできません。

(setq f 'list)
     ⇒ list
(funcall f 'x 'y 'z)
     ⇒ (x y z)
(funcall f 'x 'y '(z))
     ⇒ (x y (z))
(funcall 'and t nil)
error→ Invalid function: #<subr and>

これらの例を、applyの例と比較してみてください。

Function: apply function &rest arguments

applyは、関数functionを引数argumentsで呼び出します。これはfuncallと同様ですが、1つ違いがあります。argumentsの最後はオブジェクトのリストです。これは1つのリストではなく、個別の引数としてfunctionに渡されます。わたしたちはこれを、applyがこのリストを展開(spread)(個々の要素が引数となるので)する、と言います。

applyは、functionを呼び出した結果をreturnします。funcallと同様、functionはLisp関数かプリミティブ関数でなければなりません。つまりスペシャルフォームやマクロは、applyでは意味をもちません。

(setq f 'list)
     ⇒ list
(apply f 'x 'y 'z)
error→ Wrong type argument: listp, z
(apply '+ 1 2 '(3 4))
     ⇒ 10
(apply '+ '(1 2 3 4))
     ⇒ 10

(apply 'append '((a b c) nil (x y z) nil))
     ⇒ (a b c x y z)

applyを使用した興味深い例は、Definition of mapcarを参照してください。

ある関数にたいして、その関数のある引数を特定の値に固定し、他の引数は実際に呼びだされたときの値にできれば便利なことがあります。関数のいくつかの引数を固定することは、その関数の部分適用(partial application)と呼ばれます9。結果は、残りの引数をとる新たな関数で、すべての引数を合わせて元の関数を呼び出します。

Emacs Lispで部分適用を行う方法を示します:

Function: apply-partially func &rest args

この関数は、新たな関数をreturnします。この新しい関数は、呼びだされたときにargsと、呼び出し時に指定された追加の引数から成る引数リストでfuncを呼び出す関数です。funcn個の引数を指定できる場合、m < n個の引数でapply-partiallyを呼び出すと、n - m個の新たな関数を生成します。

以下は、apply-partiallyと他のビルトイン関数+,を使用して、(もし存在しないなら)ビルトイン関数1+を定義する例です:

(defalias '1+ (apply-partially '+ 1)
  "Increment argument by one.")
(1+ 10)
     ⇒ 11

引数として関数をとったり、データ構造(特にフック変数やプロパティーリスト)から関数を探す関数はLispでは一般的で、それらはfuncallapplyを使用してそれらの関数を呼び出します。引数として関数をとる関数は、ファンクショナル(functional)と呼ばれるときもあります。

ファンクショナルを呼び出すとき、引数としてno-op関数(何も行わない関数)を指定できると便利なときがあります。以下に2つの異なるno-op関数を示します:

Function: identity arg

この関数はargをreturnします。副作用はありません。

Function: ignore &rest args

この関数は任意の引数を無視して、nilをreturnします。

いくつかの関数はユーザーに可視なコマンドで、これらは(通常はキーシーケンスを介して)対話的に呼び出すことができます。そのようなコマンドは、call-interactively関数を使用することにより、対話的に呼びだされたときと同様に呼び出すことができます。Interactive Callを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.6 Mapping Functions

マップ関数(mapping function)は与えられた関数(スペシャルフォームやマクロではない)を、リストや他のコレクションの各要素に適用します。Emacs Lispにはそのような関数がいくつかあります。このセクションでは、リストにたいしてマッピングを行うmapcarmapcmapconcatを説明します。obarray内のシンボルにたいしてマッピングを行う関数mapatomsは、Definition of mapatomsを参照してください。ハッシュテーブル内のkey/value関係にたいしてマッピングを行う関数maphashは、Definition of maphashを参照してください。

これらのマップ関数は、文字テーブル(char-table)には適用されません。なぜなら文字テーブルは非常に広い範囲の疎な配列だからです。疎な配列であるという性質に適う方法で文字いテーブルにマッピングするには、関数map-char-tableを使用します(Char-Tablesを参照してください)。

Function: mapcar function sequence

mapcarは、関数functionsequenceの各要素にたいして順番に適用し、その結果をリストでreturnします。

引数sequenceには、文字テーブルを除く任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できます。結果は常にリストになります。結果の長さは、sequenceの長さと同じです。たとえば:

(mapcar 'car '((a b) (c d) (e f)))
     ⇒ (a c e)
(mapcar '1+ [1 2 3])
     ⇒ (2 3 4)
(mapcar 'string "abc")
     ⇒ ("a" "b" "c")

;; my-hooks内の各関数を呼び出す。
(mapcar 'funcall my-hooks)

(defun mapcar* (function &rest args)
  "Apply FUNCTION to successive cars of all ARGS.
Return the list of results."
  ;; リストが消費されていなければ、
  (if (not (memq nil args))
      ;; CARに関数を適用する。
      (cons (apply function (mapcar 'car args))
            (apply 'mapcar* function
                   ;; 残りの要素のための再帰。
                   (mapcar 'cdr args)))))

(mapcar* 'cons '(a b c) '(1 2 3 4))
     ⇒ ((a . 1) (b . 2) (c . 3))
Function: mapc function sequence

mapcmapcarと似ていますが、functionは副作用のためだけに使用されます — つまりfunctionがreturnする値は無視され、リストに収集されません。mapcは常にsequenceをreturnします。

Function: mapconcat function sequence separator

mapconcatは関数functionsequenceの各要素に適用します。結果は結合された文字列になります。結果文字列の間に、mapconcatは文字列separatorを挿入します。separatorには通常、スペースやカンマ、あるいはその他の適切な区切り文字が含まれます。

引数functionはははは、1つの引数を取り文字列をreturnする関数でなければなりません。引数sequenceには、文字テーブルを除く、任意の種類のシーケンス — つまりリスト、ベクター、ブールベクター、文字列を指定できます。

(mapconcat 'symbol-name
           '(The cat in the hat)
           " ")
     ⇒ "The cat in the hat"

(mapconcat (function (lambda (x) (format "%c" (1+ x))))
           "HAL-8000"
           "")
     ⇒ "IBM.9111"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.7 Anonymous Functions

関数は通常、defunにより定義され、同時に名前が与えられますが、明示的にラムダ式を使う — 無名関数(anonymous function)のほうが便利なときもあります。無名関数は、名前つき関数が有効な場所なら、どこでも有効です。無名関数は変数や関数の引数に割り当てられることがよくあります。たとえば、ある関数をリストの各要素に適用するmapcarfunction引数に渡すかもしれません(Mapping Functionsを参照してください)。現実的な例は、describe-symbols exampleを参照してください。

無名関数として使用するためのラムダ式を定義するとき、原則的にはリストを構築する任意の手法を使用できます。しかし通常は、マクロlambda、スペシャルフォームfunction、または入力構文#'を使用するべきです。

Macro: lambda args [doc] [interactive] body…

このマクロは引数リストargs、(もしあれば)ドキュメント文字列doc、(もしあれば)インタラクティブ指定interactive、およびbodyで与えられるbodyフォームをもつ無名関数をreturnします。

実際にはこのマクロはlambdaフォームを“自己クォート(self-quoting)”します。つまりCARlambdaであるようなフォームは、そのフォーム自身を得ます。

(lambda (x) (* x x))
     ⇒ (lambda (x) (* x x))

lambdaフォームは別に、1つの効果をもちます。このマクロは、function(以下参照)をサブルーチンとして使用することにより、Emacs評価機能(Emacs evaluator)とバイトコンパイラーに、その引数が関数であることを告げます。

Special Form: function function-object

このスペシャルフォームは、評価を行わずに、function-objectをreturnします。この点では、quote(Quotingを参照してください)と似ています。しかしquoteとは異なり、Emacs評価機能とバイトコンパイラーに、これを関数として使用する意図を告げる役割をもちます。function-objectが有効なラムダ式と仮定すると、これは2つの効果をもちます:

入力構文#'は、functionの使用の略記です。以下のフォームは等価です:

(lambda (x) (* x x))
(function (lambda (x) (* x x)))
#'(lambda (x) (* x x))

以下の例では、3つ目の引数に関数をとる、change-property関数を定義し、その後のchange-propertyで、無名関数を渡してこれを使用しています:

(defun change-property (symbol prop function)
  (let ((value (get symbol prop)))
    (put symbol prop (funcall function value))))

(defun double-property (symbol prop)
  (change-property symbol prop (lambda (x) (* 2 x))))

lambdaフォームをクォートしていないことに注意してください。

上記のコードをコンパイルした場合は、無名関数もコンパイルされます。リストをクォートすることにより無名関数を構築した場合、コンパイルはされません。

(defun double-property (symbol prop)
  (change-property symbol prop '(lambda (x) (* 2 x))))

この場合、無名関数はコンパイルされたコード内のラムダ式に保持されます。バイトコンパイラーは、change-propertyが関数としての使用を意図していることを知ることができないので、たとえこの関数が関数のように見えるとしても、このリストが関数であると決め込むことはできません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.8 Accessing Function Cell Contents

あるシンボルの関数定義(function definition)とは、そのシンボルの関数セルに格納されたオブジェクトのことです。ここでは、シンボルの関数セルにアクセス、テスト、セットする関数を説明します。

Definition of indirect-functionの、関数indirect-functionも参照してください。

Function: symbol-function symbol

これはsymbolの関数セル内のオブジェクトをreturnします。これは、returnされたオブジェクトが本物のの関数であるかチェックしません。

関数セルがvoidの場合、return値はnilです。関数セルがvoidのときと、nilがセットされているときを区別するには、fboundp(以下参照)を使用します。

(defun bar (n) (+ n 2))
(symbol-function 'bar)
     ⇒ (lambda (n) (+ n 2))
(fset 'baz 'bar)
     ⇒ bar
(symbol-function 'baz)
     ⇒ bar

シンボルに何の関数定義も与えていない場合、そのシンボルの関数セルはvoidだと言います。別の言い方をすると、その関数セルは、どんなLispオブジェクトも保持しません。そのシンボルを関数として呼びだそうとすると、Emacsはvoid-functionエラーをシグナルします。

voidは、nilやシンボルvoidとは異なることに注意してください。シンボルnilおよびvoidはLispオブジェクトであり、他のオブジェクトと同様、関数セルに格納することができます(これらのシンボルはdefunを使用して有効な関数に成ることができます)。voidである関数セルは、どのようなオブジェクトも含みません。

fboundpを使用して、任意のシンボルの関数定義がvoidかどうかテストすることができます。シンボルに関数定義を与えた後は、fmakunboundをつかえば、再びvoidにすることができます。

Function: fboundp symbol

この関数は、そのシンボルが関数セルにオブジェクトをもっていればt、それ以外はnilをreturnします。これは、そのオブジェクトが本物の関数であるかチェックしません。

Function: fmakunbound symbol

この関数はsymbolの関数セルをvoidにします。そのため、これ以降に関数セルにアクセスしようと試みると、void-functionエラーが発生します。これはsymbolをreturnします(When a Variable is “Void”makunboundも参照してください)。

(defun foo (x) x)
(foo 1)
     ⇒1
(fmakunbound 'foo)
     ⇒ foo
(foo 1)
error→ Symbol's function definition is void: foo
Function: fset symbol definition

この関数はsymbolの関数セルに、definitionを格納します。結果はdefinitionです。definitionは通常、関数または関数の名前であるべきですが、これはチェックされません。引数symbolは、通常のどおり評価される引数です。

この関数は主に、関数を定義したり変更すして構成を行う、defunadvice-addのようなものからサブルーチンとして使用されます。シンボルにたいして、たとえばキーボードマクロ(Keyboard Macrosを参照してください)のような、関数ではない関数定義与えるためにも使用することができます:

;; 名前つきのキーボードマクロを定義する。
(fset 'kill-two-lines "\^u2\^k")
     ⇒ "\^u2\^k"

関数にたいして別の名前を作成するためにfsetを使いたい場合は、かわりにdefaliasの使用を考慮してください。Definition of defaliasを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.9 Closures

Scoping Rules for Variable Bindingsで説明したように、Emacsはオプションで変数のレキシカルバインディングを有効にできます。レキシカルバインディングが有効な場合、あなたが(たとえばdefunなどで)作成した任意の名前つき関数、同様にlambdaマクロ、functionスペシャルフォーム、#'構文を使用して作成した任意の無名関数(Anonymous Functionsを参照してください)は、自動的にクロージャー(closure)に変換されます。

クロージャーとは、その関数が定ぎされたどときに存在したレキシカル環境の記録もあわせもつ関数です。クロージャーが呼び出されたとき、定義内のレキシカル変数の参照には、その保持されたレキシカル環境を使用されます。他のすべての点では、クロージャーは通常の関数と同様に振る舞います。特に、クロージャーは通常の関数と同じ方法で呼び出すことができます。

クロージャー使用する例は、Lexical Bindingを参照してください。

現在のところ、Emacs Lispのクロージャーオブジェクトは、1つ目の要素にシンボルclosureをもつリストとして表現されます。そのリストは2つ目の要素としてレキシカル環境を表し、残りの要素で引数リストとbodyフォームを表します:

;; レキシカルバインディングが有効。
(lambda (x) (* x x))
     ⇒ (closure (t) (x) (* x x))

しかし実際には、クロージャーの内部構造は、内部的な実装の詳細と判断される残りのLisp界を“晒け出す”ものだと言えます。この理由により、クロージャーオブジェクトの構造を直接調べたり変更することは推奨しません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10 Advising Emacs Lisp Functions

他のライブラリーの関数定義を変更する必要があるとき、またはfoo-functionoのようなフックやプロセスフィルター(process filter)、または関数を値としてもつ任意の変数またはオブジェクトを変更する必要があるときには、名前つきの関数にはfsetdefun、フック変数にはsetq、プロセスフィルターにはset-process-filterのように、適切なセッター関数(setter function)を使用することができます。しかし、これらが以前の値を完全に破棄してしまうのが好ましくない場合もあります。

アドバイス(advice)機能により、関数にアドバイスすることにより、既存の関数定義に機能を追加できます。これは関数全体を再定義するより明解な手法です。

Emacsのアドバイスシステムは2つのプリミティブセットを提供します。コアとなるセットは、変数やオブジェクトのフィールドに保持された関数値にたいするものです(対応するプリミティブはadd-functionremove-functionです)。もう1つのセットは、名前つき関数の最上位のレイヤーとなるものです(主要なプリミティブはadvice-addadvice-removeです)。

たとえば、プロセスprocのプロセスフィルターの呼び出しをトレースするためには、以下を使用できます:

(defun my-tracing-function (proc string)
  (message "Proc %S received %S" proc string))

(add-function :before (process-filter proc) #'my-tracing-function)

これにより、そのプロセスの出力は、元のプロセスフィルターに渡される前に、my-tracing-functionに渡されるようになります。my-tracing-functionは元の関数と同じ引数を受け取ります。これを行った場合、以下のようにしてトレースを行わない振る舞いにリバートすることができます。

(remove-function (process-filter proc) #'my-tracing-function)

同様に、display-bufferという名前つきの関数の実行をトレースしたい場合は、以下を使用できます:

(defun his-tracing-function (orig-fun &rest args)
  (message "display-buffer called with args %S" args)
  (let ((res (apply orig-fun args)))
    (message "display-buffer returned %S" res)
    res))

(advice-add 'display-buffer :around #'his-tracing-function)

ここで、his-tracing-functionは元の関数のかわりに呼び出され、元の関数(加えてその関数の引数)を引数として受け取るので、必要な場合はそれを呼び出すことができます。出力を確認し終えたら、以下のようにしてトレースしない振る舞いにリバートできます:

(advice-remove 'display-buffer #'his-tracing-function)

上記の例で使用されている引数:before:aroundは、2つの関数が構成される方法を指定します(これを行うには多くの方法があるからです)。追加された関数も、アドバイス(advice)と呼ばれます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10.1 Primitives to manipulate advices

Macro: add-function where place function &optional props

このマクロはplace(Generalized Variablesを参照してください)に格納された関数に、アドバイスfunctionを追加する手軽な方法です。

whereは、既存の関数のどこに — たとえば元の関数の前、または後に — functionが構成されるかを決定します。2つの関数を構成するために利用可能な方法のリストは、Ways to compose advicesを参照してください。

(通常は名前が-functionで終わる)変数を変更するときには、functionがグローバルに使用されるか、あるいはカレントバッファーだけに使用されるか選ぶことができます。placeが単にシンボルの場合、functionplaceのグローバル値に追加されます。place(local symbol)というフォームの場合、symbolはその変数の名前をreturnする式なので、functionはカレントバッファーだけに追加されます。最後に、レキシカル変数を変更したい場合には、(var variable)を使用する必要があるでしょう。

add-functionで追加されたすべての関数は、自動的にプロパティーpropsの関連リストに加えることができます。現在のところ、特別な意味をもつのは2つのプロパティーだけです:

name

これはアドバイスの名前を与えます。この名前は、remove-functionが取り除く関数を識別するのに使用できます。これは通常、functionが無名関数のときに使用されます。

depth

これは複数のアドバイスが与えられたときに、どのようにアドバイスを順番づけるかを指定します。depthのデフォルト0です。depthが100のとき、このアドバイスは可能な限りの深さを保持すべきことを意味し、-100のときは最外のアドバイスに留めることを意味します。同じdepthで2つのアドバイスが指定された場合、もっとも最近に追加されたアドバイスが最外になります。

:beforeアドバイスにたいしては、最外(outermost)になるということは、このアドバイスが他のアドバイスの前、つまり1番目に実行されることを意味し、最内(innermost)とは元の関数が実行される直前、すなわちこのアドバイスと元の関数の間に実行されるアドバイスは存在しないことを意味します。同様に:afterアドバイスにたいしては、最内とは元の関数の直後、つまりこの元の関数とアドバイスの間に実行される他のアドバイスは存在せず、最外とは他のすべてのアドバイスが実行された後にこのアドバイスが実行されることを意味します。:overrideの最内アドバイスは、元の関数だけをオーバーライドし、他のアドバイスは適用されませんが、:overrideの最外アドバイスは元の関数だけではなく。その他すべての適用済みのアドバイスををオーバーライドします。

functionがインタラクティブでない場合、欠オグされた関数は、(もしあれば)元の関数のインタラクティブ指定(interactive spec)を継承します。それ以外は、結合された関数はインタラクティブになり、functionのインタラクティブ指定を使用します。1つ例外があります。functionのインタラクティブ指定が、(式や文字列ではない)関数の場合、元の関数のインタラクティブ指定を唯一の引数として、その関数を呼び出して、それが結合された関数のインタラクティブ指定になります。引数として受け取ったインタラクティブ指定を解釈するためには、advice-eval-interactive-specを使用します。

注意: functionのインタラクティブ指定は結合された関数に適用され、functionではなく、結合された関数の呼び出し規約に従うべきです。多くの場合、これらは等しいので差異は生じませんが、function:around:filter-argsfilter-returnでは、重要になります。

Macro: remove-function place function

このマクロはplaceに格納された関数から、functionを取り除きます。これは、add-functionを使用して、functionplaceに追加されたときだけ機能します。

functionは、placeに追加された関数にたいして、ラムダ式にたいしても機能するように、equalを使用して比較を試みます。これは追加でplaceに追加された関数のnameプロパティーも比較します。これはequalを使用してラムダ式を比較するより信頼性があります。

Function: advice-function-member-p advice function-def

adviceがすでにfunction-def内にある場合は、非nilをreturnします。上記のremove-functionと同様、実際の関数adviceのかわりに、アドバイス断片(piece of advice)のnameも使用できます。

Function: advice-function-mapc f function-def

function-defに追加されたすべてのアドバイスに対して、関数fを呼び出します。fは2つの引数 — アドバイス関数と、それのプロパティーで呼びだされます。

Function: advice-eval-interactive-spec spec

そのような指定で関数がインタラクティブに呼び出されたように、インタラクティブ指定specを評価して、構築された引数のリストに対応するリストをreturnします。たとえば、(advice-eval-interactive-spec "r\nP")は、リージョンの境界、カレントプレフィクス引数を含む、3つの要素からなるリストをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10.2 Advising Named Functions

アドバイスの一般的な使い方は、名前つき関数やマクロにたいして使用する方法です。これは単にadd-functionを使用して以下のように行うことができます:

(add-function :around (symbol-function 'fun) #'his-tracing-function)

しかし、かわりにadvice-addadvice-removeを使うべきです。この別の関数セットは名前つき関数に適用されるアドバイス断片を操作するためのもので、add-functionと比較して以下の追加機能があります。まず、これらはマクロおよびオートロードされた関数を扱う方法を知っています。次に、describe-functionにたいして、追加されたアドバイスと同様に、元のドキュメント文字列を維持します。さらに、関数が定義される前でも、アドバイスの追加と削除ができます。

既存の関数を関数全体を再定義せずに、既存の呼び出しを変更するために、advice-addは有用になります。しかし、その関数の既存の呼び出し元は、古い振る舞いを前提としているかもしれず、アドバイスによりその振る舞いが変更されたときに正しく機能しないかもしれないので、これはソースのバグにもなり得ます。アドバイスはデバッグを難しくする可能性もあります。デバッグを行う人は、その関数がアドバイスにより変更されたことに気づかなかったり、失念しているかもしれません。

これらの理由により、他の方法で関数の振る舞いを変更できない場合のために、アドバイスの使用は控えるべきです。フックを通じて同じことが行えるなら、フック(Hooksを参照してください)の使用が望ましい方法です。特定のキーが行う何かを変更したいだけなら、新しいコマンドを記述して、古いコマンドのキーバインドを新しいコマンドにリマップ(Remapping Commandsを参照してください)するのが、おそらくより良い方法です。特に、Emacs自身のソースファイルは、Emacs内の関数をアドバイスするべきではありません(現在のところこの慣習には数少ない例外がありますが、わたしたちはこれを改善しようと思っています)。

スペシャルフォーム(Special Formsを参照してください)はアドバイスできませんが、マクロは関数と同じ方法でアドバイスできます。もちろん、これはすでにマクロ展開されたコードには影響しないため、マクロ展開前にアドバイスが確実にインストールされる必要があります。

プリミティブ(What Is a Function?を参照してください)にアドバイスするのは可能ですが、2つの理由により通常は行うべきではありません。1つ目の理由は、いくつかのプリミティブはアドバイスのメカニズム内で使用されているため、それらにたいしてアドバイスを行うと無限再帰が発生するからです。2つ目の理由は、多くのプリミティブがCから直接呼び出されていて、そのような呼び出しはアドバイスを無視するからです。したがって、プリミティブにたいしてアドバイスの使用を控えることは、ある呼び出しはアドバイスにしたがい(Lispコードから呼びだされたため)、他の呼び出しではアドバイスにしたがわない(Cコードから呼び出されたため)という混乱した状況を解決します。

Function: advice-add symbol where function &optional props

名前つき関数symbolに、アドバイスfunctionを追加します。wherepropsは、add-function(Primitives to manipulate advicesを参照してください)のときと同じ意味をもちます。

Function: advice-remove symbol function

名前つき関数symbolからアドバイスfunctionを取り除きます。functionにアドバイスのnameを指定することもできます。

Function: advice-member-p function symbol

名前つき関数symbol内にすでにアドバイスfunctionがある場合は、非nilをreturnします。functionにアドバイスのnameを指定することもできます。

Function: advice-mapc function symbol

名前つき関数symbolにすでに追加されたすべての関数にたいして、functionを呼び出します。functionは2つの引数、アドバイス関数と、そのプロパティーで呼び出されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10.3 Ways to compose advices

以下はadd-functionおよびadvice-addwhere引数に可能な値で、そのアドバイスfunctionと元の関数が構成されるべき方法を指定します。

:before

古い関数の前にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (apply function r) (apply oldfun r))

(add-function :before funvar function)は、ノーマルフックにたいする(add-hook 'hookvar function)のような、1関数のフックと同等です。

:after

古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (prog1 (apply oldfun r) (apply function r)))

(add-function :after funvar function)は、ノーマルフックにたいする(add-hook 'hookvar function 'append)のような、1関数のフックと同等です。

:override

これは古い関数を新しい関数に完全に置き換えます。もちろん、remove-functionを呼び出した後に、古い関数は復元されます。

:around

古い関数のかわりにfunctionを呼び出しますが、古い関数はfunctionの追加の引数になります。これはもっとも柔軟な結合です。たとえば、古い関数を異なる引数で呼び出したり、複数回呼び出したり、letバインディングで呼び出したり、あるときは古い関数に処理を委譲し、またあるときは完全にオーバーライドすることが可能になります。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (apply function oldfun r))
:before-while

古い関数の前にfunctionを呼び出し、functionnilをreturnした場合は古い関数を呼び出しません。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、古い関数のreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (and (apply function r) (apply oldfun r)))

(add-function :before-while funvar function)は、run-hook-with-args-until-failureを通じてhookvarが実行されたときの(add-hook 'hookvar function)のような、1関数のフックと同等です。

:before-until

古い関数の前にfunctionを呼び出し、functionnilをreturnした場合だけ古い関数を呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (or (apply function r) (apply oldfun r)))

(add-function :before-until funvar function) は、run-hook-with-args-until-successを通じてhookvarが実行されたときの(add-hook 'hookvar function)のような、1関数のフックと同等です。

:after-while

古い関数が非nilをreturnした場合だけ、古い関数の後にfunctionを呼び出します。関数は両方とも同じ引数を受け取り、2つの関数の結合のreturn値は、functionのreturn値です。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (and (apply oldfun r) (apply function r)))

(add-function :after-while funvar function)は、run-hook-with-args-until-failureを通じてhookvarが実行されたときの(add-hook 'hookvar function 'append)のような、1関数のフックと同等です。

:after-until

古い関数がnilをreturnした場合だけ、古い関数の後にfunctionを呼び出します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (or  (apply oldfun r) (apply function r)))

(add-function :after-until funvar function)は、run-hook-with-args-until-successを通じてhookvarが実行されたときの(add-hook 'hookvar function 'append)のような、1関数のフックと同等です。

:filter-args

最初にfunctionを呼び出し、その結果(リスト)を新たな引数として古い関数に渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (apply oldfun (funcall function r)))
:filter-return

最初に古い関数を呼び出し、その結果をfunctionに渡します。より正確に言うと、2つの関数の結合は、以下のように振る舞います:

(lambda (&rest r) (funcall function (apply oldfun r)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.10.4 Adapting code using the old defadvice

多くのコードは古いdefadviceメカニズムを使用しており、これらの大半はadvice-addにより陳腐化しました。advice-addの実装と意味は、とてもシンプルです。

古いアドバイスは以下のようなものです:

(defadvice previous-line (before next-line-at-end
                                 (&optional arg try-vscroll))
  "Insert an empty line when moving up from the top line."
  (if (and next-line-add-newlines (= arg 1)
           (save-excursion (beginning-of-line) (bobp)))
      (progn
        (beginning-of-line)
        (newline))))

新しいアドバイスメカニズムを使用すれば、これを通常の関数に変換できます:

(defun previous-line--next-line-at-end (&optional arg try-vscroll)
  "Insert an empty line when moving up from the top line."
  (if (and next-line-add-newlines (= arg 1)
           (save-excursion (beginning-of-line) (bobp)))
      (progn
        (beginning-of-line)
        (newline))))

これが実際のprevious-lineを変更しないことは明確です。古いアドバイスには、以下が必要です:

(ad-activate 'previous-line)

一方、新しいアドバイスメカニズムでは、以下が必要です:

(advice-add 'previous-line :before #'previous-line--next-line-at-end)

ad-activateはグローバルな効果をもつことに注意してください。これは、指定された関数にたいして、アドバイスのすべての断片を有効にします。特定のアドバイスだけをアクティブ、または非アクティブにしたい場合、ad-enable-advice、またはad-disable-adviceにより、有効または無効にする必要があります。新しいメカニズムではこの区別はなくなりました。

以下のようなaroundのアドバイスがあるとします:

(defadvice foo (around foo-around)
  "Ignore case in `foo'."
  (let ((case-fold-search t))
    ad-do-it))
(ad-activate 'foo)

これは以下のように変換できます:

(defun foo--foo-around (orig-fun &rest args)
  "Ignore case in `foo'."
  (let ((case-fold-search t))
    (apply orig-fun args)))
(advice-add 'foo :around #'foo--foo-around)

アドバイスのクラスについて、新たな:beforeは、古いbeforeは完全に等価ではないことに注意してください。なぜなら古いアドバイス内では、(たとえばad-set-argを使って)その関数の引数を変更できそれは元の関数が参照する引数値に影響します。しかし新しい:beforeは、setqを通じてアドバイス内の引数をし、その変更は元の関数からの参照に影響しません。この振る舞いにもとづいてbeforeアドバイスを移行するときは、代わりにそれを新たなアドバイス:aroundまたは:filter-argsに変更する必要があるでしょう。

同様に、古いafterアドバイスは、ad-return-valueを変更することによりreturn値を変更できますが、新しい:afterは変更できないので、そのようなafterを移行するときは、かわりにそれらを新しいアドバイス:aroundまたは:filter-returnに変更する必要があるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.11 Declaring Functions Obsolete

名前つき関数を陳腐化している(obsolete)とマークすることができます。これは、その関数が将来のある時点で削除されるかもしれないことを意味します。陳腐化しているとマークされた関数を含むコードをバイトコンパイルしたとき、Emacsは警告を発します。また、その関数のヘルプドキュメントは表示されなくなります。他の点においては、陳腐化した関数は他の任意の関数と同様に振る舞います。

関数を陳腐化しているとマークするもっとも簡単な方法は、その関数のdefun定義に(declare (obsolete …))を配置することです。The declare Formを参照してください。かわりに、以下で説明しているmake-obsolete関数を使うこともできます。

make-obsoleteを使用して、マクロ(Macrosを参照してください)を陳腐化しているとマークすることもできます。これは関数のときと同じ効果をもちます。関数またはマクロにたいするエイリアスも、陳腐化しているとマークできます。これはエイリアス自身をマークし、名前解決される関数またはマクロにたいしてではありません。

Function: make-obsolete obsolete-name current-name &optional when

この関数は、obsolete-nameを陳腐化しているとマークします。obsolete-nameには関数またはマクロを名前づけるシンボル、、または関数やマクロにたいするエイリアスを指定します。

current-nameがシンボルの場合は、obsolete-nameのかわりにcurrent-nameの使用を促す警告メッセージになります。current-nameは、obsolete-nameにたいするエイリアスである必要はありません。似たような機能をもつ、別の関数かもしれません。current-nameには、警告メッセージとなる文字列も指定できます。メッセージは小文字で始まりピリオドで終えるべきです。nilも指定でき、この場合には警告メッセージに追加の詳細は提供されません。

whenが与えられた場合、それは最初にその関数が陳腐化する時期を示す文字列 — たとえば火付けやリリース番号を指定します。

Macro: define-obsolete-function-alias obsolete-name current-name &optional when doc

この便利なマクロは関数obsolete-nameを陳腐化しているとマークするとともに、それを関数current-nameのエイリアスにします。これは以下と等価です:

(defalias obsolete-name current-name doc)
(make-obsolete obsolete-name current-name when)

加えて、陳腐化した関数にたいする特定の呼び出し規約をマークできます。

Function: set-advertised-calling-convention function signature when

この関数は、functionを呼び出す正しい方法として、引数リストsignatureを指定します。これにより、Emacs Lispプログラムが他の方法でfunctionを呼び出している場合には、Emacsのバイトコンパイラーが警告を発します(それでもコードはバイトコンパイルされます)。whenには、その変数が最初に陳腐化するときを示す文字列(通常はバージョン番号)を指定します。

たとえば、古いバージョンのEmacsでは、sit-forには以下のように3つの引数を指定していました

  (sit-for seconds milliseconds nodisp)

しかしこの方法によるsit-forの呼び出しは陳腐化していると判断されます(Waiting for Elapsed Time or Inputを参照してください)。以下のように、古い呼び出し規約は推奨されません:

(set-advertised-calling-convention
  'sit-for '(seconds &optional nodisp) "22.1")

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.12 Inline Functions

インライン関数(inline function)は関数と同様に機能しますが、1つ例外があります。その関数の呼び出しがバイトコンパイルされると(Byte Compilationを参照してください)、その関数の定義が呼び出し元に展開されます。インライン関数を定義するには、defunのかわりにdefsubstを使用します。

Macro: defsubst name args [doc] [declare] [interactive] body…

このマクロはインライン関数を定義します。マクロの構文はdefunとまったく同じです(Defining Functionsを参照してください)。

関数をインラインにすることにより、その関数の呼び出しが高速になる場合があります。しかし欠点もあります。1つは柔軟性の減少です。その関数の定義を変更した場合、すでにインライン化された呼び出しは、リコンパイルを行うまで古い定義を使用します。

もう1つの欠点は、大きな関数をインライン化することにより、コンパイルされたコードのファイル上およびメモリー上のサイズが増大することです。スピード面でのインライン化の有利性は小さい関数にたいして顕著なので、一般的に大きな関数をインライン化するべきではありません。

インライン関数は、デバッグ、トレース、アドバイス(Advising Emacs Lisp Functionsを参照してください)に際してうまく機能しません。デバッグの容易さと関数の再定義の柔軟さはEmacsの重要な機能なので、スピードがとても重要であり、defunの使用が実際に性能の面で問題となるのか検証するためにすでにコードをチューニングしたのでなければ、たとえその関数が小さくてもインライン化するべきでは ありません。

インライン関数が実行するのと同じコードに展開されるマクロ(Macrosを参照してください)を定義することは可能です。しかし式内でのマクロの直接の使用には制限があります — applymapcarなどでマクロを呼び出すことはできません。通常の関数からマクロへの変換には、そのための余分な作業が必要になります。通常の関数をインライン関数に変換するのは簡単です。defundefsubstに置き換えるだけです。インライン関数の引数はそれぞれ正確に1回評価されるので、マクロのときのように、bodyで引数を何回使用するか心配する必要はありません。

インライン関数を定義した後、そのインライン展開はマクロ同様、同じファイル内の後の部分で処理されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.13 The declare Form

declare(宣言)は特別なマクロで、関数やマクロに“メタ”プロパティーを追加するために使用できます。たとえば陳腐化しているとマークしたり、Emacs Lispモード内の特別なTABインデント規則を与えることができます。

Macro: declare specs…

このマクロは引数を無視して、nilとして評価され、実行時の効果はありません。しかしdefunまたはdefsubst(Defining Functionsを参照してください)、またはdefmacroマクロ(Defining Macrosを参照してください)の定義のdeclare引数にdeclareフォームがある場合は、specsで指定されたプロパティーを関数またはマクロに追加します。これはdefundefsubstdefmacroにより特別に処理されます。

specs内の各要素は(property args…)というフォームをもつべきです。また、クォートするべきではありません。これらは、以下の効果をもちます:

(advertised-calling-convention signature when)

これはset-advertised-calling-convention(Declaring Functions Obsoleteを参照してください)の呼び出しと同じように振る舞います。signatureはその関数(またはマクロにたいする正しい引数リスト)で、whenは古い引数リストが最初に陳腐化する時期を示す文字列を指定します。

(debug edebug-form-spec)

これはマクロだけに有効です。Edebugでそのマクロ入ったときに、edebug-form-specを使用します。Instrumenting Macro Callsを参照してください。

(doc-string n)

それ自身が関数、マクロ、または変数のようなエンティティーを定義するために使用される関数やマクロを定義するときに使用されます。これはn番目の引数を示し、もしあれば、それはドキュメント文字列です。

(indent indent-spec)

この関数(またはマクロ)にたいするインデント呼び出しは、indent-specにしたがいます。これは関数でも機能しますが、通常はマクロで使用されます。Indenting Macrosを参照してください。

(obsolete current-name when)

make-obsolete(Declaring Functions Obsoleteを参照してください)と同様に、関数(またはマクロ)を陳腐化しているとマークします。current-nameにはシンボル(かわりにこのシンボルを使うことをすすめる警告メッセージになります)、文字列(警告メッセージを指定します)、またはnil(警告メッセージには追加の詳細が含まれません)を指定します。whenには、その関数(またはマクロ)が最初に陳腐化する時期を示す文字列を指定します。

(compiler-macro expander)

これは関数だけに使用でき、最適化関数(optimization function)としてexpanderを使用するようコンパイラーに告げます。(function args…)のようなその関数への呼び出しフォームに出会うと、マクロ展開機能(macro expander)はargs…と同様のフォームでexpanderを呼び出します。expanderはその関数呼び出しのかわりに使用するための新しい式、または変更されていないフォーム(その関数呼び出しを変更しないことを示す)のどちらかをreturnすることができます。expanderにはシンボル、またはフォーム(lambda (arg) body)を指定できます。フォームの場合、argは元の関数呼び出し式を保持して、その関数の形式に適う引数を使用することにより、その関数にたいする(評価されていない)引数にアクセスできます。

(gv-expander expander)

expandergv-define-expanderと同様、汎変数としてマクロ(または関数)にたいする呼び出しを処理する関数であることを宣言します。expanderはシンボル、またはフォーム(lambda (arg) body)を指定できます。フォームの場合、その関数は追加でそのマクロ(または関数)にアクセスできます。

(gv-setter setter)

setterが、汎変数としてマクロ(または関数)にたいする呼び出しを処理する関数であることを宣言します。setterはシンボル、またはフォームを指定できます。シンボルの場合、そのシンボルはgv-define-simple-setterに渡されます。フォームの場合は(lambda (arg) body)という形式で、その関数は追加でマクロ(または関数)にアクセスでき、gv-define-setterに渡されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.14 Telling the Compiler that a Function is Defined

あるファイルをバイトコンパイルするとき、コンパイラーが知らない関数について警告が生成されるときがあります(Compiler Errorsを参照してください)。実際に問題がある場合もありますが、問題となっている関数がそのコードの実行時にロードされる他のファイルで定義されている場合が通常です。たとえば以前は、fortran.elをバイトコンパイルすると、以下のような警告が出ていました:

In end of data:
fortran.el:2152:1:Warning: the function `gud-find-c-expr' is not
    known to be defined.

実際のところ、gud-find-c-exprは、Fortranモードが使用するgud-find-expr-functionのローカル値(GUDからのコールバック)の中だけで使用されていて、呼びだされた場合はGUD関数がロードされます。そのような警告が実際には問題を示さないことを知っているときには、警告を抑制したほうがよいでしょう。そうすれば、実際に問題があることを示す新しい警告の識別性が良くなります。declare-functionを使用して、これを行うことができます。

必要なのは、問題となっている関数を最初に使用する前にdeclare-function命令を追加するだけです:

(declare-function gud-find-c-expr "gud.el" nil)

これはgud-find-c-exprgud.el(‘.el’は省略可)の中で定義していることを告げます。コンパイラーは関数がそのファイルで実際に定義されているとみなし、チェックを行いません。

3つ目の引数はオプションで、gud-find-c-exprの引数リストを指定します。この例では、引数はありません(nilと値を指定しないのは、異なります)。それ以外の場合は、(file &optional overwrite)のようになります。引数リストを指定する必要はありませんが、指定すればコンパイラーはその呼び出しが宣言と合致するかチェックできます。

Macro: declare-function function file &optional arglist fileonly

バイトコンパイラーにたいして、引数arglistをとるfunctionが定義されていて、その定義はfileにあるとみなすように告げます。fileonlyが非nilの場合は、fileが存在することだけをチェックして、実際のfunctionの定義はチェックしないことを意味します。

これらの関数がdeclare-functionが告げる場所で実際に宣言されているか検証するには、check-declare-fileを使用して、1つのソースファイル中のすべてのdeclare-function呼び出しをチェックするか、check-declare-directoryを使用して、特定のディレクトリー配下のすべてのファイルをチェックします。

これらのコマンドは、locate-libraryで使用する関数の定義を含むべきファイルを探します。ファイルが見つからない場合、これらのコマンドはdeclare-functionの呼び出しを含むファイルをがあるディレクトリーからの相対ファイル名に、定義ファイル名を展開します。

.c’や‘.m’で終わるファイル名を指定することにより、プリミティブ関数を指定することもできます。これが有用なのは、特定のシステムだけで定義されるプリミティブを呼び出す場合だけです。ほとんどのプリミティブは常に定義されているので、それらについて警告を受け取ることはありえないはずです。

あるファイルがオプションとして外部のパッケージの関数を使う場合があります。declare-function命令内のファイル名のプレフィクスを‘ext:’にすると、そのファイルが見つかった場合はチェックして、見つからない場合はエラーとせずにスキップします。

check-declare’が理解しない関数定義もいくつか存在します(たとえばdefstructや、その他いくつかのマクロ)。そのような場合、declare-functionfileonly引数に、非nilを渡すことができます。これはファイルの存在だけをチェックして、その関数の実際の定義はチェックしないことを意味します。これを行う場合、引数リストを指定する必要はないのですが、arglist引数にはtをセットするべきだということに注意してください(なぜならnilは、引数リストが指定されなかったという意味ではなく、空の引数リストを意味するからです)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.15 Determining whether a Function is Safe to Call

SESのようないくつかのメジャーモードは、ユーザーファイル内に格納された関数を呼び出します(See (ses)Top, for more information on SESを参照してください)。 ユーザーファイルには素性があやふやな場合があります — 初対面の人から受け取ったスプレッドシートかもしれず、会ったことのない誰かから受け取ったeメールかもしれません。そのため、ユーザーファイルに格納されたソースコードの関数を呼び出すのは、それが安全だと決定されるすまでは危険です。

Function: unsafep form &optional unsafep-vars

form安全(safe)なLisp式の場合はnil、危険な場合はなぜその式が危険かもしれないのか説明するリストをreturnします。引数unsafep-varsは、この時点で一時的なバインドだと判っているシンボルのリストです。これは主に内部的な再帰呼び出しで使用されます。カレントバッファーは暗黙の引数になり、これはバッファーローカルなバインディングのリストを提供します。

高速かつシンプルにするために、unsafepは、とても軽量な分析を行うので、実際には安全な多くのLisp式を拒絶します。安全ではない式にたいして、unsafepnilをreturnするケースは確認されていません。しかし“安全”なLisp式はdisplayプロパティーと一緒に文字列をreturnでき、これはその文字列がバッファーに挿入された後に実行される、割り当てられたLisp式を含みます。割り当てられた式は、ウィルスかもしれません。安全であるためには、バッファーへ挿入する前に、ユーザーコードにより計算されたすべての文字列からプロパティーを削除しなければなりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12.16 Other Topics Related to Functions

以下のテーブルは、関数呼び出しと関数定義に関連したことを行ういくつかの関数です。これらは別の場所で説明されているので、ここではクロスリファレンスを提供します。

apply

Calling Functionsを参照してください。

autoload

Autoloadを参照してください。

call-interactively

Interactive Callを参照してください。

called-interactively-p

Distinguish Interactive Callsを参照してください。

commandp

Interactive Callを参照してください。

documentation

Access to Documentation Stringsを参照してください。

eval

Evalを参照してください。

funcall

Calling Functionsを参照してください。

function

Anonymous Functionsを参照してください。

ignore

Calling Functionsを参照してください。

indirect-function

Symbol Function Indirectionを参照してください。

interactive

Using interactiveを参照してください。

interactive-p

Distinguish Interactive Callsを参照してください。

mapatoms

Creating and Interning Symbolsを参照してください。

mapcar

Mapping Functionsを参照してください。

map-char-table

Char-Tablesを参照してください。

mapconcat

Mapping Functionsを参照してください。

undefined

Functions for Key Lookupを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13 Macros

マクロ(macros)は、新たな制御構造や、他の言語機能の定義を可能にします。マクロは関数のように定義されますが、値の計算方法を指定するかわりに、値を計算する別のLisp式を計算する方法を指示します。わたしたちはこの式のことをマクロの展開形(expansion)と呼んでいます。

マクロは、関数が行うように引数の値を処理するのではなく、引数のために未評価の式を処理することにより、これを行うことができます。したがってマクロは、これらの引数式またはその一部をを含む式を構築することができます。

マクロを使用して通常の関数が行えることを行う場合、単にそれが速度面の理由ならば、かわりにインライン関数の使用を考慮してください。Inline Functionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.1 A Simple Example of a Macro

Cの++演算子のように、変数の値をインクリメントするためのLisp構造を定義したいとします。(inc x)のように記述すると、(setq x (1+ x))という効果を得たいとします。以下はこれを行うマクロ定義です:

(defmacro inc (var)
   (list 'setq var (list '1+ var)))

これを(inc x)のように呼び出すと、引数varはシンボルxになります — 関数のときのようにxではありません。このマクロのbodyはこれを展開の構築に使用して、展開形は(setq x (1+ x))になります。マクロが1度この展開形をreturnすると。Lispはそれを評価するので、xはインクリメントされます。

Function: macrop object

この術後は、その引数がマクロかどうかテストして、もしマクロならt、それ以外はnilをreturnします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.2 Expansion of a Macro Call

マクロ呼び出しは、関数の呼び出しと同じ外観をもち、マクロの名前で始まるリストで表されます。そのリストの残りの要素は、マクロの引数になります。

マクロ呼び出しの評価は、1つの重大な違いを除き、関数の評価と同じように開始されます。重要な違いとは、そのマクロの引数はマクロ呼び出し内で実際の式として現れます。これらの引数はマクロ定義に与えられる前には評価されません。対象的に、関数の引数は、その関数の呼び出しリストの要素を評価した結果です。

こうして得た引数を使用して、Lispは関数呼び出しのように、マクロ定義を呼び出します。マクロの引数変数はマクロ呼び出しの引数値にバインドされるか、a &rest引数の場合は引数地のリストになります。そして、そのマクロのbodyが実行されて、関数bodyが行うように、マクロbodyの値をreturnsします。

マクロと関数の2つ目の重要な違いは、マクロのbodyからreturnされる値が、代替となるLisp式であることで、これはマクロの展開(expansion)としても知られます。Lispインタープリターは、マクロから展開形が戻されると、すぐにその展開形の評価を行います。

展開形は通常の方法で評価されるので、もしかしたらその展開形は他のマクロの呼び出しを含むかもしれません。一般的ではありませんが、もしかすると同じマクロを呼び出すかもしれません。

EmacsはコンパイルされていないLispファイルをロードするときに、マクロの展開を試みることに注意してください。これは常に利用可能ではありませんが、もし可能なら、それ以降の実行の速度を改善します。How Programs Do Loadingを参照してください。

macroexpandを呼び出すことにより、与えられたマクロ呼び出しにたいする展開形を確認することができます。

Function: macroexpand form &optional environment

この関数は、それがマクロ呼び出しの場合は、formを展開します。結果が他のマクロ呼び出しの場合は、結果がマクロ呼び出しでなくなるまで、順番に展開を行います。これはmacroexpandからreturnされる値になります。formがマクロ呼び出しで開始されない場合、与えられたformをそのままreturnします。

macroexpandは、(たとえいくつかのiマクロ定義がそれを行っているとしても)formの部分式(subexpression)を調べないことに注意してください。たとえ部分式自身がマクロ呼び出しの場合でも、macroexpandはそれらを展開しません。

関数macroexpandは、インライン関数の呼び出しを展開しません。なぜならインライン関数の呼び出しは、通常の関数呼び出しと比較して理解が難しい訳ではないので、通常はそれを行う必要がないからです。

environmentが与えられた場合、それはそのとき定義されているマクロをシャドーするマクロのalistを指定します。バイトコンパイルはこの機能を使用します。

(defmacro inc (var)
    (list 'setq var (list '1+ var)))

(macroexpand '(inc r))
     ⇒ (setq r (1+ r))

(defmacro inc2 (var1 var2)
    (list 'progn (list 'inc var1) (list 'inc var2)))

(macroexpand '(inc2 r s))
     ⇒ (progn (inc r) (inc s))  ; ここではincは展開されない。
Function: macroexpand-all form &optional environment

macroexpand-allmacroexpandと同様、マクロを展開しますが、ドップレベルだけではなく、form内のすべてのマクロを探して展開します。展開されたマクロがない場合、return値は、formeqになります。

上記macroexpandで使用した例をmacroexpand-allに用いると、macroexpand-allincに埋め込まれた呼び出しの展開を行うことを確認できます:

(macroexpand-all '(inc2 r s))
     ⇒ (progn (setq r (1+ r)) (setq s (1+ s)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.3 Macros and Byte Compilation

なぜわざわざマクロにたいする展開形を計算して、その後に展開形を評価する手間をかけるのか、不思議に思うかもしれません。なぜマクロbodyは直接望ましい結果を生成しないのでしょうか? それはコンパイルする必要があるからです。

コンパイルされるLispプログラム内にマクロ呼び出しがあるとき、Lispコンパイラーはインタープリターが行うようにマクロ定義を呼び出して、展開形を受け取ります。しかし展開形を評価するかわりに、コンパイラーは展開形が直接プログラム内にあるかのようにコンパイルを行います。結果として、コンパイルされたコードはそのマクロにたいする値と副作用を生成しますが、実行速度は完全にコンパイルされた行されたときと同じになります。もしマクロbody自身が値と副作用を計算したら。このようには機能しません — コンパイル時に計算されることになり、それは有用ではありません。

マクロ呼び出しのコンパイルが機能するためには、マクロを呼び出すコードがコンパイルされるとき、そのマクロがLisp内ですでに定義されていなければなりません。コンパイラーには、これを行うのを助ける特別な機能があります。コンパイルされるファイルがdefmacroフォームを含む場合、そのファイルの残りの部分をコンパイルするために、そのマクロが一時的に定義されます。

ファイルをバイトコンパイルすると、ファイル内のトップレベルにある任意のrequire呼び出しも実行されるので、それらを定義しているファイルをrequireすることにより、コンパイルの間、必要なマクロ定義が利用できることが確実になります(Featuresを参照してください)。誰かがコンパイルされたプログラムを実行するときに、マクロ定義ファイルのロードをしないようにするには、require呼び出しの周囲にeval-when-compileを記述します(Evaluation During Compilationを参照してください)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.4 Defining Macros

Lispのマクロオブジェクトは、CARmacroで、CDRが関数のリストです。マクロの展開形は、マクロ呼び出しから、評価されていない引数のリストに、(applyを使って)関数を適用することにより機能します。

無名関数のように無名Lispマクロを使用することも可能ですが、無名マクロをmapcarのようなファンクショナルに渡すことに意味がないので、これが行われることはありません。実際のところ、すべてのLispマクロは名前をもち、ほとんど常にdefmacroマクロで定義されます。

Macro: defmacro name args [doc] [declare] body…

defmacroはシンボルname(クォートはしない)を、以下のようなマクロ押して定義します:

(macro lambda args . body)

(このリストのCDRはラムダ式であることに注意してください。) このマクロオブジェクトは、nameの関数セルに格納されます。argsの意味は関数の場合と同じで、キーワード&restおよび&optionalが使用されることもあります(Other Features of Argument Listsを参照してください)。nameargsはどちらも、クォートされるべきではありません。defmacroのreturn値は未定義です。

docが与えられた場合、それはマクロのドキュメント文字列を指定する文字列です。declareが与えられた場合、それはマクロのメタデータを指定するdeclareフォームです(The declare Formを参照してください)。マクロを対話的に呼び出すことはできないので、インタラクティブ宣言をもつことはできないことに注意してください。

マクロが、定数部と非定数部の混合体から構築される巨大なリスト構造を必要とする場合があります。これを簡単に行うためには、‘`’構文(Backquoteを参照してください)を使用します。たとえば:

(defmacro t-becomes-nil (variable)
  `(if (eq ,variable t)
       (setq ,variable nil)))

(t-becomes-nil foo)
     ≡ (if (eq foo t) (setq foo nil))

マクロ定義のbodyには、そのマクロに関する追加のプロパティーを指定する、declareフォームを含めることができます。The declare Formを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5 Common Problems Using Macros

マクロ展開が、直感に反する結果となることがあり得ます。このセクションでは、問題になりかねない重要な結果と、問題を避けるためにしたがうべきルールをいくつか説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.1 Wrong Time

マクロを記述する際のもっとも一般的な問題は、展開形の中ではなく、マクロ展開中に、早まって実際に何らかの作業を行ってしまうことがあります。たとえば、実際のパッケージが以下のマクロ定義をもつとします:

(defmacro my-set-buffer-multibyte (arg)
  (if (fboundp 'set-buffer-multibyte)
      (set-buffer-multibyte arg)))

この誤ったマクロ定義は、解釈(interpret)されるときは正常に機能しますが、コンパイル時に失敗します。このマクロ定義はコンパイル時にset-buffer-multibyteを呼び出してしまいますが、それは間違っています。その後でコンパイルされたパッケージを実行しても何も行いません。プログラマーが実際に望むのは、以下の定義です:

(defmacro my-set-buffer-multibyte (arg)
  (if (fboundp 'set-buffer-multibyte)
      `(set-buffer-multibyte ,arg)))

このマクロは、もし適切ならset-buffer-multibyteの呼び出しに展開され、それはコンパイルされたプログラム実行時に実行されるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.2 Evaluating Macro Arguments Repeatedly

マクロを定義する場合、展開形が実行されるときに引数が何回評価されるか注意を払わなければなりません。以下の(繰り返し処理を用意にする)マクロで、この問題を示してみましょう。このマクロで“for”によるループ構造を記述できます。

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  (list 'let (list (list var init))
        (cons 'while
              (cons (list '<= var final)
                    (append body (list (list 'inc var)))))))

(for i from 1 to 3 do
   (setq square (* i i))
   (princ (format "\n%d %d" i square)))
→
(let ((i 1))
  (while (<= i 3)
    (setq square (* i i))
    (princ (format "\n%d %d" i square))
    (inc i)))

     -|1       1
     -|2       4
     -|3       9
⇒ nil

マクロ内の引数fromtodoは、“構文糖(syntactic sugar)”であり、完全に無視されます。このアイデアは、マクロ呼び出し中で(from, to, and doのような)余計な単語を、これらの位置に記述できるようにするというものです。

以下は、バッククォートの使用により、より単純化された等価の定義です:

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  `(let ((,var ,init))
     (while (<= ,var ,final)
       ,@body
       (inc ,var))))

この定義のフォームは両方(バッククォートのあるものと、ないもの)とも、各繰り返しにおいて毎回finalが評価されるという欠点をもちます。finalが定数のときには、問題はありません。しかし、これがより複雑な、たとえば(long-complex-calculation x)のようなフォームの場合、実効速度は顕著に低下し得ます。finalが副作用をもつ場合には、複数回実行すると、おそらく正しくなくなります。

うまく設計されたマクロ定義は、繰り返し評価することがそのマクロの意図された目的でない限り、引数を正確に1回評価を行う展開形を生成することにより、この問題を避けるためにステップを費やします。以下はforマクロの正しい展開形です:

(let ((i 1)
      (max 3))
  (while (<= i max)
    (setq square (* i i))
    (princ (format "%d      %d" i square))
    (inc i)))

以下はこの展開形を生成するためのマクロ定義です:

(defmacro for (var from init to final do &rest body)
  "Execute a simple for loop: (for i from 1 to 10 do (print i))."
  `(let ((,var ,init)
         (max ,final))
     (while (<= ,var max)
       ,@body
       (inc ,var))))

残念なことに、この訂正により、以下のセクションで説明する、別の問題が発生します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.3 Local Variables in Macro Expansions

前のセクションでは、forの定義を、展開形がマクロ引数を正しい回数評価するように訂正しました:

(defmacro for (var from init to final do &rest body)
  "Execute a simple for loop: (for i from 1 to 10 do (print i))."
  `(let ((,var ,init)
         (max ,final))
     (while (<= ,var max)
       ,@body
       (inc ,var))))

forの新しい定義には、新たな問題があります。この定義は、ユーザーが意識していない、maxという名前のローカル変数を導入しています。これは、以下の例で示すようなトラブルを招きます:

(let ((max 0))
  (for x from 0 to 10 do
    (let ((this (frob x)))
      (if (< max this)
          (setq max this)))))

forのbodyの内部のmaxへの参照は、maxのユーサーバインディングの参照を意図したものですが、実際にはforにより作られたバインディングにアクセスします。

これを修正する方法は、maxのかわりにinternされていない(uninterned)シンボルを使用することです(Creating and Interning Symbolsを参照してください)。internされていないシンボルは他のシンボルと同じようにバインドして参照することができますが、forにより作成されるので、わたしたちはすでにユーザーのプログラムに存在するはずがないことを知ることができます。これはinternされていないので、プログラムの後続の部分でそれを配置する方法はありません。これはforにより配置された場所をのぞき、他の場所で配置されることはありません。以下はこの方法で機能するforの定義です:

(defmacro for (var from init to final do &rest body)
  "Execute a simple for loop: (for i from 1 to 10 do (print i))."
  (let ((tempvar (make-symbol "max")))
    `(let ((,var ,init)
           (,tempvar ,final))
       (while (<= ,var ,tempvar)
         ,@body
         (inc ,var)))))

作成されたinternされていないシンボルの名前はmaxで、これを通常のinternされたシンボルmaxのかわりに、式内のその位置に記述します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.4 Evaluating Macro Arguments in Expansion

マクロ定義自体が、eval(Evalを参照してください)の呼び出しなどによりマクロ引数式を評価した場合には、別の問題が発生します。その引数がユーザーの変数を参照する場合、ユーザーがマクロ引数と同じな前で変数をしようとした場合に問題となるでしょう。マクロのbodyないでは、マクロ引数のバインディングは、その変数のもっともローカルなバインディングなので、そのフォーム内部の任意の参照は、それを参照するように評価されます。以下は例です:

(defmacro foo (a)
  (list 'setq (eval a) t))
(setq x 'b)
(foo x) → (setq b t)
     ⇒ t                  ; bがセットされる。
;; but
(setq a 'c)
(foo a) → (setq a t)
     ⇒ t                  ; しかし、これはcではなくaがセットされる。

ユーザーの変数の名前がaxかということで、違いが生じています。これはaが、マクロの引数変数aと競合しているからです。

マクロ定義内でのevalの呼び出しにまつわる別の問題は、それがおそらくコンパイル時にあなたが意図したことを行わないだろうということです。バイトコンパイラーは、そのプログラム自身の(あなたがevalでアクセスしたいと望む)計算は発生せず、ローカル変数バインディングも存在しないプログラムのコンパイル時にマクロ定義を実行します。

この問題を避けるためには、マクロ展開形の計算では引数式を評価しないでください。かわりにその式をマクロ展開形の中に置き換えれば、その値は展開形の実行の一部として計算されます。これは、このチャプターの他の例が機能する方法です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.5.5 How Many Times is the Macro Expanded?

マクロ呼び出しは逐次解釈される関数で毎回マクロ呼び出しが展開されるが、コンパイルされた関数では(コンパイル時に)1回だけしか展開されないという事実にもとづく問題が、時折発生します。そのマクロ定義が副作用をもつ場合、それらのマクロは、そのマクロが難解展開されたかにより、異なる動作をとるでしょう。

したがって、あなたが何をしているか本当に判っていないのであれば、マクロ展開形の計算での副作用は避けるべきです。

避けることのできない特殊な副作用が1つあります。それはLispオブジェクトの構築です。ほとんどすべてのマクロ展開形には、リストの構築が含まれます。リスト構築はほとんどのマクロの核心部分です。これは通常は安全です。用心しなければならないケースが1つだけあります。それは構築するオブジェクトが、マクロ展開形の中でクォートされた定数の一部となるときです。

そのマクロが1回だけ — コンパイル時 — しか展開されない場合、そのオブジェクトの構築もコンパイル時の1回です。しかし逐次実行では、そのマクロはマクロ呼び出しが実行されるたびに展開され、これは毎回新たなオブジェクトが構築されることを意味します。

クリーンなLispコードのほとんどでは、この違いは問題になりません。しかし、マクロ定義によるオブジェクト構築の副作用を処理する場合には、問題になるかもしれません。したがって問題を避けるために、マクロ定義によるオブジェクト構築の副作用を避けてください。以下は副作用により問題が起こる例です:

(defmacro empty-object ()
  (list 'quote (cons nil nil)))

(defun initialize (condition)
  (let ((object (empty-object)))
    (if condition
        (setcar object condition))
    object))

initializeが解釈された場合、initializeが呼び出されるたびに、新しいリスト(nil)が構築されます。したがって、各呼び出しの間において、副作用は存続しません。しかしinitializeがコンパイルされた場合、マクロempty-objectはコンパイル時に展開され、これは1つの“定数”(nil)を生成し、この定数はinitializeの毎回の呼び出しで、再利用・変更されます。

このような異常な状態を避ける1つの方法は、empty-objectを、メモリー割り当て構造ではなく、一種の奇妙な変数と考えることです。'(nil)のような定数にたいしてsetcarを使うことはないでしょうから、当然(empty-object)にも使うことはないでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

13.6 Indenting Macros

マクロ定義では、マクロ呼び出しをTABがどのようにインデントすべきか指定するために、declareフォーム(Defining Macrosを参照してください)を使うことができます。インデント指定は以下のように記述します:

(declare (indent indent-spec))

以下は利用できるindent-specです:

nil

これはプロパティーを指定しない場合と同じ — 標準的なインデントパターンを使用します。

defun

この関数を‘def’構造 — 2番目の行がbodyの開始 — と同様に扱います。

整数: number

関数の最初のnumber個の引数は区別され、残りは式のbodyと判断されます。その式の中の行は、最初の引数が区別されているかどうかにしたがってインデントされます。引数がbodyの一部である場合、その行はこの式の先頭の 開きカッコ(open-parenthesis)よりもlisp-body-indentだけ多い列にインデントされます。引数が 区別されていて、1つ目または2つ目の引数である場合は、2倍余分にインデントされます。引数が区別されていて1つ目あるいは2つ目の引数でない場合、その行は標準パターンによってインデントされます。

シンボル: symbol

symbolは関数名です。その関数はこの式のインデントを計算するために呼び出される関数です。この関数は2つの引数をとります:

pos

その行のインデントが開始される位置です。

state

その行の開始まで解析されたとき、parse-partial-sexp(インデントとネスト深さの計算のためのLispプリミティブ)によりreturnされる値です。

これは、数(その行のインデントの列数)、またはそのような数がcarであるようなリストをreturnすべきです。数とリストの違いは、数の場合、同じネスト深さの後続のすべての行はこの数と同じインデントとなります。リストの場合、後続の行は異なるインデントを呼び出すかもしれません。これは、C-M-qによりインデントが計算されるときに違いがでます。値が数の場合、C-M-qはリストの終わりまでの後続の行のインデントを、再計算する必要はありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14 Customization Settings

Emacsのユーザーは、カスタマイズインターフェースにより、Lispコードを記述することなく。変数とフェースをカスタマイズできます。Easy Customization in The GNU Emacs Manualを参照してください。このチャプターでは、カスタマイズインターフェースを通じて、ユーザーとやりとりするための、カスタマイズアイテム(customization items)を定義する方法を説明します。

カスタマイズアイテムには、カスタマイズ可能変数(customizable variable: defcustomマクロで定義される。 カスタマイズ可能フェース(customizable face: deffaceで定義される。Defining Facesを参照してください)、および関連するカスタマイズアイテムのグループのためのコンテナーとして働くカスタマイズグループ(customization group: defgroupで定義される) が含まれます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.1 Common Item Keywords

以降のセクションで説明するカスタマイズ宣言(customization declaration) — defcustomdefgroupなどはすべて、さまざまな情報を指定するためのキーワード引数(Variables that Never Changeを参照してください)を受け取ります。このセクションでは、カスタマイズ宣言のすべての種類に適用されるキーワードを説明します。

:tag以外のすべてのキーワードは、与えられたアイテムにたいして複数回使用できます。キーワードの使用はそれぞれ独立した効果をもちます。:tagは例外で、これはすべての与えられたアイテムは1つの名前だけを表示できるからです。

:tag label

labelを使用すると、カスタマイズメニュー(customization menu)およびカスタマイズバッファー(customization buffer)のアイテムのラベルづけに、そのアイテムの名前のかわりに指定された文字列を使用します。混乱を招くので、そのアイテムの実際の名前と、大きく異なる名前は使用しないでください

:group group

このカスタマイズアイテムを、グループgroupに配します。defgroup内で:groupを使用した場合、そのアイテムは新しいグループ(:groupのサブグループ)になります。

このキーワードを複数回使用した場合、1つのアイテムを複数のグループに配すことができます。これらのグループのどれかを表示すると、このアイテムが表示されます。煩わしくなるので、多用しないでください。

:link link-data

このアイテムのドキュメント文字列の後に外部リンクを含めます。これは他のドキュメントを参照する、センテンスを含むボタンです。

link-dataに使用できる複数の候補があります:

(custom-manual info-node)

infoノードへのリンクです。info-nodeは、"(emacs)Top"のような、ノード名を示す文字列です。このリンクはカスタマイズバッファーの‘[Manual]’に表示され、info-nodeにたいしてビルトインのinfoリーダーを起動します。

(info-link info-node)

custom-manualと同様ですが、カスタマイズバッファーには、そのinfoノード名が表示されます。

(url-link url)

ウェブページヘのリンクです。urlURLを指定する文字列です。カスタマイズバッファーに表示されるリンクは、browse-url-browser-functionで指定されたWWWブラウザーを呼び出します。

(emacs-commentary-link library)

ライブラリーのコメントセクション(commentary section)へのリンクです。libraryはライブラリー名を指定する文字列です。Conventional Headers for Emacs Librariesを参照してください。

(emacs-library-link library)

Emacs Lispライブラリーファイルへのリンクです。libraryはライブラリー名を指定する文字列です。

(file-link file)

ファイルへのリンクです。fileは、ユーザーがこのリンクを呼び出したときにfind-fileでvisitするファイルの名前を指定する文字列です。

(function-link function)

関数のドキュメントへのリンクです。functionは、ユーザーがこのリンクを呼び出したときにdescribe-functionで説明を表示する関数の名前を指定する文字列です。

(variable-link variable)

変数のドキュメントへのリンクです。variableは、ユーザーがこのリンクを呼び出したときにdescribe-variableで説明を表示する変数の名前を指定する文字列です。

(custom-group-link group)

他のカスタマイズグループへのリンクです。このリンクを呼び出すことにより、groupにたいする新たなカスタマイズバッファーが作成されます。

link-dataの1つ目の要素の後に:tag nameを追加することにより、カスタマイズバッファーで使用するテキストを指定できます。たとえば(info-link :tag "foo" "(emacs)Top")は、そのバッファーで‘foo’と表示されるEmacs manualへのリンクを作成します。

複数のリンクを追加するために、このキーワードを複数回使用することができます。

:load file

このカスタマイズアイテムを表示する前に、ファイルfileをロードします(Loadingを参照してください)。ロードはloadにより行われ、そのファイルがまだロードされていないときだけロードします。

:require feature

保存したカスタマイズが、このアイテム値をセットするとき、(require 'feature)が実行されます。featureはシンボルです。

:requireを使用するもっとも一般的な理由は、ある変数がマイナーモードのような機能を有効にするとき、そのモードを実装するコードがロードされていない場合には、変数をセットするだけでは効果がないからです。

:version version

このキーワードは、そのアイテムが最初に導入されたEmacsバージョンversion、またはそのアイテムのデフォルト値がそのバージョンで変更されたことを指定します。値versionは文字列でなければなりません。

:package-version '(package . version)

このキーワードは、そのアイテムが最初に導入されたpackageのバージョンversionまたはアイテムの意味(またはデフォルト値)が変更されたバージョンを指定します。このキーワードは:versionより優先されます。

packageにはそのパッケージの公式名をシンボルとして指定します(たとえばMH-E)。versionには文字列を指定します。パッケージpackageがEmacsの一部としてリリースされた場合、packageversionの値は、customize-package-emacs-version-alistの値に表示されるべきです。

Emacsの一部として配布された:package-versionキーワードを使用するパッケージは、customize-package-emacs-version-alist変数も更新しなければなりません。

Variable: customize-package-emacs-version-alist

このalistは、Emacsのバージョンにたいして、:package-versionキーワード内でリストされたパッケージのバージョンへのマッピングを提供します:

(package (pversion . eversion)…)

package(シンボル)それぞれにたいして、パッケージバージョンpversionを含む1つ以上の要素と、それに関連づけられるEmacsバージョンeversionが存在します。これらのバージョンは文字列です。たとえばMH-Eパッケージは、以下でalistを更新します:

(add-to-list 'customize-package-emacs-version-alist
             '(MH-E ("6.0" . "22.1") ("6.1" . "22.1") ("7.0" . "22.1")
                    ("7.1" . "22.1") ("7.2" . "22.1") ("7.3" . "22.1")
                    ("7.4" . "22.1") ("8.0" . "22.1")))

packageの値は一意である必要があり、また:package-versionキーワード内に現れるpackageの値とマッチする必要があります。おそらくユーザーはエラーメッセージからこの値を見るので、MH-EやGnusのようなパッケージの公式名を選択するのがよいでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.2 Defining Customization Groups

Emacs Lispパッケージはそれぞれ、1つのメインカスタマイズグループ(main customization group)をもち、それにはすべてのオプション、フェイス、そのパッケージ内の他のグループが含まれるべきです。そのパッケージには少数のオプションとフェイスしかない場合は、1つのグループだけを使用して、その中にすべてを置きます。20以上のオプションやフェイスがある場合には、それらをサブグループ内に構造化して、そのサブグループをメインカスタマイズグループの下に配します。そのパッケージ内の任意のオプションまたはフェイスを、サブグループと並行してメイングループに配しても構いません。

そのパッケージのメイングループ(または唯一のグループ)は、1つ以上の標準カスタムグループ(standard customization group)のメンバーであるべきです(これらの完全なリストを表示するには、M-x customizeを使用します)。それらの内から1つ以上(多すぎないこと)を選択して、:groupを使用してあなたのグループをそれらに追加します。

新しいカスタマイズグループは、defgroupで宣言します。

Macro: defgroup group members doc [keyword value]…

membersを含む、カスタマイズグループとして、groupを宣言します。シンボルgroupはクォートしません。引数docは、そのグループにたいするドキュメント文字列を指定します。

引数membersは、そのグループのメンバーとなるカスタマイズアイテムの初期セットを指定するリストです。しかしほとんどの場合はmembersnilにして、メンバーを定義するときに:groupキーワードを使用することにより、そのグループのメンバーを指定します。

membersを通じてグループのメンバーを指定したい場合、各要素は(name widget)という形式で指定するべきです。ここでnameはシンボル、widgetはそのシンボルを編集するウィジェット型(widget type)です。有用なウィジェットには、変数にたいするcustom-variable、フェイスにたいするcustom-face、グループにたいするcustom-groupがあります。

Emacsに新しいグループを導入するときは、defgroup内で:versionキーワードを使用します。そうすればグループの個別のメンバーに対してそれを使用する必要がなくなります。

一般的なキーワード(Common Item Keywordsを参照してください)に加えて、defgroupないでは以下のキーワードも使用できます:

:prefix prefix

グループ内のアイテムの名前がprefixで始まり、カスタマイズ変数custom-unlispify-remove-prefixesが非nilの場合、そのアイテムのタグからprefixが省略されます。グループは任意の数のプレフィクスをもつことができます。

User Option: custom-unlispify-remove-prefixes

この変数が非nilの場合、グループの:prefixキーワードで指定されたプレフィクスは、ユーザーがグループをカスタマイズするときは常に、タグ名から省略されます。

デフォルト値はnil、つまりプレフィクス省略(prefix-discarding)の機能は無効です。これは、オプションやフェイスの名前にたいしてプレフィクスを省略するのは、混乱を招くことがあるからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.3 Defining Customization Variables

カスタマイズ可能変数(customizable variable)ユーザーオプション(user option)とも呼ばれ、これはCustomizeインターフェースを通じてセットできるグローなるなLisp変数です。defvar(Defining Global Variablesを参照してください)により定義される他のグローバル変数とは異なり、カスタマイズ可能変数はdefcustomマクロを使用して定義されます。サブルーチンとしてdefvarを呼び出すことに加え、defcustomはCustomizeインターフェースでその変数が表示される方法や、その変数がとることができる値などを明示します。

Macro: defcustom option standard doc [keyword value]…

このマクロはユーザーオプション(またはカスタマイズ可能変数)としてoptionを宣言します。optionはクォートするべきではありません。

引数standardは、optionの標準値を指定する式です。defcustomフォームの評価により、standardが評価されますが、その値にオプションをバインドする必要はありません。optionがすでにデフォルト値をもつ場合、それは変更されずに残ります。ユーザーがすでにoptionにたいするカスタマイズを保存している場合、ユーザーによりカスタマイズされた値がデフォルト値としてインストールされます。それ以外は、standardを評価した結果がデフォルト値としてインストールされます。

defvarと同様、このマクロはoptionをスペシャル変数 — 常にダイナミックにバインドされるべきことを意味する — としてマークします。optionがすでにレキシカルバインドをもつ場合、そのレキシカルバインドはバインディング構造を抜けるまで効果をもちます。Scoping Rules for Variable Bindingsを参照してください。

standardは別の様々な機会にも — カスタマイズ機能がoptionの標準値を知る必要があるときは常に — 評価される可能性があります。そのため任意回数評価しても安全な式を使用するように気をつけてください。

引数docは、その変数にたいするドキュメント文字列を指定します。

defcustomが何も:groupを指定しない場合、同じファイル内でdefgroupにより最後に定義されたグループが使用されます。この方法では、ほとんどのdefcustomは明示的な:groupが必要なくなります。

Emacs LispモードでC-M-x(eval-defun)によりdefcustomフォームを評価するとき、eval-defunの特別な機能は、変数の値がvoidかどうかテストせず、無条件に変数をセットする段取りをします(同じ機能はdefvarにも適用されます。Defining Global Variablesを参照してください)。すでに定義されたdefcustomでeval-defunを使用することにより、(もしあれば):set関数が呼び出されます(以下参照)。

事前ロード( pre-loaded)されたEmacs Lispファイル(Building Emacsを参照してください)にdefcustomを配した場合、ダンプ時にインストールされた標準値は正しくない — たとえば依存している他の変数は、まだ正しい値を割り当てられていない — かもしれません。この場合、Emacs起動後に標準値を再評価するために、以下で説明するcustom-reevaluate-settingを使用します。

Common Item Keywordsにリストされたキーワードに加え、このマクロには以下のキーワードを指定できます:

:type type

このオプションのデータ型として、typeを使用します。これはどんな値が適正なのか、その値をどのように表示するかを指定します(Customization Typesを参照してください)。

:options value-list

このオプションに使用する適正な値のリストを指定します。ユーザーが使用できる値はこれらの値に限定されませんが、これらは便利な候補値を提示します。

これは特定の型にたいしてだけ意味をもち、現在のところhookplistalistが含まれます。:optionsの使用法の説明は、個別の型の定義を参照してください。

:set setfunction

Customizeインターフェースを使用してこのオプションの値を変更する方法として、setfunctionを指定します。関数setfunctionは2つの引数 — シンボル(オプション名)と新しい値 — をとり、このオプションにたいして正しく値を更新するために必要なことは何であれ行うべきです(これはおそらくLisp変数として単にオプションをセットすることを意味しないでしょう)。望ましくは、この関数は引数の値を破壊的に変更するべきではありません。setfunctionのデフォルトは、set-defaultです。

このキーワードを指定した場合、その変数のドキュメント文字列には、手入力のLispコードで同じことを行う方法が記載されるべきです。

:get getfunction

このオプションの値を抽出する方法として、getfunctionを指定します。関数getfunctionは1つの引数(シンボル)をとり、カスタマイズがそのシンボル(シンボルのLisp値である必要はない)にたいする“カレント値”としてそれを使うべきかreturnするべきです。デフォルトはdefault-valueです。

:getを正しく使用するためには、Customの機能を真に理解する必要があります。これは変数としてCustom内で扱われる値のためのものですが、実際にはLisp変数に格納されません。実際にLisp変数に格納されている値にgetfunctionを指定するのは、ほとんどは誤りです。

:initialize function

functionは、defcustomが評価されるときに変数を初期化するために使用される関数であるべきです。これは2つの引数 — オプション名(シンボル)と値をとります。この方法での使用のために事前定義された関数がいくつかあります:

custom-initialize-set

変数の初期化に、その変数の:set関数を使用しますが、値がすでに非voidの場合、再処帰化を行いません。

custom-initialize-default

custom-initialize-setと同様ですが、その変数の:setのかわりに、関数set-defaultを使用して変数をセットします。これは変数の:set関数がマイナーモードを有効または無効にする場合の、通常の選択です。この選択により、変数の定義ではマイナーモード関数を呼び出しませんが、変数をカスタマイズしたときはマイナーモード関数を呼び出します。

custom-initialize-reset

変数の初期化に、常に:set関数を使用します。変数がすでに非voidの場合、(:getメソッドでreturnされる)カレント値を使用して:set関数を呼び出して変数をリセットします。これはデフォルトの:initialize関数です。

custom-initialize-changed

変数がすでにセットされている、またはカスタマイズされている場合は、変数の初期化のために:set関数を使用し、それ以外は単にset-defaultを使用します。

custom-initialize-safe-set
custom-initialize-safe-default

これらのn関数はcustom-initialize-setcustom-initialize-defaultと同様に振る舞いますが、エラーをcatchします。初期化中にエラーが発生した場合は、set-defaultを使用して変数をnilにセットして、エラーをシグナルしません。

これらの関数は事前ロードされたファイルで定義されたオプションのためのものです(requireされた変数または関数がまだ定義されていないため、standard式はエラーをシグナルするかもしれない)。その値は通常、startup.elで更新され、defcustomにより計算された値は無視されます。startup後に、その値をunsetして、defcustomを再評価すれば、エラーなしでstandardは評価されます。

:risky value

その変数のrisky-local-variableプロパティーをvalueにセットします(File Local Variablesを参照してください)。

:safe function

その変数のsafe-local-variableプロパティーを、functionにセットします(File Local Variablesを参照してください)。

:set-after variables

保存されたカスタマイズに合わせて変数をセッティングするときは、その前に変数variables確実にセット — つまり、これら他のものが処理される後までセッティングを遅延 — してください。これら他の変数が意図された値をもっていない場合に、この変数のセッティングが正しく機能しないときは、:set-afterを使用してください。

特定の機能を“オンに切り替える”オプションにたいしては、:requireキーワードを指定すると便利です。これは、その機能がまだロードされていないときは、そのオプションがセットされるとEmacsがその機能をロードするようにします。Common Item Keywordsを参照してください。以下はライブラリーsaveplace.elの例です:

(defcustom save-place nil
  "Non-nil means automatically save place in each file..."
  :type 'boolean
  :require 'saveplace
  :group 'save-place)

あるカスタマイズアイテムが、:optionsがサポートするhookalistのような型をもつ場合は、custom-add-frequent-valueを呼び出すことにより、defcustom宣言の外部から、別途値を追加できます。たとえばemacs-lisp-mode-hookから呼び出されることを意図した関数my-lisp-mode-initializationを定義する場合は、emacs-lisp-mode-hookにたいする正当な値として、その定義を編集することなく、その関数をリストに追加したいと思うかもしれません。これは以下のようにして行うことができます:

(custom-add-frequent-value 'emacs-lisp-mode-hook
   'my-lisp-mode-initialization)
Function: custom-add-frequent-value symbol value

カスタマイズオプションsymbolにたいして正当な値のリストにvalueを追加します。

追加による正確な効果は、symbolのカスタマイズ型に依存します。

内部的には、defcustomは、標準値にたいする式を記録するためにシンボルプロパティーstandard-valueを、カスタマイズバッファーでユーザーによりセットされたが保存されていない値を記録するためにsaved-valueを使用します。Symbol Propertiesを参照してください。これらのプロパティーは、carがその値を評価する式であるようなリストです。

Function: custom-reevaluate-setting symbol

この関数は、defcustomを通じて宣言されたユーザーオプションsymbolの標準値を再評価します。変数がカスタマイズされた場合、この関数はかわりに保存された値を再評価します。それからこの関数はユーザーオプションをその値に(もし定義されていればそのオプションの:setプロパティーを使用して)セットします。

これは値が正しく計算される前に定義されたカスタマイズ可能オプションにたいして有用です。たとえばstartupの間、Emacsは事前ロードされたEmacs Lispファイルで定義されたユーザーオプションにたいしてこの関数を呼び出しますが、これらの初期値は実行時だけ利用可能な情報に依存します。

Function: custom-variable-p arg

この関数は、argがカスタマイズ可能変数の場合は、非nilをreturnします。カスタマイズ可能変数とは、standard-valuecustom-autoloadプロパティーをもつ(通常はdefcustomで宣言されたことを意味する)変数、または別のカスタマイズ可能変数にたいするエイリアスのことです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4 Customization Types

defcustomでユーザーオプションを定義するときは、ユーザーオプションのカスタマイズ型(customization type)を指定しなければなりません。これは、(1)値が適正か、(2)編集のためにカスタマイズバッファーで値を表示する方法、を記述するLispオブジェクトです。

カスタマイズ型は、defcustom内の:typeキーワードで指定します。:typeの引数は評価されますが、defcustomが実行されるとき1回だけ評価されるので、さまざまな値をとる場合には有用でありません。通常はクォートされた定数を使用します。たとえば:

(defcustom diff-command "diff"
  "The command to use to run diff."
  :type '(string)
  :group 'diff)

一般的に、カスタマイズ型は、最初の要素が以降のセクションで定義されるカスタマイズ型の1つであるような、リストです。このシンボルの後にいくつかの引数があり、それはそのシンボルに依存します。型シンボルと引数の間には、オプションでkeyword-valueペアー(Type Keywordsを参照してください)を記述できます。

いくつかの型シンボルは引数を使用しません。これらはシンプル型(simple types)と呼ばれます。シンプル型にたいしては、keyword-valueペアーを使用しない場合は、型シンボルの周囲のカッコ(parentheses)を省略できます。たとえばカスタマイズ型として単にstringと記述すると、それは(string)と等価です。

すべてのカスタマイズ型はウィジェットとして実装されます。詳細は、Introduction in The Emacs Widget Libraryを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.1 Simple Types

このセクションでは、すべてのシンプルデータ型を説明します。これらのカスタマイズ型のうちのいくつかにたいして、カスタマイズウィジェットはC-M-iまたはM-TABによる、インライン補完を提供します。

sexp

値はプリントおよび読み込むことができる任意のLispオブジェクトです。より特化した型の使用するために時間をとりたくない場合は、任意のオプションへのフォールバックとしてsexpを使用することができます。

integer

値は整数でなければなりません。

number

値は数(浮動小数点数または整数)でなければなりません。

float

値は浮動小数点数でなければなりません。

string

値は文字列でなければなりません。カスタマイズバッファーはその文字列を区切り文字‘"’文字および‘\’クォートなしで表示します。

regexp

string文字と同様ですが、その文字列は有効な正規表現でなければなりません。

character

値は文字コードでなければなりません。文字コードは実際には整数ですが、この型は数字を表示せずに、バッファー内にその文字を挿入することにより値を表示します。

file

値はファイル名でなければなりません。ウィジェットは補完を提供します。

(file :must-match t)

値は既存のファイル名でなければなりません。ウィジェットは補完を提供します。

directory

値はディレクトリー名でなければなりません。ウィジェットは補完を提供します。

hook

値は関数のリストでなければなりません。このカスタマイズ型はフック変数にたいして使用されます。フック内での使用を推奨される関数のリストを指定するために、フック変数のdefcustom内で:optionsキーワードを使用できます。Defining Customization Variablesを参照してください。

symbol

値はシンボルでなければなりません。これはカスタマイズバッファー内でシンボル名として表示されます。ウィジェットは補完を提供します。

function

値はラムダ式か関数名でなければなりません。ウィジェットは関数名にたいする補完を提供します。

variable

値は変数名でなければなりません。ウィジェットは補完を提供します。

face

値はフェイス名のシンボルでなければなりません。ウィジェットは補完を提供します。

boolean

値は真偽値 — niltです。choiceconstを合わせて使用(次のセクションを参照)することにより、値がniltでなければならず、それぞれの値に固有の意味に適合する説明テキストを指定することもできます。

key-sequence

値はキーシーケンスです。カスタマイズバッファーは、kbd関数と同じ構文うぃ使用して、キーシーケンスを表示します。Key Sequencesを参照してください。

coding-system

値はコーディングシステム名でなければならず、M-TABで保管することができます。

color

値は有効なカラー名でなければなりません。ウィジェットはカラー名にたいする補完と、同様に*Colors*バッファーに表示されるカラーサンプルとカラー名のリストからカラー名を選択するボタンを提供します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.2 Composite Types

適切なシンプル型がないときは、複合型(composite types)を使うことができます。複合型は特定のデータによる他の型から、新しい型を構築します。指定された型またはデータは、その複合型の引数(argument)と呼ばれます。複合型は通常、以下のようなものです:

(constructor arguments…)

しかし、以下のように引数の前にkeyword-valueペアーを追加することもできます。

(constructor {keyword value}arguments…)

以下のテーブルに、はコンストラクター(constructor)と、複合型を記述するためにそれらを使用する方法を示します:

(cons car-type cdr-type)

値はコンスセルでなければならず、CARcar-typeCDRcdr-typeに適合していなければなりません。たとえば、(cons string symbol)は、("foo" . foo)のような値にマッチするデータ型です。

カスタマイズバッファーでは、CARCDRは、それぞれ特定のデータ型に応じて、別々に表示・編集されます。

(list element-types…)

値は、element-typesで与えられる要素と数が正確に一致するリストでなければならず、リストの各要素はそれぞれ対応するelement-typeに適合しなければなりません。

たとえば、(list integer string function)は、3つの要素のリストを示し、1つ目の要素は整数、2つ目の要素は文字列、3つ目の要素は関数です。

カスタマイズバッファーでは、各要素は、それぞれ特定のデータ型に応じて、別々に表示・編集されます。

(group element-types…)

これはlistと似ていますが、Customバッファー内でのテキストのフォーマットが異なります。listは各要素の値を、そのタグでラベルづけしますが、groupはそれを行いません。

(vector element-types…)

これはlistと似ていますが、リストではなくベクターでなければなりません。各要素はlistの場合と同様に機能します。

(alist :key-type key-type :value-type value-type)

値はコンスセルのリストでなければならず、各セルのCARはカスタマイズ型key-typeのキーを表し、同じセルのCDRはカスタマイズ型value-typeの値を表します。ユーザーはkey/valueペアーの追加や削除ができ、各ペアのキーと値の両方を編集することができます。

省略された場合、key-typevalue-typeのデフォルトは、sexpです。

ユーザーは指定されたkey-typeにマッチする任意のキーを追加できますが、:options(Defining Customization Variablesを参照してください)で指定することにより、あるキーを優先的に扱うことができます。指定されたキーは、(適切な値とともに)常にカスタマイズバッファーに表示されます。また、alistにkey/valueを含める、除外する、または無効にするかを指定するチェックボックスも一緒に表示されます。ユーザーは:optionsキーワード引数により指定された値は、変更できません。

:optionsキーワードにたいする引数は、alist内の適切なキーにたいする仕様のリストであるべきです。これらは通常、単純なアトムであり、それらは自身をを意味します。たとえば:

:options '("foo" "bar" "baz")

これは、名前が"foo""bar""baz"の、3つの“既知”のキーがあることを指定し、それらは常に最初に表示されます。

たとえば"bar"キーに対応する値を整数だけにするというように、特定のキーに対して値の型を制限したいときがあるかもしれません。これはリスト内でアトムのかわりにリストを使用することにより、指定することができます。前述のように、1つ目の要素はそのキーを指定し、2つ目の要素は値の型を指定します。たとえば:

:options '("foo" ("bar" integer) "baz")

最後に、キーが表示される方法を変更したいときもあるかもしれません。デフォルトでは、:optionsキーワードで指定された特別なキーはユーザーが変更できないので、キーは単にconstとして表示されます。しかし、たとえばそれが関数バインディングをもつシンボルだと知っている場合はfunction-itemといったように、あるキーの表示のために、より特化した型を使用したいと思うかもしれません。これは、キーに対してシンボルを使うかわりに、カスタマイズ型指定を使用することにより、行うことができます。

:options '("foo"
           ((function-item some-function) integer)
           "baz")

多くのalistは、コンスセルのかわりに2要素のリストを使用します。たとえば、

(defcustom cons-alist
  '(("foo" . 1) ("bar" . 2) ("baz" . 3))
  "Each element is a cons-cell (KEY . VALUE).")

のかわりに以下を使用します

(defcustom list-alist
  '(("foo" 1) ("bar" 2) ("baz" 3))
  "Each element is a list of the form (KEY VALUE).")

リストはコンスセルの最上位に実装されているため、上記のlist-alistを、コンスセルのalist(value-typeが実際の値を含む1要素のリストであるような)として扱うことができます。

(defcustom list-alist '(("foo" 1) ("bar" 2) ("baz" 3))
  "Each element is a list of the form (KEY VALUE)."
  :type '(alist :value-type (group integer)))

listのかわりにgroupを使用するのは、その目的に適したフォーマットのためだけです。

同様に、以下のようなトリックの類を用いることにより、より多くの値が各キー連づけられたalistを得ることができます:

(defcustom person-data '(("brian"  50 t)
                         ("dorith" 55 nil)
                         ("ken"    52 t))
  "Alist of basic info about people.
Each element has the form (NAME AGE MALE-FLAG)."
  :type '(alist :value-type (group integer boolean)))
(plist :key-type key-type :value-type value-type)

このカスタマイズ型はalist(上位参照)と似ていますが、(1)情報がプロパティーリスト(Property Listsを参照してください)に格納され、(2)key-typeが省略された場合、デフォルトはsexpではなく、symbolになります。

(choice alternative-types…)

値はalternative-typesのうちの1つに適合しなければなりません。たとえば、(choice integer string)では整数か文字列が許されます。

カスタマイズバッファーでは、ユーザーはメニューを使用して候補を選択して、それらの候補にたいして通常の方法で値を編集できます。

通常この選択からメニューの文字列が自動的に決定されます。しかし候補の中に:tagキーワードを含めることにより、メニューにたいして異なる文字列を指定できます。たとえば、空白の数を意味する整数と、その通りに使用したいテキストにたいする文字列の場合は、以下のような方法でカスタマイズ型を記述したいかもしれません

(choice (integer :tag "Number of spaces")
        (string :tag "Literal text"))

この場合メニューは、‘Number of spaces’と‘Literal text’を提示します。

const以外のnilが有効な値ではない候補には、:valueキーワードを使用して、有効なデフォルト値を指定するべきです。Type Keywordsを参照してください。

複数の候補によりいくつかの値が提供される場合、カスタマイズは適合する値をもつ最初の候補を選択します。これは常に、もっとも特有な型を最初に、もっとも一般的な型を最後にリストすべきことを意味します。以下は適切な使い方の例です:

(choice (const :tag "Off" nil)
        symbol (sexp :tag "Other"))

この使い方では、特別な値nilはその他のシンボルとは別に扱われ、シンボルは他のLisp式とは別に扱われます。

(radio element-types…)

これはchoiceと似ていますが、選択はメニューではなく、‘ラジオボタン’で表示されます。これは該当する選択にたいしてドキュメントが表示できる利点があるので、関数定数(function-itemカスタマイズ型)の選択に適す場合があります。

(const value)

値はvalueでなければならず、他は許されません。

constは主にchoiceの中で使用されます。たとえば、(choice integer (const nil))では、整数かnilが選択できます。

choiceの中では、:tagとともにconstが使用される場合があります。たとえば、

(choice (const :tag "Yes" t)
        (const :tag "No" nil)
        (const :tag "Ask" foo))

これはtがyes、nilがno、fooが“ask”を意味することを示します。

(other value)

この候補は任意のLisp値にマッチできますが、ユーザーがこの候補を選択した場合は、値valueが選択されます。

otherは主にchoiceの最後の要素に使用されます。たとえば、

(choice (const :tag "Yes" t)
        (const :tag "No" nil)
        (other :tag "Ask" foo))

これはtがyes、nilがno、それ以外は“ask”を意味することを示します。ユーザーが候補メニューから‘Ask’を選択した場合は、値fooが指定されます。しかし、その他の値(tnilfooを除く)では、fooと同様に‘Ask’が表示されます。

(function-item function)

constと同様ですが、値が関数のときに使用されます。これはドキュメント文字列も関数名と同じように表示します。ドキュメント文字列は、:docで指定した文字列か、function自身のドキュメント文字列です。

(variable-item variable)

constと同様ですが、値が変数名のときに使用されます。これはドキュメント文字列も変数名と同じように表示します。ドキュメント文字列は、:docで指定した文字列か、variable自身のドキュメント文字列です。

(set types…)

値はリストでなければならず、指定されたtypesの1つにマッチしなければなりません。

これはカスタマイズバッファーではチェックリストとして表示されるので、typesはそれぞれ対応する要素を1つ、あるいは要素をもちません。同じ1つのtypesにマッチするような、異なる2つの要素を指定することはできません。たとえば、(set integer symbol)は、リスト内で1つの整数、および/または1つのシンボルが許され、複数の整数や複数のシンボルは許されません。結果として、set内でintegerのような特定的ではない型を使用するのは稀です。

以下のように、const型はset内のtypesでよく使用されます:

(set (const :bold) (const :italic))

alist内で利用できる要素を示すために使用されることもあります:

(set (cons :tag "Height" (const height) integer)
     (cons :tag "Width" (const width) integer))

これによりユーザーにオプションでheightとwidthの値を指定させることができます。

(repeat element-type)

値はリストでなければならず、リストの各要素は型element-typeに適合しなければなりません。カスタマイズバッファーでは要素のリストとして表示され、‘[INS]’および‘[DEL]’ボタンにより、要素の追加や削除が行われます。

(restricted-sexp :match-alternatives criteria)

これはもっとも汎用的な複合型の構築方法です。値はcriteriaを満足する任意のLispオブジェクトです。criteriaはリストで、リストの各要素は以下のうちの1つを満たす必要があります:

たとえば、

(restricted-sexp :match-alternatives
                 (integerp 't 'nil))

これは整数、tnilを正当な値として受け入れます。

カスタマイズバッファーは適切な値をそれらの入力構文ですべて表示し、ユーザーはこれらをテキストとして編集できます。

以下は複合型でキーワード/値ペアーとして使用できるキーワードのテーブルです:

:tag tag

tagは、ユーザーとのコミュニケーションのために、その候補の名前として使用される。choice内に出現する型にたいして有用。

:match-alternatives criteria

criteriaは可能な値とのマッチに使用されます。restricted-sexp内でのみ有用です。

:args argument-list

型構築の引数としてargument-listの要素を使用します。たとえば、(const :args (foo))(const foo)と等価です。明示的に:argsとく記述する必要があるのは稀です。なぜなら、最後のキーワード/値ペアーの後に続くものは何であれ、引数として認識されるからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.3 Splicing into Lists

:inline機能により、可変個の要素を、カスタマイズ型のlistvectorの途中にスプライス(splice: 継ぎ足す)することができます。listvector記述を含む型にたいして:inline tを追加することによりこれを使用します。

通常listvector型の仕様は、単一の要素型を表します。しかしエントリーが:inline tを含む場合、マッチする値は、その含まれたシーケンスに直接マージされます。たとえば、エントリーが3要素のリストにマッチする場合、全体が3要素のシーケンスになります。これはバッククォート構文(Backquoteを参照)の‘,@’に類似しています。

たとえば、最初の要素がbazで、残りの引数は0個以上のfoobarでなければならないリストを指定する場合は、以下のカスタマイズ型を使用します:

(list (const baz) (set :inline t (const foo) (const bar)))

これは (baz)(baz foo)(baz bar)(baz foo bar)のような値にマッチします。

要素の型がchoiceの場合は、choice自身の中で:inlineを使用せずに、choiceの候補(の一部)の中で使用します。たとえば、最初がファイル名で開始され、その後にシンボルtか2つの文字列を続けなければならないリストにマッチさせるには、以下のカスタマイズ型を使用します:

(list file
      (choice (const t)
              (list :inline t string string)))

選択においてユーザーが選択肢の1つ目を選んだ場合、リスト全体が2つの要素をもち、2つ目の要素はtになります。ユーザーが2つ目の候補を選んだ場合、リスト全体が3つの要素をもち、2つ目と3つ目の要素は文字列でなければなりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.4 Type Keywords

カスタマイズ型内の型名シンボルの後にキーワード/引数ペアーを指定できます。以下は使用できるキーワードと、それらの意味です:

:value default

デフォルト値を提供する。

その候補にたいしてnilが有効な値でない場合は、:valueに有効なデフォルトを指定することが必須になります。

choiceの内部の候補として出現する型にたいしてこれを使用する場合、ユーザーがカスタマイズバッファー内のメニューによりこの候補を選択したときに、使用するデフォルト値を最初に指定します。

もちろんオプションの実際の値がこの候補に適合する場合は、defaultではなく実際の値が表示されます。

:format format-string

この文字列は、その型に対応する値を説明するために、バッファーに挿入されます。format-string内では、以下の‘%’エスケープが利用できます:

%[button%]

ボタンとしてマークされたテキストbuttonを表示する。:action属性は、ユーザーがそれを呼び出したときに、そのボタンが何を行うか指定する。この属性の値は2つの引数 — ボタンが表示されるのでウィジェットとイベント — をとる関数。

異なるアクションを行う2つの異なるボタンを指定する方法はない。

%{sample%}

:sample-faceにより指定された、スペシャルフェイス内のsampleを表示する。

%v

そのアイテムの値を代替えする。その値がどのように表示されるかはアイテムの種類と、(カスタマイズ型にたいしては)カスタマイズ型にに依存する。

%d

そのアイテムのドキュメント文字列を代替えする。

%h

%d’と同様ふぁが、ドキュメント文字列が複数行の場合に、ドキュメント文字列全体か最初の行だけかを制御するボタンを追加する。

%t

その位置でタグに置き換える。:tagキーワードでタグを指定する。

%%

リテラル‘%’を表示する。

:action action

ユーザーがボタンをクリックした場合はactionを実行します。

:button-face face

%[…%]’で表示されたボタンテキストにたいして、フェイスface(フェイス名、またはフェイス名のリスト)を使用します。

:button-prefix prefix
:button-suffix suffix

これらはボタンの前、または後に表示されるテキストを指定します。以下が指定できます:

nil

テキストは挿入されない。

文字列

その文字列がリテラルに挿入される。

シンボル

そのシンボルの値が使用される。

:tag tag

この型に対応する値(または値の一部)にたいするタグとしてtag(文字列)を使用する。

:doc doc

この型に対応する値(または値の一部)にたいするドキュメント文字列としてdocを使用する。これが機能するためには、:formatにたいする値を指定し、その値にたいして‘%d’か‘%h’を使用しなければならない。

ある型にたいしてドキュメント文字列を指定するのは、:choice内の候補の型や、他の複合型の一部について情報を提供するのが通常の理由である。

:help-echo motion-doc

widget-forwardwidget-backwardでこのアイテムに移動したときに、エコーエリアに文字列motion-docを表示する。さらに、マウスのhelp-echo文字列としてmotion-docが使用され、これは実際にはヘルプ文字列を生成するために評価される関数またはフォームかもしれない。もし関数の場合、これは1つの引数(そのウィジェット)で呼び出される。

:match function

値がその型にマッチするか判断する方法を指定する。対応する値functionは、2つの引数(ウィジェットと値)をとる関数で、値が適切なら非nilをリターンすること。

:validate function

入力にたいして検証を行う関数を指定する。functionは引数としてウィジェットをとり、そのウィジェットのカレント値がウィジェットにたいして有効ならnilをリターンすること。それ以外は無効なデータを含むウィジェットをリターンして、そのウィジェットの:errorプロパティに、そのエラーを説明する文字列をセットすること。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.4.5 Defining New Types

前のセクションでは、defcustomにたいして型の詳細な仕様を作成する方法を説明しました。そのような型仕様に名前を与えたい場合があるかもしれません。理解しやすいケースとしては、多くのユーザーオプションに同じ型を使用する場合などです。各オプションにたいして仕様を繰り返すより、その型に名前を与えて、defcustomそれぞれにその名前を使用することができます。他にもユーザーオプションの値が再帰的なデータ構造のケースがあります。あるデータ型がそれ自身を参照できるようにするためには、それが名前をもつ必要があります。

カスタマイズ型はウィジェットとして実装されているめ、新しいカスタマイズ型を定義するには、新たにウィジェット型を定義します。ここではウィジェットインターフェイスの詳細は説明しません。Introduction in The Emacs Widget Libraryを参照してください。 かわりに、シンプルな例を用いて、カスタマイズ型を新たに定義するのに必要となる、最小限の機能について説明します。

(define-widget 'binary-tree-of-string 'lazy
  "A binary tree made of cons-cells and strings."
  :offset 4
  :tag "Node"
  :type '(choice (string :tag "Leaf" :value "")
                 (cons :tag "Interior"
                       :value ("" . "")
                       binary-tree-of-string
                       binary-tree-of-string)))

(defcustom foo-bar ""
  "Sample variable holding a binary tree of strings."
  :type 'binary-tree-of-string)

新しいウィジェットを定義するための関数は、define-widgetと呼ばれます。1つ目の引数は、新たなウィジェット型にしたいシンボルです。2つ目の引数は既存のウィジェットを表すシンボルで、新しいウィジェットではこの既存のウィジェットと異なる部分を定義することになります。新たなカスタマイズ型を定義する目的にたいしては、lazyウィジェットが最適です。なぜならこれは、defcustomにたいするキーワード引数と同じ構文、同じ名前でキーワード引数:typeを受け取るからです。3つ目の引数は、新しいウィジェットにたいするドキュメント文字列です。この文字列は、M-x widget-browse RET binary-tree-of-string RETコマンドで参照することができるようになります。

これらの必須の引数の後にキーワード引数が続きます。もっとも重要なのは:typeで、これはこのウィジェットにマッチさせたいデータ型を表します。上記の例ではbinary-tree-of-stringは文字列、またはcarとcdrがbinary-tree-of-stringであるようなコンスセルです。この定義中でのウィジェット型への参照に注意してください。:tag属性はユーザーインターフェイスでウィジェット名となる文字列、:offset引数はカスタマイズバッファーでのツリー構造の外観で,子ノードと関連する親ノードの間に4つのスペースを確保します。

defcustomは、通常のカスタマイズ型に使用される方法で新しいウィジェットを表示します。

lazyという名前の由来は、他のウィジェットの場合、それらがバッファーでインスタンス化されるとき、他の合成されたウィジェットが下位のウィジェットを内部形式に変換するからです。この変換は再帰的なので、下位のウィジェットは、それら自身の下位ウィジェットへと変換されます。データ構造自体が再帰的な場合、この変換は無限再帰(infinite recursion)となります。lazyウィジェットは、:type引数を必要なときだけ変換することにより、この再帰を防ぎます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.5 Applying Customizations

以下の関数には、変数とフェイスにたいして、そのユーザーのカスタマイズ設定をインストールる役目があります。それらの関数は、ユーザーがカスタマイズインターフェイスで‘Save for future sessions’を呼び出したときに、次回のEmacs起動時に評価されるようにcustom-set-variablesフォーム、および/またはcustom-set-facesフォームを がカスタムファイルに書き込まれることによって効果をもちます。

Function: custom-set-variables &rest args

この関数はargsにより指定された変数のカスタマイズをインストールします。args内の引数はそれぞれ、以下のようなフォームです

(var expression [now [request [comment]]])

varは変数名(シンボル)、expressionはカスタマイズされた値に評価される式です。

このcustom-set-variables呼び出しより前にvarにたいしてdefcustomフォームが評価された場合は、即座にexpressionが評価され、その変数の値にその結果がセットされます。それ以外は、その変数のsaved-valueプロパティにexpressionが格納され、これに関係するdefcustomが呼び出されたとき(通常はその変数を定義するライブラリーがEmacsにロードされたとき)に評価されます。

nowrequestcommentエントリーは内部的な使用に限られており、省略されるかもしれません。nowは、もし非nilの場合には、たとえその変数のdefcustomフォームが評価されていなくても、その変数の値がそのときセットされます。requestは即座にロードされる機能のリストです(Featuresを参照)。commentはそのカスタマイズを説明する文字列です。

Function: custom-set-faces &rest args

この関数はargsにより指定されたフェイスのカスタマイズをインストールします。args内の引数はそれぞれ、以下のようなフォームです

(face spec [now [comment]])

faceはフェイス名(シンボル)、specはそのフェイスにたいするカスタマイズされたフェイス仕様です(Defining Facesを参照)。

nowrequestcommentエントリーは内部的な使用に限られており、省略されるかもしれません。nowは、もし非nilの場合には、たとえdeffaceフォームが評価されていなくても、そのフェイス仕様がそのときセットされます。commentはそのカスタマイズを説明する文字列です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

14.6 Custom Themes

カスタムテーマ(Custom themes)とはユニットとして有効または無効にできるセッティングのコレクションです。Custom Themes in The GNU Emacs Manualを参照してくださいカスタムテーマはそれぞれEmacs Lispソースファイルにより定義され、それらはこのセクションで説明する慣習にしたがう必要があります。(カスタムファイルを手で記述するかわりに、カスタマイズ風のインターフェイスを使用して作成することもできます。Creating Custom Themes in The GNU Emacs Manualを参照してください。)

カスタムファイルはfoo-theme.elのように命名すべきです。ここでfooはテーマの名前です。このファイルでの最初のLispフォームはdefthemeの呼び出しで、最後のフォームはprovide-themeにすべきです。

Macro: deftheme theme &optional doc

このマクロはカスタムテーマの名前としてtheme(シンボル)を宣言します。オプション引数docは、そのテーマを説明する文字列であるべきです。この文字列はユーザーがdescribe-themeコマンドを呼び出したり、‘*Custom Themes*’バッファーで?をタイプしたときに表示されます。

2つの特別なテーマ名は禁止されています(それらを使用するとエラーになります)。userは、そのユーザーの直接的なカスタマイズ設定を格納するための“ダミー”のテーマです。そしchangedはカスタムシステムの外で行われた変更を格納するための“ダミー”のテーマです。

Macro: provide-theme theme

このマクロは完全に仕様が定められたテーマ名themeを宣言します。

defthemeprovide-themeの違いは、そのテーマセッティングを規定するLispフォーム(通常はcustom-theme-set-variablesの呼び出し、および/またはcustom-theme-set-facesの呼び出し)です。

Function: custom-theme-set-variables theme &rest args

この関数は、カスタムテーマthemeの変数のセッティングを規定します。themeはシンボルです。args内の各引数はフォームのリストです。

(var expression [now [request [comment]]])

ここでリストエントリーはcustom-set-variablesのときと同じ意味をもちます。Applying Customizationsを参照してください。

Function: custom-theme-set-faces theme &rest args

この関数は、カスタムテーマthemeのフェイスのセッティングを規定します。themeはシンボルです。args内の各引数はフォームのリストです。

(face spec [now [comment]])

ここでリストエントリーはcustom-set-facesのときと同じ意味をもちます。Applying Customizationsを参照してください。

原則的に、テーマファイルは他のLispフォームを含むこともでき、それらはそのテーマがロードされるときに評価されるでしょうが、これは“悪いフォーム”です。悪意のあるコードを含むテーマのロードを防ぐために、最初に非ビルトインテーマをロードする前に、Emacsはソースファイルを表示して、ユーザーにたいして確認を求めます。

以下の関数は、テーマをプログラム的に有効または無効にするのに有用です:

Function: custom-theme-p theme

この関数はtheme(シンボル)がカスタムテーマの名前の場合(たとえば、そのテーマが有効かどうかにかかわらず、カスタムテーマがEmacsにロードされていれば)、非nilをリターンします。それ以外はnilをリターンします。

Variable: custom-known-themes

この変数の値は、Emacsにロードされたテーマのリストです。テーマはそれぞれ、Lispシンボル(テーマ名)により表されます。この変数のデフォルト値は、2つの“ダミーテーマ”を含みます: (user changed)changedテーマには、カスタムテーマが適用される前に行われたセッティング(たとえばカスタムの外部での変数のセット)が格納されています。userテーマには、そのユーザーがカスタマイズして保存したセッティングが格納されています。defthemeマクロで宣言された任意の追加テーマは、このリストの先頭に追加されます。

Command: load-theme theme &optional no-confirm no-enable

この関数はthemeという名前のカスタムテーマを、変数custom-theme-load-pathで指定されたディレクトリーを探して、ソースファイルからロードします。Custom Themes in The GNU Emacs Manualを参照してください。また、そのテーマの変数とフェイスのセッティングが効果を及ぼすようにテーマをenablesにします(オプション引数no-enableが非nilでない場合)さらに、オプション引数no-confirmが非nilでない場合は、そのテーマをロードする前にユーザーに確認を求めます。

Command: enable-theme theme

この関数はthemeという名前のカスタムテーマを有効にします。そのようなテーマがロードされていない場合は、エラーをシグナルします。

Command: disable-theme theme

この関数はthemeという名前のカスタムテーマを無効にします。テーマはロードされたまま残りので、続けてenable-themeを呼び出せばテーマは再び有効になります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15 Loading

Lispコードのファイルをロードすることは、その内容をLispオブジェクト形式でLisp環境に取り込むことを意味します。Emacsはファイルを探してオープンし、テキストを読み込んで各フォームを評価してから、そのファイルをクローズします。そのようなファイルはLispライブラリー(Lisp library)とも呼ばれます。

eval-buffer関数がバッファー内のすべての式を評価するのと同様に、load関数はファイル内のすべての式を評価します。異なるのはEmacsバッファー内のテキストではなく、load関数はディスク上で見つかったファイル内のテキストを読み込み、評価することです。

ロードされたファイルは、ソースコードかバイトコンパイルされたコードとしてLisp式を含んでいなければなりません。このファイル内の各フォームは、トップレベルフォーム(top-level form)と呼ばれます。ロード可能なファイル内のフォームにたいする特別なフォーマットはありません。ファイル内のフォームはどれも、同じように直接バッファーにタイプされ、そこで評価されるでしょう(実際、ほとんどのコードはこの方法でテストされます)。多くの場合、そのフォームは関数定義と変数定義です。

外部ライブラリーのオンデマンドローディングについては、Dynamically Loaded Librariesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.1 How Programs Do Loading

Emacs Lispにはロードのためのインターフェイスがいくつかあります。たとえば、autoloadはファイル内で定義された関数にたいしてプレースホルダーとなるオブジェクトを作成します。この関数はオートロードされる関数を呼び出すために、ファイルからその関数の実際の定義の取得を試みます(Autoloadを参照)。requireは、ファイルがまだロードされていない場合にファイルをロードします(Featuresを参照)。これらすべての関数は、処理を行うために最終的にloadを呼び出します。

Function: load filename &optional missing-ok nomessage nosuffix must-suffix

この関数はLispコードのファイルを見つけてオープンし、その中のすべてのフォームを評価して、そのファイルをクローズします。

ファイルを見つけるために、まずloadfilename.elcという名前、つまりfilenameに拡張子‘.elc’を足した名前のファイルを探します。このようなファイルが存在したら、それをロードします。その名前のファイルが存在しない場合、loadfilename.elという名前のファイルを探します。このファイルが存在したら、それをロードします。最後に、もしこれらの名前がどちらも見つからなかった場合、loadは何も付け足さないfilenameという名前のファイルを探して、それが存在したらロードします。(load関数にfilenameを認識する賢さはありません。foo.el.elのような正しくない名前のファイルの場合も、(load "foo.el")の評価によりそれを見つけてしまいます。)

Auto Compressionモードが有効(残念ながらデフォルトでは有効ですが)の場合、loadは他のファイル名を試みる前に圧縮されたバージョンのファイル名を探すので、ファイルを見つけることができません。圧縮されたファイルが存在したら、それを解凍してロードします。loadはファイル名にjka-compr-load-suffixes内の各サフィックスを足して、圧縮されたバージョンを探します。この変数の値は、文字列のリストでなければなりません。標準的な値は(".gz")です。

オプション引数nosuffixが非nilの場合loadはサフィックス‘.elc’と‘.el’を試みません。この場合、ロードしたいファイルの正確な名前を指定しなければなりません。ただしAuto Compressionモードが有効な場合には、loadは圧縮されたバージョンを探すために、jka-compr-load-suffixesを使用します。正確なファイル名の指定と、、nosuffixにたいしてtを使用することにより、foo.el.elのような名前のファイルにたいするロードの試みを抑止できます。

オプション引数must-suffixが非nilの場合、loadはロードに使用されるファイルの名前に明示的にディレクトリー名が含まれていなければ、ファイル名が‘.el’か‘.elc’で終わること(あるいは圧縮による拡張子が付加されているかもしれません)を要求します。

オプションload-prefer-newerが非nilの場合、loadはサフィックスを検索するとき、どのファイルであっても(‘.elc’、‘.el’など)、もっとも最近変更されたファイルのバージョンを選択します。

filenamefoobaz/foo.barのような相対ファイル名の場合、loadは変数load-pathを使用してそのファイルを探します。これはload-path内にリストされた各ディレクトリーにfilenameを追加して、最初に見つかったら名前のマッチするファイルをロードします。デフォルトディレクトリーを意味するnilload-pathで措定されたときだけ、カレントデフォルトディレクトリーを試みます。loadload-path内の最初のディレクトリーで利用可能な3つのサフィックスすべてを試行してから、2つ目のディレクトリーで3つのサフィックスすべてを試行する、というようにファイルを探します。Library Searchを参照してください。

最終的に見つかったファイル、およびEmacsがそのファイルを見つけたディレクトリーが何であれ、Emacsはそのファイル名を変数load-file-nameの値にセットします。

foo.elcfoo.elより古いと警告された場合、それはfoo.elのリコンパイルを考慮すべきことを意味します。Byte Compilationを参照してください

(コンパイルされていない)ソースファイルをロードしたとき、Emacsがファイルをvisitしたときと同じようにloadは文字セットの変換を行います。Coding Systemsを参照してください。

コンパイルされていないファイルをロードするとき、Emacsはそのファイルに含まれる任意のマクロ(Macrosを参照)を展開します。わたしたちはこれをeagerマクロ展開(eager macro expansion)と呼んでいます。(関連するコードを実行するまで展開を延期するのではなく)これを行うことにより、コンパイルされていないコード実行のスピードが明らかに向上します。このマクロ展開は、循環参照により行うことができないときもあります。これの一番簡単な例は、ロードしようとしているファイルが他のファイルで定義されているマクロを参照しているが、そのファイルはロードしようとしているファイルを必要としている場合です。これは一般的には無害です。Emacsは問題の詳細を与えるために警告(‘Eager macro-expansion skipped due to cycle…’)をプリントしますが、単にその時点ではマクロを展開せずに、そのファイルはロードされます。あなたはこの問題が発生しないように、コードをリストラクチャーしたいと思うかもしれません。コンパイル済みファイルでは、マクロ展開はコンパイル時に行われるので、ロード時のマクロ展開は行われません。Macros and Byte Compilationを参照してください。

nomessageが非nilでない場合は、ロードの間、エコーエリアに‘Loading foo...’や‘Loading foo...done’のようなメッセージが表示されます。

ファイルをロードする間のハンドルされないエラーは、ロードを終了させます。autoloadのためのロードの場合、ロードの間に定義された任意の関数定義は元に戻されます。

loadがロードするファイルを見つけられなかった場合、通常は(‘Cannot open load file filename’のメッセージとともに)エラーfile-errorがシグナルされます。しかしmissing-okが非nilの場合、loadは単にnilをリターンします。

式の読み取りにたいしてloadreadのかわりに使用する関数を指定するために、変数load-read-functionを使用できます。以下を参照してください。

ファイルが正常にロードされた場合、loadtをリターンします。

Command: load-file filename

このコマンドは、ファイルfilenameをロードします。filenameが相対ファイル名の場合は、カレントデフォルトディレクトリーとみなされます。このコマンドは、load-pathを使用せず、サフィックスの追加もしません。しかし、(Auto Compressionモードが有効な場合は)圧縮されたバージョンの検索を行います。ロードするファイル名を正確に指定したい場合は、このコマンドを使用してください。

Command: load-library library

このコマンドはlibraryという名前のライブラリーをロードします。このコマンドは、引数を読み取る方法がインタラクティブであることを除き、loadと同じです。Lisp Libraries in The GNU Emacs Manualを参照してください。

Variable: load-in-progress

この変数は、Emacsがファイルをロード中のときは非nil、それ以外はnilです。

Variable: load-file-name

このセクションの最初に説明した検索でEmacsがファイルを見つけて、そのファイルをロード中のとき、この変数の値はそのファイルの名前です。

Variable: load-read-function

この変数は、loadeval-regionが式の読み取るために、readのかわりに使用する関数を指定します。指定する関数はreadと同様、引数が1つの関数です。

通常、この変数の値はnilで、これはそれらの関数がreadを使用すべきことを意味します。

この変数を使用するかわりに、別の新たな方法を使用するほうが明確です。eval-regionread-function引数に、その関数を渡す方法です。Evalを参照してください。

Emacsのビルドでloadがどのように使用されているかについての情報は、Building Emacsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.2 Load Suffixes

ここでは、loadが試行するサフィックスについて、技術的な詳細を説明します。

Variable: load-suffixes

これは(ソースまたはコンパイル済みの)Emacs Lispファイルを示すサフィックスのリストです。空の文字列が含まれるべきではありません。loadは、指定されたファイル名にLispファイルのサフィックスを追加するときに、これらのサフィックスを使用します。標準的な値は(".elc" ".el")で、これは前のセクションで説明した振る舞いとなります。

Variable: load-file-rep-suffixes

これは同じファイルにたいする異なる表現を示すサフィックスのリストです。このリストは空の文字列から開始されるべきです。loadはファイルを検索するときは、他のファイルを検索する前にこのリストのサフィックスを順番にファイル名に追加します。

Auto Compressionモードを有効にすることによりjka-compr-load-suffixesのサフィックスがこのリストに追加され、無効にすると再びリストから取り除かれます。load-file-rep-suffixesの標準的な値は、Auto Compressionモードが無効な場合は("")です。jka-compr-load-suffixesの標準的な値が(".gz")であることを考慮すると、Auto Compressionモードが有効な場合のload-file-rep-suffixesの標準的な値は("" ".gz")です。

Function: get-load-suffixes

この関数は、must-suffix引数が非nilのときは、loadが試みるべきすべてのサフィックスを順番にしたがったリストでリターンします。この関数はload-suffixesload-file-rep-suffixesの両方を考慮に入れます。load-suffixesjka-compr-load-suffixesload-file-rep-suffixesがすべて標準的な値の場合、この関数はAuto Compressionモードが有効なら(".elc" ".elc.gz" ".el" ".el.gz")、無効なら(".elc" ".el")をリターンします。

まとめると、loadは通常まず(get-load-suffixes)の値のサフィックスを試み、つぎにload-file-rep-suffixesを試みます。nosuffixが非nilの場合は前者がスキップされ、must-suffixが非nilの場合は後者がスキップされます。

User Option: load-prefer-newer

このオプションが非nilの場合は、ファイルが見つかった最初のサフィックスで停止せずに、loadはすべてのサフィックスをテストして、一番新しいファイルを使用します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.3 Library Search

EmacsがLispライブラリーをロードするときは、変数load-path.<により指定されるディレクトリー内のライブラリーを検索します。

Variable: load-path

この変数の値は、loadでファイルをロードするとき検索するディレクトリーのリストです。リストの各要素は文字列(ディレクトリー名でなければなりません)、またはnil(カレントワーキングディレクトリーを意味します)です。

Emacsは起動時にいくつかのステップによりload-pathの値をセットアップします。最初に、Emacsがコンパイルされたときのデフォルトロケーションセット(default locations set)を使用して、load-pathを初期化します。通常これは以下のようなディレクトリーです

"/usr/local/share/emacs/version/lisp"

(以下の例では、あなたがインストールしたEmacsのインストールプレフィクスに合うように/usr/localを置き換えてください。)これらのディレクトリーには、Emacsとともにインストールされた、標準的なLispファイルが含まれます。Emacsがこれらを見つけられない場合は、正常に起動しないでしょう。

Emacsをビルドしたディレクトリーから起動した場合 −−− つまり正式にインストールされた実行形式ではないEmacsを起動した場合 — 、Emacsはビルドされたディレクトリーのソースのlispディレクトリーを使用してload-pathを初期化します。ソースとは別のディレクトリーでEmacsをビルドした場合は、ビルドしたディレクトリーのlispディレクトリーも追加します。(どちらの場合も、要素は絶対ファイル名になります。)

--no-site-lispオプションでEmacsを起動した場合を除き、load-pathの先頭に2つのさらにsite-lispを追加します。これらはローカルにインストールされたLispファイで、通常は:

"/usr/local/share/emacs/version/site-lisp"

"/usr/local/share/emacs/site-lisp"

の形式です。1つ目は特定のバージョンのEmacsにたいしてローカルにインストールされたものです。2つ目はインストールされたすべてのバージョンのEmacsが使用することを意図してローカルにインストールされたものです。(インストールされたものでないEmacsが実行された場合は、もし存在すればソースディレクトリーとビルドディレクトリーのsite-lispディレクトリーも追加します。これらのディレクトリーは通常、site-lispディレクトリーを含みません。)

環境変数EMACSLOADPATHがセットされている場合は、上述の初期化プロセスが変更されます。Emacsは、この環境変数の値にもとづいてload-pathを初期化します。

EMACSLOADPATHの構文は、PATHで使用される構文と同様です。ディレクトリー名は‘:’(オペレーティングシステムによっては‘;’)で区切られます。 以下は、(shスタイルのシェルから)EMACSLOADPATH変数をセットする例です:

export EMACSLOADPATH=/home/foo/.emacs.d/lisp:

環境変数の値内の空の要素は、(上記例のような)末尾、先頭、中間にあるかに関わらず、標準の初期化処理により決定されるload-pathのデフォルト値に置き換えられます。そのような空要素が存在しない場合には、EMACSLOADPATHによりload-path全体が指定されます。空要素、または標準のLispファイルを含むディレクトリーへの明示的なパスのどちらかを含めなければなりません。さもないとEmacsが関数を見つけられなくなります。(load-pathを変更する他の方法は、Emacs起動時にコマンドラインオプション-Lを使用する方法です。以下参照。)

load-path内の各ディレクトリーにたいし、Emacsはそのディレクトリーがファイルsubdirs.elを含むか確認し、もしあればそれをロードします。subdirs.elファイルは、load-pathのディレクトリーみたいして任意のサブディレクトリーを追加するためのコードが含まれており、Emacsがビルド/インストールされたとき作成されます。サブディレクトリーと複数階層下のレベルのサブディレクトリーの両方が、直接追加されます。ただし、名前の最初が英数字でないディレクトリー、名前がRCSまたはCVSのディレクトリー、名前が.nosearchというファイルを含むディレクトリーは除外されます。

Emacsは次に、コマンドラインオプション-L(Action Arguments in The GNU Emacs Manualを参照)で指定したロードディレクトリーを追加します。もしあれば、オプションパッケージ(Packaging Basicsを参照)がインストールされた場所も追加します。

initファイル(The Init Fileを参照)で、load-pathに1つ以上のディレクトリーを追加するコードを記述するのは一般的に行なわれています。たとえば:

(push "~/.emacs.d/lisp" load-path)

Emacsのダンプには、load-pathの特別な値を使用します。ダンプされたEmacsをカスタマイズするためにsite-load.elまたはsite-init.elを使用する場合、これらのファイルが行ったload-pathにたいする変更はすべて、ダンプ後失われます。

Command: locate-library library &optional nosuffix path interactive-call

このコマンドは、ライブラリーlibraryの正確なファイル名を探します。loadと同じ方法でライブラリーを検索し、引数nosuffixloadの場合と同じ意味です。libraryに指定する名前には、サフィックス‘.elc’または‘.el’を追加しないでください。

pathが非nilの場合は、load-pathのかわりにディレクトリーのリストが使用されます。

locate-libraryがプログラムから呼び出されたときは、ファイル名を文字列としてリターンします。ユーザーがインタラクティブにlocate-libraryを実行したときは、引数interactive-calltとなり、これはlocate-libraryにたいしてファイル名をエコーエリアに表示するよう指示します。

Command: list-load-path-shadows &optional stringp

このコマンドは、シャドー(shadowed)されたEmacs Lispファイルを表示します。シャドーされたファイルとは、load-pathのディレクトリーに存在するにも関わらず、load-pathのディレクトリーリスト内で前の位置にある他のディレクトリーに同じ名前のファイルが存在するため、通常はロードされないファイルのことです。

たとえば、以下のようにload-pathがセットされていたとします

  ("/opt/emacs/site-lisp" "/usr/share/emacs/23.3/lisp")

そして、両方のディレクトリーにfoo.elという名前のファイルがあるとします。この場合、(require 'foo)は決して2つ目のディレクトリーのファイルをロードしません。このような状況は、Emacsがインストールされた方法に問題があることを示唆します。

Lispから呼び出された場合、この関数はバッファー内に表示するかわりに、シャドーされたファイルリストのメッセージをプリントします。オプション引数stringpが非nilの場合は、かわりにシャドーされたファイルを文字列としてリターンします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.4 Loading Non-ASCII Characters

Emacs Lispプログラムが非ASCII文字の文字列定数を含むとき、Emacsではそれらをユニバイト文字列またはマルチバイト文字列のどちらかで表現される場合があります。どちらの表現が使用されるかは、そのファイルがどのようにEmacsに読み込まれたかに依存します。マルチバイト表現へのデコーディングとともに読み込まれた場合、Lispプログラム内のテキストはマルチバイトのテキストとなり、ファイル内の文字列定数はマルチバイト文字列になります。(たとえば)Latin-1文字を含むファイルをデコーディングなしで読み込んだ場合、そのプログラムのテキストはユニバイトのテキストとなり、ファイル内の文字列定数はユニバイト文字列になります。Coding Systemsを参照してください。

マルチバイト文字列がユニバイトバッファーに挿入されるときは自動的にユニバイトに変換されるため、大部分のEmacs Lispプログラムにおいて、マルチバイト文字列が非ASCII文字列であるという事実を意識させないようにすべきです。しかしこれが行われことにより違いが生じる場合には、ローカル変数セクションに‘coding: raw-text’と記述することにより、特定のLispファイルを強制的にユニバイトとして解釈させることができます。この識別子により、そのファイルは無条件でユニバイトとして解釈されます。これは、?vliteralで記述された非ASCII文字にキーバインドするとき重要になります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.5 Autoload

オートロード(autoload: 自動ロード)の機能により、定義されているファイルをロードすることなく、関数やマクロの存在を登録できます。関数の最初の呼び出しで、実際の定義およびその他の関連するコードをインストールするために適切なライブラリーを自動的にロードし、すべてがすでにロードされていたかのように、実際の定義を実行します。関数やマクロのドキュメントを参照することによっても、オートロードが発生します(Documentation Basicsを参照)。

オートロードされた関数をセットアップするには、2つの方法があります。それはautoloadを呼び出す方法と、ソースの実際の定義の前に、特別な“マジック”コメントを記述する方法です。autoloadはオートロードのための低レベルのプリミティブです。任意のLispプログラムが、任意のときにautoloadを呼び出すことができます。Emacsととみにインストールされるパッケージにとって、マジックコメントは関数をオートロードできるようににするための一番便利な方法です。コメント自身は何も行いませんが、コマンドupdate-file-autoloadsにたいするガイドを努めます。このコマンドはautoloadの呼び出しを構築し、Emacsビルド時に実行されるようアレンジします。

Function: autoload function filename &optional docstring interactive type

この関数は、filenameから自動的にロードされるように、functionという名前の関数(またはマクロ)を定義します。文字列filenameのは、functionの実際の定義を取得するファイルを指定します。

filenameがディレクトリー名とサフィックス.el.elcのどちらも含まない場合、この関数はこれらの強制的にサフィックスを追加します。つまりサフィックスが追加されないただのfilenameという名前のファイルはロードされません。(変数load-suffixesにより要求される正確なサフィックスが指定されます。)

引数docstringは、その関数のドキュメント文字列です。autoloadの呼び出しでドキュメント文字列を指定することにより、その関数の実際の定義をロードせずにドキュメントを見ることが可能になります。この引数の値は通常、関数定義のドキュメント文字列と等しくあるべきです。もし等しくない場合は、その関数のドキュメント文字列がロード時に有効になります。

interactiveが非nilの場合、その関数はインタラクティブに呼び出すことが可能になります。これにより、functionの実際の定義をロードせずに、M-xによる補完が機能するようになります。。ここでは、完全なインタラクティブ指定は与えられません。完全な指定はユーザーが実際にfunctionを呼び出すまで必要ありません。実際にユーザーが呼び出したときに、実際の定義がロードされます。

普通の関数と同様、マクロおよびキーマップをオートロードできます。functionが実際にはマクロの場合はtypemacroを指定し、キーマップの場合にはtypekeymapを指定します。Emacsのさまざまな部分は、実際の定義をロードせずに、これらの情報を知る必要があるのです。

オートロードされたキーマップは、あるプレフィクスキーがシンボルfunctionにバインドされているときにキーを探す間に、自動的にロードされます。そのキーマップにたいする他の類のアクセスでは、オートロードは発生しません。特に、Lispプログラムが変数の値からそのキーマップを取得してdefine-keyを呼び出した場合には、たとえその変数の名前がシンボルfunctionと同じであっても、オートロードは起こりません。

functionが非voidのオートロードされたオブジェクトではない関数定義をもつ場合、その関数は何も行わずnilをリターンします。それ以外は、オートロードされたオブジェクト(Autoload Typeを参照)を作成して、それをfunctionにたいする関数定義として格納します。オートロードされたオブジェクトは、以下の形式をもちます:

(autoload filename docstring interactive type)

たとえば、

(symbol-function 'run-prolog)
     ⇒ (autoload "prolog" 169681 t nil)

このような場合、"prolog"はロードするファイルの名前、169681はemacs/etc/DOCファイル(Documentation Basicsを参照)内のドキュメント文字列への参照で、tはその関数がインタラクティブであり、nilはそれがマクロやキーマップでないことを意味します。

Function: autoloadp object

この関数は、objectがオートロードされたオブジェクトの場合、非nilをリターンします。たとえば、run-prologがオートロードされたオブジェクトかチェックするには、以下を評価します

(autoloadp (symbol-function 'run-prolog))

オートロードされたファイルは、通常は他の定義を含み、1つ以上の機能を必要あるいは提供するかもしれません。(内容の評価でのエラーにより)そのファイルが完全にロードされていない場合、そのロードの間に行われた関数定義やprovideの呼び出しはアンドゥされます。これは、このファイルからオートロードされる関数にたいして再度呼び出しを試みたときに、そのファイルを確実に再ロードさせるためです。このようにしないと、そのファイル内のいくつかの関数はアボートしたロードにより定義されていて、それらはロードされなかった修正後のファイルで提供される正しいサブルーチンを欠くため、正しく機能しないからです。

オートロードされたファイルが意図したLisp関数、またはマクロの定義に失敗した場合には、データ"Autoloading failed to define function function-name"とともにエラーがシグナルされます。

オートロードのマジックコメント(autoload cookieとも呼ばれる)は、オートロード可能なソースファイル内の実際の定義の直前にある、‘;;;###autoload’だけの行から構成されます。コマンドM-x update-file-autoloadsは、対応するautoload呼び出しをloaddefs.el内に書き込みます。(autoload cookieとなる文字列と、update-file-autoloadsにより生成されるファイルの名前は、上述のデフォルトから変更可能です。以下を参照。) Emacsのビルドではloaddefs.elをロードするためにautoloadを呼び出します。M-x update-directory-autoloadsは、より強力です。このコマンドはカレントディレクトリー内のすべてのファイルにたいするオートロードを更新します。

このマジックコメントは、任意の種類のフォームを、loaddefs.el内にコピーできます。このマジックコメントに続くフォームは、そのままコピーされます。しかしオートロード機能が特別に処理するフォームの場合は除外されます(たとえばautoload内への変換)。以下は、そのままコピーされないフォームです:

関数、または関数のようなオブジェクトにたいする定義:

defundefmacrocl-defuncl-defmacro(Argument Lists in Common Lisp Extensionsを参照)、およびdefine-overloadable-function (mode-local.el内のコメントを参照)も該当

メジャーモードおよびマイナーモードにたいする定義:

define-minor-modedefine-globalized-minor-modedefine-generic-modedefine-derived-modeeasy-mmode-define-minor-modeeasy-mmode-define-global-modedefine-compilation-modedefine-global-minor-mode

その他のタイプの定義:

defcustomdefgroupdefclass (EIEIO in EIEIOを参照)、およびdefine-skeleton (skeleton.el内のコメントを参照)。

ビルド時に、そのファイル自身をロードするときにフォームを実行しないように、マジックコメントを使用することもできます。これを行なうには、マジックコメントと同じ行にフォームを記述します。これはコメントなので、ソースファイルをロードするとき何も行いません。ただしM-x update-file-autoloadsは、Emacsビルド時に実行されたものは、M-x update-file-autoloadsにコピーします。

以下は、マジックコメントによるオートロードのためにdoctorを準備する例です:

;;;###autoload
(defun doctor ()
  "Switch to *doctor* buffer and start giving psychotherapy."
  (interactive)
  (switch-to-buffer "*doctor*")
  (doctor-mode))

これにより、以下がloaddefs.el内に書き込まれます:

(autoload (quote doctor) "doctor" "\
Switch to *doctor* buffer and start giving psychotherapy.

\(fn)" t nil)

ダブルクォートの直後のバックスラッシュまたは改行は、loaddefs.elのようなプリロードされた未コンパイルだけに使用される慣習です。これは、make-docfileにたいして、ドキュメント文字列をetc/DOCファイルに配するよう指示します。Building Emacsを参照してください。また、lib-src/make-docfile.c内のコメントも参照してください。ドキュメント文字列の使い方(usage part)の中の‘(fn)’は、種々のヘルプ関数(Help Functionsを参照)が表示するとき、その関数の名前に置き換えられます。

関数定義手法として既知ではなく、認められてもいないような、通常とは異なるマクロにより関数定義を記述した場合、通常のオートロードのマジックコメントの使用により、定義全体がloaddefs.el内にコピーされるでしょう。これは期待した動作ではありません。かわりに以下を記述することにより、意図したautoload呼び出しをloaddefs.el内に配することができます。

;;;###autoload (autoload 'foo "myfile")
(mydefunmacro foo
  ...)

autoload cookieとして、デフォルト以外の文字列を使用して、デフォルトのloaddefs.elとは異なるファイル内に、対応するオートロード呼び出しを記述できます。これを制御するために、Emacsは2つの変数を提供します:

Variable: generate-autoload-cookie

この変数の値は、Lispコメントの文法に準じた文字列です。M-x update-file-autoloadsは、そのcookieの後のLispフォームを、cookieが生成したオートロードファイル内にコピーします。この変数のデフォルト値は、";;;###autoload"です。

Variable: generated-autoload-file

この変数の値は、オートロード呼び出しが書き込まれるEmacs Lispファイルを命名します。デフォルト値はloaddefs.elですが、(たとえば.elファイル内のセクション“Local Variables”))をオーバーライドできます。オートロードファイルは、フォームフィード文字で開始される終端を含んでいると仮定されます。

以下の関数は、オートロードオブジェクトにより指定されたライブラリーを明示的にロードするために使用されるかもしれません:

Function: autoload-do-load autoload &optional name macro-only

この関数はオートロードオブジェクトautoloadにより指定されたロードを処理します。オプション引数nameに非nilを指定する場合は、関数値がautoloadとなるシンボルを指定します。この場合、この関数のリターン値は、そのシンボルの新しい関数値になります。オプション引数macro-onlyの値がmacroの場合、この関数は関数ではなくマクロのロードだけを有効にします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.6 Repeated Loading

1つのEmacsセッション内で、ファイルを複数回ロードできます。たとえば、バッファーで関数定義を編集して再インストールした後に、元のバージョンに戻したいときがあるかもしれません。これは、元のファイルをリロードすることにより行なうことができます。

ファイルをロードまたはリロードするとき、loadおよびload-library関数は未コンパイルのファイルではなく、バイトコンパイルされた同名のファイルを自動的にロードすることに留意してください。ファイルを再記述して保存後に再インストールする場合には、新しいバージョンをバイトコンパイルする必要があります。さもないと、Emacsは新しいソースではなく、古いバイトコンパイルされたファイルをロードしてしまうでしょう! その場合には、ファイルロード時に表示されるメッセージに、そのファイルのリコンパイルを促す‘(compiled; note, source is newer)’というメッセージが含まれます。

Lispライブラリーファイル内にフォームを記述するときは、そのファイルが複数回ロードされるかもしれないことに留意してください。たとえば、そのライブラリーをリロードするときには、各変数が最初期化されるべきかどうか考慮してください。。変数がすでに初期化されている場合、defvarはその変数の値を変更しません(Defining Global Variablesを参照)。

alistに要素を追加するもっともシンプルな方法は、以下のようなものでしょう:

(push '(leif-mode " Leif") minor-mode-alist)

しかし、これはそのライブラリーがリロードされた場合は、複数の要素を追加してしまうでしょう。この問題を避けるには、add-to-list(Modifying List Variablesを参照)を使用します:

(add-to-list 'minor-mode-alist '(leif-mode " Leif"))

時には、ライブラリーが既にロード済みか、明示的にテストしたいときがあるでしょう。そのライブラリーがprovideを使用して名前付きフィーチャ(named feature)を提供する場合は、featurepを使用して前にprovideが実行されているかテストすることができます。かわりに、以下のようにすることもできます:

(defvar foo-was-loaded nil)

(unless foo-was-loaded
  execute-first-time-only
  (setq foo-was-loaded t))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.7 Features

providerequireは、autoloadにかわるファイルを自動的にロードする関数です。これらは名前付きのフィーチャ(feature: 機能)という面で機能します。オートロードは特定の関数の呼び出しをトリガーにしますが、フィーチャーは最初は他のプログラムが名前により問い合わせたときにロードされます。

フィーチャ名とは、関数、変数などのコレクションを表すシンボルです。これらを定義するファイルは、そのフィーチャをプロバイド(provide: 提供)すべきです。これらのフィーチャを使用する他のプログラムは、その機能をリクワイア(require: 要求)することにより、それらが定義されているか確認できるでしょう。これは、定義がまだロードされていなければ、定義ファイルをロードします。

フィーチャをリクワイアするには、フィーチャ名を引数としてrequireを呼び出します。requireは、意図する機能がすでにプロバイドされているか確認するために、グローバル変数featuresを調べます。もしプロバイドされていなければ、適切なファイルからそのフィーチャをロードします。このファイルは、そのフィーチャをfeaturesに追加するために、トップレベルでprovideを呼び出すべきです。これに失敗すると、requireはエラーをシグナルします。

たとえば、idlwave.el内のidlwave-complete-filenameにたいする定義には、以下のコードが含まれます:

(defun idlwave-complete-filename ()
  "Use the comint stuff to complete a file name."
   (require 'comint)
   (let* ((comint-file-name-chars "~/A-Za-z0-9+@:_.$#%={}\\-")
          (comint-completion-addsuffix nil)
          ...)
       (comint-dynamic-complete-filename)))

(require 'comint)は、comint.elがまだロードされていなければ、comint-dynamic-complete-filenameが確実に定義されるように、そのファイルをロードします。フィーチャは通常、それらを提供するファイルにしたがって命名されるため、requireにファイル名を与える必要はありません。(require命令文がletのボディーの外側にあるのが重要なことに注意してください。変数がletバインドされているライブラリーをロードすることにより、意図せぬ結果、つまりletをexitした後にその変数がアンバインドされます。)

comint.elには以下のトップレベル式が含まれます:

(provide 'comint)

これはcomintはグローバルなリストfeaturesに追加するので、(require 'comint)は今後何も行う必要がないことを知ることができます。

ファイルのトップレベルrequireが使用されたときは、それをロードしたときと同様、そのファイルをバイトコンパイル(Byte Compilationを参照)したときにも効果が表れます。これはリクワイアされたパッケージがマクロを含み、バイトコンパイラーがそれを知らなければならない場合です。これはrequireによりロードされるファイルで定義される関数と変数にたいするバイトコンパイラーの警告も無効にします。

バイトコンパイルの間にトップレベルのrequireが評価されるとしても、provide呼び出しは評価されません。したがって、以下の例のようにprovideの後に同じ機能にたいするrequireを含めることにより、バイトコンパイル前に定義しているファイルを確実にロードできます。

(provide 'my-feature)  ; バイトコンパイラーには無視され、
                       ;   loadには評価される。
(require 'my-feature)  ; バイトコンパイラーにより評価される。

コンパイラーはprovideを無視して、その後に対象のファイルをロードすることによりrequireが処理されます。ファイルのロードはprovide呼び出しを実行するので、後続のrequireはファイルがロードされているときは何も行いません。

Function: provide feature &optional subfeatures

この関数は、カレントEmacsセッションにfeatureがロードされた、あるいはロードされつつあることをアナウンスします。これは、featureに関連する機能が他のLispプログラムから利用可能できる、あるいは利用可能になることを意味します。

provideを呼び出すことによる直接的な効果は、まだfeaturefeatures内に存在しない場合はリストの先頭に追加して、それを必要としているeval-after-loadコードを呼び出します(Hooks for Loadingを参照)。引数featureはシンボルでなければなりません。providefeatureをリターンします。

subfeaturesが与えられた場合、それはfeatureの当該バージョンによりプロバイドされる特定のサブフィーチャのセットを示すシンボルのリストであるべきです。featurepを使用して、サブフィーチャの存在をテストできます。あるパッケージの、ロードされるか、あるいはそのバージョンに存在するか不明なさまざまな部分や機能に名前を与えて使いやすくするには、そのパッケージが複雑すぎるときにサブフィーチャを使用するというのがサブフィーチャというアイデアです。例としては、Testing Availability of Network Featuresを参照してください。

features
     ⇒ (bar bish)

(provide 'foo)
     ⇒ foo
features
     ⇒ (foo bar bish)

オートロードによりあるファイルがロードされて、その内容の評価エラーによりストップいたとき、そのロードの間に発生した関数定義やprovide呼び出しはアンドゥされます。Autoloadを参照してください。

Function: require feature &optional filename noerror

この関数はカレントEmacsセッションにおいて、featureが存在するかどうかを、((featurep feature)を使用して。以下を参照)をチェックします。引数featureはシンボルでなければなりません。

そのフィーチャが存在しない場合、requireloadによりfilenameをロードします。filenameが与えられなかった場合は、シンボルfeatureの名前がロードするファイル名のベースとして使用されます。しかしこの場合、requirefeatureを探すためにサフィックス‘.el’および‘.elc’の追加を強制します(圧縮ファイルのサフィックスに拡張されるかもしれません)。名前がただのfeatureというファイルは使用されません。(変数load-suffixesは要求されるLispサフィックスを正確に指定します。)

noerrorが非nilの場合は、ファイルの実際のロードにおけるエラーを抑止します。この場合、そのファイルのロードが失敗すると、requirenilをリターンします。通常では、requirefeatureをリターンします。

ファイルのロードは成功したがfeatureをプロバイドしていない場合、requireは‘Required feature feature was not provided’のようにエラーをシグナルします。

Function: featurep feature &optional subfeature

この関数は、カレントEmacsセッションfeatureがプロバイドされている場合(たとえばfeaturefeaturesのメンバーの場合)はtをリターンします。subfeatureが非nilの場合、この関数はサブフィーチャも同様にプロバイドされているとき(たとえばsubfeatureがシンボルfeatureのプロパティsubfeatureのメンバーのとき)だけtをリターンします。

Variable: features

この変数の値はシンボルのリストで、このシンボルはカレントEmacsセッションにロードされたフィーチャです。シンボルはそれぞれprovideを呼び出すことにより、このリストにputされたものです。リストfeatures内の要素の順番に意味はありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.8 Which File Defined a Certain Symbol

Function: symbol-file symbol &optional type

この関数は、symbolを定義しているファイルの名前をリターンします。typenilの場合は、どのようなタイプの定義も受け入れられます。typedefunの場合は関数定義、defvarは変数定義、deffaceはフェイス定義だけを指定します。

値は通常、絶対ファイル名です。定義がどのファイルにも関係しないときは、nilになることもあります。symbolがオートロード関数を指定する場合、値が拡張子なしの相対ファイル名になることもあります。

symbol-fileは変数load-history.<の値にもとづいています。

Variable: load-history

この変数の値は、ロードされたライブラリーファイルの名前を、それらが定義する関数と変数の名前、およびそれらがプロバイドまたはリクワイアするフィーチャに関連付けるalistです。

このalist内の各要素は、1つのロード済みライブラリー(スタートアップ時にプリロードされたライブラリーを含む)を記述します。要素はCARがライブラリーの絶対ファイル名(文字列)のリストです。残りのリスト要素は、以下の形式です:

var

シンボルvarが変数として定義された。

(defun . fun)

関数funが定義された。

(t . fun)

関数funは、このライブラリーがそれを関数として再定義する前はオートロードとして定義されていた。後続の要素は常に(defun . fun)で、これはfunを関数として定義する。

(autoload . fun)

関数funはオートロードとして定義された。

(defface . face)

フェイスfaceが定義された。

(require . feature)

フィーチャfeatureがリクワイアされた。

(provide . feature)

フィーチャfeatureがプロバイドされた。

load-historyの値には、CARnilの要素が1つ含まれるかもしれません。この要素は、ファイルをvisitしていないバッファーでのeval-bufferで作成された定義を記述します。

コマンドeval-regionload-historyを更新しますが、要素を置き換えずに、visitされているファイルの要素にたいして定義されたシンボルを追加します。Evalを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.9 Unloading

他のLispオブジェクト用にメモリーを回収するために、ライブラリーによりロードされた関数や変数を破棄することができます。これを行うには、関数unload-featureを使用します:

Command: unload-feature feature &optional force

このコマンドはフィーチャfeatureをプロバイドしていたライブラリーをアンロードします。そのライブラリー内のdefundefaliasdefsubstdefmacrodefconstdefvardefcustomにより定義されたすべての関数、マクロ、変数は未定義になります。その後、それらのシンボルにたいして事前に関連付けられていたオートロードをリストアします。(ロードはシンボルのautoloadプロパティにこれらを保存しています。)

以前の定義をリストアする前に、特定のフックからそのライブラリー内の関数を取り除くために、unload-featureremove-hookを実行します。これらのフックには、名前が‘-hook’(または廃止されたサフィックス‘-hooks’)で終わる変数、加えてunload-feature-special-hooks、同様にauto-mode-alistにリストされた変数も含まれます。これは、重要なフックがすでに定義されていない関数を参照をすることにより、Emacsの機能が停止することを防ぐためです。

標準的なアンロードアクティビティは、そのライブラリー内の関数のELPプロファイリングを取り消し、そのライブラリーによりプロバイドされたフィーチャを取り消し、そのライブラリーで定義された変数に保持されたタイマーも取り消します。

これらの基準が機能不全を防ぐのに十分でない場合、ライブラリーはfeature-unload-functionという名前の明示的なアンローダーを定義できます。そのシンボルが関数として定義された場合、unload-featureは何かを行う前にまず引数なしでそれを呼び出します。これはライブラリーをアンロードしるために適切なすべてのことを行うことができます。これがnilをリターンした場合、unload-featureは通常のアンロードアクションを処理します。それ以外は、アンロード処理は完了したとみなします。

unload-featureは通常、他のライブラリーが依存するライブラリーのアンロードを拒絶します。(ライブラリーbにたいするrequireがライブラリーaに含まれる場合、abに依存します。)オプション引数forceが非nilの場合、依存関係は無視され、どのようなライブラリーもアンロードできます。

unload-feature関数はLispで記述されており、その動作は変数load-historyにもとづきます。

Variable: unload-feature-special-hooks

この変数には、ライブラリー内で定義された関数を取り除くために、ライブラリーをアンロードする前にスキャンされるフックのリストが保持されています。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

15.10 Hooks for Loading

変数after-load-functionsを使用することにより、Emacsがライブラリーをロードするたびにコードを実行させることができます:

Variable: after-load-functions

このアブノーマルフック(abnormal hook)は、ファイルをロードした後に実行されます。フック内の各関数は1つの引数(ロードされたファイルの絶対ファイル名)で呼び出されます。

特定のライブラリーがロードされた後にコードを実行したい場合は、マクロwith-eval-after-loadを使用します:

Macro: with-eval-after-load library body…

このマクロはlibraryがロードされるたびに、ファイルlibraryのロードの最後でbodyが評価されるよう準備します。libraryがすでにロード済みの場合は、即座にbodyを評価します。

ファイル名libraryにディレクトリーや拡張子を与える必要はありません。通常は以下のようにファイル名だけを与えます:

(with-eval-after-load "edebug" (def-edebug-spec c-point t))

どのファイルが評価をトリガーできるか制限するには、ディレクトリーか拡張子、またはしの両方をlibraryに含めます。実際のファイル名(たとえばすべてのシンボリックリンク名は除外される)が、与えられた名前すべてにマッチするファイルだけが、マッチします。以下の例では、どこかのディレクトリー..../foo/barにあるmy_inst.elcmy_inst.elc.gzは評価をトリガーしますが、my_inst.elは異なります。:

(with-eval-after-load "foo/bar/my_inst.elc" …)

libraryはフィーチャ(たとえばシンボル)でもよく、その場合(provide library)を呼び出す任意のファイルの最後にbodyが評価されます。

body内のエラーはロードをアンドゥしませんが、bodyの残りの実行を妨げます。

上手く設計されたLispプログラムは通常、eval-after-loadを使用するべきではありません。(外部からの使用を意図した)他のライブラリーで定義された変数を調べたりセットする必要がある場合、それは即座に行うことができます −−− そのライブラリーがロードされるのを待つ必要はありません。そのライブラリーで定義された関数を呼び出す必要がある場合は、そのライブラリーをロードすべきで、それにはrequire(Featuresを参照)が適しています。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16 Byte Compilation

Emacs Lispには、Lispで記述された関数を、より効率的に実行できるバイトコード(byte-code)と呼ばれる特別な表現に翻訳するコンパイラー(compiler)があります。コンパイラーはLispの関数定義をバイトコードに置き換えます。バイトコード関数が呼び出されたとき、その定義はバイトコードインタープリター(byte-code interpreter)により評価されます。

バイトコンパイルされたコードは、(本当のコンパイル済みコードのように)そのマシンのハードウェアにより直接実行されるのではなく、バイトコンパイラーにより評価されるため、バイトコードはリコンパイルしなくてもマシン間での完全な可搬性を有します。しかし、本当にコンパイルされたコードほど高速ではありません。

一般的に、任意のバージョンのEmacsはそれ以前のバージョンのEmacsにより生成されたバイトコンパイル済みコードを実行できますが、逆は成り立ちません。

あるLispファイルを常にコンパイルせずに実行したい場合は、以下のようにno-byte-compileにバインドするファイルローカル変数を配します:

;; -*-no-byte-compile: t; -*-

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.1 Performance of Byte-Compiled Code

バイトコンパイルされた関数はCで記述されたプリミティブ関数ほど効率的ではありませんがLispで記述されたバージョンよりは高速に実行されます。以下は例です:

(defun silly-loop (n)
  "Return the time, in seconds, to run N iterations of a loop."
  (let ((t1 (float-time)))
    (while (> (setq n (1- n)) 0))
    (- (float-time) t1)))
⇒ silly-loop

(silly-loop 50000000)
⇒ 10.235304117202759

(byte-compile 'silly-loop)
⇒ [コンパイルされたコードは表示されない]

(silly-loop 50000000)
⇒ 3.705854892730713

この例では、インタープリターによる実行には10秒を要しますが、バイトコンパイルされたコードは4秒未満です。これは典型的な結果例ですが、実際の結果はさまざまでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.2 Byte-Compilation Functions

byte-compileにより、関数やマクロを個別にバイトコンパイルできます。byte-compile-fileでファイル全体、byte-recompile-directoryまたはbatch-byte-compileで複数ファイルをコンパイルできます。

バイトコンパイラーが警告、および/またはエラーメッセージを生成することもあります(詳細はCompiler Errorsを参照)。これらのメッセージはCompilationモードが使用する*Compile-Log*と呼ばれるバッファーに記録されます。Compilation Mode in The GNU Emacs Manualを参照してください。

バイトコンパイルを意図したファイル内にマクロ呼び出しを記述する際は、注意が必要です。マクロ呼び出しはコンパイル時に展開されるので、そのマクロはEmacsにロードされる必要があります(さもないとバイトコンパイラーは正しく処理しないでしょう)。これを処理する通常の方法は、必要なマクロ定義を含むファイルをrequireフォームで指定することです。バイトコンパイラーは通常、コンパイルするコードを評価しませんが、requireフォームは指定されたライブラリーをロードすることにより特別に扱われます。誰かがコンパイルされたプログラムを実行する際に、マクロ定義ファイルのロードを回避するには、require呼び出しの周囲にeval-when-compileを記述します(Evaluation During Compilationを参照)。詳細はMacros and Byte Compilationを参照してください。

インライン(defsubst)の関数は、これほど面倒ではありません。定義が判明する前にそのような関数呼び出しをコンパイルした場合でも、その呼び出しは低速になるだけで、正しく機能するでしょう。

Function: byte-compile symbol

この関数はsymbolの関数定義をバイトコンパイルして、以前の定義をコンパイルされた定義に置き換えます。symbolの関数定義は、その関数にたいする実際のコードでなければなりません。byte-compileはインダイレクト関数を処理しません。リターン値は、symbolのコンパイルされた定義であるバイトコード関数ブジェクトです(Byte-Code Function Objectsを参照)。

(defun factorial (integer)
  "INTEGERの階乗を計算する。"
  (if (= 1 integer) 1
    (* integer (factorial (1- integer)))))
⇒ factorial

(byte-compile 'factorial)
⇒
#[(integer)
  "^H\301U\203^H^@\301\207\302^H\303^HS!\"\207"
  [integer 1 * factorial]
  4 "Compute factorial of INTEGER."]

symbolの定義がバイトコード関数オブジェクトの場合、byte-compileは何も行わずnilをリターンします。そのシンボルの関数セル内の(コンパイルされていない)オリジナルのコードはすでにバイトコンパイルされたコードに置き換えられているので、“シンボルの定義の再コンパイル”はしません。

byte-compileの引数としてlambda式も指定できます。この場合、関数は対応するコンパイル済みコードをリターンしますが、それはどこにも格納されません。

Command: compile-defun &optional arg

このコマンドはポイントを含むdefunを読み取りそれをコンパイルして、結果を評価します。実際に関数定義であるようなdefunでこれを使用した場合は、その関数のコンパイル済みバージョンをインストールする効果があります。

compile-defunは通常、評価した結果をエコーエリアに表示しますが、argが非nilの場合は、そのフォームをコンパイルした後にカレントバッファーに結果を挿入します。

Command: byte-compile-file filename &optional load

この関数はfilenameという名前のLispコードファイルを、バイトコードのファイルにコンパイルします。出力となるファイルの名前は、サフィックス‘.el’を‘.elc’に変更することにより作成されます。filenameが‘.el’で終了しない場合は、‘.elc’をfilenameの最後に付け足します。

コンパイルは入力ファイルから1つのフォームを逐次読み取ることにより機能します。フォームが関数またはマクロの場合は、コンパイル済みの関数またはマクロが書き込まれます。それ以外のフォームはまとめられて、まとめられたものごとにコンパイルされ、そのファイルが読まれたとき実行されるようにコンパイルされたコードが書き込まれます。入力ファイルを読み取る際、すべてのコメントは無視されます。

このコマンドはエラーのないときはt、それ以外はnilをリターンします。インタラクティブに呼び出されたときは、ファイル名の入力をもとめます。

loadが非nilの場合、このコマンドはコンパイルした後にコンパイルされたファイルをロードします。インタラクティブに呼び出された場合、loadはプレフィクス引数です。

$ ls -l push*
-rw-r--r-- 1 lewis lewis 791 Oct  5 20:31 push.el

(byte-compile-file "~/emacs/push.el")
     ⇒ t

$ ls -l push*
-rw-r--r-- 1 lewis lewis 791 Oct  5 20:31 push.el
-rw-rw-rw- 1 lewis lewis 638 Oct  8 20:25 push.elc
Command: byte-recompile-directory directory &optional flag force

このコマンドは、directory(またはそのサブディレクトリー)内の、リコンパイルを要するすべての‘.el’ファイルをリコンパイルします。‘.elc’ファイルが存在し、それが‘.el’より古いファイルは、リコンパイルが必要です。

.el’ファイルに対応する‘.elc’ファイルが存在しない場合、何を行うかをflagで指定します。nilの場合、このコマンドはこれらのファイルを無視します。flagが0のときは、それらをコンパイルします。nilと0以外の場合は、それらのファイルをコンパイルするかユーザーに尋ね、同様にそれぞれのサブディレクトリーについても尋ねます。

インタラクティブに呼び出された場合、byte-recompile-directorydirectoryの入力を求め、flagはプレフィクス引数になります。

forceが非nilの場合、このコマンドは‘.elc’ファイルのあるすべての‘.el’ファイルをリコンパイルします。

リターン値は不定です。

Function: batch-byte-compile &optional noforce

この関数は、コマンドラインで指定されたファイルにたいして、byte-compile-fileを実行します。この関数は処理が完了するとEmacsをkillするので、Emacsのバッチ実行だけで使用しなければなりません。1つのファイルでエラーが発生しても、それにより後続のファイルにたいする処理が妨げられることはありませんが、そのファイルにたいする出力ファイルは生成されず、Emacsプロセスは0以外のステータスコードで終了します。

noforceが非nilの場合、この関数は最新の‘.elc’ファイルがあるファイルをリコンパイルしません。

$ emacs -batch -f batch-byte-compile *.el

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.3 Documentation Strings and Compilation

Emacsがバイトコンパイルされたファイルから関数や変数をロードする際、通常はメモリー内にそれらのドキュメント文字列をロードしません。それぞれのドキュメント文字列は、必要なときだけバイトコンパイルされたファイルから“ダイナミック(dynamic: 動的)”にロードされます。ドキュメント文字列の処理をスキップすることにより、メモリーが節約され、ロードが高速になります。

この機能には欠点があります。コンパイル済みのファイルを削除、移動、または(新しいバージョンのコンパイル等で)変更した場合、Emacsは前にロードされた関数や変数のドキュメント文字列にアクセスできなくなるでしょう。このような問題は通常、あなた自身がEmacsをビルドした場合に、そのLispファイルを編集、および/またはリコンパイルしたときだけ発生します。この問題は、リコンパイル後にそれぞれのファイルをリロードするだけで解決します。

バイトコンパイルされたファイルからのドキュメント文字列のダイナミックロードは、バイトコンパイルされたファイルごとに、コンパイル時に決定されます。これはオプションbyte-compile-dynamic-docstringsにより、無効にできます。

User Option: byte-compile-dynamic-docstrings

これが非nilの場合、バイトコンパイラーはドキュメント文字列をダイナミックロードするようセットアップしたコンパイル済みファイルを生成します。

特定のファイルでダイナミックロード機能を無効にするには、以下のようにヘッダー行(Local Variables in Files in The GNU Emacs Manualを参照)で、このオプションにnilをセットします。

-*-byte-compile-dynamic-docstrings: nil;-*-

これは主に、あるファイルを変更しようとしていて、そのファイルをすでにロード済みのEmacsセッションがファイルを変更した際にも正しく機能し続けることを望む場合に有用です。

内部的には、ドキュメント文字列のダイナミックロードは、特殊なLispリーダー構成‘#@count’とともにコンパイル済みファイルに書き込むことにより達成されます。この構成は、次のcount文字をスキップします。さらに‘#$’構成も使用され、これは“このファイルの名前(文字列)”を意味します。これらの構成をLispソースファイル内で使用しないでください。これらは人間がファイルを読む際に明確であるようデザインされていません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.4 Dynamic Loading of Individual Functions

ファイルをコンパイルするとき、オプションでダイナミック関数ロード(dynamic function loading)機能(laxyロード(lazy loading)とも呼ばれる)を有効にできます。ダイナミック関数ロードでは、ファイルのロードでファイル内の関数定義は完全には読み込まれません。かわりに、各関数定義にはそのファイルを参照するプレースホルダーが含まれます。それぞれ関数が最初に呼び出されるときに、そのプレースホルダーを置き換えるために、ファイルから完全な定義が読み込まれます。

ダイナミック関数ロードの利点は、ファイルのロードがより高速になることです。ユーザーが呼び出せる関数を多く含むファイルにとって、それらの関数のうち1つを使用したら、おそらく残りの関数も使用するというのでなければ、これは利点です。多くのキーボードコマンドを提供する特化したモードは、このパターンの使い方をする場合があります。ユーザーはそのモードを呼び出すかもしれませんが、使用するのはそのモードが提供するコマンドのわずか一部です。

ダイナミックロード機能には、いくつか不利な点があります:

このような問題は、通常の状況でインストールされたEmacsファイルでは決して発生しません。しかし、あなたが変更したLispファイルでは発生し得ます。それぞれのファイルをリコンパイルしたらすぐに、新たなコンパイル済みファイルをリロードするのが、これらの問題を回避する一番簡単な方法です。

コンパイル時に変数byte-compile-dynamicが非nilの場合、バイトコンパイラーはダイナミック関数ロード機能を使用します。ダイナミックロードが望ましいのは特定のファイルにたいしてだけなので、この変数をグローバルにセットしないでください。そのかわりに、特定のソースファイルのファイルローカル変数で、この機能を有効にしてください。たとえば、ソースファイルの最初の行に以下のテキストを記述することにより、これを行うことができます:

-*-byte-compile-dynamic: t;-*-
Variable: byte-compile-dynamic

これが非nilの場合、バイトコンパイラーはダイナミック関数ロードのためにセットアップされたコンパイル済みファイルを生成します。

Function: fetch-bytecode function

functionがバイトコード関数オブジェクトの場合、それがまだ完全にロードされていなければ、バイトコンパイル済みのファイルからのfunctionのバイトコードのロードを完了させます。それ以外は、何も行いません。この関数は、常にfunctionをリターンします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.5 Evaluation During Compilation

これらの機能により、プログラムのコンパイル中に評価されるコードを記述できます。

Special Form: eval-and-compile body…

このフォームは、それを含むコードがコンパイルされるとき、および(コンパイルされているかいないかに関わらず)実行されるときの両方で、bodyが評価されるようにマークします。

bodyを別のファイルに配し、そのファイルをrequireで参照すれば、同様の結果が得られます。これはbodyが大きいとき望ましい方法です。事実上、requireは自動的にeval-and-compileされ、そのパッケージはコンパイル時と実行時の両方でロードされます。

autoloadも実際はeval-and-compileされます。これはコンパイル時に認識されるので、そのような関数の使用により警告“not known to be defined”は生成されません。

ほとんどのeval-and-compileの使用は、完全に妥当であると言えます。

あるマクロがマクロの結果を構築するためのヘルパー関数をもち、そのマクロがそのパッケージにたいしてローカルと外部の両方で使用される場合には、コンパイル時と後の実行時にそのヘルパー関数を取得するために、eval-and-compileを使用すべきです。

関数がプログラム的に(fsetで)定義されている場合には、それがコンパイル時、同様に実行時に行われるように使用でき、それらの関数への呼び出しはチェックされます(“not known to be defined”の警告は抑えられます)。

Special Form: eval-when-compile body…

このフォームは、bodyがコンパイル時に評価され、コンパイルされたプログラムがロードされるときは評価されないようにマークします。コンパイラーによる評価の結果は、コンパイル済みのプログラム内の定数となります。ソースファイルをコンパイルではなくロードした場合、bodyは通常どおり評価されます。

生成するために何らかの計算が必要な定数がある場合、eval-when-compileはコンパイル時にそれを行なうことができます。たとえば、

(defvar my-regexp
  (eval-when-compile (regexp-opt '("aaa" "aba" "abb"))))

他のパッケージを使用しているが、そのパッケージのマクロ(バイトコンパイラーはそれらを展開します)だけが必要な場合、それらを実行せずにコンパイル用にロードさせるためにeval-when-compileを使用できます。たとえば、

(eval-when-compile
  (require 'my-macro-package))

これらの事項は、マクロおよびdefsubst関数がローカルに定義され、そのファイル内だけで使用されることを要求します。これらは、そのファイルのコンパイルに必要ですが、コンパイル済みファイルの実行には、ほとんどの場合必要ありません。たとえば、

(eval-when-compile
  (unless (fboundp 'some-new-thing)
    (defmacro 'some-new-thing ()
      (compatibility code))))

これは大抵他のバージョンのEmacsとの互換性にたいする保証だけのためのコードにたいして有用です。

Common Lispに関する注意: トップレベルでは、eval-when-compileはCommon Lispのイディオム(eval-when (compile eval) …)に類似しています。トップレベル以外では、Common Lispのリーダーマクロ‘#.’(ただし解釈時を除く)が、eval-when-compileと近いことを行います。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.6 Compiler Errors

バイトコンパイルのエラーメッセージと警告メッセージは、*Compile-Log*という名前のバッファーにプリントされます。これらのメッセージには、問題となる箇所を示すファイル名と行番号が含まれます。これらのメッセージにたいして、コンパイラー出力を操作する通常のEmacsコマンドが使用できます。

あるエラーがプログラムのシンタックスに由来する場合、バイトコンパイラーはエラーの正確な位置の取得に際し混乱するかもしれません。バッファー *Compiler Input*.にスイッチするのは、これを調べ1つの方法です。(このバッファー名はスペースで始まるので、Buffer Menuに表示されません。)このバッファーにはコンパイルされたプログラムと、バイトコンパイラーが読み取れた箇所からポイントがどれほど離れているかが含まれ、エラーの原因はその近傍にあるかもしれません。シンタックスエラーを見つけるヒントについては、Debugging Invalid Lisp Syntaxを参照してください。

定義されていない関数や変数の使用は、バイトコンパイラーにより報告される警告のタイプとしては一般的です。そのような警告では、定義されていない関数や変数を使用した位置ではなく、そのファイルの最後の行の行番号が報告されるので、それを見つけるには手作業で検索しなければなりません。

定義のない関数や変数の警告が間違いだと確信できる場合には、警告を抑制する方法がいくつかあります:

with-no-warnings構成を使用して特定の式にたいするコンパイラーのすべての任意の警告を抑制することもできます:

Special Form: with-no-warnings body…

実行時には〜これは(progn body...)と等価ですが、コンパイラーはbodyの中で起こるいかなる事項にたいしても警告を発しません。

わたしたちは、あなたが抑制したいと意図する警告以外の警告を失わないようにするために、可能な限り小さいコード断片にたいしてこの構成を使用することを推奨します。

変数byte-compile-warningsをセットすることにより、コンパイラーの警告をより詳細に制御できます。詳細は、変数のドキュメント文字列を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.7 Byte-Code Function Objects

バイトコンパイルされた関数は、特別なデータ型、バイトコード関数オブジェクト(byte-code function objects)をもちます。関数呼び出しとしてそのようなオブジェクトが出現したとき、Emacsはそのバイトコードを実行するために、常にバイトコードインタープリターを使用します。

内部的には、バイトコード関数オブジェクトはベクターによく似ています。バイトコード関数オブジェクトの要素には、arefを通じてアクセスできます。バイトコード関数オブジェクトのプリント表現(printed representation)はベクターに似ていて、開き‘[’の前に‘#’が追加されます。バイト関数オブジェクトは少なくとも4つの要素をもたねばならず、要素数に上限はありません。しかし通常使用されるのは、最初の6要素です。これらは:

arglist

シンボル引数のリスト。

byte-code

バイトコード命令を含む文字列。

constants

バイトコードにより参照されるLispオブジェクトのベクター。関数名と変数名に使用されるシンボルが含まれる。

stacksize

この関数が要するスタックの最大サイズ。

docstring

(もしあれば)ドキュメント文字列。それ以外はnil。ドキュメント文字列がファイルに格納されている場合、値は数字かリストかもしれない。本当のドキュメント文字列の取得には、関数documentationを使用する(Access to Documentation Stringsを参照)。

interactive

(もしあれば)インタラクティブ仕様。文字列かLisp式。インタラクティブでない関数ではnil

以下は、バイトコード関数オブジェクトのプリント表現の例です。これはコマンドbackward-sexpの定義です。

#[(&optional arg)
  "^H\204^F^@\301^P\302^H[!\207"
  [arg 1 forward-sexp]
  2
  254435
  "^p"]

バイトコードオブジェクトを作成する原始的な方法は、make-byte-codeです:

Function: make-byte-code &rest elements

この関数はelementsを要素とするバイトコードオブジェクトを構築して、リターンします。

あなた自身が要素を収集してバイトコード関数を構築しないでください。それらが矛盾する場合、その関数の呼び出しによりEmacsがクラッシュするかもしれません。これらのオブジェクトの作成は、常にバイトコンパイラーにまかせてください。バイトコンパイラーは、要素を矛盾なく構築します(願わくば)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.8 Disassembled Byte-Code

人はバイトコードを記述しません。それはバイトコンパイラーの仕事です。しかし、好奇心を満たすために、わたしたちはディスアセンブラを提供しています。ディスアセンブラは、バイトコードを人間が読めるフォームに変換します。

バイトコードインタープリターは、シンプルなスタックマシンとして実装されています。これは値を自身のスタックにpushして、計算で使用するためにそれらをpopして取り出し、おの結果を再びそのスタックにpushして戻します。バイトコード関数がリターンするときは、スタックから値をpopして取り出し、その関数の値としてリターンします。

それに加えてスタックとバイトコード関数は、値を変数とスタックの間で転送することにより、普通のLisp変数を使用したり、バインドおよびセットすることができます。

Command: disassemble object &optional buffer-or-name

このコマンドは、objectにたいするディスアセンブルされたコードを表示します。インタラクティブに使用した場合、またはbuffer-or-namenilか省略された場合は、*Disassemble*という名前のバッファーに出力します。buffer-or-nameが非nilの場合は、バッファーもしくは既存のバッファーの名前でなければなりません。その場合は、そのバッファーのポイント位置に出力され、ポイントは出力の前に残りされます。

引数objectには関数名、ラムダ式(Lambda Expressionsを参照)、またはバイトコードオブジェクト(Byte-Code Function Objectsを参照)を指定できます。ラムダ式の場合、disassembleはそれをコンパイルしてから、そのコンパイル済みコードをディスアセンブルします。

以下にdisassemble関数を使用した例を2つ示します。バイトコードとLispソースを関連付ける助けとなるように、説明的なコメントを追加してあります。これらのコメントは、disassembleの出力にはありません。

(defun factorial (integer)
  "Compute factorial of an integer."
  (if (= 1 integer) 1
    (* integer (factorial (1- integer)))))
     ⇒ factorial

(factorial 4)
     ⇒ 24

(disassemble 'factorial)
     -| byte-code for factorial:
 doc: Compute factorial of an integer.
 args: (integer)

0   varref   integer      ; integerの値を取得して
                          ;   それをスタック上にpushする。
1   constant 1            ; スタック上に1をpushする。
2   eqlsign               ; 2つの値をスタックからpopして取り出し、
                          ;   それらを比較して結果をスタック上にpushする。
3   goto-if-nil 1         ; スタックのトップをpopしてテストする。
                          ;   nilなら1へ、それ以外はcontinue。
6   constant 1            ; スタックのトップに1をpushする。
7   return                ; スタックのトップの要素をリターンする。
8:1 varref   integer      ; integerの値をスタック上にpushする。
9   constant factorial    ; factorialをスタック上にpushする。
10  varref   integer      ; integerの値をスタック上にpushする。
11  sub1                  ; integerをpopして値をデクリメントする。
                          ;   スタック上に新しい値をpushする。
12  call     1            ; スタックの最初(トップ)の要素を引数として
                          ;   関数factorialを呼び出す。
                          ;   リターン値をスタック上にpushする。
13 mult                   ; スタックのトップ2要素をpopして取り出し乗じ
                          ;   結果をスタック上にpushする。
14 return                 ; スタックのトップ要素をリターンする。

silly-loopは幾分複雑です:

(defun silly-loop (n)
  "Return time before and after N iterations of a loop."
  (let ((t1 (current-time-string)))
    (while (> (setq n (1- n))
              0))
    (list t1 (current-time-string))))
     ⇒ silly-loop

(disassemble 'silly-loop)
     -| byte-code for silly-loop:
 doc: Return time before and after N iterations of a loop.
 args: (n)

0   constant current-time-string  ; current-time-string
                                  ;   スタック上のトップにpushする。
1   call     0            ; 引数なしでcurrent-time-stringを呼び出し
                          ;   結果をスタック上にpushする。
2   varbind  t1           ; スタックをpopしてt1にpopされた値をバインドする。
3:1 varref   n            ; 環境からnの値を取得して
                          ;   その値をスタック上にpushする。
4   sub1                  ; スタックのトップから1を減ずる。
5   dup                   ; スタックのトップを複製する。
                          ;   たとえばスタックのトップをコピーしてスタック上にpushする。
6   varset   n            ; スタックのトップをpopして
                          ;   nをその値にバインドする。

;; (要はシーケンスdup varsetはpopせずに
;;  スタックのトップをnの値にコピーする。)

7   constant 0            ; スタック上に0をpushする。
8   gtr                   ; スタックのトップ2値をpopして取り出し
                          ;   nが0より大かテストし
                          ;   結果をスタック上にpushする。
9   goto-if-not-nil 1     ; n > 0なら1へ
                          ;   (これはwhile-loopを継続する)
                          ;   それ以外はcontinue。
12  varref   t1           ; t1の値をスタック上にpushする。
13  constant current-time-string  ; current-time-string
                                  ;   スタックのトップにpushする。
14  call     0            ; 再度current-time-stringを呼び出す。
15  unbind   1            ; ローカル環境のt1をアンバインドする。
16  list2                 ; スタックのトップ2要素をpopして取り出し
                          ;   それらのリストを作りスタック上にpushする。
17  return                ; スタックのトップの値をリターンする。

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17 Debugging Lisp Programs

Emacs Lispプログラム内の問題を見つけて詳細に調べる方法が、いくつかあります。

入出力の問題をデバックする便利なその他のツールに、ドリブルファイル(dribble file: Terminal Inputを参照)と、open-termscript関数(Terminal Output)があります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1 The Lisp Debugger

普通のLispデバッガは、フォーム評価のサスペンド機能を提供します。評価がサスペンド(一般的にはbreakの状態として知られる)されている間、実行時スタックを調べたり、ローカル変数やグローバル変数の値を調べたり変更することができます。breakは再帰編集(recursive edit)なので、Emacsの通常の編集機能が利用可能です。デバッガにエンターするようにプログラムを実行することさえ可能です。Recursive Editingを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.1 Entering the Debugger on an Error

デバッガに入る一番重要なタイミングは、Lispエラーが発生したときです。デバッガでは、エラーの直接原因を調査できます。

しかしデバッガへのエンターは、エラーによる通常の結末ではありません。多くのコマンドは不適切に呼び出されたときにLispエラーをシグナルするので、通常の編集の間にこれが発生するたびデバッガにエンターするのは、とても不便でしょう。したがって、エラーの際にデバッガにエンターしたい場合は、変数debug-on-errorに非nilをセットします。(コマンドtoggle-debug-on-errorは、これを簡単に行う方法を提供します。)

User Option: debug-on-error

この変数はエラーがシグナルされ、それがハンドルされていないときに、デバッガが呼び出されるかどうかを決定します。debug-on-errortの場合は、debug-ignored-errors(以下を参照)にリストされているエラーを除く、すべての種類のエラーがデバッガを呼び出します。nilの場合は、デバッガを呼び出しません。

値にはエラー条件(How to Signal an Errorを参照)のリストも指定できます。その場合、このリスト内のエラー条件だけにより、デバッガが呼び出されます(debug-ignored-errorsにもリストされているエラー条件は除外されます)。たとえば、debug-on-errorをリスト(void-variable)にセットした場合には、値をもたない変数に関するエラーにたいしてだけデバッガが呼び出されます。

eval-expression-debug-on-errorがこの変数をオーバーライドする場合がいくつかあることに注意してください(以下を参照)。

この変数が非nilのとき、Emacsはプロセスフィルター関数と番兵(sentinel)の周囲にエラーハンドラーを作成しません。したがって、これらの関数内でのエラーは、デバッガを呼び出します。Processesを参照してください。

User Option: debug-ignored-errors

この変数は、debug-on-errorの値に関わらず、デバッガにエンターすべきでないエラーを指定します。変数の値はエラー条件のシンボル、および/または正規表現のリストです。エラーがこれら条件シンボルのいずれか、またはエラーメッセージが正規表現のいずれかにマッチする場合、そのエラーはデバッガにエンターしません。

この変数の通常の値にはuser-errorと、同様に編集中にしばしば発生するがLispプログラムのバグによるものはほとんどない、いくつかのエラーが含まれます。しかし、“ほとんどない”は“絶対ない”ではありません。あなたのプログラムがこのリストにマッチするエラーにより機能しない場合は、そのエラーをデバッグするために、このリストの変更を試みるのもよいでしょう。通常はdebug-ignored-errorsnilにセットしておくのが、もっとも簡単な方法です。

User Option: eval-expression-debug-on-error

この変数が非nil値(デフォルト)の場合は、コマンドeval-expressionの実行により、一時的にdebug-on-errortがバインドされます。Evaluating Emacs-Lisp Expressions in The GNU Emacs Manualを参照してください。

eval-expression-debug-on-errornilの場合は、eval-expressionの間もdebug-on-errorの値は変更されません。

Variable: debug-on-signal

condition-caseによりキャッチされたエラーは通常、決してデバッガを呼び出しません。condition-caseは、デバッガがそのエラーをハンドルする前に、エラーをハンドルする機会を得ます。

debug-on-signalを非nil値に変更した場合は、condition-caseの存在如何に関わらず、すべてのエラーにおいてデバッガが最初に機会を得ます。(デバッガを呼び出すためには、依然としてそのエラーがdebug-on-errordebug-ignored-errorsで指定された条件を満たさなければなりません。)

警告: この変数を非nilにセットすると、芳しくない効果があるかもしれません。Emacsのさまざまな部分で処理の通常の過程としてエラーがキャッチされており、そのエラーが発生したことに気づかないことさえあるかもしれません。condition-caseでラップされたコードをデバッグする必要がある場合は、condition-case-unless-debug(see section Writing Code to Handle Errorsを参照)の使用を考慮してください。

User Option: debug-on-event

debug-on-eventをスペシャルイベント(Special Eventsを参照)にセットした場合は、Emacsはspecial-event-mapをバイパスして、このイベントを受け取ると即座にデバッガへのエンターを試みます。現在のところサポートされる値は、シグナルSIGUSR1およびSIGUSR2に対応する値だけです(これがデフォルトです)。これはinhibit-quitがセットされていて、それ以外はEmacsが応答しない場合に有用かもしれません。

Variable: debug-on-message

debug-on-messageに正規表現をセットした場合には、それにマッチするメッセージがエコーエリアに表示されると、Emacsはデバッガにエンターします。たとえば、これは特定のメッセージの原因を探すのに有用かもしれません。

initファイルロード中に発生したエラーをデバッグするには、オプション‘--debug-init’を使用します。これはinitファイルロードの間にdebug-on-errortにバインドして、通常はinitファイル内のエラーをキャッチするcondition-caseをバイパスします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.2 Debugging Infinite Loops

プログラムが無限にループしてリターンできないとき、最初の問題はそのループをいかに停止するかです。ほとんどのオペレーティングシステムでは、(quitさせる)C-gでこれを行うことができます。Quittingを参照してください。

普通のquitでは、なぜそのプログラムがループしたかについての情報は与えられません。変数debug-on-quitに非nilをセットすることにより、より多くの情報を得ることができます。無限ループの途中でデバッガを実行すれば、デバッガからステップコマンドで先へ進むことができます。ループ全体をステップで追えば、問題を解決するために十分な情報が得られるでしょう。

C-gによるquitはエラーとは判断されないので、C-gのハンドルにdebug-on-errorは効果がありません。同じように、debug-on-quitはエラーにたいして効果がありません。

User Option: debug-on-quit

この変数は、quitがシグナルされ、それがハンドルされていないときに、デバッガを呼び出すかどうかを決定します。debug-on-quitが非nilの場合は、quit(つまりC-gをタイプ)したときは常にデバッガが呼び出されます。debug-on-quitnil(デフォルト)の場合は、quitしてもデバッガは呼び出されません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.3 Entering the Debugger on a Function Call

プログラムの途中で発生する問題を調べるための有用なテクニックの1つは、特定の関数が呼び出されたときデバッガにエンターする方法です。問題が発生した関数にこれを行い、その関数をステップで追ったり、問題箇所の少し手前の関数呼び出しでこれを行い、その関数をステップオーバーしてその後をステップで追うことができます。

Command: debug-on-entry function-name

この関数は、function-nameが呼び出されるたびにデバッガの呼び出しを要求します。

Lispコードで定義された任意の関数およびマクロは、インタープリターに解釈されたコードかコンパイル済みのコードかに関わらず、エントリーにbreakをセットできます。その関数がコマンドの場合は、Lispから呼び出されたときと、インタラクティブに呼び出されたとき、デバッガにエンターします。(たとえばCで記述された)プリミティブ関数にも、この方法でdebug-on-entryをセットできますが、そのプリミティブがLispコードから呼び出されたときだけ効果があります。debug-on-entryはスペシャルフォームにはセットできません。

debug-on-entryがインタラクティブに呼び出されたときは、ミニバッファーでfunction-nameの入力を求めます。その関数がすでにエントリーでデバッガを呼び出すようにセットアップされていた場合、debug-on-entryは何も行いません。debug-on-entryは常にfunction-nameをリターンします。

以下は、この関数の使い方を説明するための例です:

(defun fact (n)
  (if (zerop n) 1
      (* n (fact (1- n)))))
     ⇒ fact
(debug-on-entry 'fact)
     ⇒ fact
(fact 3)

------ Buffer: *Backtrace* ------
Debugger entered--entering a function:
* fact(3)
  eval((fact 3))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp)
------ Buffer: *Backtrace* ------

Command: cancel-debug-on-entry &optional function-name

この関数はfunction-nameにたいするdebug-on-entryの効果をアンドゥします。インタラクティブに呼び出されたときは、ミニバッファーでfunction-nameの入力を求めます。function-nameが省略された、あるいはnilの場合は、すべての関数にたいするbreak-on-entryをキャンセルします。エントリー時にbreakするようセットアップされていない関数にcancel-debug-on-entryを呼び出したときは、何も行いません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.4 Explicit Entry to the Debugger

プログラム内の特定箇所に式(debug)を記述することにより、その箇所でデバッガが呼び出されるようにできます。これを行うにはソースファイルをvisitして、適切な箇所にテキスト‘(debug)’を挿入し、C-M-x(Lispモードでのeval-defunにたいするキーバインド)をタイプします。警告: 一時的なデバッグ目的のためにこれを行なう場合は、ファイルを保存する前に確実にアンドゥしてください!

(debug)’を挿入する箇所は、追加フォームが評価されることができ、その値を無視することができる箇所でなければなりません。(‘(debug)’の値が無視されない場合が、プログラムの実行が変更されてしまうでしょう!) 一般的にもっとも適した箇所は、prognまたは暗黙的なprogn(Sequencingを参照)の内部です。

デバッグ命令を配したいソースコード中の正確な箇所がわからないが、特定のメッセージが表示されたときにバックトレースを表示したい場合は、意図するメッセージにマッチする正規表現をdebug-on-messageにセットできます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.5 Using the Debugger

デバッガにエンターすると、その前に選択されていたウィンドウを1つのウィンドウに表示し、他のウィンドウに*Backtrace*という名前のバッファーを表示します。backtraceバッファーには、現在実行されているLisp関数の各レベルが1行ずつ含まれます。このバッファーの先頭は、デバッガが呼び出された理由を説明するメッセージ(デバッガがエラーにより呼び出された場合はエラーメッセージや関連するデータなど)です。

backtraceバッファーは読み取り専用で、文字キーにデバッガコマンドが定義されたDebuggerモードという特別なメジャーモードを使用します。通常のEmacs編集コマンドが利用できます。したがって、エラー時に編集されていたバッファーを調べるためにウィンドウを切り替えたり、バッファーを切り替えやファイルのvisit、その他一連の編集処理を行なうことができます。しかしデバッガは再帰編集レベル(Recursive Editingを参照)にあり、編集が終わったらそれはbacktraceバッファーに戻って、(qコマンドで)デバッガをexitできます。デバッガをexitすることにより、再帰編集を抜け出し、backtraceバッファーはバリー(bury: 覆い隠す)されます。(変数debugger-bury-or-killwをセットすることにより、backtraceバッファーでqコマンドが何を行うかをカスタマイズできます。たとえば、バッファーをバリーせずにkillしたい場合は、この変数をkillにセットします。他の値については、変数のドキュメントを調べてください。)

デバッガにエンターしたとき、eval-expression-debug-on-errorに一致するように変数debug-on-errorが一時的にセットされます。変数eval-expression-debug-on-errorが非nilの場合、debug-on-errorは一時的にtにセットされます。これは、デバッグセッション行っている間にさらにエラーが発生すると、(デフォルトでは)他のbacktraceがトリガーされることを意味します。これが望ましくない場合は、debugger-mode-hook内でeval-expression-debug-on-errornilにセットするか、debug-on-errornilにセットすることができます。

backtraceバッファーは、実行されている関数と、その関数の引数の値を示します。しのフレームを示す行にポイントを移動して、スタックフレームを指定することもできます。(スタックフレームとは、Lispインタープリターがある関数への特定の呼び出しを記録する場所のことです。) 行ポイントがオンのフレームが、カレントフレーム(current frame)となります。デバッガコマンドのいくつかは、カレントフレームを処理します。ある行がスター(star)で始まる場合は、そのフレームをexitすることにより再びデバッガが呼び出されることを意味します。これは関数のリターン値を調べるとき有用です。

関数名にアンダーラインが引かれている場合は、デバッガがその関数のソースコードも位置を知っていることを意味します。その名前をマウスでクリックするか、そこに移動してRETをタイプして、ソースコードをvisitできます。

デバッガはデバッガ自身のスタックフレーム数を想定するため、バイトコンパイルされて実行されなければなりません。デバッガがインタープリターに解釈されて実行されているとき、これらの想定は正しくなくなります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.6 Debugger Commands

(Debuggerモードの)debuggerバッファーでは、通常のEmacsコマンドに加えて、特別なコマンドが提供されます。デバッガでもっとも重要な使い方をするのは、制御フローを見ることができるコードをステップ実行するコマンドです。デバッガはインタープリターにより解釈された制御構造のステップ実行はできますが、バイトコンパイル済みの関数ではできません。バイトコンパイル済み関数をステップ実行したい場合は、同じ関数の解釈された定義に置き換えてください。(これを行なうには、その関数のソースをvisitして、関数の定義でC-M-xとタイプしてください。) プリミティブ関数のステップ実行にLispデバッガは使用できません。

以下はDebuggerモードのコマンドのリストです:

c

デバッガをexitして、実行を継続する。これはあたかもデバッガにエンターしなかったかのように(デバッガ内で行った変数値やデータ構造の変更などの副作用は除外される)、プログラムの実行を再開する。

d

実行を継続するが、次にLisp関数が何か呼び出されたときはデバッガにエンターする。これにより、ある式の下位の式をステップ実行して、下位の式が計算する値や、行うことを確認できる。

デバッガにエンターした関数呼び出しにたいして、この方法で作成されたスタックフレームには自動的にフラグがつくので、そのフレームをexitすると再びデバッガが呼び出されます。このフラグは、uコマンドを使用してキャンセルできます。

b

カレントフレームにフラグをつけるので、そのフレームをexitするときデバッガにエンターする。この方法でフラグがつけられたフレームは、backtraceバッファーでスターのマークがつく。

u

カレントフレームをexitしたとき、デバッガにエンターしてはならない。これは、そのフレームのbコマンドをキャンセルする。目に見える効果としては、backtraceバッファーの行からスターが削除される。

j

bと同じようにカレントフレームにフラグをつける。その後、cのように実行を継続するが、debug-on-entryによりセットアップされたすべての関数にたいするbreak-on-entryを一時的に無効にする。

e

ミニバッファーのLisp式を読み取り、(関連するlexical環境が適切なら)評価して、エコーエリアに値をプリントする。デバッガは特定の重要な変数とバッファーを処理の一部としてを変更する。eは一時的にデバッガの外部からそれらの値をリストアするので、それらを調べて変更できる。これによりデバッガはより透過的になる。対照的に、デバッガ内でM-:は特別なことを行わず、デバッガ内での変数の値を表示する。

R

eと同様だが、バッファー*Debugger-record*内の評価の結果も保存する。

q

デバッグされているプログラムを終了し、Emacsコマンド実行のトップレベルにリターンする。

C-gによりデバッガにエンターしたが、実際はデバッグではなくquitしたいときは、qコマンドを使用する。

r

デバッガから値をリターンする。ミニバッファーで式を読み取り、それを評価することにより、値が計算される。

dコマンドは、(bによるリクエスト、またはdによるそのフレームへのエンターによる)Lisp呼び出しフレームからのexitでデバッガが呼び出されたときに有用です。rコマンドで指定された値は、そのフレームの値として使用されます。これは、debugを呼び出して、そのリターン値を使用するときも有用です。それ以外は、rcと同じ効果をもyい、指定されたリターン値は問題になりません。

エラーによりデバッガにエンターしたときは、rコマンドは使用できません。

l

呼び出されたときにデバッガを呼び出す関数をリストします。これは、debug-on-entryによりエントリー時にbreakするようセットされた関数のリストです。

v

カレントスタックフレームのローカル変数の表示を切り替えます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.7 Invoking the Debugger

以下では、デバッガを呼び出すために使用される関数debugの完全な詳細を説明します。

Command: debug &rest debugger-args

この関数は、デバッガにエンターします。この関数は*Backtrace*(デバッガへの2回目以降の再帰エントリーでは*Backtrace*<2>、...)という名前のバッファーにバッファーを切り替えて、Lisp関数呼び出しについての情報を書き込みます。それから再帰編集にエンターして、Debuggerモードでbacktraceバッファーを表示します。

Debuggerモードのコマンドcdjrは再帰編集をexitします。その後、debugは以前のバッファーに戻って、debugを呼び出したものが何であれ、そこにリターンします。これは関数debugが呼び出し元にリターン可能な唯一の方法です。

debugger-argsを使用すると、debug*Backtrace*の最上部に残りの引数を表示するもで、ユーザーがそれらを確認できます。以下で説明する場合を除き、これは、これらの引数を使用する唯一の方法です。

しかしdebugへの1つ目の引数にたいする値は、特別な意味をもちます。(これらの値は通常、debugを呼び出すプログラマーではなく、Emacs内部でのみ使用されます。) 以下はこれら特別な値のテーブルです:

lambda

1つ目の引数galambdaの場合、それはdebug-on-next-callが非nilのときに関数にエントリーしたことによりdebugが呼び出されたことを意味する。デバッガはバッファーのトップのテキスト行に‘Debugger entered--entering a function:’と表示する。

debug

1つ目の引数がdebugの場合、それはエントリー時にデバッグされるようにセットされた関数にエントリーしたことによりdebugが呼び出されたことを意味する。デバッガはlambdaのときと同様、‘Debugger entered--entering a function:’を表示します。これはその関数のスタックフレームもマークするので、exit時にデバッガが呼び出される。

t

1つ目の引数がtの場合、それはdebug-on-next-callが非nilのときに関数呼び出しの評価によりdebugが呼び出されたことを示す。デバッガはバッファーのトップの行に‘Debugger entered--beginning evaluation of function call form:’と表示する。

exit

1つ目の引数がexitのときは、exit時にデバッガを呼び出すよう以前にマークされたスタックフレームをexitしたことを示す。この場合は、debugに与えられた2つ目の引数が、そのフレームからリターンされた値になる。デバッガはバッファーのトップの行に‘Debugger entered--returning value:’とリターンされた値を表示する。

error

1つ目の引数がerrorのときは、ハンドルされていないエラーまたはquitがシグナルされてデバッガにエンターした場合で、デバッガは‘Debugger entered--Lisp error:’とその後にシグナルされたエラーおよびsignalへの引数を表示して、それを示す。たとえば、

(let ((debug-on-error t))
  (/ 1 0))

------ Buffer: *Backtrace* ------
Debugger entered--Lisp error: (arith-error)
  /(1 0)
...
------ Buffer: *Backtrace* ------

エラーがシグナルされた場合はおそらく、変数debug-on-errorは非nilで、quitがシグナルされた場合はおそらく、変数debug-on-quitは非nilである。

nil

明示的にデバッガにエンターしたいときは、debugger-argsの1つ目の引数にnilを使用する。残りのdebugger-argsは、バッファーのトップの行にプリントされる。メッセージ — たとえばdebugが呼び出された条件を思い出すためのリマインダー — の表示にこの機能を使用できる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.1.8 Internals of the Debugger

このセクションでは、デバッガ内部で使用される関数と変数について説明します。

Variable: debugger

この関数の値は、デバッガを呼び出す関数呼び出しです。値には任意個の引数をとる関数、より具体的には関数の名前でなければなりません。この関数は何らかのデバッガを呼び出すべきです。この変数のデフォルト値はdebugです。

関数にたいしてLispが渡す1つ目の引数は、その関数がなぜ呼び出されたかを示します。引数の慣習は、debug(Invoking the Debugger)に詳解されています。

Command: backtrace

この関数は現在アクティブなLisp関数呼び出しのトレースをプリントします。この関数はdebug*Backtrace*バッファーに書き込む内容を得るために使用されます。どの関数呼び出しがアクティブか判断するためにスタックにアクセスしなければならないので、この関数はCで記述されています。リターン値は、常にnilです。

以下の例では、Lisp式で明示的にbacktraceを呼び出しています。これはストリームstandard-output(この場合はバッファー‘backtrace-output’)にbacktraceをプリントします。

backtraceの各行は、1つの関数呼び出しを表します。関数の引数が既知の場合は行に値が表示され、まだ計算中の場合は行にその旨が示されます。スペシャルフォームの引数は無視されます。

(with-output-to-temp-buffer "backtrace-output"
  (let ((var 1))
    (save-excursion
      (setq var (eval '(progn
                         (1+ var)
                         (list 'testing (backtrace))))))))

     ⇒ (testing nil)

----------- Buffer: backtrace-output ------------
  backtrace()
  (list ...computing arguments...)
  (progn ...)
  eval((progn (1+ var) (list (quote testing) (backtrace))))
  (setq ...)
  (save-excursion ...)
  (let ...)
  (with-output-to-temp-buffer ...)
  eval((with-output-to-temp-buffer ...))
  eval-last-sexp-1(nil)
  eval-last-sexp(nil)
  call-interactively(eval-last-sexp)
----------- Buffer: backtrace-output ------------
Variable: debug-on-next-call

この変数が非nilの場合、それは次のevalapplyfuncallの前にデバッガを呼び出すよう指定します。デバッガへのエンターにより、debug-on-next-callnilにセットされます。

デバッガのdコマンドは、この変数をセットすることにより機能します。

Function: backtrace-debug level flag

この関数は、そのスタックフレームのlevel下位のスタックフレームのdebug-on-exitフラグにflagに応じた値をセットします。flagが非nilの場合は、後にそのフレームをexitするときデバッガにエンターします。そのフレームを通じた非ローカルexitでも、デバッガにエンターします。

この関数は、デバッガだけに使用されます。

Variable: command-debug-status

この変数はカレントのインタラクティブコマンドのデバッグ状態を記録します。コマンドがインタラクティブに呼び出されるたびに、この変数はnilにバインドされます。デバッガは、同じコマンドが呼び出されたときのデバッガ呼び出しに情報を残すために、この変数をセットできます。

普通のグローバル変数ではなくこの変数を使用する利点は、そのデータが後続のコマンド呼び出しに決して引き継がれないことです。

Function: backtrace-frame frame-number

関数backtrace-frameは、Lispデバッガ内での使用を意図しています。これは、frame-numberレベル下位のスタックフレームで、何の評価が行われているかに関する情報をリターンします。

そのフレームがまだ引数を評価していない場合、またはそのフレームがスペシャルフォームの場合、値は(nil function arg-forms…)です。

そのフレームが引数を評価して関数をすでに呼び出した場合、リターン値は(t function arg-values…)です。

リターン値のfunctionは何であれ評価されたリストのCARとして提供されます。マクロ呼び出しの場合はlambda式になります。その関数に&rest引数がある場合は、リストarg-valuesの末尾に表されます。

frame-numberが範囲外の場合、backtrace-framenilをリターンします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2 Edebug

EdebugはEmacs Lispプログラムにたいするソースレベルデバッガです。これにより、以下のことができます:

以下の初めの3つのセクションは、使用を開始するためにEdebugについて十分説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.1 Using Edebug

EdebugでLispプログラムをデバッグするには、最初にデバッグしたいLispコードをインストルメント(instrument: 計装)しなければなりません。これを行なうもっともシンプルな方法は、関数またはマクロの定義に移動して、C-u C-M-x(プレフィクス引数を指定したeval-defun)を行います。コードをインストルメントする他の手段については、Instrumenting for Edebugを参照してください。

一度関数をインストルメントすると、その関数にたいする任意の呼び出しにより、Edebugがアクティブになります。Edebugがアクティブになると、どのEdebug実行モードを選択したかに依存して、その関数をステップ実行できるように実行がストップされるか、ディスプレイを更新してデバッグコマンドにたいするチェックの間、実行が継続されます。デフォルトの実行モードstepで、これは実行をストップします。Edebug Execution Modesを参照してください。

Edebugでは通常、デバッグしているLispコードをEmacsバッファーで閲覧します。これをソースコードバッファー(source code buffer)と呼び、バッファーは一時的に読み取り専用になります。

左フリンジの矢印は、その関数で実行されている行を示します。最初ポイントはその関数の実行されている行にありますが、ポイントを移動するとこれは真ではなくなります。

以下は、facの定義(以下を参照)をインストルメントして(fac 3)を実行した場合に通常目にするものです。ポイントは、ifの前の開きカッコにあります。

(defun fac (n)
=>∗(if (< 0 n)
      (* n (fac (1- n)))
    1))

関数内でEdebugが実行をストップできる位置のことを、ストップポイント(stop points)と呼びます。ストップポイントは、リストであるような部分式の前後、および変数参照の後でも発生します。以下は、関数fac内のストップポイントをピリオドで示したものです:

(defun fac (n)
  .(if .(< 0 n.).
      .(* n. .(fac .(1- n.).).).
    1).)

Emacs Lispモードのコマンドに加えて、ソースコードバッファーでは、Edebugのスペシャルコマンドが利用できます。たとえば、EdebugコマンドSPCで次のストップポイントまで実行することができます。facにエントリーした後に一度facとタイプした場合は、以下のように表示されるでしょう:

(defun fac (n)
=>(if ∗(< 0 n)
      (* n (fac (1- n)))
    1))

式の後でEdebugが実行をストップしたときは、エコーエリアにその式の値が表示されます。

他にも頻繁に使用されるコマンドとして、ストップポイントにbreakpointをセットするb、breakpointに達するまで実行するg、Edebugをexitしてトップレベルのコマンドループにリターンするqがあります。また、?とタイプするとすべてのEdebugコマンドがリストされます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.2 Instrumenting for Edebug

LispコードのデバッグにEdebugを使用するためには、最初にそのコードをインストルメント(instrument: 計装)しなければなりません。コードをインストルメントすると、適切な位置でEdebugを呼び出すために追加コードが挿入されます。

関数定義でプレフィクス引数とともにコマンドC-M-x (eval-defun)を呼び出すと、それを評価する前にその定義をインストルメントします。(ソースコード自体は変更しません。) 変数edebug-all-defsが非nilの場合は、プレフィクス引数の意味を反転します。この場合、C-M-xはプレフィクス引数がなければその定義をインストルメントします。edebug-all-defsのデフォルト値はnilです。コマンドM-x edebug-all-defsは、変数edebug-all-defsの値を切り替えます。

edebug-all-defsが非nilの場合はeval-regioneval-current-buffereval-bufferも、それらが評価する定義をインストルメントします。同様に、edebug-all-formsは、eval-regionが(非定義フォームさえ含む)あらゆるフォームをインストルメントすべきかを制御します。これはミニバッファー内でのロードや評価には適用されません。コマンドM-x edebug-all-formsは、このオプションを切り替えます。

他にもコマンドM-x edebug-eval-top-level-formが利用可能で、これはedebug-all-defsedebug-all-formsの値に関わらず、トップレベルの任意のフォームをインストルメントします。edebug-defunedebug-eval-top-level-formのエイリアスです。

Edebugがアクティブのの間、コマンドI(edebug-instrument-callee)は、ポイント後のリストフォームに呼び出される関数およびマクロ定義がまだインストルメントされていなければ、それらをインストルメントします。これは、そのファイルのソースの場所をEdebugが知っている場合だけ可能です。この理由によりEdebugロード後は、たとえ評価する定義をインストルメントしない場合でも、eval-regionは評価するすべての定義の位置を記録します。インストルメント済み関数呼び出しにステップインするiコマンド(Jumpingを参照)も参照してください。

Edebugはすべての標準スペシャルフォーム、式引数をもつinteractiveフォーム、無名ラムダ式、およびその他の定義フォームのインストルメント方法を知っています。しかし、Edebugはユーザー定義マクロが引数にたいして何を行うかを判断できないので、Edebug仕様を使用してその情報を与えなければなりません。詳細はEdebug and Macrosを参照してください。

Edebugがセッション内で最初にコードをインストルメントしようとするときは、フックedebug-setup-hookを実行してから、それにnilをセットします。使おうとしているパッケージに結びつけてEdebug仕様をロードするためにこれを使用できますが、それはEdebugを使用するときだけ機能します。

定義からインストルメントを削除するには、単にインストルメントを行わない方法でその定義を再評価するだけです。フォームを絶対にインストルメントせずに評価するには、2つの方法があります。それはファイルからのloadによる評価と、ミニバッファーからのeval-expression(M-:)による評価です。

Edebugがインストルメント中にシンタックスエラー(syntax error: 構文エラー)を検知した場合は、間違ったコードの箇所にポイントを残してinvalid-read-syntaxエラーをシグナルします。

Edebug内で利用可能な他の評価関数については、Evaluationを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.3 Edebug Execution Modes

Edebugは、デバッグするプログラムの実行にたいして、いくつかの実行モードをサポートします。これらの実行モードを、Edebug実行モード(Edebug execution modes)と呼びます。これらをメジャーモードやマイナーモードと混同しないでください。カレントのEdebug実行モードは、プログラムをストップする前にEdebugがどれだけ実行を継続するか — たとえばストップポイントごとにストップ、あるいは次のbreakpointまで継続など — と、ストップする前にEdebugがどれだけ進捗を表示するかを決定します。

Edebug実行モードは通常、ある特定のモードでプログラムを継続させるコマンドをタイプすることにより指定します。以下は、それらのコマンドのテーブルです。プログラムの実行を再開S以外は、少なくともある長さの間だけ実行を継続します。

S

Stop(ストップ): これ以上プログラムを実行しないで、Edebugのコマンドを待つ(edebug-stop)。

SPC

Step(ステップ): 次のストップポイントでストップする(edebug-step-mode)。

n

Next(次へ): 式の後にある次のストップポイントでストップする(edebug-next-mode)。Jumpingedebug-forward-sexpも参照。

t

Trace(トレース): Edebugのストップポイントごとにpause(通常は1秒)する(edebug-trace-mode)。

T

Rapid trace(高速でトレース):ストップポイントごとに表示を更新するが、実際にpauseはしない(edebug-Trace-fast-mode)。

g

Go(進む): 次のbreakpointまで実行する(edebug-go-mode)。Edebug Breakpointsを参照。

c

Continue(継続): breakpointごとにpauseしてから継続する(edebug-continue-mode)。

C

Rapid continue(高速で継続): ポイントを各breakpointへ移動するが、pauseしない(edebug-Continue-fast-mode)。

G

Go non-stop(ストップせず進む): breakpointを無視する(edebug-Go-nonstop-mode)。まだS、またはその他の編集コマンドでプログラムをストップするのは可能。

一般的に、上記リストの最初のほうにある実行モードは後のほうの実行モードに比べて、プログラムをより低速に実行、またはすぐにストップさせます。

実行中、またはトレース中は、任意のEdebugコマンドをタイプすることにより、実行をインタラプト(interrupt: 中断、割り込み)できます。Edebugは次のストップポイントでプログラムをストップしてから、タイプされたコマンドを実行します。たとえば、実行中にtをタイプすると、次のストップポイントでトレースモードに切り替えます。Sを使用すれば、他に何も行わずに実行をストップできます。

関数でたまたま読み取り入力が発生した場合には、実行のインタラプトを意図してタイプされた文字は、かわりにその関数により読み取られます。そのプログラムが入力を欲するタイミングに注意を払うことで、そのような意図せぬ結果を避けることができます。

このセクションのコマンドを含むキーボードマクロは、完全には機能しません。プログラムを再開するためにEdebugからexitすると、キーボードマクロの追跡記録は失われます。これを処理するのは、簡単ではありません。またEdebug外部でキーボードマクロを定義または実行しても、Edebug内部のコマンドに影響しません。通常これは利点です。Edebug Options内のedebug-continue-kbd-macroオプションも参照してください。

新たなEdebugレベルにエンターしたとき、初期の実行モードは変数edebug-initial-modeの値により与えられます(Edebug Optionsを参照)。デフォルトでこれはstepモードを指定します。たとえば1つのコマンドからインストルメント済みの関数が複数回呼び出された場合は、同じEdebugレベルに再エンターするかもしれないことに注意してください。

User Option: edebug-sit-for-seconds

このオプションは、traceモードおよびcontinueモードで実行ステップの間を何秒待つか指定します。デフォルトは1秒です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.4 Jumping

このセクションで説明するコマンドは、指定された場所に達するまで実行を続けます。iを除くすべてのコマンドは、ストップ場所を確立するために一時的なbreakpointを作成してから、goモードにスイッチします。意図されたストップポイントの前にある他のストップポイントに達した場合も、実行はストップします。breakpointの詳細は、Edebug Breakpointsを参照してください。

これらのコマンドは、非ローカルexitの場合はプログラムのストップを期待する一時的なbreakpointをバイパスできるので、期待どおり機能しないかもしれません。

h

ポイントがある場所の近くのストップポイントへ実行を進める(edebug-goto-here)。

f

プログラムの式を1つ分実行する(edebug-forward-sexp)。

o

sexpを含む終端までプログラムを実行する(edebug-step-out)。

i

ポイントの後のフォームから呼び出された関数またはマクロにステップインする(edebug-step-in)。

hコマンドは一時的なbreakpointを使用して、ポイントのカレント位置、またはその後のストップポイントまで処理を進めます。

fコマンドは式を1つ飛び越してプログラムを実家します。より正確には、forward-sexpにより到達できる位置に一時的なbreakpointをセットしてからgoモードで実行するので、プログラムはそのbreakpointでストップすることになります。

プレフィクス引数nとともに使用した場合は、ポイントからn個のsexp(s-expression: S式)を超えた場所に一時的なbreakpointをセットします。ポイントを含むリストがnより少ない要素で終わるような場合は、ストップ箇所はポイントが含まれる式の後になります。

forward-sexpが見つける位置と、プログラムを実際にストップさせたい位置なのかチェックしなければなりません。たとえばcond内では、これは正しくないかもしれません。

fコマンドは柔軟性を与えるために、forward-sexpをストップポイントではなく、ポイント位置から開始します。カレントのストップポイントから1つの式を実行したい場合は、まずそこにポイントを移動するためにw(edebug-where)をタイプして、それからfをタイプしてください。

oコマンドは、式の“外側”で実行を継続します。これは、ポイントを含む式の最後に一時的なbreakpointを配します。ポイントを含むsexpが関数定義の場合、oはその定義内の最後のsexpの直前まで実行を継続します。もし定義内の最後のsexpの直前にポイントがある場合は、その関数からリターンしてからストップします。他の言い方をすると、このコマンドは最後のsexpの後にポイントがない場合は、カレントで実行中の関数からexitしません。

iコマンドは、ポイントの後のリストフォームに呼び出された関数、またはマクロにステップインします。そのフォームは、評価されようとしているもの1つである必要はないことに注意してください。しかし、そのフォームが評価されようとしている関数呼び出しの場合は、引数が何も評価されないうちにこのコマンドを使用しないと、遅すぎることを覚えておいてください。

iコマンドは、ステップインしようとしている関数またはマクロがまだインストルメントされていない場合は、それらをインストルメントします。これは便利かもしれませんが、それらを明示的に非インストルメントしない場合、その関数またはマクロはインストルメントされたままになることを覚えておいてください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.5 Miscellaneous Edebug Commands

ここでは、その他のEdebugコマンドを説明します。

?

Edebugのヘルプメッセージを表示する(edebug-help)。

C-]

1レベルを中断して以前のコマンドレベルへ戻る(abort-recursive-edit)。

q

エディターのトップレベルのコマンドループにリターンする(top-level)。これは、すべてのレベルのEdebugアクティビティを含む、すべての再帰編集レベルをexitする。しかし、フォームunwind-protectまたはcondition-caseで保護されたインストルメント済みのコードはデバッグを再開するかもしれない。

Q

qと同様だが、保護されたコードでもストップしない(edebug-top-level-nonstop)。

r

エコーエリアに、もっとも最近の既知のコマンドを再表示する(edebug-previous-result)。

d

backtraceを表示するが、明確であるようにEdebug自身の関数は除外される(edebug-backtrace)。

Edebugのbacktraceバッファーでは、標準デバッガ内のようにバッガコマンドは使用できない。

実行を継続したとき、backtraceバッファーは自動的にkillされる。

Edebugから再帰的にEdebugをアクティブにするコマンドを呼び出すことができます。Edebugがアクティブなときは常に、qによトップレベルの終了、またはC-]による再帰編集1レベルの中断ができます。dにより、すべての未解決な評価のbacktraceを表示できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.6 Breaks

Edebugのstepモードは、次のストップポイントに達したときに、実行をストップします。一度開始されたEdebugの実行をストップするには、他に3つの方法があります。それはbreakpoint、グローバルbreak条件、およびソースbreakpointです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.6.1 Edebug Breakpoints

Edebugを使用しているときは、テスト中のプログラム内にbreakpointを指定できます。breakpointとは、実行がストップされる場所のことです。Using Edebugで定義されている任意のストップポイントに、breakpointをセットできます。breakpointをセットおよび解除において影響を受けるストップポイントは、ソースコードバッファー内でポイント位置、またはポイント位置の後の最初のストップポイントです。以下はEdebugのbreakpoint用のコマンドです:

b

ポイント位置、またはポイント位置の後のストップポイントに、breakpointをセットする(edebug-set-breakpoint)。プレフィクス引数を使用した場合、それは一時的なbreakpointになり、プログラムが最初にそこで停止したとき解除される。

u

(もしあれば)ポイント位置、またはポイント位置の後のストップポイントにあるbreakpointを解除(unset)する(edebug-unset-breakpoint)。

x condition RET

conditionを評価して非nil値になる場合だけプログラムをストップする、条件付きbreakpointをセットする(edebug-set-conditional-breakpoint)。プレフィクス引数を指定した場合は、一時的なbreakpointになる。

B

カレント定義内の、次のbreakpointにポイントを移動する(edebug-next-breakpoint)。

Edebug内では、bでbreakpointをセットして、uでそれを解除できます。最初に望ましいストップポイントにポイントを移動してから、そこにbreakpointをセットまたは解除するためにbまたはuをタイプしますbreakpointがない場所でbreakpointを解除しても、影響はありません。

ある定義を再評価、または再インストルメントすると、以前のbreakpointはすべて削除されます。

条件付きbreakpoint(conditional breakpoint)は、プログラムがそこに達するたびに条件をテストします。条件を評価した結果エラーが発生した場合、エラーは無視され結果はnilになります。条件付きbreakpointをセットするにはxを使用して、ミニバッファーで条件式を指定します。以前にセットされた条件付きbreakpointがあるストップポイントに条件付きbreakpointをセットすると、以前の条件式がミニバッファーに配されるので、それを編集できます。

プレフィクス引数を指定してbreakpointをセットするコマンドを使用することにより、一時的な条件付きbreakpoint、および無条件のbreakpointを作成できます。一時的なbreakpointによりプログラムがストップしたとき、そのbreakpointは自動的に解除されます。

Go-nonstopモードを除き、Edebugは常にbreakpointでストップ、またはpauseします。Go-nonstopモードでは、breakpointは完全に無視されます。

breakpointがどこにあるか探すには、Bコマンドを使用します。このコマンドは同じ関数内から、ポイント以降にある次のbreakpoint(ポイント以降にbreakpointが存在しない場合は最初のbreakpoint)にポイントを移動します。このコマンドは実行を継続せず、単にバッファー内のポイントを移動します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.6.2 Global Break Condition

グローバルbreak条件(global break condition)は指定された条件が満たされたとき、それがどこで発生したかによらず、実行をストップします。Edebugは、すべてのストップポイントでグローバルbreak条件を評価します。これが非nil値に評価された場合は、あたかもそのストップポイントにbreakpointがあったかのように、実行をストップまたはpauseします(実行モードによる)。条件の評価でエラーを取得した場合は、実行をストップしません。

条件式はedebug-global-break-conditionに格納されます。EdebugがアクティブなときにソースバッファーからXコマンドを使用するか、Edebugがロードされている間は任意のバッファーから任意のタイミングでC-x X X(edebug-set-global-break-condition)を使用することにより新たな式を指定できます。

グローバルbreak条件は、コード内のどこでイベントが発生したかを見つけるもっともシンプルな方法ですが、コードの実行は遅くなります。そのため、使用しないときは条件をnilにリセットするべきです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.6.3 Source Breakpoints

定義内のすべてのbreakpointは、それをインストルメントするたびに失われます。breakpointが失われないようにしたい場合は、ソースコード内で単に関数edebugを呼び出すソースbreakpoint(source breakpoint)を記述できます。もちろん、そのような呼び出しを条件付きすることにもできます。たとえばfac関数内に以下のような行を1行目に挿入して、引数が0になったときストップさせることができます:

(defun fac (n)
  (if (= n 0) (edebug))
  (if (< 0 n)
      (* n (fac (1- n)))
    1))

facの定義がインストルメントされて呼び出されたとき、edebug呼び出しはbreakpointとして振る舞います。実行モードに応じて、Edebugはそこでストップまたはpauseします。

edebugが呼び出されたときにインストルメント済みのコードが実行されていなければ、この関数はdebugを呼び出します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.7 Trapping Errors

エラーがシグナルされて、それがcondition-caseでハンドルされていないとき、Emacsは通常エラーメッセージを表示します。Edebugがアクティブでインストルメント済みのコードを実行中は、ハンドルされていないエラーには通常Edebugが対応します。オプションedebug-on-errorおよびedebug-on-quitで、これをカスタマイズできます。Edebug Optionsを参照してください。

Edebugがエラーに対応するときは、エラー発生箇所の前にある最後のストップポイントを表示します。この場所はインストルメントされていない関数の呼び出しで、その関数内で実際にエラーが発生したのかもしれません。バインドされていない変数に関するエラーの場合は、最後の既知のストップポイントは、その不正な変数参照から遠く離れた場所かもしれません。そのような場合は、完全なbacktraceを表示したいと思うでしょう(Miscellaneous Edebug Commandsを参照)。

Edebugがアクティブの間にdebug-on-error、またはdebug-on-quitを変更した場合、それらの変更はEdebugが非アクティブになったとき失われます。さらに、Edebugの再帰編集の間、これらの変数はEdebugの外部でもっていた値にバインドされます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.8 Edebug Views

これらのEdebugコマンドは、Edebugにエントリーする前のバッファーの外観と、ウィンドウの状態を調べるコマンドです。外部のウィンドウ構成は、ウィンドウのコレクションとその内容であり、これらは実際にEdebugの外部にあります。

v

外部のウィンドウ構成ビューに切り替える(edebug-view-outside)。Edebugにリターンするには、C-x X wをタイプする。

p

一時的に外部のカレントバッファーを表示し、ポイントもその外部の位置になる(edebug-bounce-point)。Edebugにリターンする前に、1秒pauseする。プレフィクス引数nを指定すると、かわりにn秒pauseする。

w

ソースコードバッファー内のカレントストップポイントにポイントを戻す(edebug-where)。

このコマンドを同じバッファーを表示する異なるウィンドウで使用した場合には、そのウィンドウは将来カレント定義を表示するために代用される。

W

Edebugが外部のウィンドウ構成を保存、およびリストアするかどうかを切り替える(edebug-toggle-save-windows)。

プレフィクス引数を指定すると、Wは選択されたウィンドウの保存とリストアだけを切り替える。ソースコードバッファーを表示していないウィンドウを指定するには、グローバルキーマップからC-x X Wを使用しなければならない。

v、または単にpでカレントバッファーにポイントを反跳させれば、たとえ通常は表示されないウィンドウでも、外部のウィンドウ構成を調べることができます。

ポイントを移動した後に、ストップポイントに戻りたいときがあるかもしれません。これは、ソースコードバッファーからwで行うことができます。どのバッファーにいても、C-x X wを使用すれば、ソースコードバッファー内のストップポイントに戻ることができます。

保存をオフにするためにWを使用するたびに、Edebugは外部のウィンドウ構成を忘れます。そのため、たとえ保存をオンに戻しても、(プログラムを実行することにより)次にEdebugをexitしたとき、カレントウィンドウ構成は変更されないまま残ります。しかし、十分な数のウィンドウをオープンしていない場合は、*edebug**edebug-trace*の再表示が、あなたが見たいバッファーと競合するかもしれません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.9 Evaluation

Edebug内では、まるでEdebugが実行されていないかのように、式を評価できます。式の評価とプリントに際して、Edebugが不可視になるよう試みます。。副作用をもつ式の評価は、Edebugが明示的に保存とリストアを行うデータへの変更を除き、期待したとおり機能するでしょう。このプロセスの詳細は、The Outside Contextを参照してください。

e exp RET

Edebugのコンテキスト外で、式expを評価する(edebug-eval-expression)。つまり、Edebugはその式への干渉を最小限にしようと努める。

M-: exp RET

Edebug自身のコンテキスト内で、式expを評価する(eval-expression)。

C-x C-e

Edebugのコンテキスト外で、ポイントの前の式を評価する(edebug-eval-last-sexp)。

Edebugは、cl.el内の構文(lexical-letmacroletsymbol-macrolet)により作成された、レキシカル(lexical)にバインドされたシンボルへの参照を含む式の評価をサポートします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.10 Evaluation List Buffer

式をインタラクティブに評価するために、*edebug*と呼ばれる評価リストバッファー(evaluation list buffer)を使用できます。Edebugがディスプレイを更新するたびに自動的に評価される、式の評価リスト(evaluation list)もセットアップできます。

E

評価リストバッファー*edebug*に切り替える(edebug-visit-eval-list)。

*edebug*バッファーでは、以下の特別なコマンドと同様に、Lisp Interactionモード(see Lisp Interaction in The GNU Emacs Manual)のコマンドも使用できます。

C-j

ポイントの前の式をコンテキスト外で評価して、その値をバッファーに挿入する(edebug-eval-print-last-sexp)。

C-x C-e

Edebugのコンテキスト外で、ポイントの前の式を評価する(edebug-eval-last-sexp)。

C-c C-u

バッファー内のコンテンツから、新たに評価リストを構築する(edebug-update-eval-list)。

C-c C-d

ポイントのある評価リストグループを削除する(edebug-delete-eval-item)。

C-c C-w

ソースコードバッファーに切り替えてカレントストップポイントに戻る(edebug-where)。

評価リストウィンドウ内では、*scratch*にいるときと同様に、C-jC-x C-eで式を評価できますが、それらはEdebugのコンテキスト外で評価されます。

インタラクティブに入力した式(とその結果)は、実行を継続すると失われます。しかし、実行がストップされるたびに評価されるように、式から構成される評価リストをセットアップできます。

これを行なうには、評価リストバッファー内で1つ以上の評価リストグループ(evaluation list group)を記述します。評価リストグループは、1つ以上のLisp式から構成されます。グループはコメント行で区切られます。

コマンドC-c C-u(edebug-update-eval-list)は、バッファーをスキャンして各グループの最初の式を使用して、評価リストを再構築します。(これはグループの2つ目の式は以前に計算、表示されている値だという発想からです。)

Edebugにエントリーするたびに、評価リストの各式(および式の後に式のカレント値)をバッファーに挿入して再表示します。これはコメント行も挿入するため、各式はそのグループの一員となります。したがって、バッファーのテキストを変更せずにC-c C-uとタイプした場合、評価リストは実際には変更されません。

評価リストからの評価の間にエラーが発生した場合、それが式の結果であるかのようにエラーメッセージが文字列で表示されます。したがって、カレントで無効な変数を使用する式により、デバッグが中断されることはありません。

以下は、いくつかの式を評価リストウィンドウに追加したとき、どのように見えるかの例です:

(current-buffer)
#<buffer *scratch*>
;---------------------------------------------------------------
(selected-window)
#<window 16 on *scratch*>
;---------------------------------------------------------------
(point)
196
;---------------------------------------------------------------
bad-var
"Symbol's value as variable is void: bad-var"
;---------------------------------------------------------------
(recursion-depth)
0
;---------------------------------------------------------------
this-command
eval-last-sexp
;---------------------------------------------------------------

グループを削除するには、グループ内にポイントを移動してC-c C-dをタイプするか、単にグループのテキストを削除してC-c C-uで評価リストを更新します。評価リストに新たな式を追加するには、適切な箇所にその式を挿入し、新たなコメント行を挿入してからC-c C-uをタイプします。コメント行にダッシュを挿入する必要はありません — 内容は関係ないのです。

*edebug*を選択した後に、C-c C-wでソースコードバッファーにリターンできます。*edebug*は実行を継続したときkillされ、次回必要なとき再作成されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.11 Printing in Edebug

プログラム内の式が循環リスト構造(circular list structure)を含む値を生成する場合は、Edebugがそれをプリントしようとしたときエラーとなるかもしれません。

循環構造への対処の1つに、print-lengthおよびprint-levelにプリントの切り詰めをセットする方法があります。Edebugは、変数edebug-print-lengthおよびedebug-print-levelの値(非nil値をもつ場合)を、これらの変数にバインドします。Variables Affecting Outputを参照してください。

User Option: edebug-print-length

nilの場合は、結果をプリントするときEdebugはprint-lengthをこの値にバインドする。デフォルト値は50

User Option: edebug-print-level

nilの場合は、結果をプリントするときEdebugはprint-levelをこの値にバインドする。デフォルト値は50

print-circleを非nil値にバインドして、循環構造や要素を共有する構造を、より参考になる情報をプリントすることもできます。

以下は循環構造を作成するコードの例です:

(setq a '(x y))
(setcar a a)

カスタムプリントはこれを、‘Result: #1=(#1# y)’のようにプリントします。‘#1=’という表記はその後の構造をラベル‘1’とラベル付けし、‘#1#’表記はその前にラベル付けされた構造を参照しています。この表記は、リストやベクターの任意の共有要素に使用されます。

User Option: edebug-print-circle

nilの場合は、結果をプリントするときEdebugはprint-circleをこの値にバインドする。デフォルト値はt

他にプログラムもカスタムプリントを使用できます。詳細はcust-print.elを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.12 Trace Buffer

Edebugは実行トレースを*edebug-trace*という名前のバッファーに格納して記録できます。実行トレースとは関数呼び出しよリターンのログのことで、関数名と引数、および値が確認できます。トレースレコードを有効にするには、edebug-traceを非nil値にセットしてください。

トレースバッファーの作成は、実行モードのトレースの使用(Edebug Execution Modesを参照)と同じではありません。

トレースレコードが有効なときは、関数へのエントリーとexitのたびに、トレースバッファーに行が追加されます。関数エントリーレコードは‘::::{’、および関数名と引数の値により構成されます。関数exitレコードは‘::::}’、および関数名と関数の結果により構成されます。

:’の数は、関数エントリーの再帰レベルを表します。トレースバッファーでは、関数呼び出しの開始と終了の検索に‘{’と‘}’を使用できます。

関数edebug-print-trace-beforeおよびedebug-print-trace-afterを再定義することにより、関数エントリーと関数exitのトレースレコードをカスタマイズできます。

Macro: edebug-tracing string body…

このマクロはbodyフォーム実行活動にたいする、追加のトレース情報をリクエストする。引数stringは、トレースバッファーに配す‘{’または‘}’の後のテキストを指定する。すべての引数は評価され、edebug-tracingbody内の最後のフォームの値をリターンする。

Function: edebug-trace format-string &rest format-args

この関数は、トレースバッファーにテキストを挿入する。テキストは、(apply 'format format-string format-args)により計算される。エントリー間の区切りとして改行も付け加える。

edebug-tracingおよびedebug-traceは、たとえEdebugが非アクティブでも、呼び出されたときは常にトレースバッファーに行を挿入します。トレースバッファーへのテキストの追加により、挿入された最後の行が見えるようにウィンドウもスクロールします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.13 Coverage Testing

Edebugは基本的なカバレッジテスト(coverage test)と実行頻度(execution frequency)の表示を提供します。

カバレッジテストは、すべての式の結果と以前の結果を比較することにより機能します。プログラム内のフォームがそれぞれ、カレントEmacsセッション内でカバレッジテストを開始して以降に、2つの異なる値をリターンした場合、それらのフォームは“カバー”されたと判断します。したがって、プログラムにカバレッジテストを行なうには、そのプログラムをさまざまなコンディション下で実行して、プログラムが正しく振る舞うかに注目します。異なるコンディション下で十分にテストして、すべてのフォームが異なる2つの値をリターンしたとき、Edebugはそのことを告げるでしょう。

カバレッジテストにより実行速度が低下するので、edebug-test-coverageが非nilのときだけカバレッジテストが行なわれます。頻度計数(frequency count)は、たとえ実行モードがGo-nonstopでも、カバレッジテストが有効か無効かに関わらず、すべての式にたいして処理されます。

定義にたいするカバレッジ情報と頻度数の両方を表示するには、C-x X =(edebug-display-freq-count)を使用する。単に=(edebug-temp-display-freq-count)とすると、他のキーをタイプするまでの間だけ、同様な情報を一時的に表示する。

Command: edebug-display-freq-count

このコマンドは、カレント定義の各行の頻度数を表示する。

このコマンドは、コードの各行の下にコメント行として頻度数を挿入する。1回のundoコマンドで、すべての挿入をアンドゥできる。頻度数は式の前の‘(’、または式の後の‘)’、または変数の最後の文字の下に表示される。表示をシンプルにするために、同一行にたいして式の以前頻度数と頻度数が同じ場合は表示しない。

ある式にたいする頻度数の後に文字‘=’がある場合、それはその式が評価されるたびに毎回同じ値をリターンしていることを表す。他の言い方をすると、カバレッジテストの目的からは、その式はまだ“カバー”されていないということである。

ある定義にたいして頻度数とカバレッジデータを明確にするには、単にeval-defunで再インストルメントすればよい。

たとえば、ソースのbreakpointで(fac 5)を評価した後、edebug-test-coveragetにセットすると、breakpointに達したときの頻度データは以下のようになります:

(defun fac (n)
  (if (= n 0) (edebug))
;#6           1      = =5
  (if (< 0 n)
;#5         =
      (* n (fac (1- n)))
;#    5               0
    1))
;#   0

コメント行は、facが6回呼び出されたことを表しています。最初のif命令は毎回同じ結果を5回リターンしています。同じ結果という意味では、2つ目のifの条件にも当てはまります。facの再帰呼び出しは、結局リターンしません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.14 The Outside Context

Edebugはデバッグ中のプログラムにたいして透過的であろうと努めますが、完全には達成されません。Edebugは、eや評価リストバッファーで式を評価するときも、一時的に外部のコンテキストをリストアして、透明化を試みます。このセクションではEdebugがリストアするコンテキストと、Edebugがいかにして完全に透過的になるのに失敗するかを正確に説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.14.1 Checking Whether to Stop

Edebugにエンターするときは常に特定のデータの保存とリストアを行なう必要があり、それはトレース情報を作成するか、あるいはプログラムを停止するかを決定する前に行なう必要があります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.14.2 Edebug Display Update

(たとえばtraceモードなどで)Edebugが何かを表示する必要があるときは、Edebugの“外部”からカレントウィンドウ構成(Window Configurationsを参照)を保存します。Edebugをexitするときに、以前のウィンドウ構成がリストアされます。

Emacsは、pause時だけ再表示を行います。通常は実行を継続したときに、そのプログラムはbreakpointまたはステップ実行後にEdebugに再エンターし、その間にpauseや入力の読み取りはありません。そのような場合、Emacsが“外部”の構成を再表示する機会は決してありません。結果として、ユーザーが目にするウィンドウ構成は、前回Edebugが中断なしでアクティブだったときのウィンドウ構成と同じになります。

何かを表示するためにEdebugにエントリーすることにより、(たとえこれらのうちのいくつかは、エラーやquitがシグナルされたときは、故意にリストアしないデータだとしても)以下のデータも保存およびリストアされます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.14.3 Edebug Recursive Edit

Edebugにエンターしてユーザーのコマンドが実際に読み取られるとき、Edebugは以下の追加データを保存(そして後でリストア)します:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15 Edebug and Macros

Edebugが正しくマクロを呼び出す式をインストルメントするには、いくつかの特定な配慮が必要になります。このサブセクションでは、その詳細を説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15.1 Instrumenting Macro Calls

EdebugがLispマクロを呼び出す式をインストルメントするときは、正しくインストルメントを行なうために、そのマクロに関して追加の情報が必要になります。これは、マクロ呼び出しのどの部分式(subexpression)が評価されるフォームなのか推測する方法がないからです。(評価はマクロのbodyで明示的に発生するかもしれないし、展開結果が評価されるとき、または任意のタイミングで行われるかもしれません。)

したがって、Edebugが処理するかもしれないすべてのマクロにたいして、そのマクロの呼び出しフォーマットを説明するための、Edebug仕様(Edebug specification)を定義しなければなりません。これを行なうには、マクロ定義にdebug宣言を追加します。以下はマクロ例for(Evaluating Macro Arguments Repeatedlyを参照)にたいする簡単な仕様の例です。

(defmacro for (var from init to final do &rest body)
  "Execute a simple \"for\" loop.
For example, (for i from 1 to 10 do (print i))."
  (declare (debug (symbolp "from" form "to" form "do" &rest form)))
  ...)

このEdebug仕様は、マクロ呼び出しのどの部分が評価されるフォームなのかを示しています。単純なマクロにたいするEdebug仕様は、そのマクロ定義の正式な引数リストに非常に類似している場合がありますが、Edebug仕様はマクロ引数に比べより汎的です。declareフォームの詳細は、Defining Macrosを参照してください。

コードをインストルメントするときEdebugに仕様が確実に解るよう注意してください。マクロ定義を含む他のファイルを要求するためにeval-when-compileを使用するファイルから関数をインストルメントする場合は、そのファイルを明示的にロードする必要があるかもしれません。

def-edebug-specによりマクロ定義から個々のマクロにたいしてEdebug仕様を定義することもできます。Lispで記述されたマクロ定義にたいしてはdebug宣言を追加するほうが好ましく、その方が便利でもありますが、def-edebug-specではCで実装されたスペシャルフォームにたいしてEdebug仕様を定義することが可能になります。

Macro: def-edebug-spec macro specification

マクロmacro呼び出しのどの式が評価される式かを指定する。specificationはEdebug仕様である。どちらの引数も評価されない。

引数macroは単なるマクロ名ではない、任意の実シンボルを指定できる。

以下はspecificationに指定できるシンボルと、引数を処理する方法のテーブルです。

t

すべての引数は評価のためにインストルメントされる。

0

引数はインストルメントされない。

シンボル

そのシンボルは、かわりに使用されるEdebug仕様をもたなければならない。このインダイレクションは、他の種類の仕様が見つかるまで繰り返される。これにより、他のマクロの仕様を継承できる。

リスト

リストの要素はフォーム呼び出しの引数の型を記述する。仕様リストに指定できる要素については、以降のセクションを参照。

マクロがEdebug仕様をもたない場合は、debug宣言およびdef-edebug-spec呼び出しのどちらを通じても、変数edebug-eval-macro-argsが効果を発揮する。

User Option: edebug-eval-macro-args

これは、Edebugが明示的なEdebug仕様をもたないマクロ引数を扱う方法を制御する。nil(デフォルト)の場合、引数は評価のためにインストルメントされない。それ以外は、すべての引数がインストルメントされる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15.2 Specification List

あるマクロ呼び出しにおいて、いくつかの引数は評価されるが、それ以外の引数は評価されないような場合には、Edebug仕様のために仕様リスト(specification list)が要求されます。仕様リスト内のいくつかの要素は1つ以上の引数にマッチしまづが、それ以外の要素は以降に続くすべての引数の処理を変更します。後者は仕様キーワード(specification keywords)と呼ばれ、(&optionalのように)‘&’で始まるシンボルです。

仕様リストは、それ自身がリストであるような引数にマッチする部分リスト(sublist)、またはグループ化に使用されるベクターを含むかもしれません。したがって部分式とグループは、仕様リストをレベル階層に細分化します。仕様キーワードは、部分式やグループを含むものの残りに適用されます。

仕様リストに選択肢や繰り返しが含まれる場合は、実際のマクロの呼び出しにたいしてマッチさせるためにバックトラックが要求されるかもしれません。詳細は、Backtracking in Specificationsを参照してください。

Edebug仕様は、バランスのとれたカッコで括られた部分式へのマッチ、フォームの再帰処理、インダイレクト仕様を通じた再帰などの、正規表現によるマッチングと、コンテキストに依存しない文法構成を提供します。

以下は仕様リストに使用できる要素と、その意味についてのテーブルです(使用例はSpecification Examplesを参照):

sexp

評価れない単一のLispオブジェクト。インストルメントされない。

form

評価される単一のLispオブジェクト。インストルメントされる。

place

汎変数(generalized variable)。Generalized Variablesを参照。

body

&rest formの省略形。以下の&restを参照。

function-form

関数フォーム。クォートされた関数シンボル、クォートされたラムダ式、または(関数シンボルかラムダ式に評価される)フォームのうちのどれか。これはラムダ式のbodyをいずれかの方法でインストルメントするため、functionよりもquoteでクォートされたラムダ式の引数にたいし有用。

lambda-expr

クォートされないラムダ式。

&optional

仕様リスト内の後続の要素はオプション。マッチしない要素が出現すると、Edebugはこのレベルのマッチングを停止する。

後続が非オプションの要素であるような数個の要素をオプションにするだけなら、[&optional specs…]を使用する。複数の要素すべてのマッチ、または非マッチを指定するには、&optional [specs…]を使用する。defunの例を参照。

&rest

仕様リスト内の後続のすべての要素は、0回以上繰り返される。しかし、最後の繰り返しでは、仕様リスト内のすべての要素にたいするマッチングの前に式が終了しても問題はない。

数個の要素を繰り返すには、[&rest specs…]を使用する。各繰り返しにおいいてすべてマッチしなければならない複数要素を指定するには、&rest [specs…]を使用する。

&or

仕様リスト内の後続の各要素は選択肢。選択肢の1つがマッチしなければならず、マッチしない場合&or仕様は失敗する。

&orに続く各リスト要素は、単一の選択肢。複数のリスト要素を単一の選択肢にグループ化するには、それらを[…]で括る。

&not

後続の各要素は、&orが使用されたときのように選択肢にマッチするが、要素がマッチした場合に失敗する。どれもマッチする要素がない場合は何もマッチされないが、&not仕様は成功する。

&define

フォーム定義にたいする仕様であることを示す。フォーム定義自体はインストルメントされない(つまりEdebugはフォーム定義の前後でストップしない)が、フォーム内部は通常はインストルメントされるであろう。&defineキーワードはリスト仕様の最初の要素であること。

nil

カレント引数レベルでマッチさせる引数が存在しない場合は成功し、それ以外は失敗する。部分リスト仕様とバッククォートの例を参照。

gate

引数はマッチされないがgateを通じたバックトラックは、このレベルの使用の残りをマッチングする間は無効にされる。これは主に、特定の構文エラーメッセージを一般的にするために使用される。詳細はBacktracking in Specifications、およびletの例も参照。

other-symbol

仕様リスト内のその他の要素は、述語(predicate)かインダイレクト仕様(indirect specification)である。

シンボルがEdebug仕様をもつ場合、インダイレクト仕様(indirect specification)はシンボル位置に使用されるリスト仕様か、引数を処理するための関数のどちらかである。この仕様はマクロにたいするdef-edebug-specのように定義される。defunの例を参照。

それ以外の場合、シンボルは述語(predicate)である。述語は引数とともに呼び出され、述語がnilをリターンした場合、その仕様は失敗して引数はインストルメントされない。

適切な述語としてはsymbolpintegerpstringpvectorpatomが含まれる。

[elements…]

要素のベクターは、要素を単一のグループ仕様(group specification)にグループ化する。このグループ仕様は、ベクター自体に何も行わない。

"string"

引数はstringという名前のシンボルである。この仕様は、symbolの名前がstringであるクォートされたシンボル'symbolと等価だが、文字列形式のほうが好ましい。

(vector elements…)

引数は、要素が仕様内のelementsにマッチするベクターである。バッククォートの例を参照。

(elements…)

他のリストは部分リスト仕様(sublist specification)であり、引数は要素が仕様のelementsにマッチするリストでなければならない。

部分リスト仕様はドットリスト(dotted list)かもしれず、その場合対応するリスト引数はドットリストである。かわりに、ドットリスト仕様の最後のCDRが、(グループ化やインダイレクト仕様による)他の部分リスト仕様かもしれない(たとえば要素が非ドットリストにマッチする(spec . [(more specs…)])))。これはバッククォートの例のような再帰仕様に有用。このような再帰を終了させるには、上述のnil仕様も参照。

(specs . nil)のように記述された部分リスト仕様は(specs)(specs . (sublist-elements…))(specs sublist-elements…)と等価であることに注意。

以下は&defineの後だけに出現する追加仕様のリストです。defunの例を参照してください。

name

引数(シンボル)は定義フォームの名前。

定義フォームは名前フィールドをもつ必要はなく、複数の名前フィールドをもつかもしれない。

:name

この構成は引数に実際のマッチは行わない。:nameの後の要素はシンボルであり、その定義の追加の名前要素として使用される。定義名に一意で静的な要素を加えるために、これを使用できる。複数回使用されるかもしれない。

arg

引数(シンボル)は定義フォームの引数の名前である。しかし、lambda-listキーワード(‘&’で始まるシンボル)は許されない。

lambda-list

これはラムダリスト(ラムダ式の引数リスト)にマッチする。

def-body

引数は定義内のコードのbodyである。これは上述のbodyと似ているが、定義のbodyはその定義に関連する情報を照会する別のEdebug呼び出しでインストルメントされていなければならない。定義内のより高位レベルのフォームリストには、def-bodyを使用する。

def-form

引数は、定義内のもっとも高位レベルの単一フォームである。これはdef-bodyと似ているが、フォームリストではなく単一フォームのマッチに使用される。特別なケースとして、def-formはフォームが実行されるときトレース情報を出力しないことも意味する。interactiveの例を参照。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15.3 Backtracking in Specifications

あるポイント位置で仕様がマッチに失敗しても、構文エラーがシグナルされるとは限りません。そのかわりバックトラック(backtracking)が開始されます。バックトラックは、すべての選択肢をマッチングするまで行なわれます。最終的に引数リストのすべての要素は仕様内の要素のいずれかとマッチしなければならず、仕様内の必須要素は引数のいずれかとマッチしなければなりません。

構文エラーが検出されてもその時点では報告されず、より高位レベルの選択肢のマッチングが終わった後、実際のエラー箇所から離れたポイント位置でエラーが報告されるかもしれません。しかしエラー発生時にバックトラックが無効なら、エラーは即座に報告されるでしょう。ある状況においては、バックトラックも自動的に再有効化されることに注意してください。&optional&rest&orにより新たな選択肢が設定されたとき、または部分リスト、グループ、インダイレクト仕様が開始されたときは、バックトラックが自動的に有効になります。バックトラックを有効、または無効にした場合の影響は、現在処理中のレベルの残り要素と、低位レベルに限定されます。

何らかのフォーム仕様(すなわちformbodydef-formdef-body)をマッチングする間、バックトラックは無効になっています。これらの仕様は任意のフォームにマッチするので、何らかのエラーが発生するとしたらそれは高位レベルではなく、そのフォーム自体の内部でなければなりません。

バックトラックはクォートされたシンボルや文字列仕様とのマッチに成功した後にも無効になります。なぜなら通常これは構成が認識されたことを示すからです。しかし、同じシンボルで始まる一連の選択肢構成がある場合は、たとえば["foo" &or [first case] [second case] ...]のように、通常は選択肢の外部にそのシンボルをファクタリングすることにより、この制約に対処できます。

ほとんどのニーズは、バックトラックを自動的に無効にする、これら2つの方法で満足させることができますが、gate仕様を使用して明示的にバックトラックを無効にするほうが便利なときもあります。これは、高位に適用可能な選択肢が存在しないことが分かっている場合に有用です。let仕様の例を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.15.4 Specification Examples

以下で提供する例から学ぶことにより、Edebug仕様の理解が容易になるかもしれません。

スペシャルフォームletは、バインディングとbodyのシーケンスをもちます。各バインディングはそシンボル、またはシンボルとオプションの部分リストです。以下の仕様では、部分リストを見つけたらバックトラックを抑止するために、部分リスト内のgateがあることに注目してください。

(def-edebug-spec let
  ((&rest
    &or symbolp (gate symbolp &optional form))
   body))

Edebugはdefunおよび関連する引数リスト、interactive仕様にたいして以下の仕様を使用します。式の引数はその関数bodyの外部で実際に評価されるので、interactiveフォームは特別に処理する必要があります。(defmacroにたいする仕様はdefunにたいする仕様と非常に似ていますが、declare命令文が許されます。)

(def-edebug-spec defun
  (&define name lambda-list
           [&optional stringp]   ; ドキュメント文字列が与えられた場合はマッチする。
           [&optional ("interactive" interactive)]
           def-body))

(def-edebug-spec lambda-list
  (([&rest arg]
    [&optional ["&optional" arg &rest arg]]
    &optional ["&rest" arg]
    )))

(def-edebug-spec interactive
  (&optional &or stringp def-form))    ; Notice: def-form

以下のバッククォートにたいする仕様は、ドットリストにマッチさせる方法と、nilを使用して再帰を終了させる方法を説明するための例です。また、ベクターのコンポーネントをマッチさせる方法も示しています。(Edebugにより定義される実際の仕様は少し異なり、ドットリストについては失敗するかもしれない非常に深い再帰を引き起こすためサポートしていません。)

(def-edebug-spec \` (backquote-form))   ; Alias just for clarity.

(def-edebug-spec backquote-form
  (&or ([&or "," ",@"] &or ("quote" backquote-form) form)
       (backquote-form . [&or nil backquote-form])
       (vector &rest backquote-form)
       sexp))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.2.16 Edebug Options

以下のオプションは、Edebugの動作に影響を与えます:

User Option: edebug-setup-hook

Edebugが使用される前に呼び出される関数。この関数は毎回新たな値をセットする。Edebugこれらの関数を一度呼び出したら、その後edebug-setup-hooknilにリセットする。使用するパッケージに関係するEdebug仕様をロードするために使用dきるが、それはEdebugを使用するときだけである。Instrumenting for Edebugを参照。

User Option: edebug-all-defs

これが非nilの場合はdefundefmacroのような定義フォームの普通に評価すると、Edebug用にインストルメントされる。これはeval-defuneval-regioneval-buffer、and eval-current-bufferに適用される。

このオプションの切り替えには、コマンドM-x edebug-all-defsを使用する。Instrumenting for Edebugを参照。

User Option: edebug-all-forms

これが非nilの場合eval-defuneval-regioneval-buffereval-current-bufferは、たとえフォームが何も定義していなくても、すべてのフォームをインストルメントする。これはロードとミニバッファー内の評価には適用されない。

このオプションの切り替えには、コマンドM-x edebug-all-formsを使用する。Instrumenting for Edebugを参照。

User Option: edebug-save-windows

これが非nilの場合、Edebugはウィンドウ構成の保存とリストアを行なう。これにはある程度時間がかかるので、ウィンドウ構成に何が起こってもプログラムに関係しない場合は、この変数をnilにセットしたほうがよい。

値がリストの場合は、リストされたウィンドウだけが保存およびリストアされる。

Edebug内では、この変数をインタラクティブに変更するためにWコマンドを使用できる。Edebug Display Updateを参照。

User Option: edebug-save-displayed-buffer-points

これが非nilの場合、Edebugは表示されているすべてのバッファー内のポイントを保存およびリストアする。

選択されていないウィンドウ内に表示されているバッファーのポイントを変更するコードをデバッグしている場合は、他のバッファーのポイントを保存およびリストアする必要がある。その後にEdebugまたはユーザーがそのウィンドウを選択した場合は、そのバッファー内のポイントは、そのウィンドウのポイント値に移動される。

すべてのバッファー内のポイントの保存とリストアは、それぞれのウィンドウを2回選択する必要があり高価な処理のため、必要なときだけ有効にする。Edebug Display Updateを参照。

User Option: edebug-initial-mode

この変数が非nilの場合、Edebugが最初にアクティブになったときの、Edebugの最初の実行モードを指定する。指定できる値はstepnextgoGo-nonstoptraceTrace-fastcontinueContinue-fast

デフォルト値はstepEdebug Execution Modesを参照。

User Option: edebug-trace

これが非nilの場合が、各関数のエントリーとexitをトレースする。トレース出力は、関数のエントリーとexitを行ごとに、再帰レベルにしたがって*edebug-trace*という名前のバッファーに表示される。

Trace Bufferedebug-tracingも参照のこと。

User Option: edebug-test-coverage

nilの場合、Edebugはデバッグされるすべての式のカバレッジをテストする。Coverage Testingを参照。

User Option: edebug-continue-kbd-macro

nilの場合は、Edebug外で実行されている任意のキーボードマクロの定義または実行を継続する。これはデバッグされないので、慎重に使用すること。Edebug Execution Modesを参照。

User Option: edebug-unwrap-results

nilの場合、Edebugは式の結果を表示するときに、その式自体のインストルメント結果の削除を試みる。マクロをデバッグするときは、式の結果自体がインストルメントされた式になるということに関連する。実際的な例ではないが、サンプル例の関数facがインストルメントされたとき、そのフォームのマクロを考えてみるとよい。

(defmacro test () "Edebug example."
  (if (symbol-function 'fac)
      …))

testマクロをインストルメントしてステップ実行すると、デフォルトではsymbol-function呼び出しは多数のedebug-afterフォームとedebug-beforeフォームをもつことになり、それにより“実際の”結果の確認が難しくなり得る。edebug-unwrap-resultsが非nilの場合、Edebugは結果からこれらのフォームの削除を試みる。

User Option: edebug-on-error

debug-on-errorの以前がnilの場合、Edebugはdebug-on-errorをこの値にバインドする。Trapping Errorsを参照。

User Option: edebug-on-quit

debug-on-quitの以前の値がnilの場合、Edebugはdebug-on-quitにこの値をバインドする。Trapping Errorsを参照。

Edebugがアクティブな間にedebug-on-errorまたはedebug-on-quitの値を変更した場合は、次回に新たなコマンドを通じてEdebugが呼び出されるまで、これらの値は使用されない。

User Option: edebug-global-break-condition

nilの場合、値はすべてのステップポイントでテストされる式である。式の結果がnilの場合は、breakする。エラーは無視される。Global Break Conditionを参照。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.3 Debugging Invalid Lisp Syntax

Lispリーダーは無効な構文(invalid syntax)について報告はしますが、実際の問題箇所は報告しません。たとえば、ある式を評価中のエラー“End of file during parsing(パース中にファイル終端に達した)”は、開カッコまたは開角カッコ(open parenthese or open square bracket)が多いことを示しています。Lispリーダーはこの不一致をファイル終端で検出しましたが、本来閉カッコがあるべき箇所を解決することはできません。同様に、“Invalid read syntax: ")"(無効なread構文:)")"”は開カッコの欠落を示していますが、欠落しているカッコが属すべき場所は告げません。ならば、どうやって変更すべき箇所を探せばよいのでしょうか?

問題が単なるカッコの不一致でない場合の便利なテクニックは、各defunの先頭でC-M-eとタイプして、そのdefunの最後と思われる箇所に移動するか確認する方法です。もし移動しなければ、問題はそのdefunの内部にあります。

マッチしないカッコがLispにおいてもっとも一般的な構文エラーなので、これらのケースにたいしてさらにアドバイスすることができます。(Show Parenモードを有効にしてコードにポイントを移動するだけで、カッコの不一致を探しやすくなるでしょう。)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.3.1 Excess Open Parentheses

カッコがマッチしないdefunを探すのが、最初のステップです。過剰な開カッコが存在する場合は、ファイルの終端に移動してC-u C-M-uとタイプします。これにより、カッコがマッチしない最初のdefunの先頭に移動するでしょう。

何が間違っているのか正確に判断するのが次のステップです。これを確実に行なうには、そのプログラムを詳しく調べる以外に方法はありませんが、カッコがあるべき箇所を探すのに、既存のインデントが手掛かりになることが多々あります。C-M-qで再インデントして何が移動されるか確認するのが、この手掛かりを使用するもっとも簡単な方法です。しかし、行うのはちょっと待ってください! まず続きを読んでからにしましょう。

これを行なう前に、defunに十分な閉カッコがあるか確認します。十分な閉カッコがない場合、C-M-qがエラーとなるか、そのdefunからファイル終端までの残りすべてが再インデントされます。その場合はdefunの最後に移動して、そこに閉カッコを挿入します。そのdefunのカッコの釣り合いがとれるまでは、defunの最後に移動するのにC-M-eは使用できません(失敗するでしょう)。

これでdefunの先頭に移動してC-M-qとタイプすることができます。通常は、一定のポイントからその関数の最後までのすべての行が、右へとシフトされるでしょう。これはおそらくそのポイント付近で閉カッコが欠落しているか、不要な開カッコがあります。(しかし、これを真実と仮定せず、コードを詳しく調べてください。) 不一致箇所が見つけたら、元のインデントはおそらく意図されたカッコに適しているはずなので、C-_C-M-qをアンドゥしてください。

問題をfixできたと思った後に、再度C-M-qを使用します。実際に元のインデントが意図したカッコのネストに適合していて、足りないカッコを追加していたら、C-M-qは何も変更しないはずです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.3.2 Excess Close Parentheses

過剰な閉カッコへの対処は、まずファイルの先頭に移動してから、カッコのマッチしないdefunを探すためにC-u -1 C-M-uをタイプします。

それから、そのdefunの先頭でC-M-fをタイプして、実際にマッチする閉カッコを探します。これにより、そのdefunの終端より幾分手前の箇所に移動するでしょう。その付近に間違った閉カッコが見つかるでしょう。

そのポイントに問題が見つからない場合には、そのdefunの先頭でC-M-qをタイプするのが次のステップです。ある行範囲はおそらく左へシフトするでしょう。その場合、欠落している開カッコまたは間違った閉カッコは、おそらくそれらの行の1行目の近くにあるでしょう。 (しかし、これを真実と仮定せず、コードを詳しく調べてください。)不一致箇所が見つけたら、元のインデントはおそらく意図されたカッコに適しているはずなので、C-_C-M-qをアンドゥしてください。

問題をfixできたと思った後に、再度C-M-qを使用します。実際に元のインデントが意図したカッコのネストに適合していて、足りないカッコを追加していたら、C-M-qは何も変更しないはずです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.4 Test Coverage

testcoverライブラリーをロードして、コマンドM-x testcover-start RET file RETでコードをインストルメントすることにより、Lispコードのファイルにたいしてカバレッジテストを行なうことができます。コードを1回以上呼び出すことにより、テストが行なわれます。コマンドM-x testcover-mark-allを使用すれば、カバレッジが不十分な箇所が色付きでハイライト表示されます。コマンドM-x testcover-next-markは、次のハイライトされた箇所へポイントを前方に移動します。

通常、赤くハイライトされた箇所はそのフォームが完全に評価されたことが一度もないことを示し、茶色でハイライトされた箇所は常に同じ値に評価された(その結果にたいして少ししかテストされていない)ことを意味します。しかし、errorのように完全に評価するのが不可能なフォームにたいしては、赤いハイライトはスキップされます。(setq x 14)のように、常に同じ値に評価されることが期待されるフォームにたいしては、茶色のハイライトスキップされます。

難しいケースでは、テストカバレッジツールにアドバイスを与えるために、コードにdo-nothingマクロを追加することができます。

Macro: 1value form

formを評価してその値をリターンするが、テストカバレッジにたいしてformが常に同じ値だという情報を与える。

Macro: noreturn form

formを評価し、formが決してリターンしないという情報をカバレッジテストに与える。もしリターンした場合は、run-timeエラーとなる。

Edebugにもカバレッジテスト機能があります(Coverage Testingを参照)。これらの機能は部分的に重複しており、組み合わせることで明確になるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.5 Profiling

プログラムは正常に機能しているものの、より高速にまたは効率的に実行させたい場合にまず行うべきは、そのプログラムがリソースをどのように使用するか知るために、コードをプロファイル(profile)することです。ある特定の関数の実行が、実行時間のうち無視できない割り合いを占めるようなら、その部分を最適化する方法を探すことを開始できます。

Emacsには、このためのビルトインサポートがあります。プロファイリングを開始するには、M-x profiler-startをタイプします。プロファイルはプロセッサー使用(processor usage)、メモリー使用(memory usage)、またはその両方を選択できます。何らかの処理を行った後にM-x profiler-reportとタイプすると、プロファイルに選択した各リソースがsummaryバッファーに表示されます。reportバッファーの名前には、そのレポートが生成された時刻が含まれるので、前の結果を消去せずに後で他のレポートを生成できます。プロファイリングが終了したら、M-x profiler-stopとタイプしてください(プロファイリングに関連したオーバーヘッドが少しあるからです)。

profiler reportバッファーでは、各行に呼び出された関数と、その後にプロファイリングが開始されてから使用したリソース(プロセッサーまたはメモリー)の絶対時間とパーセンテージ時間が表示されます。左側にシンボル‘+’のある行ではRETをタイプして行を展開して、高位レベルの関数に呼び出された関数を確認できます。もう一度RETをタイプすると、元の状態へと行が折り畳まれます。

jまたはmouse-2を押下すると、関数の定義にジャンプします。dを押下すると、関数のドキュメントを閲覧できます。C-x C-wを使用して、プロファイルをファイルに保存できます。=を使用すれば、2つのプロファイルを比較することができます。

elpライブラリーは、別のアプローチを提案します。使い方はelp.elを参照してください。

benchmarkライブラリーを使用して、Emacs Lispフォームのスピードwpy個別にチェックできます。benchmark.el内の関数benchmark-run、およびbenchmark-run-compiledを参照してください。

configureのオプションに--enable-profilingを使用してビルドすることにより、EmacsをCコードのレベルでプロファイルすることができます。こうしてビルドされたEmacsは、Emacsをexitするときにgprofユーティリティを使用して検証できるファイルgmon.outを生成します。この機能は主にEmacsのデバッグに有用です。このEmacsは、実行状態から上述のM-x profiler-…コマンドによりLispレベルで実際にストップします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18 Reading and Printing Lisp Objects

プリント(print)および読み取り(read)は、Lispオブジェクトからテキスト形式への変換、またはその逆の変換を行なう操作です。これらはLisp Data Typesで説明したプリント表現(printed representation)と入力構文(read syntax)を使用します。

このチャプターでは、読み取りおよびプリントのためのLisp関数について説明します。このチャプターではさらにストリーム(stream)についても説明します。ストリームとは、(読み取りにおいては)テキストがどこから取得されるか、(プリントにおいては)テキストをどこに出力するかを指定します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.1 Introduction to Reading and Printing

Lispオブジェクトの読み取りとは、テキスト形式のLisp式をパース(parse: 構文解析)して、対応するLispオブジェクトを生成することを意味します。これは、LLispプログラムがLispコードファイルからLispに取得される方法でもあります。わたしたちは、そのテキストをそのオブジェクトの入力構文(read syntax)と呼んでいます。たとえばテキスト‘(a . 5)’は、CARaCDRが数字の5であるようなコンスセルにたいする入力構文です。

Lispオブジェクトのプリントとは、あるオブジェクトをそのオブジェクトのプリント表現(printed representation) (Printed Representation and Read Syntaxを参照)に変換することにより、そのオブジェクトを表すテキストを生成することを意味します。上述のコンスセルをプリントすると、テキスト‘(a . 5)’が生成されます。

読み取りとプリントは、概ね逆の処理といえます。あるテキスト断片を読み取った結果生成されたオブジェクトをプリントすると、多くの場合は同じテキストが生成され、あるオブジェクトをプリントした結果のテキストを読み取ると、通常は同じようなオブジェクトが生成されます。たとえばシンボルfooをプリントするとテキスト‘foo’が生成され、そのテキストを読み取るとシンボルfooがリターンされます。要素がabのリストをプリントするとテキスト‘(a b)’が生成され、そのテキストを読み取ると、(同じリストではないが)要素がabのリストが生成されます。

しかし、これら2つの処理は互いにまったく逆の処理というわけではありません。3つの例外があります:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.2 Input Streams

テキストを読み取るLisp関数の大部分は、引数として入力ストリーム(input stream)をとります。入力ストリームは、読み取られるテキストの文字をどこから、どのように取得するかを指定します。以下は可能な入力ストリーム型です:

buffer

入力文字はbufferのポイントの後の文字から直接読み取られる。文字の読み取りとともに、ポイントが進む。

marker

入力文字はmarkerのあるバッファーの、マーカーの後の文字から直接読み取られる。文字の読み取りとともに、マーカーが進む。ストリームがマーカーのときは、バッファー内のポイント値に影響はない。

string

入力文字はstringの最初の文字から必要な文字数分が取得される。

function

入力文字はfunctionから生成され、その関数は2種類の呼び出しをサポートしなければならない:

t

tは、その入力がミニバッファーから読み取られるストリームであることを意味する。実際にはミニバッファーが1回呼び出されて、ユーザーから与えられたテキストが、その後に入力ストリームとして使用される文字列となる。Emacsがbatchモードで実行されている場合は、ミニバッファーのかわりに標準入力が使用される。たとえば、

(message "%s" (read t))

このような場合は標準入力からLisp式が読み取られて、結果は標準出力にプリントされるだろう。

nil

入力ストリームとしてnilが与えられた場合は、かわりにstandard-inputの値が使用されることを意味する。この値はデフォルトの入力ストリーム(default input stream)であり、非nilの入力ストリームでなければならない。

symbol

入力ストリームとしてのシンボルは、(もしあれば)そのシンボルの関数定義と等価である。

以下の例では、バッファーストリームから読み込み、読み取りの前後におけるポイント位置を示しています:

---------- Buffer: foo ----------
This∗ is the contents of foo.
---------- Buffer: foo ----------

(read (get-buffer "foo"))
     ⇒ is
(read (get-buffer "foo"))
     ⇒ the

---------- Buffer: foo ----------
This is the∗ contents of foo.
---------- Buffer: foo ----------

最初の読み取りではスペースがスキップされていることに注意してください。読み取りにおいては、意味のあるテキストに先行する、任意のサイズの空白文字がスキップされます。

以下は、マーカーストリームからの読み取りの例で、最初は表示されているバッファーの先頭にマーカーが配します。読み取られた値はシンボルThisです。


---------- Buffer: foo ----------
This is the contents of foo.
---------- Buffer: foo ----------

(setq m (set-marker (make-marker) 1 (get-buffer "foo")))
     ⇒ #<marker at 1 in foo>
(read m)
     ⇒ This
m
     ⇒ #<marker at 5 in foo>   ;; 最初のスペースの前。

以下では、文字列のコンテンツから読み取っています:

(read "(When in) the course")
     ⇒ (When in)

以下はミニバッファーから読み取る例です。プロンプトは、‘Lisp expression: です。(このプロンプトはストリームtから読み取る際は常に使用されます。) ユーザーの入力はプロンプトの後に表示されます。

(read t)
     ⇒ 23
---------- Buffer: Minibuffer ----------
Lisp expression: 23 RET
---------- Buffer: Minibuffer ----------

最後は、useless-streamという名前の関数ストリームから読み取る例です。ストリームを使用する前に、変数useless-listを文字のリストに初期化しています。その後は、リスト内の次の文字を取得するため、または文字をリストの先頭に追加することにより読み戻すために、関数useless-streamを呼び出します。

(setq useless-list (append "XY()" nil))
     ⇒ (88 89 40 41)

(defun useless-stream (&optional unread)
  (if unread
      (setq useless-list (cons unread useless-list))
    (prog1 (car useless-list)
           (setq useless-list (cdr useless-list)))))
     ⇒ useless-stream

このストリームを使って、以下のように読み取ります:

(read 'useless-stream)
     ⇒ XY

useless-list
     ⇒ (40 41)

開カッコと閉カッコがリスト内に残ることに注意してください。Lispリーダーは開カッコに出会うと、それを入力の終わりと判断して、読み戻します。次にこのポイント位置からこのストリームを読み取ると、‘()’が読み取られてnilがリターンされます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.3 Input Functions

このセクションでは、読み取りに関係のあるLisp関数と変数について説明します。

以下の関数で、streamは入力ストリーム(前のセクションを参照)を意味します。streamnil、または省略された場合のデフォルト値はstandard-inputです。

読み取りにおいて終端されていないリスト、ベクター、文字列に遭遇した場合は、end-of-fileがシグナルされます。

Function: read &optional stream

この関数はstreamからテキスト表現されたLisp式を1つ読み取り、Lispオブジェクトとしてリターンする。これは基本的なLisp入力関数である。

Function: read-from-string string &optional start end

この関数はstring内のテキストから、最初のテキスト表現されたLisp式を読み取る。リターン値はCARがその式で、CDRが次に読み取られるその文字列内の残りの文字(読み取られていない最初の文字)の位置を与える整数であるようなコンスセルである。

startが与えられた場合は、文字列内のインデックスstart(最初の文字はインデックス0)から読み取りが開始される。endを指定した場合は、残りの文字列が存在しないかのごとく、そのインデックスの直前で読み取りがストップされる。

たとえば:

(read-from-string "(setq x 55) (setq y 5)")
     ⇒ ((setq x 55) . 11)
(read-from-string "\"A short string\"")
     ⇒ ("A short string" . 16)

;; Read starting at the first character.
(read-from-string "(list 112)" 0)
     ⇒ ((list 112) . 10)
;; Read starting at the second character.
(read-from-string "(list 112)" 1)
     ⇒ (list . 5)
;; Read starting at the seventh character,
;;   and stopping at the ninth.
(read-from-string "(list 112)" 6 8)
     ⇒ (11 . 8)
Variable: standard-input

この変数はデフォルト入力ストリーム(引数streamnilのときreadが使用するストリーム)を保持する。デフォルトはtで、これはミニバッファーを使用することを意味する。

Variable: read-circle

nilの場合、この変数は循環構造(circular structure)および共有構造(shared structures)の読み取りを有効にする。Read Syntax for Circular Objectsを参照。デフォルト値はt


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.4 Output Streams

出力ストリームは、プリントにより生成された文字に何を行うかを指定します。ほとんどのプリント関数は、オプション引数として出力ストリームを受け入れます。以下は利用できる出力ストリーム型です:

buffer

出力文字は、bufferのポイント位置に挿入される。文字が挿入された分、ポイントが進む。

marker

出力文字は、markerのあるバッファーのマーカー位置に挿入される。文字が挿入された分、マーカー位置が進む。ストリームがマーカーのときは、そのバッファー内のポイント位置にプリントは影響せず、この種のプリントでポイントは移動しない(マーカー位置がポイント位置、またはポイント位置より前の場合は除外される。通常はテキストの周囲にポイントが進む)。

function

出力文字は、文字を格納する役目をもつfunctionに渡される。この関数は1つの文字を引数に、出力される文字の回数呼び出され、その文字を格納したい場所に格納する役目をもつ。

t

出力文字はエコーエリアに表示される。

nil

出力ストリームにnilが指定された場合は、かわりにstandard-outputの値が使用されることを意味する。この値はデフォルトの出力ストリーム(default output stream)であり、非nilでなければならない。

symbol

出力ストリームとしてのシンボルは、(もしあれば)そのシンボルの関数定義と等価である。

有効な出力ストリームの多くは、入力ストリームとしても有効です。したがって入力ストリームと出力ストリームの違いは、Lispオブジェクトの型ではなく、どのようにLispオブジェクトを使うかという点です。

以下はバッファーを出力ストリームとして使用する例です。ポイントは最初は‘the’の中の‘h’の直前にあります。そして最後も、同じ‘h’の直前に配されます。

---------- Buffer: foo ----------
This is t∗he contents of foo.
---------- Buffer: foo ----------

(print "This is the output" (get-buffer "foo"))
     ⇒ "This is the output"

---------- Buffer: foo ----------
This is t
"This is the output"
∗he contents of foo.
---------- Buffer: foo ----------

次はマーカーを出力ストリームとして使用する例です。マーカーは最初、バッファーfoo内の単語‘the’の中の‘t’と‘h’の間にあります。最後には、挿入されたテキストによりマーカーが進み、同じ‘h’の前に留まります。通常の方法で見られるようなポイント位置への影響がないことに注意してください。

---------- Buffer: foo ----------
This is the ∗output
---------- Buffer: foo ----------

(setq m (copy-marker 10))
     ⇒ #<marker at 10 in foo>

(print "More output for foo." m)
     ⇒ "More output for foo."

---------- Buffer: foo ----------
This is t
"More output for foo."
he ∗output
---------- Buffer: foo ----------

m
     ⇒ #<marker at 34 in foo>

以下はエコーエリアに出力を表示する例です:

(print "Echo Area output" t)
     ⇒ "Echo Area output"
---------- Echo Area ----------
"Echo Area output"
---------- Echo Area ----------

最後は関数を出力ストリームとして使用する例です。関数eat-outputは与えられたそれぞれの文字をlast-outputの先頭にconsします(Building Cons Cells and Listsを参照)。最後には、リストには出力されたすべての文字が逆順で含まれます。

(setq last-output nil)
     ⇒ nil

(defun eat-output (c)
  (setq last-output (cons c last-output)))
     ⇒ eat-output

(print "This is the output" 'eat-output)
     ⇒ "This is the output"

last-output
     ⇒ (10 34 116 117 112 116 117 111 32 101 104
    116 32 115 105 32 115 105 104 84 34 10)

このリストを逆転すれば、正しい順序で出力することができます:

(concat (nreverse last-output))
     ⇒ "
\"This is the output\"
"

concatを呼び出してリストを文字列に変換すれば、内容をより明解に確認できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.5 Output Functions

このセクションでは、オブジェクトをオブジェクトのプリント表現に変換してLispオブジェクトをプリントするLisp関数を説明します。

Emacsプリント関数には、正しく読み取れるように必要なとき出力にクォート文字を追加するものがあります。使用されるクォート文字は‘"’と‘\’です。これらは文字列をシンボルと区別するとともに、文字列およびシンボル内の区切り文字が読み取り時に区切り文字として扱われることを防ぎます。完全な詳細はPrinted Representation and Read Syntaxを参照してください。クォートするかしないかは、プリント関数の選択により指定できます。

そのテキストがLispに読み戻す場合、同様にLispプログラマーにLispオブジェクトを明解に説明するのが目的の場合は、曖昧さを避けるためにクォート文字をプリントするべきです。しかし、プログラマー以外の人間にたいして出力の見栄えを良くするのが目的なら、通常はクォートなしでプリントしたほうがよいでしょう。

Lispオブジェクトは自己参照ができます。通常の方法で自己参照オブジェクトをプリントするにはテキストが無限に必要で、その試みにより無限再帰が発生する恐れがあります。Emacsはそのような再帰を検知して、すでにプリントされたオブジェクトを再帰的にプリントするかわりに、‘#level’をプリントします。たとえば以下は、カレントのプリント処理において、レベル0のオブジェクトを再帰的に参照することを示しています:

(setq foo (list nil))
     ⇒ (nil)
(setcar foo foo)
     ⇒ (#0)

以下の関数では、streamは出力ストリームを意味します。(出力ストリームの説明は、前のセクションを参照してください。) streamnil、または省略された場合のデフォルトは、standard-outputの値になります。

Function: print object &optional stream

print関数は、プリントを行うための便利な方法である。この関数はobjectの前後に改行を付与して、objectのプリント表現をstreamにプリントする。クォート文字が使用される。printobjectをリターンする。たとえば:

(progn (print 'The\ cat\ in)
       (print "the hat")
       (print " came back"))
     -|
     -| The\ cat\ in
     -|
     -| "the hat"
     -|
     -| " came back"
     ⇒ " came back"
Function: prin1 object &optional stream

この関数はobjectのプリント表現をstreamに出力する。この関数はprintのように出力を分割するための改行をプリントしないが、printのようにクォート文字を使用する。objectをリターンする。

(progn (prin1 'The\ cat\ in)
       (prin1 "the hat")
       (prin1 " came back"))
     -| The\ cat\ in"the hat"" came back"
     ⇒ " came back"
Function: princ object &optional stream

この関数はobjectのプリント表現をstreamに出力する。objectをリターンする。

この関数はreadではなく人間が読める出力を生成することを意図しているので、クォート文字を挿入せず、文字列のコンテンツの前後にダブルクォート文字を配さない。呼び出しの間に間隔を何も出力しない。

(progn
  (princ 'The\ cat)
  (princ " in the \"hat\""))
     -| The cat in the "hat"
     ⇒ " in the \"hat\""
Function: terpri &optional stream

この関数はstreamに改行を出力する。名前の由来は、“terminate print”である。

Function: write-char character &optional stream

この関数はcharacterstreamに出力する。characterをリターンする。

Function: prin1-to-string object &optional noescape

この関数は、同じ引数でprin1がプリントするテキストを含む文字列をリターンする。

(prin1-to-string 'foo)
     ⇒ "foo"
(prin1-to-string (mark-marker))
     ⇒ "#<marker at 2773 in strings.texi>"

noescapeが非nilの場合は、出力中のクォート文字の使用を抑制する。(この引数は、Emacsバージョン19以降でサポートされた。)

(prin1-to-string "foo")
     ⇒ "\"foo\""
(prin1-to-string "foo" t)
     ⇒ "foo"

Lispオブジェクトのプリント表現を文字列として取得する別の手段については、Formatting Stringsformatを参照のこと。

Macro: with-output-to-string body…

このマクロは出力を文字列に送るようstandard-outputをセットアップして、フォームbodyを実行する。その文字列がリターンされる。

たとえばカレントバッファー名が‘foo’の場合、

(with-output-to-string
  (princ "The buffer is ")
  (princ (buffer-name)))

"The buffer is foo"をリターンする。

Function: pp object &optional stream

この関数はprin1と同じようにobjectstreamに出力するが、より“優雅(pretty)”な方法でこれを行う。すなわち、この関数は人間がより読みやすいようにオブジェクトのインデントとパディングを行う。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

18.6 Variables Affecting Output

Variable: standard-output

この変数の値はデフォルト出力ストリーム(stream引数がnilのときプリント関数が使用するストリーム)である。デフォルトはtで、エコーエリアに表示することを意味する。

Variable: print-quoted

これが非nilの場合は、省略されたリーダー構文(たとえば(quote foo)'foo(function foo)#'fooのように)を使用してクォートされたフォームをプリントすることを意味する。

Variable: print-escape-newlines

この変数が非nilの場合、文字列内の改行は‘\n’、改ページは‘\f’でプリントされる。これらの文字は、通常は実際の改行および改ページとしてプリントされる。

この変数はクォートつきのプリントを行うプリント関数prin1およびprintに影響を与える。princに影響はない。以下はprin1を使用した場合の例である:

(prin1 "a\nb")
     -| "a
     -| b"
     ⇒ "a
b"

(let ((print-escape-newlines t))
  (prin1 "a\nb"))
     -| "a\nb"
     ⇒ "a
b"

2つ目の式では、prin1を呼び出す間はprint-escape-newlinesのローカルバインドが効果をもつが、結果をプリントするときには効果がない。

Variable: print-escape-nonascii

この変数が非nilの場合、クォートつきでプリントするプリント関数prin1およびprintは、文字列内のユニバイトの非ASCII文字を無条件でバックスラッシュシーケンスとしてプリントする。

これらの関数は、出力ストリームがマルチバイトバッファー、あるいはマーカーがマルチバイトバッファーをポイントするときは、この変数の値に関わらずユニバイト非ASCII文字にたいしてバックスラッシュシーケンスを使用する。

Variable: print-escape-multibyte

この変数が非nilの場合、クォートつきでプリントするプリント関数prin1およびprintは、文字列内のマルチバイトの非ASCII文字を無条件でバックスラッシュシーケンスとしてプリントする。

これらの関数は、出力ストリームがユニバイトバッファー、あるいはマーカーがユニバイトバッファーをポイントするときは、この変数の値に関わらずマルチバイト非ASCII文字にたいしてバックスラッシュシーケンスを使用する。

Variable: print-length

この変数の値は任意のリスト、ベクター、ブールベクターをプリントする際の最大要素数である。プリントされるオブジェクトがこれより多くの要素をもつ場合は、省略記号(“...”)で省略される。

値がnil(デフォルト)の場合は、無制限である。

(setq print-length 2)
     ⇒ 2
(print '(1 2 3 4 5))
     -| (1 2 ...)
     ⇒ (1 2 ...)
Variable: print-level

この変数の値はプリント時の丸カッコ(parentheses: “()”)と角カッコ(brackets: “[]"’)のネスト最大深さである。この制限を超える任意のリストまたはベクターは省略記号(“...”)で省略される。値nil(デフォルト)は無制限を意味する。

User Option: eval-expression-print-length
User Option: eval-expression-print-level

これらはeval-expressionにより使用されるprint-lengthおよびprint-levelの値であり、したがって間接的に多くのインタラクティブな評価コマンドにより使用される(Evaluating Emacs-Lisp Expressions in The GNU Emacs Manualを参照)。

以下の変数は循環構造および共有構造の検出と報告に使用されます:

Variable: print-circle

nilの場合、この変数はプリント時の循環構造と共有構造の検出を有効にする。Read Syntax for Circular Objectsを参照のこと。

Variable: print-gensym

nilの場合、この変数はプリント時のインターンされていないシンボル(Creating and Interning Symbolsを参照)の検出を有効にする。これが有効な場合、インターンされていないシンボルはプレフィックス‘#:’とともにプリントされる。このプレフィックスは、Lispリーダーにたいしてインターンされていないシンボルを生成するよう告げる。

Variable: print-continuous-numbering

nilの場合は、複数のプリント呼び出しを通じて通番が振られることを意味する。これは‘#n=’ラベルおよび‘#m#’参照にたいしてプリントされる数字に影響する。この変数をsetqでセットしてはならない。letを使用して一時的にtにバインドするべきである。これを行う場合は、print-number-tablenilにバインドするべきである。

Variable: print-number-table

この変数はprint-circle機能を実装するために、プリント処理で内部的に使用されるベクターを保持する。print-continuous-numberingをバインドするときにこの変数をnilにバインドする以外は、この変数を使用するべきではない。

Variable: float-output-format

この変数は浮動小数点数をプリントする方法を指定する。デフォルトはnilで、これは情報を失わずにその数値を表せるもっとも短い出力を使用することを意味する。

出力フォーマットをより精密に制御するために、この変数に文字列をセットできる。この文字列にはCのsprintf関数で使用される‘%’指定子をセットする。この変数で使用することのできる制限についての詳細は、この変数のドキュメント文字列を参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19 Minibuffers

ミニバッファー(minibuffer)とは、単一の数プレフィックス引数より複雑な引数を読み取るためにEmacsコマンドが使用する、特別なバッファーのことです。これらの引数にはファイル名、バッファー名、(M-xでの)コマンド名が含まれます。ミニバッファーはフレームの最下行、エコーエリア(The Echo Areaを参照)と同じ場所に表示されますが、引数を読み取るときだけ使用されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.1 Introduction to Minibuffers

ほとんどの点において、ミニバッファーは普通のEmacsバッファーです。編集コマンドのようなバッファーにたいするほとんどの操作は、ミニバッファーでも機能します。しかし、バッファーを管理する操作の多くは、ミニバッファーに適用できません。ミニバッファーは常に‘ *Minibuf-number*という形式の名前をもち、変更することはできません。ミニバッファーはミニバッファー用の特殊なウィンドウだけに表示されます。これらのウィンドウは常にフレーム最下に表示されます。(フレームにミニバッファーウィンドウがないときや、ミニバッファーウィンドウだけをもつ特殊なフレームもあります。)Minibuffers and Framesを参照してください。

ミニバッファー内のテキストは常にプロンプト文字列(prompt string)で始まります。これはミニバッファーを使用しているプログラムが、ユーザーにたいしてどのような種類の入力が求められているか告げるために指定するテキストです。このテキストは意図せずに変更してしまわないように、読み取り専用としてマークされます。このテキストはbeginning-of-lineforward-wordforward-sentenceforward-paragraphを含む特定の移動用関数が、プロンプトと実際のテキストの境界でストップするように、フィールド(Defining and Using Fieldsを参照)としてもマークされています。

ミニバッファーのウィンドウは、通常は1行です。ミニバッファーのコンテンツがより多くのスペースを要求する場合は、自動的に拡張されます。ミニバッファーのウィンドウがアクティブな間は、ウィンドウのサイズ変更コマンドで一時的にウィンドウのサイズを変更できます。サイズの変更は、ミニバッファーをexitしたとき、通常のサイズにリバートされます。ミニバッファーがアクティブでないときはフレーム内の他のウィンドウでウィンドウのサイズ変更コマンドを使用するか、マウスでモードラインをドラッグして、ミニバッファーのサイズを永続的に変更できます。(現実装では、これが機能するにはresize-mini-windowsnilでなければなりません。) フレームがミニバッファーだけを含む場合は、そのフレームのサイズを変更してミニバッファーのサイズを変更できます。

ミニバッファーの使用により入力イベントが読み取られ、this-commandlast-commandのような変数の値が変更されます(Information from the Command Loopを参照)。プログラムにそれらを変更させたくない場合は、ミニバッファーを使用するコードの前後でそれらをバインドするべきです。

ある状況下では、アクティブなミニバッファーが存在するときでもコマンドがミニバッファーを使用できます。そのようなミニバッファーは再帰ミニバッファー(recursive minibuffer)と呼ばれます。この場合、最初のミニバッファーは‘ *Minibuf-1*という名前になります。再帰ミニバッファーはミニバッファー名の最後の数字を増加させて命名されます。(名前はスペースで始まるので、通常のバッファーリストには表示されません。) 再帰ミニバッファーが複数ある場合は、最内の(もっとも最近にエンターされた)ミニバッファーがアクティブなミニバッファーになります。このバッファーが、通常ではミニバッファーと呼ばれるバッファーです。変数enable-recursive-minibuffers、またはコマンドシンボルのその名前のプロパティをセットすることにより再帰ミニバッファーを許可、または禁止できます(Recursive Minibuffersを参照)。

他のバッファーと同様、ミニバッファーは特別なキーバインドを指定するためにローカルキーマップ(Keymapsを参照)を使用します。ミニバッファーを呼び出す関数も、処理を行うためにローカルマップをセットアップします。補完なしのミニバッファーローカルマップについては、Reading Text Strings with the Minibufferを参照してください。補完つきのミニバッファーローカルマップについては、Minibuffer Commands that Do Completionを参照してください。

ミニバッファーが非アクティブのときのメジャーモードはminibuffer-inactive-modeで、キーマップはminibuffer-inactive-mode-mapです。これらは、実際にはミニバッファーが別フレームにある場合だけ、便利です。Minibuffers and Framesを参照してください。

Emacsがバッチモードで実行されている場合、ミニバッファーからの読み取りリクエストは、実装にはEmacs開始時に提供された標準入力記述子から行を読み取ります。これは基本的な入力だけをサポートします。特別なミニバッファーの機能(ヒストリー、補完、パスワードのマスクなど)は、バッチモードでは利用できません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.2 Reading Text Strings with the Minibuffer

ミニバッファー入力にたいする基本的なプリミティブはread-from-minibufferで、これは文字列とLispオブジェクトの両方からテキスト表現されたフォームを読み取ることができます。関数read-regexpは、特別な種類の文字列である正規表現式(Regular Expressionsを参照)の読み取りに使用されます。コマンドや変数、ファイル名などの読み取りに特化した関数もあります(Completionを参照)。

ほとんどの場合では、Lisp関数の途中でミニバッファー入力関数を呼び出すべきではありません。かわりにinteractive指定されたコマンドの引数読み取りの一部として、すべてのミニバッファー入力を行います。Defining Commandsを参照してください。

Function: read-from-minibuffer prompt &optional initial keymap read history default inherit-input-method

この関数は、ミニバッファーから入力を取得するもっとも一般的な手段である。デフォルトでは、任意のテキストを受け入れて、それを文字列としてリターンする。しかし、readが非nilの場合は、テキストをLispオブジェクトに変換するためにreadを使用する(Input Functionsを参照)。

この関数が最初に行うのは、ミニバッファーをアクティブにして、プロンプトにprompt(文字列でなければならない)を用いてミニバッファーを表示することである。その後に、ユーザーはミニバッファーでテキストを編集できる。

ミニバッファーをexitするためにユーザーがコマンドをタイプするとき、read-from-minibufferはミニバッファー内のテキストからリターン値を構築する。通常はそのテキストを含む文字列がリターンされる。しかし、readが非nilの場合、read-from-minibufferはテキストを読み込んで結果を未評価のLispオブジェクトでリターンする。(読み取りについての詳細は、See section Input Functionsを参照のこと。)

引数defaultは、ヒストリーコマンドを通じて利用できるデフォルト値を指定する。値には文字列、文字列リスト、またはnilを指定する。文字列または文字列リストは、ユーザーがM-nで利用可能な“未来のヒストリー(future history)”になります。

readが非nilの場合は、ユーザーの入力が空のときのreadの入力としても、defaultが使用される。defaultが文字列リストの!は、最初の文字列が入力として使用される。defaultnilの場合、空の入力はend-of-fileエラーとなる。しかし通常(readnil)の場合には、ユーザーの入力が空のときread-from-minibufferdefaultを無視して、空文字列""をリターンする。この点において、この関数はこのチャプターの他のどのミニバッファー入力関数とも異なる。

keymapが非nilの場合、そのキーマップはミニバッファー内で使用されるローカルキーマップとなる。keymapが省略、またはnilの場合は、minibuffer-local-mapの値がキーマップとして使用される。キーマップの指定は、補完のようなさまざまなアプリケーションにたいしてミニバッファーをカスタマイズする、もっとも重要な方法である。

引数historyは、入力の保存やミニバッファー内で使用されるヒストリーコマンドが使用するヒストリーリスト変数を指定する。デフォルトはminibuffer-historyである。同様に、オプションでヒストリーリスト内の開始位置を指定できる。Minibuffer Historyを参照のこと。

変数minibuffer-allow-text-propertiesが非nilの場合には、リターンされる文字列にはミニバッファーでのすべてのテキストプロパティが含まれる。それ以外では、値がリターンされるときすべてのテキストプロパティが取り除かれる。

引数inherit-input-methodが非nilの場合には、ミニバッファーにエンターする前にカレントだったバッファーが何であれ、カレントのインプットメソッド(Input Methodsを参照)、およびenable-multibyte-charactersのセッティング(Text Representationsを参照)が継承される。

ほとんどの場合、initialの使用は推奨されない。非nil値の使用は、historyにたいするコンスセル指定と組み合わせる場合のみ推奨する。Initial Inputを参照のこと。

Function: read-string prompt &optional initial history default inherit-input-method

この関数はミニバッファーから文字列を読み取り、それをリターンする。引数promptinitialhistoryinherit-input-methodread-from-minibufferで使用する場合と同様。使用されるキーマップはminibuffer-local-mapである。

オプション引数defaultread-from-minibufferの場合と同様に使用されるが、ユーザーの入力が空の場合にリターンするデフォルト値も指定する。read-from-minibufferの場合と同様、値は文字列、文字列リスト、またはnil(空文字列と等価)である。defaultが文字列のときは、その文字列がデフォルト値になる。文字列リストのときは、最初の文字列がデフォルト値になる。(これらの文字列はすべて“未来のミニバッファーヒストリー(future minibuffer history)”としてユーザーが利用可能)。

この関数はread-from-minibufferを呼び出すことにより機能する。

(read-string prompt initial history default inherit)
≡
(let ((value
       (read-from-minibuffer prompt initial nil nil
                             history default inherit)))
  (if (and (equal value "") default)
      (if (consp default) (car default) default)
    value))
Function: read-regexp prompt &optional defaults history

この関数はミニバッファーから文字列として正規表現を読み取り、それをリターンする。ミニバッファーのプロンプト文字列promptが‘:’(とその後にオプションの空白文字)で終端されていない場合、この関数はデフォルトのリターン値(空文字列でない場合。以下参照)の前に‘: ’を付加する。

オプション引数defaultsは、入力が空の場合にリターンするデフォルト値を制御する。値は文字列、nil(空文字列と等価)、文字列リスト、シンボルのうちのどれか。

defaultsがシンボルの場合、read-regexpは変数read-regexp-defaults-function(以下参照)の値を調べて非nilのときは、defaultsよりそちらを優先的に使用する。この場合、値は以下のいずれか:

これで、read-regexpdefaultsを処理した結果はリストに確定する(値がnilまたは文字列の場合は1要素のリストに変換する)。このリストにたいし、read-regexpは、以下のような入力として有用な候補をいくつか追加する:

これで関数は、ユーザー入力を取得するためにread-from-minibufferに渡す正規表現のリストを得た。リストの最初の要素は入力が空の場合のデフォルト値である。リストのすべての要素は“未来のミニバッファーヒストリーリスト(future minibuffer history list)” (see future list in The GNU Emacs Manualを参照)としてユーザーが利用可能になる。

オプション引数historyが非nilの場合、それは使用するミニバッファーヒストリーリストを指定するシンボルである(Minibuffer Historyを参照)。これが省略、またはnilの場合、ヒストリーリストのデフォルトはregexp-historyとなる。

Variable: read-regexp-defaults-function

関数read-regexpは、デフォルトの正規表現リストを決定するために、この変数の値を使用するかもしれない。非nilの場合、この変数は以下のいずれかである:

これらの変数の使い方についての詳細は、上述のread-regexpを参照のこと。

Variable: minibuffer-allow-text-properties

この変数がnilの場合、read-from-minibufferおよびread-stringはミニバッファー入力をリターンする前に、すべてのテキストプロパティを取り除く。しかしread-no-blanks-input(以下参照)、同様に補完つきでミニバッファー入力を行うread-minibufferおよびそれに関連する関数(Reading Lisp Objects With the Minibufferを参照)は、この変数の値に関わらず、無条件でテキストプロパティを破棄する。

Variable: minibuffer-local-map

これはミニバッファーからの読み取りにたいするデフォルトローカルキーマップである。デフォルトでは以下のバインディングをもつ:

C-j

exit-minibuffer

RET

exit-minibuffer

C-g

abort-recursive-edit

M-n
DOWN

next-history-element

M-p
UP

previous-history-element

M-s

next-matching-history-element

M-r

previous-matching-history-element

Function: read-no-blanks-input prompt &optional initial inherit-input-method

この関数はミニバッファーから文字列を読み取るが、入力の一部として空白文字を認めず、かわりに空白文字は入力を終端させる。引数promptinitialinherit-input-methodread-from-minibufferで使用するときと同様。

これは関数read-from-minibufferの簡略化されたインターフェイスであり、キーマップminibuffer-local-ns-mapの値をkeymap引数として、read-from-minibuffer関数に渡す。キーマップminibuffer-local-ns-mapC-qをリバインドしないので、クォートすることにより文字列内にスペースを挿入することが可能である

minibuffer-allow-text-propertiesの値に関わらず、この関数はテキストプロパティを破棄する。

(read-no-blanks-input prompt initial)
≡
(let (minibuffer-allow-text-properties)
  (read-from-minibuffer prompt initial minibuffer-local-ns-map))
Variable: minibuffer-local-ns-map

このビルトイン変数は関数read-no-blanks-input内でミニバッファーローカルキーマップとして使用されるキーマップである。デフォルトでは、minibuffer-local-mapのバインディングに加えて、以下のバインディングが有効になる:

SPC

exit-minibuffer

TAB

exit-minibuffer

?

self-insert-and-exit


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.3 Reading Lisp Objects with the Minibuffer

このセクションでは、ミニバッファーでLispオブジェクトを読み取る関数を説明します。

Function: read-minibuffer prompt &optional initial

この関数はミニバッファーを使用してLispオブジェクトをよみ、それを評価せずにリターンする。引数promptinitialは、read-from-minibufferのときと同様に使用する。

これはread-from-minibuffer関数にたいする簡略化されたインターフェイスである。

(read-minibuffer prompt initial)
≡
(let (minibuffer-allow-text-properties)
  (read-from-minibuffer prompt initial nil t))

以下の例では、初期入力として文字列"(testing)"を与えている:

(read-minibuffer
 "Enter an expression: " (format "%s" '(testing)))

;; 以下はミニバッファーでの表示::

---------- Buffer: Minibuffer ----------
Enter an expression: (testing)∗
---------- Buffer: Minibuffer ----------

ユーザーはRETをタイプして初期入力をデフォルトとして利用したり、入力を編集することができる。

Function: eval-minibuffer prompt &optional initial

この関数はミニバッファーを使用してLisp式を読み取り、それを評価して結果をリターンする。引数promptinitialの使い方は、read-from-minibufferと同様。

この関数は、read-minibufferの呼び出し結果を単に評価する:

(eval-minibuffer prompt initial)
≡
(eval (read-minibuffer prompt initial))
Function: edit-and-eval-command prompt form

この関数はミニバッファーでLisp式を読み取り、それを評価して結果をリターンする。このコマンドとeval-minibufferの違いは、このコマンドでは初期値としてのformはオプションではなく、テキストの文字列ではないプリント表現に変換されたLispオブジェクトとして扱われることである。これはprin1でプリントされるので、文字列の場合はテキスト初期値内にダブルクォート文字(‘"’)が含まれる。Output Functionsを参照のこと。

以下の例では、すでに有効なフォームであるようなテキスト初期値として式をユーザーに提案している:

(edit-and-eval-command "Please edit: " '(forward-word 1))

;; 前の式を評価した後に、
;;   ミニバッファーに以下が表示される。:

---------- Buffer: Minibuffer ----------
Please edit: (forward-word 1)∗
---------- Buffer: Minibuffer ----------

すぐにRET をタイプするとミニバッファーをexitして式を評価するので、1単語分ポイントは前進する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.4 Minibuffer History

ミニバッファーヒストリーリスト(minibuffer history list)は以前のミニバッファー入力を記録するので、それらを手軽に再利用できます。ミニバッファーヒストリーリストは、(以前に入力された)文字列のリストで、もっとも最近の文字列が先頭になります。

多数のミニバッファーが個別に存在し、異なる入力の種類に使用されます。それぞれのミニバッファー使用にたいして正しいヒストリーリストを指定するのは、Lispプログラマーの役目です。

ミニバッファーヒストリーリストは、read-from-minibufferおよびcompleting-readのオプション引数historyに指定します。以下が利用できる値です:

variable

ヒストリーリストとしてvariable(シンボル)を使用する。

(variable . startpos)

ヒストリーリストとしてvariable(シンボル)を使用し、ヒストリー位置の初期値をstartpos(負の整数)とみなす。

startposに0を指定するのは、単にシンボルvariableだけを指定するのと等価である。previous-history-elementはミニバッファー内のヒストリーリストの最新の要素を表示するだろう。 正のstartposを指定した場合、ミニバッファーヒストリー関数は(elt variable(1- startpos))がミニバッファー内でカレントで表示されているヒストリー要素であるかのように振る舞う。

一貫性を保つため、ミニバッファー入力関数のinitial引数(Initial Inputを参照)使用して、ミニバッファーの初期内容となるヒストリー要素も指定すべきである。

historyを指定しない場合は、デフォルトのヒストリーリストminibuffer-historyが使用されます。他の標準的なヒストリーリストについては、以下を参照してください。最初に使用する前にnilに初期化するだけで、独自のヒストリーリストを作成することもできます。

read-from-minibuffercompleting-readは、どちらも新たな要素を自動的にヒストリーリストに追加して、ユーザーがそのリストのアイテムを再使用するためのコマンドを提供します。ヒストリーリストを使用するためにプログラムが行う必要があるのは、リストの初期化と、使用するときに入力関数にリストの名前を渡すだけです。しかし、ミニバッファー入力関数がリストを使用していないときに、手動でリストを変更しても問題はありません。

新たな要素をヒストリーリストに追加するEmacs関数は、リストが長くなりすぎたときに古い要素の削除も行うことができます。変数history-lengthは、ほとんどのヒストリーリストの最大長を指定する変数です。特定のヒストリーリストにたいして異なる最大長を指定するには、そのヒストリーリストシンボルのhistory-lengthプロパティにその最大長をセットします。変数history-delete-duplicatesには、ヒストリー内の重複を削除するかどうかを指定します。

Function: add-to-history history-var newelt &optional maxelt keep-all

この関数はneweltが空文字列でなければ、それを新たな要素として変数history-varに格納されたヒストリーリストに追加して、更新されたヒストリーリストをリターンする。これはmaxeltまたはhistory-lengthがが非nilの場合は、リストの長さをその変数の値に制限する(以下参照)。maxeltに指定できる値の意味は、history-lengthの値と同様。

add-to-historyは通常、history-delete-duplicatesが非nilならば、ヒストリーリスト内の重複メンバーを削除する。しかし、keep-allが非nilの場合、それは重複を削除しないことを意味し、たとえneweltが空でもリストに追加する。

Variable: history-add-new-input

この変数の値がnilの場合、ミニバッファーから読み取りを行う標準的な関数は、ヒストリーリストに新たな要素を追加しない。これにより、Lispプログラムがadd-to-historyを使用して明示的に入力ヒストリーを管理することになる。デフォルト値はt

User Option: history-length

この変数の値は、最大長を独自に指定しないすべてのヒストリーリストの最大長を指定する。値がtの場合は、最大長がない(古い要素を削除しない)ことを意味する。ヒストリーリスト変数のシンボルのhistory-lengthプロパティが非nilの場合には、その特定のヒストリーリストにたいする最大長として、そのプロパティ値がこの変数をオーバーライドする。

User Option: history-delete-duplicates

この変数の値がtの場合、それは新たなヒストリー要素の追加時に、以前からある等しい要素が削除されることを意味する。

以下は、標準的なミニバッファーヒストリーリスト変数です:

Variable: minibuffer-history

ミニバッファーヒストリー入力にたいするデフォルトのヒストリーリスト。

Variable: query-replace-history

query-replaceの引数(および他のコマンドの同様の引数)にたいするヒストリーリスト。

Variable: file-name-history

ファイル名引数にたいするヒストリーリスト。

Variable: buffer-name-history

バッファー名引数にたいするヒストリーリスト。

Variable: regexp-history

正規表現引数にたいするヒストリーリスト。

Variable: extended-command-history

拡張コマンド名引数にたいするヒストリーリスト。

Variable: shell-command-history

シェルコマンド引数にたいするヒストリーリスト。

Variable: read-expression-history

評価されるためのLisp式引数にたいするヒストリーリスト。

Variable: face-name-history

フェイス引数にたいするヒストリーリスト。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.5 Initial Input

ミニバッファー入力にたいする関数のいくつかには、initialと呼ばれる引数があります。これは通常のように空の状態で開始されるのではなく、特定のテキストとともにミニバッファーが開始されることを指定しますが、ほとんどの場合において推奨されない機能です。

initialが文字列の場合、ミニバッファーはその文字列のテキストを含む状態で開始され、ユーザーがそのテキストの編集を開始するとき、ポイントはテキストの終端にあります。ユーザーがミニバッファーをexitするために単にRETをタイプした場合には、この入力文字列の初期値をリターン値だと判断します。

initialにたいして非nil値の使用には反対します。なぜなら初期入力は強要的なインターフェイスだからです。ユーザーにたいして有用なデフォルト入力を提案するためには、ヒストリーリストやデフォルト値の提供のほうが、より便利です。

しかしinitial引数にたいして文字列を指定すべき状況が1つだけあります。それは、history引数にコンスセルを指定したときです。Minibuffer Historyを参照してください。

initial(string . position)という形式をとることもできます。これはstringをミニバッファーに挿入するが、その文字列のテキスト中のpositionにポイントを配するという意味です。

歴史的な経緯により、positionは異なる関数において実装が統一されていません。completing-readではpositionの値は0基準です。つまり、値0は文字列の先頭で、1は最初の文字の次、...を意味します。しかしread-minibuffer、およびこの引数をサポートする補完を行わない他のミニバッファー入力関数では、1は文字列の先頭、2は最初の文字の次、...を意味します。

initialの値としてのコンスセルの使用は、推奨されません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6 Completion

補完(complete, ompletion)は省略された形式から始まる名前の残りを充填する機能です。補完はユーザー入力と有効な名前リストを比較して、ユーザーが何をタイプしたかで名前をどの程度一意に判定できるか判断することにより機能します。たとえばC-x b(switch-to-buffer)とタイプしてから、スイッチしたいバッファー名の最初の数文字をタイプして、その後にTAB(minibuffer-complete)をタイプすると、Emacsはその名前を可能な限り展開します。

標準的なEmacsコマンドはシンボル、ファイル、バッファー、プロセスの名前にたいして補完を提案します。このセクションの関数により、他の種類の名前にたいしても補完を実装できます。

try-completion関数は補完にたいする基本的なプリミティブです。これは初期文字列にたいして文字列セットをマッチして、最長と判定された補完をリターンします。

関数completing-readは、補完にたいする高レベルなインターフェイスを提供します。completing-readの呼び出しにより、有効な名前リストの判定方法が指定されます。その後にこの関数は補完にたいして有用ないくつかのコマンドにキーバインドするローカルキーマップとともに、ミニバッファーをアクティブ化します。その他の関数は、特定の種類の名前を補完つきで読み取る、簡便なインターフェイスを提供します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.1 Basic Completion Functions

以下の補完関数は、その関数自身ではミニバッファーでなにも行いません。ここでは、ミニバッファーを使用する高レベルの補完機能と並べて、これらの関数について説明します。

Function: try-completion string collection &optional predicate

この関数はcollection内のstringに利用可能なすべての補完の、共通する最長部分文字列をリターンする。

collection補完テーブル(completion table)と呼ばれる。値は文字列リスト、コンスセル、obarray、ハッシュテーブル、または補完関数でなければならない。

try-completionは補完テーブルにより指定された許容できる補完それぞれにたいして、stringと比較を行う。許容できる補完マッチが存在しない場合は、nilをリターンする。マッチする補完が1つだけで、それが完全一致ならばtをリターンする。それ以外は、すべてのマッチ可能な補完に共通する最長の初期シーケンス(longest initial sequence)をリターンする。

collectionがリストの場合、許容できる補完(permissible completions)はそのリストの要素により指定される。リストの要素は文字列、またはCARが文字列または(symbol-nameにより文字列に変換される)シンボルであるようなコンスセルである。リストに他の型の要素が含まれる場合は無視される。

collectionがobarray(Creating and Interning Symbolsを参照)の場合、そのobarray内のすべてのシンボル名が許容できる補完セットを形成する。

collectionがハッシュテーブルの場合には、文字列のキーが利用可能な補完(possible completions)になる。他のキーは無視される。

collectionとして関数を使用することもできる。この場合、この関数だけが補完を処理する役目を担う。つまりtry-completionは、この関数が何をリターンしようとも、それをリターンする。この関数はstringpredicatenilの3つの引数で呼び出される(3つ目の引数は同じ関数をall-completionsでも使用して、どちらの場合でも適切なことを行うためである)。Programmed Completionを参照のこと。

引数predicateが非nilの場合、collectionがハッシュテーブルなら1引数、それ以外は2引数の関数でなければならない。これは利用可能なマッチのテストに使用され、マッチはpredicateが非nilをリターンしたときだけ受け入れられる。predicateに与えられる引数は文字列、alistのコンスセル(CARが文字列)、またはobarrayのシンボル(シンボル名ではない)のうちのどれか。collectionがハッシュテーブルの場合、predicateは文字列キー(string key)と関連値(associated value)の2引数で呼び出される。

加えて使いやすいように、補完はcompletion-regexp-list内のすべての正規表現にもマッチしなければならない。(collectionが関数の場合は、その関数自身がcompletion-regexp-listを処理する必要がある。)

以下の例の1つ目では、文字列‘foo’がalistのうち3つのCARとマッチされている。すべてのマッチは文字‘fooba’で始まるので、それが結果となる。2つ目の例では、可能なマッチは1つだけで、しかも完全一致なのでリターン値はtになる。

(try-completion
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4)))
     ⇒ "fooba"

(try-completion "foo" '(("barfoo" 2) ("foo" 3)))
     ⇒ t

以下の例では、文字‘forw’で始まるシンボルが多数あり、それらはすべて単語‘forward’で始まる。ほとんどのシンボルはその後に‘-’が続くが、すべてではないので‘forward’までしか補完できない。

(try-completion "forw" obarray)
     ⇒ "forward"

最後に、以下の例では述語testに渡される利用可能なマッチは3つのうち2つだけである(文字列‘foobaz’は短すぎる)。これらは両方とも文字列‘foobar’で始まる。

(defun test (s)
  (> (length (car s)) 6))
     ⇒ test
(try-completion
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 'test)
     ⇒ "foobar"
Function: all-completions string collection &optional predicate

この関数は、stringの利用可能な補完すべてのリストをリターンする。この関数の引数はtry-completionの引数と同じであり、try-completionが行うのと同じ方法でcompletion-regexp-listを使用する。

collectionか関数の場合はstringpredicatetの3つの引数で呼び出される。この場合、その関数がリターンするのが何であれ、all-completionsはそれをリターンする。Programmed Completionを参照のこと。

以下の例は、try-completionの例の関数testを使用している。

(defun test (s)
  (> (length (car s)) 6))
     ⇒ test

(all-completions
 "foo"
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 'test)
     ⇒ ("foobar1" "foobar2")
Function: test-completion string collection &optional predicate

この関数は、stringcollectionおよびpredicateで指定された有効な補完候補の場合は、nilをリターンする。引数はtry-completionの引数と同じ。たとえば、collectionが文字列リストの場合は、stringがリスト内に存在し、かつpredicateを満足すればtrueとなる。

この関数はtry-completionが行うのと同じ方法で、completion-regexp-listを使用する。

predicateが非nilで、collectionが同じ文字列を複数含む場合には、completion-ignore-caseにしたがってcompare-stringsで判定して、それらすべてをリターンするか、もしくは何もリターンしない。それ以外では、test-completionのリターン値は基本的に予測不可能である。

collectionが関数の場合はstringpredicatelambdaの3つの引数で呼び出される。それが何をリターンするにせよ、test-completionはそれをリターンする。

Function: completion-boundaries string collection predicate suffix

この関数はポイントの前のテキストがstring、ポイントの後がsuffixと仮定して、collectionが扱うフィールドの境界(boundary)をリターンする。

補完は通常、文字列(string)全体に作用するので、すべての普通のコレクション(collection)にたいして、この関数は常に(0 . (length suffix))をリターンするだろう。しかしファイルにたいする補完などのより複雑な補完は、1回に1フィールド行われる。たとえば、たとえ"/usr/share/doc"が存在しても、"/usr/sh"の補完に"/usr/share/"は含まれるが、"/usr/share/doc"は含まれないだろう。また、"/usr/sh"にたいするall-completions"/usr/share/"は含まれず、"share/"だけが含まれるだろう。string"/usr/sh"suffix"e/doc"の場合、completion-boundaries(5 . 1)をリターンするだろう。これは、collection"/usr/"の後ろにあり"/doc"の前にある領域に関する補完情報だけをリターンするであろうことを告げている。

補完alistを変数に格納した場合は、変数のrisky-local-variableプロパティに非nilをセットして、その変数が“risky(危険)”だとマークすべきである。File Local Variablesを参照のこと。

Variable: completion-ignore-case

この変数の値が非nilの場合、補完での大文字小文字の違いは意味をもたない。read-file-nameでは、この変数はread-file-name-completion-ignore-case(Reading File Namesを参照)にオーバーライドされる。read-bufferでは、この変数はread-buffer-completion-ignore-case(High-Level Completion Functionsを参照)にオーバーライドされる。

Variable: completion-regexp-list

これは正規表現のリストである。補完関数はこのリスト内のすべての正規表現にマッチした場合のみ許容できる補完と判断する。case-fold-search(Searching and Caseを参照)ではcompletion-ignore-caseの値にバインドされる。

Macro: lazy-completion-table var fun

この変数は変数varを補完のためのcollectionとしてlazy(lazy: 力のない、だらけさせる、のろのろした、怠惰な、不精な、眠気を誘う)な方法で初期化する。ここでlazyとは、collection内の実際のコンテンツを必要になるまで計算しないという意味。このマクロはvarに格納する値の生成に使用する。varを使用して最初に補完を行ったとき、真の値が実際に計算される。これは引数なしでfunを呼び出すことにより行われる。funがリターンする値は、varの永続的な値となる。

以下は例である:

(defvar foo (lazy-completion-table foo make-my-alist))

既存の補完テーブルを受け取り変更したバージョンをリターンする関数が、いくつかあります。completion-table-case-foldは大文字小文字を区別しない、case-insensitiveなテーブルをリターンします。completion-table-in-turncompletion-table-mergeは、複数の入力テーブルを、異なる方法で組み合わせます。completion-table-subvertはテーブルを異なる初期プレフィックス(initial prefix)で変更します。completion-table-with-quotingはクォートされたテキストの処理に適したテーブルをリターンします。completion-table-with-predicateは述語関数(predicate function)によりフィルターします。completion-table-with-terminatorは終端文字列(terminating string)を追加します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.2 Completion and the Minibuffer

このセクションでは、補完つきでミニバッファーから読み取るための、基本的なインターフェイスを説明します。

Function: completing-read prompt collection &optional predicate require-match initial history default inherit-input-method

この関数は、補完の提供によりユーザーを支援して、ミニバッファーから文字列を読み取る。prompt(文字列でなければならない)のプロンプトとともに、ミニバッファーをアクティブ化する。

実際の補完は、補完テーブルcollectionと補完述語predicateを関数try-completion(Basic Completion Functionsを参照)に渡すことにより行われる。これは補完の使用されるローカルキーマップに特定のコマンドをバインドしたとき発生する。これらのコマンドのいくつかは、test-completionも呼び出す。したがって、predicateが非nilの場合は、collectioncompletion-ignore-caseが矛盾しないようにすべきである。Definition of test-completionを参照のこと。

オプション引数require-matchの値は、ユーザーがミニバッファーをexitする方法を決定する。

しかし、require-matchの値に関わらず、空の入力は常に許される。この場合、completing-readdefaultがリストなら最初の要素、defaultnilなら""、またはdefaultをリターンする。文字列およびdefault内の文字列は、ヒストリーコマンドを通じてユーザーが利用できる。

関数completing-readrequire-matchnilの場合はキーマップとしてminibuffer-local-completion-mapを、require-matchが非nilの場合はminibuffer-local-must-match-mapを使用する。Minibuffer Commands that Do Completionを参照のこと。

引数historyは入力の保存とミニバッファーヒストリーコマンドに、どのヒストリーリスト変数を使用するか指定する。デフォルトはminibuffer-historyMinibuffer Historyを参照のこと。

initialは、ほとんどの場合推奨されない。historyにたいするコンスセル指定と組み合わせた場合のみ、非nil値の使用を推奨する。Initial Inputを参照のこと。デフォルト入力にたいしては、かわりにdefaultを使用する。

引数inherit-input-methodが非nilの場合には、ミニバッファーにエンターする前にカレントだったバッファーが何であれ、カレントのインプットメソッド(Input Methodsを参照)、およびenable-multibyte-charactersのセッティング(Text Representationsを参照)が継承される。

変数completion-ignore-caseが非nilの場合、利用可能なマッチにたいして入力を比較するときの補完は、大文字小文字を区別しない。Basic Completion Functionsを参照のこと。このモードでの操作では、predicateも大文字小文字を区別してはならない(さもないと驚くべき結果となるであろう)。

以下はcompleting-readを使用した例である:

(completing-read
 "Complete a foo: "
 '(("foobar1" 1) ("barfoo" 2) ("foobaz" 3) ("foobar2" 4))
 nil t "fo")

;; 前の式を評価後に、
;;   ミニバッファーに以下が表示される。:

---------- Buffer: Minibuffer ----------
Complete a foo: fo∗
---------- Buffer: Minibuffer ----------

その後ユーザーがDEL DEL b RETをタイプすると、completing-readbarfooをリターンする。

completing-read関数は、実際に補完を行うコマンドの情報を渡すために、変数をバインドする。これらの変数は、以降のセクションで説明する。

Variable: completing-read-function

この変数の値は関数でなければならず、補完つきの読み取りを実際に行うためにcompleting-readから呼び出される。この関数はcompleting-readと同じ引数を受け入れる。他の関数のバインドして、通常のcompleting-readの振る舞いを完全にオーバーライドすることができる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.3 Minibuffer Commands that Do Completion

このセクションでは、補完のためにミニバッファーで使用されるキーマップ、コマンド、ユーザーオプションを説明します。

Variable: minibuffer-completion-table

この変数の値は、ミニバッファー内の補完に使用される補完テーブルである。これはcompleting-readtry-completionに渡す補完テーブルを含むグローバル変数である。minibuffer-complete-wordのような、ミニバッファー補完コマンドにより使用される。

Variable: minibuffer-completion-predicate

この変数の値はcompleting-readtry-completionに渡す述語(predicate)である。この変数は、他のミニバッファー補完関数でも使用される。

Variable: minibuffer-completion-confirm

この変数はミニバッファーをexitする前に、Emacsが確認を求めるかどうかを決定する。completing-readはこの変数をバインドして、exitする前に関数minibuffer-complete-and-exitがこの値をチェックする。値がnilの場合は、確認は求められない。値がconfirmの場合、入力が有効な補完候補でなくてもユーザーはexitするかもしれないが、Emacsは確認を求めない。値がconfirm-after-completionの場合、入力が有効な補完候補でなくてもユーザーはexitするかもしれないが、ユーザーがminibuffer-confirm-exit-commands内の任意の補完コマンドの直後に入力を確定した場合、Emacsは確認を求める。

Variable: minibuffer-confirm-exit-commands

この変数には、completing-readの引数require-matchconfirm-after-completionの場合は、ミニバッファーをexitする前にEmacsが確認を求めるようにさせるコマンドのリストが保持されている。このリストないのコマンドを呼び出した直後にユーザーがミニバッファーのexitを試みると、Emacsは確認を求める。

Command: minibuffer-complete-word

この関数は、ただ1つの単語からミニバッファーを補完する。たとえミニバッファーのコンテンツが1つの補完しかもたない場合でも、minibuffer-complete-wordはその単語に属さない最初の文字を超えた追加はしない。Syntax Tablesを参照のこと。

Command: minibuffer-complete

この関数は、可能な限りミニバッファーのコンテンツを補完する。

Command: minibuffer-complete-and-exit

この関数はミニバッファーのコンテンツを補完して、確認が要求されない場合(たとえばminibuffer-completion-confirmnilのとき)はexitする。確認が要求される場合には、このコマンドを即座に繰り返すことにより確認が行われないようにする。このコマンドは2回連続で実行された場合は確認なしで機能するようにプログラムされている。

Command: minibuffer-completion-help

この関数は、カレントのミニバッファーのコンテンツで利用可能な補完のリストを作成する。これはall-completionsの引数collectionに変数minibuffer-completion-tableの値を、引数predicateminibuffer-completion-predicateの値を使用して呼び出すことにより機能する。補完リストは、*Completions*と呼ばれるバッファーのテキストとして表示される。

Function: display-completion-list completions

この関数はstandard-output内のストリーム(通常はバッファー)にcompletionsを表示する(ストリームについての詳細は、Reading and Printing Lisp Objectsを参照)。引数completionsは通常、all-completionsがリターンする補完リストそのものだが、それである必要はない。要素はシンボルか文字列で、どちらも単にプリントされる。文字列2つのリストでもよく、2つの文字列が結合されたかのようにプリントされる。この場合、1つ目の文字列は実際の補完で、2つ目の文字列は注釈の役目を負う。

この関数はminibuffer-completion-helpにより呼び出される。一般的には、以下のようにwith-output-to-temp-bufferとともに使用される。

(with-output-to-temp-buffer "*Completions*"
  (display-completion-list
    (all-completions (buffer-string) my-alist)))
User Option: completion-auto-help

この変数が非nilの場合には、次の文字が一意でないために決定できず補完が完了しないときは常に、補完コマンドは利用可能な補完リストを自動的に表示する。

Variable: minibuffer-local-completion-map

completing-readの値は、補完の1つが完全に一致することを要求されないときにローカルキーマップとして使用される。デフォルトでは、このキーマップは以下のバインディングを作成する:

?

minibuffer-completion-help

SPC

minibuffer-complete-word

TAB

minibuffer-complete

親キーマップとしてminibuffer-local-mapを使用する(Definition of minibuffer-local-mapを参照)。

Variable: minibuffer-local-must-match-map

completing-readは、補完の1つの完全な一致が要求されないときのローカルキーマップとして、この値を使用する。したがってexit-minibufferにキーがバインドされていなければ、無条件にミニバッファーをexitする。デフォルトでは、このキーマップは以下のバインディングを作成する:

C-j

minibuffer-complete-and-exit

RET

minibuffer-complete-and-exit

親キーマップはminibuffer-local-completion-mapを使用する。

Variable: minibuffer-local-filename-completion-map

これは単にSPCを非バインドするsparseキーマップ(sparse: 疎、希薄、まばら)を作成する。これはファイル名にスペースを含めることができるからである。関数read-file-nameは、このキーマップとminibuffer-local-completion-mapminibuffer-local-must-match-mapのいずれかを組み合わせる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.4 High-Level Completion Functions

このセクションでは、特定の種類の名前を補完つきで読み取る便利な高レベル関数を説明します。

ほとんどの場合、Lisp関数の中盤でこれらの関数を呼び出すべきではありません。可能なときは、interactive指定の内部で呼び出し、ミニバッファーのすべての入力をコマンドの引数読み取りの一部にします。Defining Commandsを参照してください。

Function: read-buffer prompt &optional default require-match

この関数はバッファーの名前を読み取り、それを文字列でリターンする。引数defaultは、ミニバッファーが空の状態でユーザーがexitした場合にリターンされるデフォルト名として使用される。非nilの場合は文字列、文字列リスト、またはバッファーを指定する。リストの場合は、リストの先頭の要素がデフォルト値になる。デフォルト値はプロンプトに示されるが、初期入力としてミニバッファーには挿入されない。

引数promptは、コロンかスペースで終わる文字列である。defaultが非nilの場合、この関数はデフォルト値つきでミニバッファーから読み取る際の慣習にしたがい、コロンの前のpromptの中にこれを挿入する。

オプション引数require-matchは、completing-readのときと同じ。Completion and the Minibufferを参照のこと。

以下の例で、ユーザーが‘minibuffer.t’とエンターしてから、RETをタイプする。引数require-matchtであり、与えられた入力で始まるバッファー名は‘minibuffer.texi’だけなので、その名前が値となる。

(read-buffer "Buffer name: " "foo" t)
;; 前の式を評価した後、
;;   空のミニバッファーに
;;   以下のプロンプトが表示される:

---------- Buffer: Minibuffer ----------
Buffer name (default foo): ∗
---------- Buffer: Minibuffer ----------

;; ユーザーがminibuffer.t RETとタイプする。
     ⇒ "minibuffer.texi"
User Option: read-buffer-function

この変数が非nilの場合は、バッファー名を読み取る関数である。read-bufferは通常行うことを行うかわりに、read-bufferと同じ引数でその関数を呼び出す。

User Option: read-buffer-completion-ignore-case

この変数が非non-nilの場合は、補完の処理においてread-bufferは大文字小文字を無視する。

Function: read-command prompt &optional default

この関数はコマンドの名前を読み取り、Lispシンボルとしてそれをリターンする。引数promptは、read-from-minibufferで使用される場合と同じ。それが何であれcommandptをリターンすればコマンドであり、コマンド名とはcommandptをリターンするシンボルだということを思い出してほしい。Interactive Callを参照のこと。

引数defaultは、ユーザーがnull入力をエンターした場合に何をリターンするか指定する。シンボル、文字列、文字列リストを指定できる。文字列の場合、read-commandはリターンする前にそれをinternする。リストの場合、read-commandはリストの最初の要素をinternする。defaultnilの場合は、デフォルトが指定されなかったことを意味する。その場合もしユーザーがnull入力をエンターすると、リターン値は(intern "")、つまり名前が空文字列のシンボルとなる。

(read-command "Command name? ")

;; 前の式を評価した後に、
;;   空のミニバッファーに以下のプロンプトが表示される:

---------- Buffer: Minibuffer ----------
Command name?
---------- Buffer: Minibuffer ----------

ユーザーがforward-c RETとタイプした場合、この関数はforward-charをリターンする。

read-command関数は、completing-readの簡略化されたインターフェイスである。実在するLisp変数のセットを補完するために変数obarrayを、コマンド名だけを受け入れるために述語commandpを使用する。

(read-command prompt)
≡
(intern (completing-read prompt obarray
                         'commandp t nil))
Function: read-variable prompt &optional default

この変数はカスタマイズ可能な変数の名前を読み取り、それをシンボルとしてリターンする。引数の形式はread-commandの引数と同じ。この関数は、commandpのかわりにcustom-variable-pを述語に使用する点を除き、read-commandと同様に振る舞う。

Command: read-color &optional prompt convert allow-empty display

この関数はカラー指定(カラー名、または#RRRGGGBBBのような形式のRGB16進値)の文字列を読み取る。これはプロンプトにprompt(デフォルトは"Color (name or #RGB triplet):")を表示して、カラー名にたいする補完を提供する(16進RGB値は補完しない)。標準的なカラー名に加えて、補完候補にはポイント位置のフォアグラウンドカラーとバックグラウンドカラーが含まれる。

Valid RGB values are described in Color Names.

この関数のリターン値は、ミニバッファー内でユーザーがタイプした文字列である。しかし、インタラクティブに呼び出されたとき、またはオプション引数convertが非nilの場合は、入力されたカラー名のかわりに、それに対応するRGB値文字列をリターンする。この関数は、入力に有効なカラー指定を求める。allow-emptyが非nilでユーザーがnull入力をエンターした場合は、空のカラー名が許される。

インタラクティブに呼び出されたとき、またはdisplayが非nilの場合には、エコーエリアにもリターン値が表示される。

User-Chosen Coding Systemsの関数read-coding-systemread-non-nil-coding-system、およびInput Methodsread-input-method-nameも参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.5 Reading File Names

高レベル補完関数read-file-nameread-directory-nameread-shell-commandはそれぞれ、ファイル名、ディレクトリー名、シェルコマンドを読み取るようデザインされています。これらはデフォルトディレクトリーの自動挿入を含む特別な機能を提供します。

Function: read-file-name prompt &optional directory default require-match initial predicate

この関数はプロンプトpromptとともに補完つきでファイル名を読み取る。

例外として以下のすべてが真ならば、この関数はミニバッファーのかわりにグラフィカルなファイルダイアログを使用してファイル名を読み取る:

  1. マウスコマンドを通じて呼び出された。
  2. グラフィカルなディスプレイ上の選択されたフレームがこの種のダイアログをサポートする。
  3. 変数use-dialog-boxが非nilの場合。Dialog Boxes in The GNU Emacs Manualを参照のこと。
  4. directory引数(以下参照)がリモートファイルを指定しない。Remote Files in The GNU Emacs Manualを参照のこと。

グラフィカルなファイルダイアログを使用したときの正確な振る舞いは、プラットホームに依存する。ここでは単にミニバッファーを使用したときの振る舞いを記す。

read-file-nameはリターンするファイル名を自動的に展開しない。絶対ファイル名が必要ならば、自分でexpand-file-nameを呼び出さなければならない。

オプション引数require-matchは、completing-readのときと同じ。Completion and the Minibufferを参照のこと。

引数directoryは、相対ファイル名の補完に使用するディレクトリーを指定する。値は絶対ディレクトリー名。変数insert-default-directoryが非nilの場合は、初期入力としてミニバッファーにdirectoryも挿入される。デフォルトはカレントバッファーのdefault-directoryの値。

initialを指定した場合、それはミニバッファーに挿入する初期ファイル名になる(directoryが挿入された場合はその後に挿入される)。この場合、ポイントはinitialの先頭に配される。initialのデフォルト値はnil(ファイル名を挿入しない)。initialが何を行うか確認するには、ファイルをvisitしているバッファーでC-x C-vを試すとよい。注意: ほとんどの場合、initialよりもdefaultの使用を推奨する。

defaultが非nilの場合、ユーザーが最初にread-file-nameが挿入したものと同じ、空以外のコンテンツを残してミニバッファーをexitすると、この関数はdefaultをリターンする。insert-default-directoryが非nilの場合はそれがデフォルトとなるので、ミニバッファーの初期コンテンツは常に空以外になる。require-matchの値に関わらず、defaultの有効性はチェックされない。とはいえrequire-matchが非nilの場合、ミニバッファーの初期コンテンツは有効なファイル名(またはディレクトリー名)であるべきだろう。それが有効でない場合、ユーザーがそれを編集せずにexitするとread-file-nameは補完を試み、defaultはリターンされない。defaultはヒストリーコマンドからも利用できる。

defaultnilの場合、read-file-nameはその場所に代用するデフォルトを探そうと試みる。この代用デフォルトは、明示的にdefaultにそれが指定されたかのように、defaultとまったく同じ方法で扱われる。defaultnilでもinitialが非nilの場合、デフォルトはdirectoryinitialから得られる絶対ファイル名になる。defaultinitialの両方がnilで、そのバッファーがファイルをvisitしているバッファーの場合、read-file-nameはそのファイルの絶対ファイル名をデフォルトとして使用する。バッファーがファイルをvisitしていなければ、デフォルトは存在しない。この場合、ユーザーが編集せずにRETをタイプすると、read-file-nameは前にミニバッファーに挿入されたコンテンツを単にリターンする。

空のミニバッファー内でユーザーがRETをタイプした場合、この関数はrequire-matchの値に関わらず、空の文字列をリターンする。たとえばユーザーがM-x set-visited-file-nameを使用して、カレントバッファーをファイルをvisitしていないことにするのに、この方法を使用している。

predicateが非nilの場合、それは補完候補として許容できるファイル名を決定する、1引数の関数である。predicateが関数名にたいして非nilをリターンすれば、それはファイル名として許容できる値である。

以下はread-file-nameを使用した例である:

(read-file-name "The file is ")

;; 前の式を評価した後に、
;;   ミニバッファーに以下が表示される。:

---------- Buffer: Minibuffer ----------
The file is /gp/gnu/elisp/∗
---------- Buffer: Minibuffer ----------

manual TABをタイプすると以下がリターンされる:

---------- Buffer: Minibuffer ----------
The file is /gp/gnu/elisp/manual.texi∗
---------- Buffer: Minibuffer ----------

ここでユーザーがRETをタイプすると、read-file-nameは文字列"/gp/gnu/elisp/manual.texi"をファイル名としてリターンする。

Variable: read-file-name-function

nilの場合は、read-file-nameと同じ引数を受け取る関数である。read-file-nameが呼び出されたとき、read-file-nameは通常の処理を行なうかわりに、与えられた引数でこの関数を呼び出す。

User Option: read-file-name-completion-ignore-case

この変数が非nilの場合、read-file-nameは補完を行なう際に大文字小文字を無視する。

Function: read-directory-name prompt &optional directory default require-match initial

この関数はread-file-nameと似ているが、補完候補としてディレクトリーだけを許す。

defaultnilinitialが非nilの場合、read-directory-namedirectory(directorynilならカレントバッファーのデフォルトディレクトリー)とinitialを組み合わせて代替えのデフォルトを構築する。defaultinitialの両方がnilの場合、この関数はdirectorydirectorynilの場合はカレントバッファーのデフォルトディレクトリーを代替えのデフォルトとして使用する。

User Option: insert-default-directory

この変数はread-file-nameにより使用されるため、ファイル名を読み取るほとんどのコマンドにより、間接的に使用される。(これらのコマンドにはコマンドのインタラクティブフォームに‘f’や‘F’のコードレター(code letter))をふくむすべてのコマンドが含まれる。Code Characters for interactiveを参照のこと。)この変数の値は、(もしあれば)デフォルトディレクトリー名をミニバッファー内に配してread-file-nameを開始するかどうかを制御する。変数の値がnilの場合、read-file-nameはミニバッファーに初期入力を何も配さない(ただしinitial引数で初期入力を指定しない場合)。この場合、依然としてデフォルトディレクトリーが相対ファイル名の補完に使用されるが、表示はされない。

この変数がnilでミニバッファーの初期コンテンツが空の場合、ユーザーはデフォルト値にアクセスするために次のヒストリー要素を明示的にフェッチする必要があるだろう。この変数が非nilならミニバッファーの初期コンテンツは常に空以外となり、ミニバッファーで編集をおこなわず即座にRETをタイプすることにより、常にデフォルト値を要求できる(上記参照)。

たとえば:

;; デフォルトディレクトリーとともにミニバッファーが開始。
(let ((insert-default-directory t))
  (read-file-name "The file is "))

---------- Buffer: Minibuffer ----------
The file is ~lewis/manual/∗
---------- Buffer: Minibuffer ----------

;; ミニバッファーはプロンプトだけで空。
;;   appears on its line.
(let ((insert-default-directory nil))
  (read-file-name "The file is "))

---------- Buffer: Minibuffer ----------
The file is ∗
---------- Buffer: Minibuffer ----------
Function: read-shell-command prompt &optional initial history &rest args

この関数は、プロンプトpromptと優れた補完を提供して、ミニバッファーからのシェルコマンドを読み取る。これはコマンド名にたいして適切な候補を使用してコマンドの最初の単語を補完する。コマンドの残りの単語はファイル名として補完する。

この関数はミニバッファー入力にたいするキーマップとしてminibuffer-local-shell-command-mapを使用する。history引数は使用するヒストリーリストを指定する。省略、またはnilの場合のデフォルトはshell-command-history(shell-command-historyを参照)。オプション引数initialはミニバッファーの初期コンテンツを指定する(Initial Inputを参照)。もしあれば、残りのargsread-from-minibuffer内のdefaultおよびinherit-input-methodとして使用される(Reading Text Strings with the Minibufferを参照)。

Variable: minibuffer-local-shell-command-map

このキーマップはread-shell-commandにより、コマンドおよびシェルコマンドの一部となるファイル名の補完のために使用される。これは親キーマップとしてminibuffer-local-mapを使用し、TABcompletion-at-pointにバインドする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.6 Completion Variables

補完のデフォルト動作を変更するために使用される変数がいくつかあります。

User Option: completion-styles

この変数の値は、補完を行うために使用される補完スタイル(シンボル)である。補完スタイル(completion style)とは、補完を生成するためのルールセットのこと。このリストにあるシンボルはそれぞれ、completion-styles-alist内に対応するエントリーをもたなければならない。

Variable: completion-styles-alist

この変数には補完スタイルのリストが格納される。リスト内の各要素は以下の形式をもつ

(style try-completion all-completions doc)

ここでstyleは補完スタイルの名前(シンボル)であり、そのスタイルを参照するために変数completion-styles内で使用されるかもしれない。try-completionは補完を行なう関数で、all-completions補完をリストする関数、doc補完スタイルを説明する文字列である。

関数try-completionおよびall-completionsstringcollectionpredicatepointの4つの引数をとる。引数stringcollectionpredicateの意味はtry-completion(Basic Completion Functionsを参照)のときと同様。引数pointstring内のポイント位置。各関数は自身の処理を行った場合は非nilを、行わなかった場合(たとえば補完スタイルに一致するようにstringを行う方法がない場合)はnilをリターンする。

ユーザーがminibuffer-complete(Minibuffer Commands that Do Completionを参照)のような補完コマンドを呼び出すと、Emacsはcompletion-stylesに最初にリストされたスタイルを探して、そのスタイルのtry-completion関数を呼び出す。この関数がnilをリターンした場合、Emacsは次にリストされた補完スタイルに移動してそのスタイルのtry-completion関数を呼び出すといったように、try-completion関数の1つが補完の処理に成功して非nil値をリターンするまで順次これを行なう。同様の手順はall-completions関数を通じて、補完のリストにも行われる。

利用できる補完スタイルについてはCompletion Styles in The GNU Emacs Manualを参照のこと。

User Option: completion-category-overrides

この変数は特別な補完スタイルと、特定の種類のテキスト補完時に使用するその他の補完動作を指定する。この変数の値は(category . alist)という形式の要素をもつalistである。categoryは何が補完されるかを記述するシンボルで、現在のところカテゴリーにbufferfileunicode-nameが定義されているが、これに特化した補完関数(Programmed Completionを参照)を通じて他のカテゴリーを定義できる。alistは、そのカテゴリーにたいして補完がどのように振る舞うべきかを記述する連想リスト。以下のalistのキーがサポートされる:

styles

値は補完スタイル(シンボル)のリスト。

cycle

値はそのカテゴリーにたいするcompletion-cycle-threshold(Completion Options in The GNU Emacs Manualを参照)の値。

将来、さらにalistエントリーが定義されるかもしれない。

Variable: completion-extra-properties

この変数はカレント補完コマンドの特別なプロパティの指定に使用される。この変数は補完に特化したコマンドによりletバインドされることを意図している。値はプロパティ/値ペアーのリスト。以下のプロパティがサポートされる:

:annotation-function

値は補完バッファー内に注釈(annotation)を加える関数。この関数は引数completionを1つ受け取りnil、または補完の隣に表示する文字列をリターンしなければならない。

:exit-function

値は補完を行った後に実行する関数。この関数は2つの引数stringstatusを受け取る。stringは補完されたフィールドのテキストで、statusは行われた操作の種類を示す。操作の種類は、テキストの補完が完了したならfinished、それ以上補完できないが補完が完了していなければsole、有効な補完だがさらに補完できるときはexactとなる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.7 Programmed Completion

意図した利用可能な補完のすべてを含むalistまたはobarrayを前もって作成するのが不可能または不便なことがあります。このような場合は、与えられた文字列にたいする補完を計算する独自の関数を提供できます。これはプログラム補完(programmed completion)と呼ばれます。Emacsは数あるケースの中でも特に、ファイル名の補完(File Name Completionを参照)でプログラム補完を使用しています。

この機能を使用するためには、関数をcompleting-readcollection引数に渡します。関数completing-readはその補完関数がtry-completionall-completionsなどの基本的な補完関数に渡されて、その関数がすべてを行えるよう取り計らいます。

補完関数は3つの引数を受け取ります:

以下はmetadataフラグ引数への応答として補完関数がリターンするかもしれない、metadataエントリーのリストです:

category

値は補完関数が補完を試みているテキストの種類を説明するシンボル。シンボルがcompletion-category-overrides内のキーの1つにマッチする場合、通常の補完動作はオーバーライドされる。Completion Variablesを参照のこと。

annotation-function

値は補完に注釈(annotation)を付ける関数。この関数は1つの引数stringをとり、これは利用可能な補完である。リターン値は文字列で、*Completions*バッファー内の補完stringの後に表示される。

display-sort-function

値は補完をソートする関数。関数は1つの引数をとる。これは補完文字列のリストで、ソートされた補完文字列リストがリターンされる。その入力のリストは破壊的に変更することが許される。

cycle-sort-function

値はcompletion-cycle-thresholdが非nilで、ユーザーが補完候補を巡回するときに補完をソートする関数。引数のリストとリターン値はdisplay-sort-functionと同様。

Function: completion-table-dynamic function

この関数はプログラム補完関数として動作する関数を記述する便利な方法である。引数functionは1つの引数(文字列)をとる関数であり、その文字列の利用可能な補完のalistをリターンする。completion-table-dynamicは、functionとプログラム補完関数のインターフェイス変換器と考えることができる。

Function: completion-table-with-cache function &optional ignore-case

これは前回の引数/結果ペアーを保存するcompletion-table-dynamicにたいするラッパーである。これは同じ引数にたいする複数回の検査に必要なのは、1回のfunction呼び出しだけであることを意味する。これは外部プロセス呼び出しなど、処理が低速のとき有用かもしれない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.6.8 Completion in Ordinary Buffers

補完は通常はミニバッファー内で行われますが、補完機能は通常のEmacsバッファー内のテキストにも使用できます。多くのメジャーモードで、コマンドC-M-iまたはM-TABによりバッファー内補完が行われ、それらはcompletion-at-pointにバインドされています。Symbol Completion in The GNU Emacs Manualを参照してください。このコマンドはアブノーマルフック変数completion-at-point-functionsを使用します:

Variable: completion-at-point-functions

このアブノーマルフックの値は関数のリストである。これらの関数はポイント位置のテキストの補完にたいする補完テーブルの計算に使用される。これはメジャーモードにより、モード特有な補完テーブル(Major Mode Conventionsを参照)の提供に使用できる。

コマンドcompletion-at-pointが実行されると、引数なしでリスト内の関数が1つずつ呼び出される。それぞれの関数は、ポイント位置のテキストにたいして補完テーブルを生成できない場合はnilをリターンする。生成できた場合は、以下の形式のリストをリターンする

(start end collection . props)

ここでstartendは補完する(ポイントを取り囲む)テキストの区切りである。collectionはそのテキストを補完する補完テーブルであり、try-completion(Basic Completion Functionsを参照)の2つ目の引数として渡すのに適した形式である。補完候補はcompletion-styles(Completion Variablesを参照)で定義された補完スタイルを通じ、この補完テーブルを通常の方法で使用して生成されるだろう。propsは追加の情報のためのプロパティリストである。completion-extra-properties内のすべてのプロパティ(Completion Variablesを参照)と、以下の追加のプロパティが認識される:

:predicate

値は補完候補が満足する必要がある述語。

:exclusive

値がnoの場合は、もし補完テーブルがポイント位置のテキストのマッチに失敗したなら、補完の失敗を報告するかわりにcompletion-at-pointcompletion-at-point-functions内の次の関数へ移動する。

completion-at-point-functions内の関数も関数をリターンするかもしれない。その場合は引数なしでリターンされた関数が呼び出され、その関数が補完処理の全責任を負う。この方法は推奨されない。これはcompletion-at-pointを使用する古いコードの救済を意図したもののだからである。

nil値を最初にリターンしたcompletion-at-point-functions内の関数が、completion-at-pointにより使用される。残りの関数は呼び出されない。これの例外は上述の:exclusive指定があるときである。

以下の関数は、Emacsバッファー内の任意に拡張されたテキストにたいして便利な補完方法を提供します:

Function: completion-in-region start end collection &optional predicate

この関数はcollectionを使用して、カレントバッファー内の位置startendの間のテキストを補完する。引数collectiontry-completion(Basic Completion Functionsを参照)のときと同じ意味をもつ。

この関数は補完テキストを直接カレントバッファーに挿入する。completing-read(Completion and the Minibufferを参照)とは異なり、ミニバッファーをアクティブにしない。

この関数が機能するためには、ポイントがstartendの間になければならない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.7 Yes-or-No Queries

このセクションでは、ユーザーにyes-or-noの確認を求める関数を説明します。関数y-or-n-pは1文字での応答に使用できます。この関数は不注意による誤った答えが深刻な結果を招かない場合に有用です。yes-or-no-pは3文字から4文字の答えを要求するので、より重大な問に適しています。

3つの関数はどれも、マウスを使用して呼び出されたコマンド、より正確にはlast-nonmenu-event(Information from the Command Loopを参照)がnilかリストの場合は、問いに答えるためにダイアログボックスまたはポップアップメニューを使用します。それ以外の場合はキーボード入力を使用します。呼び出しの周囲でlast-nonmenu-eventに適切な値をバインドすることにより、マウスまたはキーボードの使用を強制できます。

厳密に言うと、yes-or-no-pはミニバッファーを使用し、y-or-n-pは使用しませんが、これらのコマンドは一緒に説明したほうがよいでしょう。

Function: y-or-n-p prompt

この関数はユーザーに答えを尋ねて、ミニバッファーに入力を求める。ユーザーがyをタイプしたらtnをタイプしたらnilをリターンする。この関数はyesの意味でSPC、noの意味でDELも受け入れる。“quit”の意味としてC-gと同様にC-]も受け入れる。これは問いがミニバッファーのような外見をもち、ミニバッファーを抜けるためにユーザーがC-]の使用を試みるかもしれないという理由による。応答は1文字であり、問いを終了させるためのRETは必要ない。大文字と小文字は等価である。

“答えを尋ねる”とはエコーエリアにpromptと、その後に文字列‘(y or n) をプリントすることを意味する。期待される答え(ynSPCDEL、もしくは質問を終了するその他のキー)以外が入力された場合、この関数は‘Please answer y or n.’と応答し、繰り返し答えの入力を要求する。

この関数は答えの編集を許さないため、実際にミニバッファーは使用しない。実際に使用するのはミニバッファーと同じスクリーンスペースを使用するエコーエリア(The Echo Areaを参照)である。問いが答えられるまで、カーソルはエコーエリアに移動する。

答えとその意味は、たとえ‘y’と‘n’であっても固定されたものではなく、キーマップquery-replace-mapにより指定される(Search and Replaceを参照)。特にユーザーがrecenterscroll-upscroll-downscroll-other-windowscroll-other-window-down(それぞれquery-replace-map内でC-lC-vM-vC-M-vC-M-S-vにバインドされている)のような特殊な応答をエンターした場合、この関数はは指定されたウィンドウの再センタリングやスクロール操作を処理してから再度答えを求める。

例ではエコーエリアのメッセージを連続する行で示しているが、スクリーン上に実際に表示されるのは1回に1行だけである。

Function: y-or-n-p-with-timeout prompt seconds default

y-or-n-pと同様だが、ユーザーがseconds秒以内に答えないと、この関数は待つのをやめてdefaultをリターンする。これはタイマーをセットアップすることにより機能する。引数secondsは数字である。

Function: yes-or-no-p prompt

この関数は質問して、ミニバッファーに答えの入力を求める。これはユーザーが‘yes’をエンターするとtを、‘no’をエンターするとnilをリターンする。ユーザーは応答を終えるためにRETをタイプしなければならない。大文字と小文字は等価である。

yes-or-no-pはエコーエリアにpromptとその後に‘(yes or no) を表示することにより開始される。ユーザーは期待される応答の1つをタイプしなければならない。それ以外の答えだと、この関数は‘Please answer yes or no.’と応答して約2秒待った後に要求を繰り返す。

yes-or-no-py-or-n-pより多くの作業をユーザーに要求し、より重大な決定に適している。

以下は例である:

(yes-or-no-p "Do you really want to remove everything? ")

;; 前の式を評価した後、
;;   空のミニバッファーに
;;   以下のプロンプトが表示される:

---------- Buffer: minibuffer ----------
Do you really want to remove everything? (yes or no)
---------- Buffer: minibuffer ----------

ユーザーが最初にy RETとタイプした場合、これは無効である。なぜならこの関数は‘yes’という単語全体を要求しているので、以下のプロンプトを説明のために一時停止して表示する。

---------- Buffer: minibuffer ----------
Please answer yes or no.
Do you really want to remove everything? (yes or no)
---------- Buffer: minibuffer ----------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.8 Asking Multiple Y-or-N Questions

同じような連続する質問と答えがある場合、たとえば各バッファーにたいして順に“Do you want to save this buffer”と確認を求めるような場合は、個別に質問するよりmap-y-or-n-pを使用して質問のコレクションを尋ねるべきです。これはユーザーにたいして、質問全体にたいして1回で答えられるような便利な機能を提供します。

Function: map-y-or-n-p prompter actor list &optional help action-alist no-cursor-in-echo-area

この関数はユーザーに一連の質問をし、それぞれの質問にたいしてエコーエリア内の1文字の答えを読み取る。

listは質問をするオブジェクトを指定する。これはリスト、オブジェクト、または生成関数(generator function)のいずれかである。関数の場合は引数なしで、次に質問するオブジェクト、または質問の中止を意味するnilのいずれかをリターンする。

引数prompterは各質問について問い合わせ方法を指定する。prompterが文字列の場合、質問テキストは以下のようになる:

(format prompter object)

ここでobjectは、(listから得られる)質問する次のオブジェクトである。

文字列でない場合、prompterは1つの引数(質問する次のオブジェクト)をとる関数で、質問テキストをリターンする。値が文字列の場合は、ユーザー問うための質問。関数はt(ユーザーに尋ねずこのオブジェクトを処理する)、またはnil(ユーザーに尋ねずこのオブジェクトを無視する)をリターンすることもできる。

引数actorは、ユーザーが与えた答えにたいし、どのように処理するかを指定する。これは引数が1つの関数で、ユーザーがyesと答えたオブジェクトを引数に呼び出される。引数は常にlistから取得したオブジェクトである。

引数helpが与えられた場合は、以下の形式のリストである:

(singular plural action)

singularはそのオブジェクトが概念的に何に作用するかを説明する単数形の名詞を含む文字列、pluralはそれに対応する複数形の名詞、actionactorが何を行うかを説明する他動詞である。

helpを指定しない場合のデフォルトは、("object" "objects" "act on")

質問のたびに、ユーザーはそのオブジェクトを処理するにはyYまたはSPCを、そのオブジェクトをスキップするにはnN、またはDELを、以降のすべてのオブジェクトを処理するには!を、exit(以降のすべてのオブジェクトをスキップ)するにはESCqを、カレントオブジェクトを処理した後にexitするには.(ピリオド)を、ヘルプを入手するにはC-hをエンターする。これらはquery-replaceが受け入れるのと同じ答えである。キーマップquery-replace-mapmap-y-or-n-pにたいするそれらの意味を定義し、query-replaceにたいしても同様に定義する。Search and Replaceを参照のこと。

action-alistを使用して、利用できる追加の答えとそれらが何を意味するかを指定できる。これは要素が(char function help)という形式のalistで、それぞれの要素が追加の答えを1つ定義する。要素の内容はcharが文字(答え)、functionが引数が1つ(listから取得するオブジェクト)の関数、helpが文字列である。

ユーザーの応答がcharの場合、map-y-or-n-pfunctionを呼び出す。これが非nilをリターンした場合には、そのオブジェクトが“処理された”と判断して、map-y-or-n-plist内の次のオブジェクトに進む。nilをリターンした場合は、同じオブジェクトにたいして質問を繰り返す。

確認を求める間は通常、map-y-or-n-pcursor-in-echo-areaをバインドする。しかしno-cursor-in-echo-areaが非nilの場合はバインドしない。

マウスを使用して呼び出されたコマンドからmap-y-or-n-pが呼び出された場合(より正確にはlast-nonmenu-eventは非nilかリストの場合。Information from the Command Loopを参照)は、確認を求めるためにダイアログボックスかポップアップメニューが使用される。この場合、キーボード入力やエコーエリアは使用されない。呼び出しの前後でlast-nonmenu-eventを適切な値にバインドして、入力マウスあるいはキーボードの入力を強制できる。

map-y-or-n-pのリターン値は、処理したオブジェクトの数である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.9 Reading a Password

他のプログラムに渡すためのパスワードを読み取るために、関数read-passwdを使用できます。

Function: read-passwd prompt &optional confirm default

この関数はプロンプトpromptを表示してパスワードを読み取る。これはユーザーがタイプしたパスワードのかわりに、パスワード内の各文字を‘.’にかえてエコーする(バッチモードでは入力は隠されないことに注意)。)

オプション引数confirmが非nilの場合にはパスワードを2回読み取ることで、それらが同じものであることを強制する。同じでない場合は、2回の入力が同じになるまで、ユーザーはパスワードを繰り返しタイプする必要がある。

オプション引数defaultは、ユーザーが空入力をエンターした場合のデフォルトパスワードである。defaultnilの場合、read-passwdはnull文字列をリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.10 Minibuffer Commands

このセクションではミニバッファー内で使用するコマンドを説明します。

Command: exit-minibuffer

このコマンドはアクティブなミニバッファーをexitする。これは通常、ミニバッファー内のローカルキーマップのキーにバインドされる。

Command: self-insert-and-exit

このコマンドはキーボードでタイプされた最後の文字を挿入した後にアクティブなミニバッファーをexitする。Information from the Command Loop)を参照のこと。

Command: previous-history-element n

このコマンドは、n個前(古い)のヒストリー要素の値でミニバッファー内のコンテンツを置換する。

Command: next-history-element n

このコマンドは、n個先(新しい)のヒストリー要素の値でミニバッファー内のコンテンツを置換する。

Command: previous-matching-history-element pattern n

このコマンドはpattern(正規表現)にマッチするn個前(古い)のヒストリー要素でミニバッファー内のコンテンツを置換する。

Command: next-matching-history-element pattern n

このコマンドはpattern(正規表現)にマッチするn個先(新しい)のヒストリー要素でミニバッファー内のコンテンツを置換する。

Command: previous-complete-history-element n

このコマンドはミニバッファー内のポイントの前のカレントコンテンツを、n個前(古い)ヒストリー要素の値で置換する。

Command: next-complete-history-element n

このコマンドはミニバッファー内のポイントの前のカレントコンテンツを、n個先(新しい)ヒストリー要素の値で置換する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.11 Minibuffer Windows

以下の関数はミニバッファーウィンドウをアクセスにして選択して、それがアクティブかどうかテストします。

Function: active-minibuffer-window

この関数はカレントでアクティブなミニバッファーウィンドウ、アクティブなウィンドウがない場合はnilをリターンする。

Function: minibuffer-window &optional frame

この関数はフレームframeにたいして使用されるミニバッファーウィンドウをリターンする。framenilの場合はカレントフレームを意味する。フレームに使用されるミニバッファーウィンドウは、そのフレームの一部である必要はないことに注意。自身のミニバッファーをもたないフレームは、必然的に他のフレームのミニバッファーウィンドウを使用する。

Function: set-minibuffer-window window

この関数はミニバッファーウィンドウとしてwindowを使用するよう指定する。 This function specifies as the minibuffer window to use. これは通常のミニバッファーコマンドを呼び出さずにミニバッファーにテキストを入力する場合、そのミニバッファーがどこに表示されるかに影響を及ぼす。通常のミニバッファー入力関数はすべてカレントフレームに対応するミニバッファーを選択して開始されるので、影響はない。

Function: window-minibuffer-p &optional window

この関数はwindowがミニバッファーウィンドウならnilをリターンする。windowのデフォルトは選択されたウィンドウである。

(minibuffer-window)の結果を比較して、与えられたウィンドウがミニバッファーかどうか判断するのは正しくない。なぜなら複数のフレームがある場合、ミニバッファーウィンドウも複数あり得るからである。

Function: minibuffer-window-active-p window

この関数はwindowがカレントでアクティブなミニバッファーウィンドウの場合は、非nilをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.12 Minibuffer Contents

以下の関数はミニバッファーのプロンプトとコンテンツにアクセスします。

Function: minibuffer-prompt

この関数はカレントでアクティブなミニバッファーのプロンプト文字列をリターンする。アクティブなミニバッファーがない場合は、nilをリターンする。

Function: minibuffer-prompt-end

この関数は、ミニバッファーがカレントの場合はミニバッファープロンプトの終端のカレント位置をリターンする。それ以外はバッファーの有効な最小位置をリターンする。

Function: minibuffer-prompt-width

この関数はミニバッファーがカレントの場合は、ミニバッファープロンプトのカレントの表示幅をリターンする。それ以外は0をリターンする。

Function: minibuffer-contents

この関数はミニバッファーがカレントの場合は、ミニバッファーの編集可能なコンテンツ(つまりプロンプト以外のすべて)を文字列でリターンする。それ以外は、カレントバッファーのコンテンツ全体をリターンする。

Function: minibuffer-contents-no-properties

これはminibuffer-contentsと同様だが、テキストプロパティをコピーせず文字だけをリターンする。Text Propertiesを参照のこと。

Function: delete-minibuffer-contents

この関数はミニバッファーがカレントの場合は、ミニバッファーの編集可能なコンテンツ(つまりプロンプト以外のすべて)を削除する。それ以外は、カレントバッファー全体を削除する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.13 Recursive Minibuffers

以下の関数および変数は再帰ミニバッファーを処理します(Recursive Editingを参照):

Function: minibuffer-depth

この関数はアクティブなミニバッファーのカレント深さを正の整数でリターンする。アクティブなミニバッファーが存在しない場合は0をリターンする。

User Option: enable-recursive-minibuffers

この変数が非nilの場合は、ミニバッファーウィンドウがアクティブでも、(find-fileのような)ミニバッファーを使用するコマンドを呼び出すことができる。このような呼び出しは、新たなミニバッファーにたいして再帰編集レベル(recursive editing level)を生成する。内側レベルの編集の間、外側レベルのミニバッファーは非表示になる。

この変数がnilの場合、ミニバッファーウィンドウがアクティブなときは、たとえ他のウィンドウに切り替えても、ミニバッファーコマンドの呼び出しはできない。

コマンド名が非nilのプロパティenable-recursive-minibuffersをもつ場合は、たとえミニバッファーから呼び出された場合でも、そのコマンドは引数の読み取りにミニバッファーを使用できる。コマンドのinteractive宣言内でenable-recursive-minibufferstにしても、これを行うことができる(Using interactiveを参照)。ミニバッファーコマンドnext-matching-history-element(ミニバッファー内では通常M-s)は後者を行う。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

19.14 Minibuffer Miscellany

Function: minibufferp &optional buffer-or-name

この関数はbuffer-or-nameがミニバッファーの場合は非nilをリターンする。buffer-or-nameが省略された場合はカレントバッファーをテストする。

Variable: minibuffer-setup-hook

これはミニバッファーがエンターされたときは常に実行されるノーマルフックである。Hooksを参照のこと。

Variable: minibuffer-exit-hook

これはミニバッファーがexitされたときは常に実行されるノーマルフックである。

Variable: minibuffer-help-form

この変数のカレント値はミニバッファー内でhelp-formをローカルにリバインドするために使用される(Help Functionsを参照)。

Variable: minibuffer-scroll-window

この変数の値が非nilの場合、それはウィンドウオブジェクトである。ミニバッファー内で関数scroll-other-windowが呼び出されたときは、このウィンドウをスクロールする。

Function: minibuffer-selected-window

この関数はミニバッファーがエンターされたときに選択されていたウィンドウをリターンする。選択されたウィンドウがミニバッファー以外のときは、nilをリターンする。

User Option: max-mini-window-height

この変数はミニバッファーウィンドウのリサイズにたいする最大高さを指定する。浮動小数点数の場合は、フレーム高さにたいする割り合いを指定する。整数の場合は行数を指定する。

Function: minibuffer-message string &rest args

この関数は数秒、あるいは次の入力イベントが到着するまで、ミニバッファーテキストの最後に一時的にstringを表示する。変数minibuffer-message-timeoutは入力がない場合に待機する秒数を指定する(デフォルトは2)。argsが非nilの場合、実際のメッセージはformatstringargsを渡して作成される。See section Formatting Stringsを参照のこと。

Command: minibuffer-inactive-mode

これはインタラクティブなミニバッファー内で使用されるメジャーモードである。キーマップminibuffer-inactive-mode-mapを使用する。ミニバッファーが別のフレームにある場合は有用かもしれない。Minibuffers and Framesを参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20 Command Loop

Emacsを実行すると、ほぼ即座にエディターコマンドループ(editor command loop)にエンターします。このループはキーシーケンスを読み取り、それらの定義を実行して、結果を表示します。このチャプターでは、これらが行われる方法と、Lispプログラムがこれらを行えるようにするサブルーチンを説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.1 Command Loop Overview

コマンドループが最初に行わなければならないのはキーシーケンスの読み取りです。キーシーケンスほコマンドに変換される入力イベントのシーケンスです。これは関数read-key-sequenceを呼び出すことにより行われます。Lispプログラムもこの関数を呼び出すことができます(Key Sequence Inputを参照)。これらはより低レベルのread-keyread-event(Reading One Event)で入力を読み取ったり、discard-input(Miscellaneous Event Input Featuresを参照)で保留中の入力を無視することもできます。

キーシーケンスはカレントでアクティブなキーマップを通じてコマンドに変換されます。これが行われる方法については、See section Key Lookupを参照してください。結果はキーボードマクロかインタラクティブに呼び出し可能な関数になります。キーがM-xの場合は、他のコマンドの名前を読み取り、それを呼び出します。これはコマンドexecute-extended-command(Interactive Callを参照)により行われます。

コマンドの実行に先立ち、Emacsはアンドゥ境界(undo boundary)を作成するためにundo-boundaryを実行します。Maintaining Undo Listsを参照してください。

コマンドを実行するために、Emacsはまずcommand-executeを呼び出してコマンドの引数を読み取ります(Interactive Callを参照)。Lispで記述されたコマンドについては、interactive指定で引数を読み取る方法を指定します。これはプレフィクス引数(Prefix Command Argumentsを参照)を使用したり、ミニバッファー内(Minibuffersを参照)で確認を求めて読み取りを行うかもしれません。たとえば、コマンドfind-fileにはinteractive指定があり、これはミニバッファーを使用してファイル名を読み取ることを指定します。find-fileの関数bodyはミニバッファーを使用しないので、Lispコードから関数としてfind-fileを呼び出す場合は通常のLisp関数引数としてファイル名を文字列で与えなければなりません。

コマンドがキーボードマクロ(文字列やベクター)の場合、Emacsはexecute-kbd-macroを使用してそれを実行します(Keyboard Macrosを参照)。

Variable: pre-command-hook

このノーマルフックはコマンドを実行する前に、エディターコマンドループにより実行される。その際、this-command には実行しようとするコマンドが含まれ、last-commandには前のコマンドが記述される。Information from the Command Loopを参照のこと。

Variable: post-command-hook

このノーマルフックはコマンドを実行した後(quitやエラーにより早期に終了させられたコマンドを含む)に、エディターコマンドループにより実行される。その際、this-commandは正に実行されたコマンドを参照し、last-commandは前に実行されたコマンドを参照する。

このフックはEmacsが最初にコマンドループにエンターしたときにも実行される(その時点ではthis-commandlast-commandはどちらもnil)。

pre-command-hookおよびpost-command-hookの実行中、quitは抑制されます。これらのフックのどれか1つを実行中にエラーが発生した場合、そのエラーはフックの実行を終了させません。そのかわりにエラーは黙殺され、エラーが発生した関数はそのフックから取り除かれます。

Emacsサーバー(Emacs Server in The GNU Emacs Manualを参照)に届くリクエストは、キーボードコマンドが行うのと同じように、これらの2つのフックを実行します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2 Defining Commands

スペシャルフォームinteractiveはLisp関数をコマンドに変えます。interactiveフォームは関数ボディーのトップレベルに置かなければならず、通常はボディー内の最初のフォームとして記述されます。これはラムダ式(Lambda Expressionsを参照)とdefun(Defining Functionsを参照)の両方を受け入れます。このフォームは、その関数が実際に実行される間は何も行いません。このフォームの存在はフラグとしての役割りをもち、Emacsコマンドループにたいしてその関数がインタラクティブに呼び出せることを告げます。interactiveフォームの引数は、インタラクティブな呼び出しが引数を読み取る方法を指定します。

interactiveフォームのかわりに、関数シンボルのinteractive-formプロパティで指定されることもあります。このプロパティが非nil値の場合、関数ボディー内のinteractiveフォームより優先されます。この機能はほとんど使用されません。

インタラクティブに呼び出されることだけを意図していて、決してLispから直接呼び出されない関数が時折あります。この場合は、その関数のinteractive-onlyプロパティに非nilを与えます。これにより、そのコマンドがLispから呼び出された場合に、バイトコンパイラーが警告を発します。このプロパティの値には、文字列、t、または任意のシンボルを指定できます。文字列の場合、それはバイトコンパイラーによる警告内で直接使用されます(最初は大文字でなくピリオドで終端される文字列。たとえば“use … instead.”)。シンボルの場合、それはLispコード内で使用されるかわりの関数です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2.1 Using interactive

このセクションでは、Lisp関数をインタラクティブに呼び出し可能なコマンドにするinteractiveフォームの記述方法と、コマンドのinteractiveフォームの検証方法について説明します。

Special Form: interactive arg-descriptor

このスペシャルフォームは関数がコマンドであり、したがって(M-xを通じて、またはそのコマンドにバインドされたキーシーケンスのエンターすることにより)インタラクティブに呼び出されるかもしれないことを宣言する。引数arg-descriptorは、そのコマンドがインタラクティブに呼び出されたときに引数を計算する方法を宣言する。

コマンドは他の関数と同じようにLisp関数から呼び出されるかもしれないが、その場合呼び出し側は引数を提供し、arg-descriptorは効果をもたない。

interactiveフォームは関数ボディー内のトップレベルに置くか、関数シンボルのinteractive-formプロパティ((Symbol Properties)を参照)になければならない。これはコマンドループが関数を呼び出す前にinteractiveフォームを調べることにより効果をもつ(Interactive Callを参照)。一度関数が呼び出されると関数ボディー内のすべてのフォームが実行される。このときボディー内にinteractiveフォームが出現しても、そのフォームは引数の評価さえされず、単にnilをリターンする。

慣例により、interactiveフォームは関数ボディー内の最初のトップレベルフォームとするべきである。interactiveフォームがシンボルのinteractive-formプロパティと関数ボディーの両方に存在する場合は、前者が優先される。interactive-formフォームは既存の関数にinteractiveフォームを追加したり、その関数を再定義することなく引数をインタラクティブに処理する方法を変更するために使用できる。

引数arg-descriptorには3つの可能性があります:

Function: interactive-form function

この関数はfunctioninteractiveフォームをリターンする。functionがインタラクティブに呼び出し可能な関数(Interactive Callを参照)の場合、値はそのコマンドの引数を計算する方法を指定するinteractiveフォーム((interactive spec))である。それ以外では値はnilである。functionがシンボルの場合は、そのシンボルの関数定義が使用される。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2.2 Code Characters for interactive

ここで説明されているコード文字には、以下で定義されるいくつかのキーワードが含まれています:

Completion

補完を提供する。TABSPCRETcompleting-read(Completionを参照)を使用して引数を読み取り、名前の補完を行う。?で利用可能な補完リストを表示する。

Existing

既存オブジェクトの名前を要求する。無効な名前は受け付けられない。カレント入力が有効でない場合、ミニバッファーをexitするコマンドはexitしない。

Default

ユーザーがテキストを何もエンターしなかった場合は、ある種のデフォルト値が使用される。デフォルトはコード文字に依存する。

No I/O

このコード文字は入力を読み取らずに引数を計算する。したがってプロンプト文字列を使用せず、与えられたプロンプト文字列は無視される。

たとえこのコード文字がプロンプト文字列を使用しなくても、これが文字列内で最後のコード文字でない場合は、その後に改行を付けなければならない。

Prompt

コード文字の直後にプロンプトが続く。プロンプトの終端は文字列の終端、または改行。

Special

このコード文字はインタラクティブ文字列の先頭にあるときのみ意味があり、プロンプトおよび改行を要求しない。単一の独立した文字である。

以下はinteractiveとともに使用されるコード文字です:

*

カレントバッファーが読み取り専用の場合はエラーをシグナルする。[Special]

@

このコマンドを呼び出したキーシーケンス内の最初のマウスイベントに関連するウィンドウを選択する。[Special]

^

シフト転換を通じてコマンドが呼び出された場合はコマンドを実行する前に、マークをセットして一時的にリージョンをアクティブにするか、すでにリージョンがアクティブな場合はリージョンを拡張する。シフト転換を通じずにコマンドが呼び出され、リージョンが一時的にアクティブな場合は、コマンドを実行する前にそのリージョンを非アクティブにする。[Special]

a

関数名(たとえばfboundpを満足するシンボル)。[Existing]、[Completion]、[Prompt]

b

既存バッファーの名前。 The name of an existing buffer. デフォルトではカレントバッファー(Buffersを参照)の名前を使用する。[Existing]、[Completion]、[Default]、[Prompt]

B

バッファー名。そのバッファーが存在する必要はない。デフォルトではカレントバッファーではなくもっとも最近使用されたバッファーの名前を使用する。[Completion]、[Default]、[Prompt]

c

文字。カーソルはエコーエリアに移動しない。[Prompt]

C

コマンド名(たとえばcommandpを満足するシンボル)。[Existing]、[Completion]、[Prompt]

d

ポイント位置の整数(Pointを参照)。[No I/O]

D

ディレクトリー名。デフォルトはカレントバッファーのカレントのデフォルトディレクトリーdefault-directory(Functions that Expand Filenamesを参照)。[Existing]、[Completion]、[Default]、[Prompt]

e

そのコマンドを呼び出したキーシーケンス内の1つ目、または2つ目の非キーボードイベント。より正確には、‘e’はリストとしてイベントを取得するので、リスト内のデータを調べることができる。Input Eventsを参照のこと。[No I/O]

e’はマウスイベント、および特別なシステムイベント(Miscellaneous System Eventsを参照)にたいして使用する。コマンドが受け取るイベントリストは、そのイベントに依存する。Input Eventsではそれぞれのイベントのリスト形式を、対応するサブセクションでそれぞれ説明しているので、参照のこと。

1つのコマンドのinteractive仕様の中で、‘e’を複数回使用できる。そのコマンドを呼び出したキーシーケンスがイベントn(リスト)をもつ場合は、‘e’のn番目がそのイベントを提供する。関数キーやASCII文字のようなリスト以外のイベントは、‘e’に関連するイベントとしてカウントされない。

f

既存ファイルのファイル名(File Namesを参照)。デフォルトのディレクトリーはdefault-directory。[Existing]、[Completion]、[Default]、[Prompt]

F

ファイル名。ファイルが存在している必要はない。[Completion]、[Default]、[Prompt]

G

ファイル名。ファイルが存在している必要はない。ユーザーがディレクトリー名だけをエンターした場合、値はそのディレクトリー名となり、そのディレクトリー名にファイル名は追加されない。[Completion]、[Default]、[Prompt]

i

無関係な引数。このコード文字は引数値として常にnilを与える。[No I/O]

k

キーシーケンス(Key Sequencesを参照)。これはカレントキーマップ内でコマンド(または未定義のコマンド)が見つかるまで、イベントを読み取り続ける。キーシーケンス引数は文字列、またはベクターで表される。カーソルはエコーエリアに移動しない。[Prompt]

k’が(マウスの)down-eventで終わるキーシーケンスを読み取った場合は、後続の(マウスの)up-eventも読み取り、それを捨てる。コード文字‘U’により、up-eventへのアクセスを得ることができる。

この種の入力は、describe-keyglobal-set-keyのようなコマンドにより使用される。

K

キーシーケンス。その定義は変更されることを意図している。これは‘k’と同じように機能するが、キーシーケンス内の最後の入力イベントにたいして、通常(必要なら)使用される未定義キーから定義済みキーへの変換を抑制する。

m

マーク位置の整数。[No I/O]

M

任意のテキスト。ミニバッファー内でカレントバッファーの入力メソッド(Input Methods in The GNU Emacs Manualを参照)を使用して読み取りを行い、それを文字列でリターンする。[Prompt]

n

数字。ミニバッファーで読み取られる。入力が数字でない場合、ユーザーは再試行する必要がある。‘n’は決してプレフィクス引数を使用しない。[Prompt]

N

数引数(numeric prefix argument)。ただしプレフィクス引数がない場合は、nのように数字を読み取る。値は常に数字。Prefix Command Argumentsを参照のこと。[Prompt]

p

数引数()これは小文字の‘p’であることに注意)。[No I/O]

P

rawプレフィクス引数(これは大文字の‘P’であることに注意)。[No I/O]

r

2つの数引数(ポイントとマーク)。小さいほうが先。これは1つではなく連続する2つの引数を指定する唯一のコード文字である。[No I/O]

s

任意のテキスト。ミニバッファー内で読み取りを行い文字列としてリターンする(Reading Text Strings with the Minibufferを参照)。C-jRETで入力を終端する(これらの文字を入力に含めるためにC-qが使用されるかもしれない)。[Prompt]

S

インターン済みのシンボル。名前はミニバッファー内で読み取られる。C-jRETで入力を終端する。ここでは、その他の通常はシンボルを終端する文字(たとえば空白文字、丸カッコ、角カッコ)では終端されない。[Prompt]

U

キーシーケンス、またはnil。‘k’(または‘K’)が読み取った後に、(もしあれば)捨てられる(マウスの)up-eventを取得するために、引数‘k’(または‘K’)の後で使用され得る。捨てられたup-eventが存在しない場合、‘U’は引数としてnilを提供する。[No I/O]

v

ユーザーオプションとして宣言された変数(たとえば述語custom-variable-pを満足する)。これはread-variableを使用して変数を読み取る。Definition of read-variableを参照のこと。[Existing]、[Completion]、[Prompt]

x

Lispオブジェクト。そのオブジェクトの入力構文により指定され、C-jRETで終端される。オブジェクトは評価されない。Reading Lisp Objects with the Minibufferを参照のこと。[Prompt]

X

Lispフォームの値。‘X’は‘x’のように読み取りを行いフォームを評価して、その値がコマンドの引数になる。[Prompt]

z

コーディングシステム名(シンボル)。ユーザーがnull入力をエンターした場合、引数値はnilになる。Coding Systemsを参照のこと。[Completion]、[Existing]、[Prompt]

Z

コマンドにプレフィクス引数がある場合はコーディングシステム名。プレフィクス引数がない場合、‘Z’は引数値としてnilを提供する。[Completion]、[Existing]、[Prompt]


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2.3 Examples of Using interactive

以下にinteractiveの例をいくつか挙げます:

(defun foo1 ()              ; foo1は1つの引数をとり
    (interactive)           ;   単に2単語分前に移動する。
    (forward-word 2))
     ⇒ foo1

(defun foo2 (n)             ; foo2は引数を1つとる
    (interactive "^p")      ;   引数は数引数
                            ; shift-select-modeでは、
                            ;   リージョンをアクティブにするか、拡張する
    (forward-word (* 2 n)))
     ⇒ foo2

(defun foo3 (n)             ; foo3は引数を1つとる
    (interactive "nCount:") ;   引数はミニバッファーで読み取られる
    (forward-word (* 2 n)))
     ⇒ foo3

(defun three-b (b1 b2 b3)
  "Select three existing buffers.
Put them into three windows, selecting the last one."
    (interactive "bBuffer1:\nbBuffer2:\nbBuffer3:")
    (delete-other-windows)
    (split-window (selected-window) 8)
    (switch-to-buffer b1)
    (other-window 1)
    (split-window (selected-window) 8)
    (switch-to-buffer b2)
    (other-window 1)
    (switch-to-buffer b3))
     ⇒ three-b
(three-b "*scratch*" "declarations.texi" "*mail*")
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.2.4 Select among Command Alternatives

マクロdefine-alternativesジェネリックコマンド(generic command)を定義するために使用できます。これらはユーザーの選択により複数の候補から選択可能なinteractive関数の実装です。

Macro: define-alternatives command &rest customizations

新たなコマンドcommand(シンボル)を定義する。

最初にユーザーがM-x command RETを実行したとき、Emacsはコマンドが使用する実際のフォームにたいして確認を求め、その選択をカスタム変数として記録する。プレフィクス引数を使用すると、候補選択のプロセスを繰り返す。

変数command-alternativesには、commandの実装候補がalistで含まれる。この変数がセットされるまで、define-alternativesは効果をもたない。

customizationsが非nilの場合は、defcustomキーワード(典型的には:groupおよび:version)と、command-alternativesの宣言に追加する値により構成される候補である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.3 Interactive Call

コマンドループはキーシーケンスをコマンドに翻訳した後、関数command-executeを使用してその関数を呼び出します。そのコマンドが関数の場合、command-executeは引数を読み取りコマンドを呼び出すcall-interactivelyを呼び出します。自分でこれらの関数を呼び出すこともできます。

このコンテキストにおいて用語“command”はインタラクティブにコール可能な関数(または関数likeなオブジェクト)やキーボードマクロを指すことに注意してください。つまりコマンドを呼び出すキーシーケンスのことではありません(Keymapsを参照)。

Function: commandp object &optional for-call-interactively

この関数はobjectがコマンドの場合はt、それ以外はnilをリターンする。

コマンドには文字列とベクター(キーボードマクロとして扱われる)、トップレベルinteractiveフォーム(Using interactiveを参照)を含むラムダ式、そのようなラムダ式から作成されたバイトコンパイル関数オブジェクト、interactiveとして宣言(autoloadの4つ目の引数が非nil)されたautoloadオブジェクト、およびいくつかのプリミティブ関数が含まれる。interactive-formプロパティが非nilのシンボル、および関数定義がcommandpを満足するシンボルもコマンドとされる。

for-call-interactivelyが非nilの場合は、call-interactivelyが呼び出すことができるオブジェクトにたいしてのみcommandptをリターンする。したがってキーボードマクロは該当しなくなる。

commandpを使用する現実的な例は、Access to Documentation Strings内のdocumentationを参照のこと。

Function: call-interactively command &optional record-flag keys

この関数はinteractive呼び出し仕様にしたがって引数を取得し、インタラクティブに呼び出し可能な関数commandを呼び出す。これはcommandがリターンするものが何であれ、それをリターンする。

たとえば、もし以下の署名をもつ関数がある場合:

(defun foo (begin end)
  (interactive "r")
  ...)

以下を行うと

(call-interactively 'foo)

これはリージョン(pointmark)を引数としてfooを呼び出すだろう。

commandが関数でない、またはインタラクティブに呼び出せない(コマンドでない)場合は、エラーをシグナルする。たとえコマンドだとしても、キーボードマクロ(文字列かベクター)は、関数ではないので、許されないことに注意。commandがシンボルの場合、call-interactivelyはそれの関数定義を使用する。

record-flagが非nilの場合は、このコマンドとコマンドの引数は無条件にリストcommand-historyに追加される。それ以外では、引数の読み取りにミニバッファーを使用した場合のみコマンドが追加される。Command Historyを参照のこと。

引数keysが与えられた場合、それはコマンドを呼び出すためにどのイベントを使用するかコマンドが問い合わせた場合に与えるべき、イベントシーケンスを指定するベクターである。keysnil、または省略された場合のデフォルトは、this-command-keys-vectorのリターン値である。Definition of this-command-keys-vectorを参照のこと。

Function: command-execute command &optional record-flag keys special

この関数はcommandを実行する。引数commandは述語commandpを満足しなければならない。つまりインタラクティブに呼び出し可能な関数かキーボードマクロでなければならない。

commandが文字列かベクターの場合は、execute-kbd-macroにより実行される。関数はrecord-flagおよびkeys引数とともにcall-interactivelyに渡される(上記参照)。

commandがシンボルの場合、その位置にシンボルの関数定義が使用される。autoload定義のあるシンボルは、インタラクティブに呼び出し可能な関数お意味するよう宣言されている場合は、コマンドとして判断される。そのような宣言は、指定されたライブラリーのロードと、シンボル定義の再チェックにより処理される。

引数specialが与えられた場合、それはプレフィクス引数を無視して、それをクリアーしないという意味である。これはスペシャルイベント(Special Eventsを参照)を実行する場合に使用される。

Command: execute-extended-command prefix-argument

この関数はcompleting-read(Completionを参照)を使用して、ミニバッファーからコマンド名を読み取る。その後、指定されたコマンドを呼び出すためにcommand-executeを使用する。そのコマンドがリターンするのが何であれ、それがexecute-extended-commandの値となる。

そのコマンドがプレフィクス引数を求める場合は、prefix-argumentのの値を受け取る。execute-extended-commandがインタラクティブに呼び出された場合は、カレントのrawプレフィクス引数がprefix-argumentに使用され、それが何であれ実行するコマンドに渡される。

通常、execute-extended-commandM-xの定義なので、プロンプトとして文字列‘M-x を使用する(execute-extended-commandを呼び出したイベントからプロンプトを受け取るほうが良いのだろうが、実装は骨が折れる)。プレフィクス引数の値の説明が、もしあれば、それもプロンプトの一部となる。

(execute-extended-command 3)
---------- Buffer: Minibuffer ----------
3 M-x forward-word RET
---------- Buffer: Minibuffer ----------
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.4 Distinguish Interactive Calls

interactive呼び出しのときは、コマンドが(エコーエリア内の情報メッセージなどのような)視覚的な追加フィードバックを表示すべきときがあります。これを行うためには、3つの方法があります。その関数がcall-interactivelyを使用して呼び出されたかどうかテストするには、オプション引数print-messageを与えるとともに、interactive呼び出しで非nilとなるようにinteractive仕様を使うのが推奨される方法です。以下は例です:

(defun foo (&optional print-message)
  (interactive "p")
  (when print-message
    (message "foo")))

数プレフィクス引数は決してnilにならないので、わたしたちは"p"を使用します。この方法で定義された関数は、キーボードマクロから呼び出されたときにメッセージを表示します。

追加引数による上記の手法は、呼び出し側に“この呼び出しをinteractiveとして扱うように”伝えることができるので、通常は最善です。しかし、called-interactively-p.をテストすることにより、これを行うこともできます。

Function: called-interactively-p kind

この関数は、呼び出された関数がcall-interactivelyを使用して呼び出された場合はtをリターンする。

引数kindはシンボルinteractiveかシンボルanyのどちらかである。これがinteractiveの場合、called-interactively-pはユーザーから直接呼び出しが行われたとき — たとえば関数呼び出しにバインドされたキーシーケンスをユーザーがタイプした場合がそれに該当するが、ユーザーがその関数を呼び出すキーボードマクロ(Keyboard Macrosを参照)を実行中した場合は該当しない — だけtをリターンするkindanyの場合、called-interactively-pはキーボードマクロを含む任意の種類のinteractive呼び出しにたいしてtをリターンする。

疑わしい場合はanyを使用すること。interactiveの使用が正しいと解っているのは、関数が実行中に役に立つメッセージを表示するかどうか判断が必要な場合だけである。

Lisp評価(またはapplyfuncall))を通じて呼び出された、または場合、関数は決してインタラクティブに呼び出されたとは判断されない。

以下はcalled-interactively-pを使用する例である:

(defun foo ()
  (interactive)
  (when (called-interactively-p 'any)
    (message "Interactive!")
    'foo-called-interactively))

;; M-x fooとタイプする
     -| Interactive!

(foo)
     ⇒ nil

以下はcalled-interactively-pの直接呼び出しと間接呼び出しを比較した例である。

(defun bar ()
  (interactive)
  (message "%s" (list (foo) (called-interactively-p 'any))))

;; M-x barとタイプする
     -| (nil t)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.5 Information from the Command Loop

エディターコマンドループは、自分自身と実行するコマンドのために、いくつかのLisp変数にステータス記録を保持します。this-commandおよびlast-command以外は、一般的にこれらの変数をLispプログラム内で変更するのは、良いアイデアではありません。

Variable: last-command

この変数は、コマンドループにより実行された以前のコマンド(前にカレントだったコマンド)の名前を記録する。値は通常、関数定義をもつシンボルだが、その保証はない。

コマンドがコマンドループからリターンするとき、this-commandから値がコピーされる。ただしそのコマンドが、後続のコマンドにたいしてプレフィクス引数を指定されたときを除く。

この変数は常にカレント端末にたいしてローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。

Variable: real-last-command

この変数はEmacsによりlast-commandと同様にセットアップされるが、Lispプログラムから決して変更されない。

Variable: last-repeatable-command

この変数は、入力イベントと一部としではなく、もっとも最近実行されたコマンドを格納する。これはコマンドrepeatが再実行を試みるコマンドである。Repeating in The GNU Emacs Manualを参照のこと。

Variable: this-command

この変数は、コマンドループにより現在実行中のコマンドの名前を記録する。last-commandと同様、通常は関数定義をもつシンボルである。

コマンドループはコマンドを実行する直前にこの変数をセットして、(そのコマンドが後続のコマンドのプレフィクス引数を指定しない場合)そのコマンドが終了したときに、その値をlast-command内にコピーする。

いくつかのコマンドは、次に実行されるコマンドが何であれ、それにたいするフラグとして、実行中の間この変数をセットする。特にテキストをkillする関数はthis-commandkill-regionにセットするので、直後に実行された任意のkillコマンドは、killしたテキストを前にkillされたテキストに追加すべきことが解かるだろう。

特定のコマンドにおいて、エラーが発生した場合に前のコマンドとして認識されたくない場合は、これを防ぐようにそのコマンドをコーディングしなければならない。これを行う1つの方法は、以下のようにコマンドの最初でthis-commandtをセットして、最後にthis-commandに正しい値をセットする方法である:

(defun foo (args…)
  (interactive …)
  (let ((old-this-command this-command))
    (setq this-command t)
    … 処理を行う …
    (setq this-command old-this-command)))

エラーの場合、letは古い値をリストアするので、わたしたちはletthis-commandをバインドしない。この場合におけるletの機能は、わたしたちが避けたいと思っていることを正確に行ってしまうだろう。

Variable: this-original-command

コマンドのリマップ(Remapping Commandsを参照)が発生したときを除き、これはthis-commandと同じ値をもつ。リマップが発生した場合、this-commandは実際に実行されたコマンド、this-original-commandは実行を指定されたが他のコマンドにリマップされたコマンドを与える。

Function: this-command-keys

この関数は、現在のコマンドを呼び出したキーシーケンスと、加えてそのコマンドにたいするプレフィクス引数を生成した前のコマンドを含む文字列またはベクターをリターンする。read-eventを使用するコマンドにより、タイムアウトせずに読み取られた任意のイベントは最後に加えられる。

しかし、そのコマンドがread-key-sequenceを呼び出していた場合は、最後に読み取られたキーシーケンスをリターンする。Key Sequence Inputを参照のこと。シーケンス内のすべてのイベントが文字列として適当な文字の場合は、文字列が値になる。Input Eventsを参照のこと。

(this-command-keys)
;; これを評価するためにC-u C-x C-eを使用すると、
     ⇒ "^U^X^E"
Function: this-command-keys-vector

this-command-keysと同様だが、常にベクターでイベントをリターンするので、入力イベントを文字列内に格納する複雑さを処理する必要がない(Putting Keyboard Events in Stringsを参照)。

Function: clear-this-command-keys &optional keep-record

この関数は、this-command-keysがリターンするイベントテーブルを空にする。keep-recordnilの場合は、その後に関数recent-keys(Recording Input)がリターンするレコードも空にする。これは特定のケースにおいて、パスワードを読み取った後、次のコマンドの一部として不用意にパスワードがエコーされるのを防ぐために有用である。

Variable: last-nonmenu-event

この変数はキーシーケンス(マウスメニューからのイベントは勘定しない)の一部として読み取られた最後の入力イベントを保持する。

この変数の1つの使い方は、x-popup-menuにたいしてどこにメニューをポップアップすべきか告げる場合である。これは内部的にy-or-n-p(Yes-or-No Queriesを参照)にも使用されている。

Variable: last-command-event

この変数には、コマンドの一部としてコマンドループに読み取られた、最後の入力イベントがセットされる。この変数は主に、self-insert-command内でどの文字が挿入されたか判断するために使用されている。

last-command-event
;; これを評価するためにC-u C-x C-eを使用すると、
     ⇒ 5

C-eASCIIコードの5が値になる。

Variable: last-event-frame

この変数は、最後の入力イベントが送られたフレームを記録する。これは通常、そのイベントが生成されたときに選択されていたフレームだが、そのフレームの入力が他のフレームにリダイレクトされていた場合は、そのリダイレクトされていたフレームが値となる。Input Focusを参照のこと。

最後のイベントがキーボードマクロ由来の場合、値はmacroになる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.6 Adjusting Point After Commands

プロパティdisplaycompositionをmつテキストや、非表示のテキストシーケンスの中間でポイント値を表示するのは、簡単ではありません。したがって、コマンドが終了した後にコマンドループにリターンするとき、そのようなシーケンス中にポイントがある場合、コマンドループは通常ポイントをそのようなシーケンスの端に移動します。

変数disable-point-adjustmentをセットすることにより、コマンドはこの機能を抑制できます:

Variable: disable-point-adjustment

この変数が非nilの場合は、コマンドがコマンドループにリターンするとき、コマンドループはこれらのテキストプロパティをチェックせず、これらのプロパティをもつシーケンスの外にポイントを移動しない。

コマンドループはそれぞれのコマンドを実行する前にこの変数をnilにセットするので、あるコマンドがこれをセットしても、効果が適用されるのはそのコマンドにたいしてだけである。

Variable: global-disable-point-adjustment

この変数を非nilにセットした場合、これらのシーケンス外にポイントを移動する機能は、完全にオフになる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7 Input Events

Emacsコマンドループは入力イベント(input events)のシーケンスを読み取ります。入力イベントとは、キーボードやマウスのアクティビティ、またはEmacsに送られるシステムイベントを表します。キーボードアクティビティにたいするイベントは文字、またはシンボルです。それ以外のイベントは、常にリストになります。このセクションでは、入力イベントの表現と意味について詳細を説明します。

Function: eventp object

この関数は、objectが入力イベント、またはイベント型の場合は、非nilをリターンする。

イベント、またはイベント型として任意のシンボルが使用されるかもしれないことに注意。eventpは、あるシンボルがLispコードによりイベントとして使用されることを意図しているか否か区別できない。そのかわりに、カレントEmacsセッション内で、そのシンボルが入力として読み取られたイベント内で実際に使用されているか否かを区別する。シンボルがまだそのように使用されていない場合、eventpnilをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.1 Keyboard Events

キーボードから取得できる入力には2つの種類があります。それは通常のキーとファンクションキーです。通常のキーは文字に対応し、それらが生成するイベントはLisp内では文字で表現されます。文字イベントのイベント型は文字自身(整数)です。Classifying Eventsを参照してください。

入力文字イベントは0から524287までの基本コード(basic code)に加えて、以下の修飾ビット(modifier bits)の一部、またはすべてにより構成されます:

meta

文字コードのビット 2**27 はメタキーが押下された状態で文字がタイプされたことを示す。

control

文字コードのビット 2**26 は非ASCIIコントロール文字を示す。

C-aのような非ASCIIコントロール文字は、自身が特別な基本コードをもつため、それらを示すためにEmacsは特別なビットを必要としない。つまりC-aのコードは単なる1である。

しかし、%のような非ASCIIとコントロールを組み合わせてタイプした場合、取得される数値は%に 2**26 を加えた値となる(端末が非ASCIIコントロール文字をサポートすると仮定する)。

shift

文字コードのビット 2**25 はシフトキーが押下された状態でASCIIコントロール文字がタイプされたことを示す。

アルファベット文字にたいしては、基本コード自身が大文字か小文字かを示す。数字と句読点文字にたいしてシフトキーは、異なる基本コードをもつ完全に違う文字を選択する。可能な限りASCII文字として保つために、Emacsはこれらの文字にたいしてビット 2**25 を使用しない。

しかし、ASCIIC-AC-aを区別する方法を提供しないので、EmacsはC-Aにたいしてビット 2**25 を使用し、C-aには使用しない。

hyper

文字コードのビット 2**24 はハイパーキーが押下された状態で文字がタイプされたことを示す。

super

文字コードのビット 2**23 はスーパーキーが押下された状態で文字がタイプされたことを示す。

alt

文字コードのビット 2**22 はアルトキーが押下された状態で文字がタイプされたことを示す(ほとんどのキーボードでAltとラベルされたキーは、実際にはアルトキーではなくメタキーとして扱われる)。

プログラム内での特定のビット数値の記述は避けるのが最善の方法です。文字の修飾ビットをテストするためには、関数event-modifiers(Classifying Eventsを参照)を使用してください。キーバインディングを作成するときは、修飾ビットつきの文字にたいする読み取り構文を使用できます(‘\C-’、‘\M-’、...など)。define-keyでのキーバインディング作成では、文字を指定するために(control hyper ?x)のようなリストを使用できます(Changing Key Bindingsを参照)。関数event-convert-listは、そのようなリストをイベント型に変換します(Classifying Eventsを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.2 Function Keys

ほとんどのキーボードにはファンクションキー(function keys)があります。これは名前、または文字以外のシンボルをもつキーです。Emacs Lispではファンクションキーはシンボルとして表現されます。そのシンボル名はファンクションキーのラベルの小文字です。たとえばF1とラベルされたキーを押下すると、シンボルf1で表される入力イベントが生成されます。

ファンクションキーのイベント型は、イベントシンボルそれ自身です。Classifying Eventsを参照してください。

ファンクションキーにたいするシンボルネーミングの慣習には、以下のような特別なケースがいくつかあります:

backspacetabnewlinereturndelete

これらのキーは、ほとんどのキーボードにおいて特別にキーをもつ、一般的なASCIIコントロール文字に対応する。

ASCIIではC-iTABは同じ文字である。端末がこれらを区別できる場合、Emacsは前者を整数の9、後者をシンボルtabで表現することにより、Lispプログラムにこれらの違いを伝える。

ほとんどの場合、これら2つを区別するのは役に立たない。そのためlocal-function-key-map(Keymaps for Translating Sequences of Eventsを参照)はtabを9にマップするようセットアップされている。したがって文字コード9(文字C-i)へのキーバインディングはtabにも適用される。このグループ内の他のシンボルも同様である。関数read-charが、これらのイベントを文字に変換する場合も同様である。

ASCIIでは、BSは実際はC-hである。しかしbackspaceは文字コード8(BS)ではなく、文字コード127(DEL)に変換される。ほとんどのユーザーにとって、これは好ましいだろう。

leftuprightdown

矢印カーソルキー

kp-addkp-decimalkp-divide、…

キーパッドキー(標準的なキーボードにおいては右側にある)。

kp-0kp-1、…

キーパッド数字キー。

kp-f1kp-f2kp-f3kp-f4

キーパッドPFキー。

kp-homekp-leftkp-upkp-rightkp-down

キーパッド矢印キー。Emacsは通常これらを非キーパッドのキーhomeleft、…に変換する。

kp-priorkp-nextkp-endkp-beginkp-insertkp-delete

通常は他の箇所にあるキーと重複するキーパッド追加キー。Emacsは通常これらを同じような名前の非キーパッドキーに変換する。

ファンクションキーにたいしても修飾キーALTCTRLHYPERMETASHIFTSUPERを使用できます。シンボル名のプレフィクスとしてこれらを表します:

A-

アルト修飾。

C-

コントロール修飾。

H-

ハイパー修飾。

M-

メタ修飾。

S-

シフト修飾。

s-

スーパー修飾。

したがって、METAを押下した場合のF3キーにたいするシンボルはM-f3になります。複雑のプレフィクスを使用する場合は、アルファベット順に記述することを推奨します。とはいえ、キーバインディングが修飾されたファンクションキーを探す際、引数の順序は関係ありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.3 Mouse Events

Emacsは4つの種類のマウスイベントをサポートします。それはクリックイベント、ドラッグイベント、ボタンダウンイベント、モーションイベントです。すべてのマウスイベントはリストで表現されます。このリストのCARはイベント型です。イベント型はどのマウスボタンが関与するのか、それにたいしてどの修飾キーが使用されたかを示します。イベント型によりダブル、あるいはトリプルでボタンが押されたかを区別することもできます(Repeat Eventsを参照)。残りのリスト要素は、位置と時間の情報を提供します。

キーの照合においては、イベント型だけが問題になります。2つのイベントが同じコマンドを実行するためには、同じイベント型が必要です。実行されるコマンドはinteractiveのコード‘e’を使用して、これらのイベントの完全な値にアクセスできます。Code Characters for interactiveを参照してください。

マウスイベントで開始されたキーシーケンスはカレントバッファーではなく、マウスのあったウィンドウ内のバッファーのキーマップを使用して読み取られます。これはウィンドウ内でクリックすることによりそのウィンドウやそのウィンドウのバッファーが選択されることを意味しません。つまり、それは完全にそのキーシーケンスのコマンドバインディングの制御下にあるのです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.4 Click Events

ユーザーが同じ場所でマウスボタンを押してからリリース(release: 離す)すると、clickイベントが生成されます。すべてのマウスクリックイベントは同じフォーマットを共有します:

(event-type position click-count)
event-type

これはマウスボタンが使用されたことを示す。これはシンボルmouse-1mouse-2、…のうちのどれかで、マウスボタンは左から右に番号が付される。

ファンクションキーにたいして行うのと同様にアルト、コントロール、ハイパー、メタ、シフト、スーパーの修飾にたいしてプレフィクス‘A-’、‘C-’、‘H-’、‘M-’、‘S-’、‘s-’も使用できる。

このシンボルは、イベントのイベント型の役割りももつ。イベントのキーバインディングはこれらの型により示される。したがって、mouse-1にたいするキーバインディングが存在する場合、そのバインディングはevent-typemouse-1であるようなすべてのイベントに適用されるだろう。

position

これはマウスクリックがどこで発生したかを表すマウス位置リスト(mouse position list)である。詳細は以下を参照のこと。

click-count

これは同じマウスボタンを素早く繰り返し押下したときの回数である。Repeat Eventsを参照のこと。

クリックイベントのpositionスロット内にあるマウス位置リストの内容にアクセスするためには、一般的にはAccessing Mouse Eventsにドキュメントされている関数を使用するべきです。このリストの明示的なフォーマットは、どこでクリックが発生したかに依存します。テキストエリア、モードライン、ヘッダーライン、フリンジ、マージンエリアでのクリックにたいして、マウス位置リストは以下のフォーマットをもちます

(window pos-or-area (x . y) timestamp
 object text-pos (col . row)
 image (dx . dy) (width . height))

以下はこれらのリスト要素がもつ意味です:

window

クリックが発生したウィンドウ。

pos-or-area

テキストエリア内でクリックされた文字のバッファー位置。またはテキストエリア外がクリックされた場合は、クリックが発生したウィンドウエリア。これはシンボルmode-lineheader-linevertical-lineleft-marginright-marginleft-fringeright-fringeのどれか。

特別な場合の1つとして、pos-or-areaが単なるシンボルではなく、(上記シンボルのいずれか1つの)シンボルを含むリストの場合がある。これはEmacsにより登録されたイベントにたいする、イマジナリープレフィクスキー(imaginary prefix key)の後に発生する。Key Sequence Inputを参照のこと。

x, y

クリックの相対ピクセル座標(relative pixel coordinates)。あるウィンドウのテキストエリア内でのクリックにたいする座標原点(0 . 0)は、テキストエリアの左上隅となる。Window Sizesを参照のこと。モードラインまたはヘッダーライン内でのクリックにたいする座標原点は、そのウィンドウ自身の左上隅となる。フリンジ、マージン、垂直ボーダー(vertical border)では、xな有意なデータをもたない。フリンジ、マージンでは、yはヘッダーラインの最下端からの相対位置である。すべてのケースにおいてxおよびy座標は右方向および下方向で増加する。

timestamp

そのイベントが発生した時刻を、システム依存の初期時刻(initial time)からの経過ミリ秒で表す整数。

object

クリック位置に文字列タイプのテキストプロパティが存在しない場合はnil、存在する場合は(string . string-pos)形式のコンスセル:

string

クリックされた文字列。すべてのテキストプロパティを含む。

string-pos

クリックが発生した文字列内の位置。

text-pos

マージンエリアまたはフリンジにたいするクリックでは、そのウィンドウ内の対応する行内の最初の可視な文字のバッファー位置となる。他のイベントにたいしては、そのウィンドウ内のカレントバッファーの位置となる。

col, row

これらはxyの位置にあるグリフ(gliph)の、実際の行と列の座標数値である。行xがその行の実際のテキストの最後の列を超える場合、colはデフォルトの文字幅をもつ仮想的な追加列数を加えた値が報告される。そのウィンドウがヘッダーラインをもつ場合、行0はヘッダーラインとなり、ヘッダーラインをもたない場合はテキストエリアの上端ラインが行0となる。ウィンドウのテキストエリアのクリックにたいしては、テキストエリアの左端列が列0となり、モードラインまたはヘッダーラインのクリックにたいしてはそのラインの左端が列0となる。フリンジまたは垂直ボーダーのクリックにたいしては、これらは有意なデータをもたない。マージンのクリックにたいしては、colはマージンエリアの左端、rowはマージンエリアの上端から測られる。

image

これはクリックが発生した場所のイメージオブジェクトである。クリックされた場所にイメージが存在しない場合はnil、イメージがクリックされた場合はfind-imageによりリターンされるイメージオブジェクトである。

dx, dy

これらはobjectの左上隅(0 . 0)からの相対的ピクセル座標である。objectnilの場合は、クリックされた文字グリフの左上隅からの相対座標である。

width, height

これらはobjectのピクセル幅とピクセル高さであり、objectnilの場合はクリックされた文字グリフのピクセル幅とピクセル高さである。

スクロールバーへのクリックにたいして、positionは以下の形式をもちます:

(window area (portion . whole) timestamp part)
window

スクロールバーがクリックされたウィンドウ。

area

これはシンボルvertical-scroll-barである。

portion

スクロールバーの上端からクリック位置までのピクセル数。GTK+を含むいくつかのツールキットでは、Emacsがこれらのデータを抽出できないので、値は常に0となる。

whole

スクロールバーの全長のピクセル数。GTK+を含むいくつかのツールキットでは、Emacsがこれらのデータを抽出できないので、値は常に0となる。

timestamp

イベントが発生したミリ秒時刻。GTK+を含むいくつかのツールキットでは、Emacsがこれらのデータを抽出できないので、値は常に0となる。

part

クリックが発生したスクロールバー部分。これはシンボルhandle(スクロールバーのハンドル)、above-handle(ハンドルの上側エリア)、below-handle(ハンドルの下側エリア)、up(スクロールバー端の上矢印)、down(スクロールバー端の下矢印)のいずれかである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.5 Drag Events

Emacsでは、特別なことをしなくてもドラッグイベントを取得できます。ドラッグイベント(drag event)は、ユーザーがマウスボタンを押下して、ボタンをリリースする前に、マウスを異なる文字位置に移動すると毎回発生します。すべてのマウスイベントと同じように、ドラッグイベントはLispではリストで表現されます。このリストは以下のように、開始マウス位置と最終位置ぼ両方を記録します:

(event-type
 (window1 START-POSITION)
 (window2 END-POSITION))

ドラッグイベントにたいしては、シンボルevent-typeの名前に、プレフィクス‘drag-’が含まれます。たとえば、ボタン2を押下したままマウスをドラッグすると、drag-mouse-2イベントが生成されます。このイベントの2つ目と3つ目の要素は、マウス位置リスト(Click Eventsを参照)としてドラッグの開始と終了の位置を与えます。任意のマウスイベントの2つ目の要素には、同じ方法でアクセスできます。しかし、ドラッグイベントは最初に選択されていたフレームの境界外で終了するかもしれません。この場合、3つ目の要素の位置リストに、ウィンドウのかわりにそのフレームが含まれます。

drag-’プレフィクスは、その後に‘C-’や‘M-’のような修飾キープレフィクスが続きます。

read-key-sequenceがキーバインディングをもたず、対応するクリックイベントにキーバインディングがあるようなドラッグイベントを受け取った場合、この関数はそのドラッグイベントをドラッグ開始位置でのクリックイベントに変更します。これは、もし望まなければクリックイベントとドラッグイベントを区別する必要がないことを意味します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.6 Button-Down Events

クリックイベントとドラッグイベントは、ユーザーがマウスボタンをリリースしたときに発生します。ボタンがリリースされるまでクリックとドラッグを区別することはできないので、リリース前にイベントが発生することはありません。

ボタンが押下されたらすぐに何か処理したい場合は、ボタンダウン(button-down)イベントを処理する必要があります11。これらはevent-typeのシンボル名に‘down-’が含まれることを除き、クリックイベントとまったく同じようなリストにより表現されます。‘down-’プレフィクスの後には、‘C-’や‘M-’のような修飾キープレフィクスが続きます。

関数read-key-sequenceは、コマンドバインディングをもたないボタンダウンイベントを無視します。したがって、Emacsコマンドループもこれらを無視します。これは、ボタンダウンイベントで何かしたい場合以外は、ボタンダウンイベントの定義について心配する必要がないことを意味します。ボタンダウンイベントを定義する通常の理由は、ボタンがリリースされるまで(モーションイベントを読み取ることにより)マウスモーションを追跡できるからです。Motion Eventsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.7 Repeat Events

マウスを移動せずに同じマウスボタンを素早く2回以上連続して押下すると、Emacsは2回目とそれ以降の押下にたいして、特別なリピート(repeat)マウスイベントを生成します。

もっとも一般的なリピートイベントは、ダブルクリック(double-click)イベントです。Emacsはボタンを2回クリックしたときに、ダブルクリックイベントを生成します。このイベントは、(すべてのクリックイベントが通常そうであるように)ボタンをリリースしたときに発生します。

ダブルクリックイベントのイベント型には、プレフィクス‘double-’が含まれます。したがって、metaを押しながら2つ目のマウスボタンをダブルクリックすると、LispプログラムにはM-double-mouse-2が渡されます。ダブルクリックイベントがバインディングをもたない場合、対応する通常のクリックイベントのバインディングが実行に使用されます。したがって、実際に望んでいなければダブルクリック機能に注意を払う必要はありません。

ユーザーがダブルクリックを行うとき、Emacsはまず通常のクリックイベントを生成し、その後ダブルクリックイベントを生成します。したがって、ダブルクリックイベントのコマンドバインディングは、すでにシングルクリックイベントが実行された想定でデザインしなければなりません。つまりシングルクリックの結果から開始して、ダブルクリックの望むべき結果を生成しなければならないのです。

これはダブルクリックの意味合いが、シングルクリックの意味合いの何らかにもとづいて“構築”される場合は便利です。これはダブルクリックにたいするユーザーインターフェイスにおける推奨されるデザインプラクティスです。

ボタンをクリックした後もう一度ボタンを押下して、そのままマウス一般的を開始した場合、最終的にボタンをリリースしたときダブルドラッグ(double-drag)イベントが取得されます。このイベント型には単なる‘drag’のかわりに‘double-drag’が含まれます。ダブルドラッグイベントがバインディングをもたない場合、それがあたかも通常のドラッグイベントだったかのようにEmacsはかわりのバインディングを探します。

ダブルクリックまたはダブルドラッグイベントの前に、Emacsはユーザーが2回目にボタンを押したタイミングでダブルダウン(double-down)イベントを生成します。このイベント型には、単なる‘down’のかわりに‘double-down’が含まれます。ダブルダウンイベントがバインディングをもたない場合、それがあたかも通常のボタンダウンイベントだったかのようにEmacsはかわりのバインディングを探します。どちらの方法でもバインディングが見つからなかった場合、ダブルダウンイベントは無視されます。

要約すると、ボタンをクリックしてすぐにまた押したとき、Emacsは1回目のクリックにたいしてダウンイベントとクリックイベントを生成し、2回目に再度ボタンを押したときにダブルダウンイベント、そして最後にダブルクリックまたはダブルドラッグイベントを生成します。

ボタンを2回クリックした後もう一度押したとき、それらすべてが素早く連続で行われた場合、Emacsはトリプルダウン(triple-down)イベントと、その後続のトリプルクリック(triple-click)またはトリプルドラッグ(triple-drag)イベントを生成します。これらイベントのイベント型には、‘double’のかわりに‘triple’が含まれます。トリプルイベントがバインディングをもたない場合、Emacsは対応するダブルイベントに使用されるであろうバインディングを使用します。

ボタンを3回以上クリックした後、再度ボタンを押した場合、3回を超える押下にたいするイベントはすべてトリプルイベントになります。Emacsはクワドループル(quadruple: 4連)、クインティプル(quintuple: 5連)、...等のイベントにたいして個別のイベント型をもちません。しかし、ボタンが何回押下されたかを正確に見つけるために、イベントリストを調べることができます。

Function: event-click-count event

この関数はeventを誘因した連続したボタン押下の回数をリターンする。eventがダブルダウン、ダブルクリック、ダブルドラッグの場合、値は2である。eventがトリプルイベントの場合、値は3以上になる。eventが(リピートイベントではない)通常のマウスイベントの場合、値は1である。

User Option: double-click-fuzz

リピートイベントを生成するためには、ほぼ同じスクリーン位置で連続でマウスボタンを押下しなければならない。double-click-fuzzの値は、ダブルクリックを生成するために連続する2回のクリック間で、マウスが移動(水平および垂直)するかもしれない最大ピクセル数を指定する。

この変数はドラッグとみなされるマウスモーションの閾値でもある。

User Option: double-click-time

リピートイベントを生成するためには、連続するボタン押下のミリ秒間隔が、double-click-timeの値より小さくなければならない。double-click-timenilにセットすると、複数回クリック検知が完全に無効になる。tにセットすると、時間制限が取り除かれる。その場合、Emacsは位置だけで複数回クリックを検知する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.8 Motion Events

Emacsは、ボタンアクティビティが何もないマウスのモーション(motion: 動き)を記述するマウスモーション(mouse motion)イベントを生成するときがあります。マウスモーションイベントは、以下のようなリストにより表現されます:

(mouse-movement POSITION)

positionは、マウスカーソルのカレント位置を指定するマウス位置リスト(see section Click Events)です。ドラッグイベントの終了位置のように、この位置リストは最初に選択されていた境界外の位置を表すかもしれず、その場合はそのフレーム内のその位置のウィンドウが含まれる。

スペシャルフォームtrack-mouseは、ボタン内でのモーションイベントの生成を有効にします。track-mouseフォームの外側では、Emacsはマウスの単なるモーションにたいするイベントは生成せず、これらのイベントは発生しません。Mouse Trackingを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.9 Focus Events

ウィンドウシステムは、ユーザーにたいしてどのウィンドウがキーボード入力を受け取るか制御するための、一般的な方法を提供します。このウィンドウ選択はフォーカス(focus)と呼ばれます。Emacsのフレームを切り替えるためにユーザーが何かを行うと、それはフォーカスイベント(focus event)を生成します。フォーカスイベントの通常の定義はグローバルキーマップ内にあり、ユーザーが期待するようにEmacsで新たなフレームを選択するためのものです。See section Input Focusを参照してください。

フォーカスイベントは、以下のようにLispのリストで表現されます:

(switch-frame new-frame)

ここでnew-frameは切り替え先のフレームです。

Xウィンドウマネージャーには、あるウィンドウにマウスを移動するだけで、そこにフォーカスされるようにセットアップするものがいくつかあります。通常は、他の種類の入力が到着するまで、Lispプログラムがフォーカスの変更を知る必要はありません。Emacsはユーザーが新たなフレーム内で実際にキーボードのキーをタイプするかマウスボタンを押下したときしか、フォーカスイベントを生成しません。つまりフレーム間でマウスを移動させても、フォーカスイベントは生成されません。

キーシーケンスの途中におけるフォーカスイベントは、そのシーケンスを誤ったものにするかもしれません。そのため、Emacsは決してキーシーケンスの途中でフォーカスイベントを生成しません。ユーザーがキーシーケンスの途中(つまりプレフィクス引数の後)でフォーカスを変更した場合、複数イベントキーシーケンスの前か後にフォーカスイベントが到着するように、Emacsはフォーカスイベントを記録しておきます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.10 Miscellaneous System Events

他にもシステム内での出来事を表現するイベント型が少数あります。

(delete-frame (frame))

このイベントの種類は、ユーザーがウィンドウマネージャーに特定のウィンドウを削除するコマンドを与えたことを示し、Emacsのフレームにたいして発生する。

フレーム削除(delete-frame)イベントの標準的な定義は、frameを削除する。

(iconify-frame (frame))

このイベントの種類は、ウィンドウマネージャーを使用してユーザーがframeをアイコン化したことを示す。標準的な定義はignoreである。これは、そのフレームがすでにアイコン化されているので、Emacsが行う必要のことは何もないからである。このイベント型の目的は、望むならこのようなイベントの追跡を可能にしておくためである。

(make-frame-visible (frame))

このイベントの種類は、ウィンドウマネージャーを使用してユーザーがframeを非アイコン化したことを示す。標準的な定義はignoreである。これは、そのフレームがすでに可視化されているので、Emacsが行う必要のことは何もないからである。

(wheel-up position)
(wheel-down position)

この種類のイベントは、マウスホイールを移動したことにより発生する。position要素は、そのイベント発生時のマウスカーソル位置を指定するマウス位置リスト(Click Eventsを参照)である。

この種類のイベントは、ある種のシステムでのみ発生する。いくつかのシステムでは、かわりにmouse-4mouse-5が使用される。可搬性のあるコードとするためには、マウスホイールにたいしてどのイベント型が期待されるかを決定するためにmwheel.el内で定義されている変数mouse-wheel-up-eventおよびmouse-wheel-down-eventを使用する。

(drag-n-drop position files)

この種類のイベントは、Emacs外部アプリケーション内でファイルグループが選択され、それがEmacsフレーム内にドラッグアンドドロップされたときに発生する。

要素positionは、そのイベント位置を記述しマウスクリックイベントで使用されるフォーマット(Click Eventsを参照)と同じである。要素filesはドラッグアンドドロップされたファイル名のリストである。通常は、それらのファイルをvisitすることにより、このイベントは処理される。

この種類のイベントは、現在のところある種のシステムでのみ生成される。

help-echo

この種類のイベントは、テキストプロパティhelp-echoをもつバッファーテキスト部分上にマウスポインターが移動したときに生成される。生成されるイベントは以下の形式をもつ:

(help-echo frame help window object pos)

イベントパラメーターの正確な意味と、ヘルプテキストを表示するためにこれらのパラメーターを使用する方法は、Text help-echoで説明されているか

sigusr1
sigusr2

これらのイベントは、EmacsプロセスがシグナルSIGUSR1およびSIGUSR2を受け取ったときに生成される。シグナルは追加情報を運搬しないので、追加データは含まれない。これらのシグナルはデバッグに有用である(Entering the Debugger on an Errorを参照)。

ユーザーシグナルをcatchするためには、special-event-map(Active Keymapsを参照)内で対応するイベントにバインドする。そのコマンドは引数なしで呼び出され、last-input-event内の特定のシグナルイベントが利用できる。たとえば:

(defun sigusr-handler ()
  (interactive)
  (message "Caught signal %S" last-input-event))

(define-key special-event-map [sigusr1] 'sigusr-handler)

シグナルハンドラーをテストするために、自身でEmacsにシグナルを送信できる:

(signal-process (emacs-pid) 'sigusr1)
language-change

この種類のイベントは、MS-Windows上で入力言語が変更されたときに生成される。これは通常、キーボードキーが異なる言語の文字でEmacsに送られることを意味する。生成されるイベントは、以下の形式をもつ:

(language-change frame codepage language-id)

ここでframeは言語が変更されたときカレントだったフレームであり、codepageは新たなコードページ番号(codepage number)、language-idは新たな入力言語の数値IDである。codepageに対応するコーディングシステム(Coding Systemsを参照)は、cpcodepageまたはwindows-codepageである。language-idを文字列に変更する(たとえばset-language-environmentのようなさまざまな言語依存機能にたいしこれを使用する)には、以下のようにw32-get-locale-info関数を使用する:

;; 英語にたいする"ENU"のような言語の省略形を取得する
(w32-get-locale-info language-id)
;; "English (United States)"のような
;; その言語の完全な英語名を取得する
(w32-get-locale-info language-id 4097)
;; その言語の完全なローカライズ名を取得する
(w32-get-locale-info language-id t)

キーシーケンスの途中、つまりプレフィクスキーの後にこれらのイベントの1つが到着した場合、複数イベントキー内ではなくその前または後にそのイベントが到着するように、Emacsはそのイベントを記録する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.11 Event Examples

ユーザーが同じ場所でマウス左ボタンを押して離した場合、それは以下のようなイベントシーケンスを生成します:

(down-mouse-1 (#<window 18 on NEWS> 2613 (0 . 38) -864320))
(mouse-1      (#<window 18 on NEWS> 2613 (0 . 38) -864180))

コントロールキーを押したままユーザーがマウス第2ボタンを押してマウスをある行から次の行へドラッグした場合、以下のような2つのイベントが生成されます:

(C-down-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219))
(C-drag-mouse-2 (#<window 18 on NEWS> 3440 (0 . 27) -731219)
                (#<window 18 on NEWS> 3510 (0 . 28) -729648))

メタキーとシフトキーを押したままユーザーがそのウィンドウのモードライン上でマウス第2ボタンを押して他ウィンドウへマウスをドラッグした場合、以下のようなイベントのペアーが生成されます:

(M-S-down-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844))
(M-S-drag-mouse-2 (#<window 18 on NEWS> mode-line (33 . 31) -457844)
                  (#<window 20 on carlton-sanskrit.tex> 161 (33 . 3)
                   -453816))

全画面表示されていないフレームに入力フォーカスがあり、ユーザーがマウスをそのフレームのスコープ外へマウスを移動した場合、スペシャルフォームtrack-mouse内では以下のようなイベントが生成されます:

(mouse-movement (#<frame *ielm* 0x102849a30> nil (563 . 205) 532301936))

SIGUSR1シグナルを処理するためにはインタラクティブ関数を定義して、それをsignal usr1イベントシーケンスにバインドします:

(defun usr1-handler ()
  (interactive)
  (message "Got USR1 signal"))
(global-set-key [signal usr1] 'usr1-handler)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.12 Classifying Events

すべてのイベントはイベント型(event type)をもちます。イベント型はキーバインディング目的でイベントをクラス分けします。キーボードイベントにたいするイベント型はイベント値と等しく、したがって文字のイベント型は文字、ファンクションキーシンボルのイベント型はそのシンボル自身です。リストであるようなイベントのイベント型は、そのリストのCAR内のシンボルです。したがって、イベント型は常にシンボルか文字です。

同じ型の2つのイベントはキーバインディングに関する限り同じです。したがって、それらは常に同じコマンドを実行します。これらが同じことを行う必要があるという意味ではありませんが、イベント全体を調べてから何を行うか決定するコマンドもいくつかあります。、たとえば、バッファー内でどこに作用するか決定するためにマウスイベントの場所を使用するコマンドもいくつかあります。

広範なイベントのクラス分けが役に立つときもあります。たとえば、他の修飾キーやマウスボタンが使用されたかとは無関係に、METAキーとともに呼び出されたイベントを尋ねたいと思うかもしれません。

関数event-modifiersevent-basic-typeは、そのような情報を手軽に取得するために提供されています。

Function: event-modifiers event

この関数は、eventがもつ修飾子のリストをリターンする。この修飾子はシンボルでありshiftcontrolmetaalthypersuperが含まれる。さらにマウスイベントシンボルの修飾子リストには常にclickdragdownのいずれか1つが含まれる。ダブルイベントまたはトリプルイベントにはdoubleまたはtripleも含まれる。

引数eventはイベントオブジェクト全体、または単なるイベント型かもしれない。eventがカレントEmacsセッション内で入力として読み取られたイベント内で決して使用されないシンボルの場合は、実際にeventが変更されたときでも、event-modifiersnilをリターンできる。

いくつか例を挙げる:

(event-modifiers ?a)
     ⇒ nil
(event-modifiers ?A)
     ⇒ (shift)
(event-modifiers ?\C-a)
     ⇒ (control)
(event-modifiers ?\C-%)
     ⇒ (control)
(event-modifiers ?\C-\S-a)
     ⇒ (control shift)
(event-modifiers 'f5)
     ⇒ nil
(event-modifiers 's-f5)
     ⇒ (super)
(event-modifiers 'M-S-f5)
     ⇒ (meta shift)
(event-modifiers 'mouse-1)
     ⇒ (click)
(event-modifiers 'down-mouse-1)
     ⇒ (down)

クリックイベントにたいする修飾リストは明示的にclickを含むが、イベントシンボル名自身は‘click’を含まない。

Function: event-basic-type event

この関数はeventを記述するキー、またはマウスボタンをリターンする。event引数はevent-modifiersの場合と同様。たとえば:

(event-basic-type ?a)
     ⇒ 97
(event-basic-type ?A)
     ⇒ 97
(event-basic-type ?\C-a)
     ⇒ 97
(event-basic-type ?\C-\S-a)
     ⇒ 97
(event-basic-type 'f5)
     ⇒ f5
(event-basic-type 's-f5)
     ⇒ f5
(event-basic-type 'M-S-f5)
     ⇒ f5
(event-basic-type 'down-mouse-1)
     ⇒ mouse-1
Function: mouse-movement-p object

objectがマウス移動イベントの場合、この関数は非nilをリターンする。

Function: event-convert-list list

この関数は修飾子名リストと基本イベント型(basic event type)を、それらすべてを指定するイベント型に変換する。基本イベント型はそのリストの最後の要素でなければならない。たとえば、

(event-convert-list '(control ?a))
     ⇒ 1
(event-convert-list '(control meta ?a))
     ⇒ -134217727
(event-convert-list '(control super f1))
     ⇒ C-s-f1

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.13 Accessing Mouse Events

このセクションではマウスボタンやモーションイベント内のデータアクセスに役に立つ関数を説明します。同じ関数を使用してキーボードイベントデータにもアクセスできますが、キーボードイベントに不適切なデータ要素は0またはnilになります。

以下の2つの関数は、マウスイベントの位置を指定するマウス位置リスト(see section Click Events)をリターンします。

Function: event-start event

これはeventの開始位置をリターンする。

eventがクリックイベントまたはボタンダウンイベントの場合、この関数はそのイベントの位置をリターンする。eventがドラッグイベントの場合は、そのドラッグの開始位置をリターンする。

Function: event-end event

これはeventの終了位置をリターンする。

eventがドラッグイベントの場合、この関数はユーザーがマウスボタンをリリースした位置をリターンする。eventがクリックイベントまたはボタンダウンイベントの場合、値はそのイベント固有の開始位置となる。

Function: posnp object

この関数はobjectが(Click Eventsに記述されたいずれかのフォーマットの)マウス位置リストの場合は非nil、それ以外ではnilをリターンする。

以下の関数は、引数にマウス位置リストをとり、そのリストのさまざまな部分をリターンします:

Function: posn-window position

positionがあったウィンドウをリターンする。positionが最初イベントがあったフレーム外の位置を表す場合は、かわりにそのフレームをリターンする。

Function: posn-area position

position内に記録されたウィンドウエリアをリターンする。そのウィンドウのテキストエリアでイベントが発生したときはnil、それ以外ではイベントがどこで発生したかを識別するシンボルをリターンする。

Function: posn-point position

position内のバッファー位置をリターンする。ウィンドウのテキストエリア、マージンエリア、フリンジでイベントが発生したときは、バッファー位置を識別する整数値、それ以外では値は未定義である。

Function: posn-x-y position

position内のピクセル単位のxy座標を、コンスセル(x . y)でリターンする。これらはposn-windowにより与えられるウィンドウにたいする相対座標である。

以下は、あるウィンドウのテキストエリア内のウィンドウ相対座標をフレーム相対座標に変換する方法を示す例である:

(defun frame-relative-coordinates (position)
  "POSITIONのフレーム相対座標をリターンする。
POSITIONはウィンドウのテキストエリアにあるものとする。"
  (let* ((x-y (posn-x-y position))
         (window (posn-window position))
         (edges (window-inside-pixel-edges window)))
    (cons (+ (car x-y) (car edges))
          (+ (cdr x-y) (cadr edges)))))
Function: posn-col-row position

この関数は、position内のバッファー位置にたいして推定される列と行を含むコンスセル(col . row)をリターンする。リターン値は、positionにたいするxyの値より計算され、そのフレームのデフォルト文字幅とデフォルト行高(行間スペースを含む)の単位で与えられる(そのため、実際の文字サイズが非デフォルト値の場合には、実際の行と列は、これらの計算された値とは異なるかもしれない)。

rowは、そのテキストエリアの上端から数えられることに注意すること。positionにより与えられるウィンドウがヘッダーライン(see section Window Header Lines)をもつ場合、そのヘッダーラインはrowの数に含まない

Function: posn-actual-col-row position

position内の実際の行と列を、コンスセル(col . row)でリターンする。値はposition与えられるウィンドウの実際の行と列である。Click Eventsを参照のこと。positionが実際のポジション値を含まない場合、この関数はnilをリターンする。この場合、おおよその値を取得するためにposn-col-rowを使用できる。

この関数は、タブ文字やイメージによるビジュアル列数のように、ディスプレイ上の文字のビジュアル幅を意味しない。標準的な文字単位の座標が必要n場合は、かわりにposn-col-rowを使用すること。

Function: posn-string position

position内の文字列オブジェクトををnil、またはコンスセル(string . string-pos)でリターンする。

Function: posn-image position

position内のイメージオブジェクトをnil、または(image ...)でリターンする。

Function: posn-object position

position内のイメージオブジェクト、または文字列オブジェクトをnil、イメージ(image ...)、またはコンスセル(string . string-pos)でリターンする。

Function: posn-object-x-y position

position内のオブジェクトの左上隅からのピクセル単位のxy座標を、コンスセル(dx . dy)でリターンする。positionがバッファーテキストの場合は、その位置にもっとも近いバッファーテキストの相対位置をリターンする。

Function: posn-object-width-height position

position内のオブジェクトのピクセル幅とピクセル高さを、コンスセル(width . height)でリターンする。positionがバッファー位置の場合は、その位置の文字のサイズをリターンする。

Function: posn-timestamp position

position内のタイムスタンプをリターンする。これはミリ秒で表されたイベント発生時刻である。

以下の関数は与えられた特定のバッファー、またはスクリーン位置により与えられる位置リストを計算します。上述の関数で、この位置リスト内のデータにアクセスできます。

Function: posn-at-point &optional pos window

この関数は位置pos in windowにたいする位置リストをリターンする。posのデフォルトはwindow内のポイントであり、windowのデフォルトは選択されたウィンドウである。

window内でposが不可視の場合、posn-at-pointnilをリターンする。

Function: posn-at-x-y x y &optional frame-or-window whole

この関数は、指定されたフレームまたはウィンドウframe-or-window(デフォルトは選択されたウィンドウ)内のピクセル座標xyに対応する位置情報をリターンする。xyは、使用されたフレームまたはウィンドウにたいする相対座標である。wholenilの場合、座標はウィンドウのテキストエリアにたいする相対座標であり、それ以外ではスクロールバー、マージン、フリンジを含むウィンドウエリア全体にたいする相対座標である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.14 Accessing Scroll Bar Events

以下の関数は、スクロールバーイベントの解析に役立ちます。

Function: scroll-bar-event-ratio event

この関数はスクロールバーで発生したスクロールバーイベントの位置の垂直位置割り合いをリターンする。値は位置の割り合いを表す2つの整数を含むコンスセル(portion . whole)である。

Function: scroll-bar-scale ratio total

この関数は、(実質的には)ratiototalを乗じて、結果を整数に丸める。引数ratioは数字ではなく、scroll-bar-event-ratioによりリターンされる典型的な値ペアー(num . denom)である。

この関数はスクロールバー位置をバッファー位置にスケーリングするのに便利である。以下のようにこれを行う:

(+ (point-min)
   (scroll-bar-scale
      (posn-x-y (event-start event))
      (- (point-max) (point-min))))

スクロールバーイベントは、xy座標ペアーのかわりに割り合いを構成する2つの整数をもつことを思い出してほしい。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.7.15 Putting Keyboard Events in Strings

文字列が使用される場所のほとんどにおいて、わたしたちはテキスト文字を含むもの、つまりバッファーやファイル内で見出すのと同種のものとして、文字列を概念化します。Lispプログラムはときおり、キーボード文字、たとえばキーシーケンスやキーボードマクロ定義かもしれないキーボード文字を概念的に含む文字列を使用します。しかし文字列内へのキーボード文字の格納は、歴史的な互換性の理由により複雑な問題であり、常に可能なわけではありません。

新たに記述するプログラムでは文字列内にキーボードイベントを格納しないことにより、これらの複雑さを扱うことを避けるよう推奨します。以下はこれを行う方法です:

複雑さはキーボード入力に含まれるかもしれない修飾ビットに起因します。メタ修飾以外の修飾ビットは文字列に含めることができず、メタ文字も特別な場合だけ許されます。

GNU Emacsの初期のバージョンでは、メタ文字を128から255のコードで表していました。その頃は基本文字コードの範囲は0から127だったので、すべてのキーボード文字を文字列内に適合させることができました。Lispプログラムの多くは、特にdefine-keyやその種の関数の引数として文字列定数内にメタ文字を意味する‘\M-’を使用し、キーシーケンスとイベントシーケンスは常に文字列として表現されていました。

127を超えるより大きい基本文字コードと追加の修飾ビットにたいするサポートを加えたとき、わたしたちはメタ文字の表現を変更する必要がありました。現在では文字のメタ修飾を表すフラグは 2**27 であり、そのような値は文字列内に含めることができません。

プログラムで文字列定数内の‘\M-’をサポートするために、文字列内に特定のメタ文字を含めるための特別なルールがあります。以下は入力文字シーケンスとして文字列を解釈するためのルールです:

キーボード入力文字の文字列定数を構築するread-key-sequenceのような関数は、イベントが文字列内に適合しないときは文字列のかわりにベクターを構築するというルールにしたがいます。

文字列内で入力構文‘\M-’を使用すると、それは128から255の範囲のコード、つまり対応するキーボードイベントを文字列内に配すために変更するとき取得されるのと同じコードが生成されます。したがって文字列内のメタイベントは、それが文字列内にどのように配置されたかと無関係に一貫して機能します。

しかし、ほとんどのプログラムはこのセクションの冒頭の推奨にしたがって、これらの問題を避けるほうがよいでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8 Reading Input

エディターコマンドループはキーシーケンスの読み取りに関数read-key-sequenceを使用し、この関数はread-eventを使用します。イベント入力にたいしてこれらの関数、およびその他の関数がLisp関数から利用できます。Temporary Displaysmomentary-string-display、およびWaiting for Elapsed Time or Inputsit-forも参照してください。端末の入力モードの制御、および端末入力のデバッグに関する関数と変数については、Terminal Inputを参照してください。

高レベル入力機能についてはMinibuffersを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.1 Key Sequence Input

コマンドループはread-key-sequenceを呼び出すことにより、キーシーケンスの入力を一度に読み取ります。Lisp関数もこの関数を呼び出すことができます。たとえばdescribe-keyはキーを説明するためにこの関数を使用します。

Function: read-key-sequence prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop

この関数はキーシーケンスを読み取り、それを文字列またはベクターでリターンする。この関数は完全なキーシーケンスに蓄積されるまで、つまりカレントでアクティブなキーマップを使用してプレフィクスなしでコマンドを指定するのに十分なキーシーケンスとなるまでイベントの読み取りを継続する(マウスイベントで始まるキーシーケンスは、カレントバッファーではなくマウスのあったウィンドウ内のバッファーのキーマップを使用して読み取られることを思い出してほしい)。

イベントがすべて文字で、それらがすべて文字列に適合する場合、read-key-sequenceは文字列をリターンする(Putting Keyboard Events in Stringsを参照)。それ以外の場合は文字、シンボル、リストなどすべての種類のイベントを保持できるベクターをリターンする。文字列またはベクターの要素は、キーシーケンス内のイベントである。

キーシーケンスのo読み取りには、そのイベントを変換するさまざまな方法が含まれる。Keymaps for Translating Sequences of Eventsを参照のこと。

引数promptはプロンプトとしてエコーエリアに表示される文字列か、プロンプトを表示しないnilである。引数continue-echoが非nilの場合、それは前のキーの継続としてそのキーをエコーすることを意味する。

通常、元となる大文字のイベントが未定義で、それと等価な小文字イベントが定義されている場合、大文字のイベントは小文字のイベントに変換される。引数dont-downcase-lastが非nilの場合、それは最後のイベントを小文字に変換しないことを意味する。これはキーシーケンスを定義するときに適している。

引数switch-frame-okが非nilの場合は、たとえ何かをタイプする前にユーザーがフレームを切り替えたとしても、この関数がswitch-frameを処理すべきでないことを意味する。キーシーケンスの途中でユーザーがフレームを切り替えた場合、またはシーケンスの最初だがswitch-frame-oknilのときにフレームを切り替えた場合、そのイベントはカレントキーシーケンスの後に延期される。

引数command-loopが非nilの場合は、そのキーシーケンスがコマンドを逐次読み取る何かによりa読み取られることを意味する。呼び出し側が1つのキーシーケンスだけを読み取る場合は、nilを指定すべきである。

以下の例では、Emacsはエコーエリアにプロンプト‘?’を表示して、その後ユーザーがC-x C-fをタイプしている。

(read-key-sequence "?")

---------- Echo Area ----------
?C-x C-f
---------- Echo Area ----------

     ⇒ "^X^F"

関数read-key-sequenceはquitを抑制する。この関数による読み取りの間にタイプされたC-gは他の文字と同じように機能し、quit-flagをaセットしない。Quittingを参照のこと。

Function: read-key-sequence-vector prompt &optional continue-echo dont-downcase-last switch-frame-ok command-loop

これはread-key-sequenceと同様だが、キーシーケンスを常にベクターでリターンし、文字列では決してリターンしない点が異なる。Putting Keyboard Events in Stringsを参照のこと。

入力文字が大文字(またはシフト修飾をもつ)で、キーバインディングをもたないが、等価な小文字はキーバインディングをもつ場合、read-key-sequenceはその文字を小文字に変換します。lookup-keyはこの方法による大文字小文字変換を行わないことに注意してください。

入力を読み取った結果がシフト変換(shift-translation)されていたような場合、Emacsは変数this-command-keys-shift-translatedに非nil値をセットします。シフト変換されたキーにより呼びだされたときは挙動を変更する必要があるLispプログラムは、この変数を調べることができます。たとえば、関数handle-shift-selectionはリージョンをアクティブ、または非アクティブにするか判断するためにこの変数の値を調べます(handle-shift-selectionを参照)。

この関数read-key-sequenceも、マウスイベントのいくつかを変換します。これはバインドされていないドラッグイベントをクリックイベントに変換し、バインドされていないボタンダウンイベントを完全に破棄します。さらにフォーカスイベントとさまざまなウィンドウイベントの再配置も行うため、これらのイベントはキーシーケンス中に他のイベントとともに決して出現しません。

モードラインやスクロールバーのようなウィンドウの特別な箇所でマウスイベントが発生したとき、そのイベント型は特別なことは何も示さず、マウスボタンと修飾キーの組み合わせを通常表すのと同じシンボルになります。ウィンドウの箇所についての情報はイベント内の別のどこか、すなわち座標に保持されています。しかしread-key-sequenceはこの情報を仮想的な“プレフィクスキー”に変換します。これらはすべてシンボルでありheader-linehorizontal-scroll-barmenu-barmode-linevertical-linevertical-scroll-barです。これらの仮想的なプレフィクスキーを使用してキーシーケンスを定義することにより、ウィンドウの特別な部分でのカウスクリックにたいして意味を定義できます。

たとえば、read-key-sequenceを呼び出した後にそのウィンドウのモードラインをマウスでクリックすると、以下のように2つのマウスイベントが取得されます:

(read-key-sequence "Click on the mode line: ")
     ⇒ [mode-line
         (mouse-1
          (#<window 6 on NEWS> mode-line
           (40 . 63) 5959987))]
Variable: num-input-keys

この変数の値は、そのEmacsセッション内で処理されたキーシーケンスの数である。これには端末からのキーシーケンスと、実行されるキーボードマクロにより読み取られたキーシーケンスが含まれる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.2 Reading One Event

read-event,read-charread-char-exclusiveは、コマンド入力にたいするもっとも低レベルの関数です。

Function: read-event &optional prompt inherit-input-method seconds

この関数はコマンド入力の次のイベントを読み取り、リターンする。必要ならイベントが利用可能になるまで待機する。

リターンされるイベントはユーザーから直接のイベントかもしれないし、またはキーボードマクロからのイベントかもしれない。イベントはキーボードの入力コーディングシステム(Terminal I/O Encodingを参照)により復号されない。

オプション引数promptが非nilの場合、それはエコーエリアにプロンプトとして表示される文字列である。nilの場合、read-eventは入力待ちを示すメッセージを何も表示せず、エコーを行うことによりプロンプトの代用とする。エコーで表示されるのはカレントコマンドに至ったイベントや読み取られたイベントの説明である。The Echo Areaを参照のこと。

inherit-input-methodが非nilの場合、(もしあれば)非ASCII文字の入力を可能にするためにカレントの入力メソッドが採用される。それ以外では、このイベントの読み取りにたいして入力メソッドの処理が無効になる。

cursor-in-echo-areaが非nilの場合、read-eventはカーソルを一時的にエコーエリアの、そこに表示されているメッセージの終端に移動する。それ以外では、read-eventはカーソルを移動しない。

secondsが非nilの場合、それは入力を待つ最大秒数を指定する数値である。その時間内に入力が何も到着しない場合、read-eventは待機を終えてnilをリターンする。浮動小数点数secondsは待機する秒の分数を意味する。いくつかのシステムではサポートされるのは整数の秒数だけであり、そのようなシステムではsecondsは切り捨てられる。secondsnilの場合、read-eventは入力が到着するのに必要なだけ待機する。

secondsnilの場合、ユーザー入力が到着するのを待つ間、Emacsはアイドル状態にあるとみなされる。この期間中にアイドルタイマー — run-with-idle-timer(Idle Timersを参照) — を実行できる。しかしsecondsが非nilの場合には、非アイドル状態は変更されずに残る。read-eventが呼び出されたときEmacsが非アイドルだった場合、read-eventの処理を通じて非アイドルのままとなる。Emacsがアイドルだった場合(これはアイドルタイマー内部からその呼び出しが行われた場合に起こり得る)は、アイドルのままとまる。

read-eventがヘルプ文字として定義されたイベントを取得した場合、ある状況においてはread-eventがリターンせずに直接イベントを処理することがある。Help Functionsを参照のこと。その他のスペシャルイベント(special events)(Special Eventsを参照)と呼ばれる特定のイベントもread-eventで直接処理される。

以下はread-eventを呼び出してから右矢印キーを押下したとき何が起こるかの例である:

(read-event)
     ⇒ right
Function: read-char &optional prompt inherit-input-method seconds

この関数はコマンド入力の文字を読み取り、それをリターンする。ユーザーが文字以外(たとえばマウスクリックやファンクションキー)のイベントを生成した場合、read-charはエラーをシグナルする。引数はread-eventと同じように機能する。

1つ目の例では、ユーザーは文字1(ASCIIコード49)をタイプしている。2つ目の例では、eval-expressionを使用してミニバッファーからread-charを呼び出すキーボード定義を示している。read-charは、キーボードマクロの直後の文字1を読み取る。その後、eval-expressionはリターン値をエコーエリアに表示する。

(read-char)
     ⇒ 49

;; M-:を使用して以下を評価するものとする
(symbol-function 'foo)
     ⇒ "^[:(read-char)^M1"
(execute-kbd-macro 'foo)
     -| 49
     ⇒ nil
Function: read-char-exclusive &optional prompt inherit-input-method seconds

この関数はコマンド入力の文字を読み取り、それをリターンする。ユーザーが文字以外のイベントを生成した場合、read-char-exclusiveはそれを無視して文字を取得するまで他のイベントを読み取る。引数はread-eventと同じように機能する。

上記でquitを抑制する関数はありません。

Variable: num-nonmacro-input-events

この変数は端末から受信した入力イベント(キーボードマクロにより生成されたイベントは勘定されない)の総数を保持する。

read-key-sequenceと異なり、関数read-eventread-charread-char-exclusiveKeymaps for Translating Sequences of Eventsで説明した変換を行わないことを強調しておきます。単一キー読み取りでこれらの変換を行いたい場合は、関数read-keyを使用してください。

Function: read-key &optional prompt

この関数は1つのキーを読み取る。これはread-key-sequenceread-eventの間の“中間的”な関数である。read-key-sequenceと異なるのは、キーシーケンスではなく単一キーを読み取ることである。read-eventと異なるのは、rawイベントをリターンせずにinput-decode-maplocal-function-key-mapkey-translation-map(Keymaps for Translating Sequences of Eventsを参照)に合わせて復号と変換を行うことである。

引数promptはプロンプトとしてエコーエリアに表示する文字列で、nilはプロンプトを表示しないことを意味する。

Function: read-char-choice prompt chars &optional inhibit-quit

この関数は1つの文字を読み取りリターンするためにread-keyを使用する。これはchars(許容される文字のリスト)のメンバー以外の入力を無視する。オプションで、有効な入力を待つ間のquitイベントも無視する。read-char-choice呼び出しの間にhelp-form(Help Functionsを参照)を非nil値にバインドした場合、help-charの押下によりhelp-formが評価され結果が表示される。その後、有効な入力文字、またはキーボードquitの待機を継続する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.3 Modifying and Translating Input Events

Emacsはextra-keyboard-modifiersに合わせて読み取ったすべてのイベントを変更して、read-eventからリターンする前に、(もし適切なら)keyboard-translate-tableを通じてそれを変換します。

Variable: extra-keyboard-modifiers

この変数は、Lispプログラムにキーボード上の修飾キーを“押下”させる。値は文字である。文字の修飾子だけが対象となる。ユーザーがキーボードのキーを押下するたびに、その修飾キーがすでに押下されたかのように処理される。たとえば、extra-keyboard-modifiers?\C-\M-aにバインドした場合、このバインディングのスコープ内にある間、すべてのキーボード入力文字はコントロール修飾とメタ修飾を適用されるだろう。文字?\C-@は0と等価なので、この目的にたいしてはコントロール文字として勘定されないが、修飾無しの文字として扱われる。したがってextra-keyboard-modifiersを0にセットすることにより、すべての修飾をキャンセルできる。

ウィンドウシステムを利用する場合は、この方法によりプログラムが任意の修飾キーを“押下”できる。それ以外はCTLMETAのキーだけを仮想的に押下できる。

この変数は実際にキーボード由来のイベントだけに適用され、マウスイベントやその他のイベントには効果がないことに注意されたい。

Variable: keyboard-translate-table

この端末ローカルな変数はキーボード文字にたいする変換テーブルである。これによりコマンドバインディングを変更することなく、キーボード上のキーを再配置できる。値は通常、文字テーブル、またはnilある(文字列かベクターも指定できるが、時代遅れとされている)

keyboard-translate-tableが文字テーブル(Char-Tablesを参照)の場合、キーボードから読み取られたそれぞれの文字はその文字テーブルを調べる。非nilの値が見つかった場合は、実際の入力文字のかわりにそれを使用する。

この変換は文字が端末から読み取られた後、最初に発生することに注意されたい。recent-keysのような記録保持機能や文字を記録するdribbleファイルは、この変換の後に処理される。

さらに、この変換は入力メソッド(Input Methodsを参照)に文字を提供する前に行われることにも注意されたい。入力メソッド処理の後に文字を変換したい場合は、translation-table-for-input(Translation of Charactersを参照)を使用すること。

Function: keyboard-translate from to

この関数は文字コードfromを文字コードtoに変換するために、keyboard-translate-tableを変更する。 必要な場合は、キーボード変換テーブルを作成する。

以下はC-xでカット、C-でコピー、C-vでペーストを処理するようにkeyboard-translate-tableを使用する例です:

(keyboard-translate ?\C-x 'control-x)
(keyboard-translate ?\C-c 'control-c)
(keyboard-translate ?\C-v 'control-v)
(global-set-key [control-x] 'kill-region)
(global-set-key [control-c] 'kill-ring-save)
(global-set-key [control-v] 'yank)

拡張ASCII入力をサポートするグラフィカルな端末上では、シフトキーとともにタイプすることにより、標準的なEmacsにおける意味をこれらの文字から依然として取得することが可能です。これはキーボード変換が関与する文字とは異なりますが、それらは通常と同じ意味をもちます。

read-key-sequenceのレベルでイベントシーケンスを変換するメカニズムについては、Keymaps for Translating Sequences of Eventsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.4 Invoking the Input Method

イベント読み取り関数は、もしあればカレント入力メソッドを呼び出します(Input Methodsを参照)。input-method-functionの値が非nilの場合、関数を指定します。read-eventが修飾ビットのないプリント文字(SPCを含む)を読み取ったときは、その文字を引数としてその関数を呼び出します。

Variable: input-method-function

これが非nilの場合、その値はカレントの入力メソッド関数を指定する。

警告: この変数はletでバインドしてはならない。この変数はしばしばバッファーローカルであり、入力の前後(これは正にあなたがバインドするであろうタイミングである)でバインドした場合、Emacsが待機中に非同期にバッファーを切り替えると誤ったバッファーに値がリストアされるだろう。

入力メソッド関数は、入力として使用されるイベントのリストをリターンするべきです(このリストがnilの場合、それは入力がないことを意味するので、read-event他のイベントを待機する)。これらのイベントはunread-command-events(Miscellaneous Event Input Featuresを参照)内のイベントの前に処理されます。入力メソッドによりリターンされるイベントは、たとえそれらが修飾ビットのないプリント文字であっても、再度入力メソッドに渡されることはありません。

入力メソッド関数がread-eventまたはread-key-sequenceを呼び出した場合は、再帰を防ぐために最初にinput-method-functionnilにバインドするべきです。

キーシーケンスの2つ目および後続のイベントを読み取るときは、入力メソッド関数は呼び出されません。したがって、それらの文字は入力メソッドの処理対象ではありません。入力メソッド関数はoverriding-local-mapoverriding-terminal-local-mapの値をテストするべきです。これらの変数のいずれかが非nilの場合、入力メソッドは引数をリストにputして、それ以上の処理を行わずにそのリストをリターンするべきです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.5 Quoted Character Input

ユーザーが手軽にコントロール文字やメタ文字。リテラルや8進文字コードを指定できるように、文字の指定をもとめることができます。コマンドquoted-insertこの関数を使用します。

Function: read-quoted-char &optional prompt

この関数はread-char同様だが、最初に読み取った文字が8進数 (0–7)の場合は任意の個数の8進数(8進数以外の文字を見つけた時点でストップする)を読み取り、その文字コードにより表される文字をリターンする。8進シーケンスを終端させた文字がRETの場合、それは無視される。他の終端文字は、この関数がリターンした後に入力として使用される。

最初の文字の読み取り時はquitは抑制されるので、ユーザーははC-gを入力できる。Quittingを参照のこと。

promptが与えられた場合、それはユーザーへのプロンプトに使用する文字列を指定する。プロンプト文字列は、その後の1つの‘-’とともに常にエコーエリアに表示される。

以下の例では、ユーザーは8進数の177(10進数の127)をタイプしている。

(read-quoted-char "What character")

---------- Echo Area ----------
What character 1 7 7-
---------- Echo Area ----------

     ⇒ 127

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.8.6 Miscellaneous Event Input Features

このセクションでは、イベントを使い切ることなく“先読み”する方法、および入力の保留や保留の破棄の方法について説明します。Reading a Passwordの関数read-passwdも参照してください。

Variable: unread-command-events

この変数はコマンド入力として読み取り待機中のイベントのリストを保持する。イベントはこのリスト内の出現順に使用され、使用されるごとにリストから取り除かれる。

ある関数がイベントを読み取ってそれを使用するかどうか決定する場合がいくつかあるので、この変数が必要になる。この変数にイベントを格納すると、コマンドループおよにコマンド入力を読み取る関数により、イベントは通常のように処理される。

たとえば、数引数を実装する関数は、任意の個数の数字を読み取る。数字イベントが見つからないとき、関数はそのイベントを読み戻す(unread)ので、そのイベントはコマンドループにより通常通り読み取られることができる。同様に、インクリメンタル検索は、検索において特別な意味をもたないイベントを読み戻すために、この機能を使用する。なぜなら、それらのイベントは検索をexitして、通常どおり実行されるべきだからである。

unread-command-eventsにイベントを置くためにキーシーケンスからイベントを抽出するには、listify-key-sequence(以下参照)を使用するのが簡単で信頼のおける方法である。

もっとも最近読み戻したイベントが最初に再読み取りされるように、このリストの先頭にイベントを追加するのが通常である。

通常このリストから読み取ったイベントは、そのイベントが最初に読み取られたときにすでに一度追加されたときのように、カレントコマンドのキーシーケンスに(たとえばthis-command-keysにリターンされたとみのように)追加される。フォーム(t . event)の要素は、カレントコマンドのキーシーケンスにeventを強制的に追加する。

Function: listify-key-sequence key

この関数は文字列またはベクターのkeyを、unread-command-events置くことができる個別のイベントのリストに変換する。

Function: input-pending-p &optional check-timers

この関数は、コマンド入力がカレントで読み取り可能かどうか判断する。入力が利用可能なら即座にtを、それ以外はnilをリターンする。非常に稀だが、入力が利用できないときにt

オプション引数check-timersが非nilの場合、Emacsは順部位ができたら任意のタイマーを実行する。Timers for Delayed Executionを参照のこと。

Variable: last-input-event

この変数は最後に読み取られた端末入力イベントがコマンドの一部なのか、それともLispプログラムによる明示的なものなのかを記録する。

以下の例では、文字1(ASCIIコード49)をLispプログラムが読み取っている。C-e(C-x C-eは式を評価するコマンドとする)がlast-command-eventに値として残っている間は、それがlast-input-eventの値となる。

(progn (print (read-char))
       (print last-command-event)
       last-input-event)
     -| 49
     -| 5
     ⇒ 49
Macro: while-no-input body…

この構成はbodyフォームを実行して、入力が何も到着しない場合だけ最後のフォームの値をリターンする。bodyフォームを実行する間に何らかの入力が到着した場合は、それらの入力をする(quitのように機能する)。while-no-inputフォームは実際のquitによりabortした場合はnil、入力の到着によりabortした場合はtをリターンする。

bodyの一部でinhibit-quitを非nilにバインドした場合、その部分の間に到着した入力は、その部分が終わるまでabortしない。

両方のabort条件をbodyにより計算されたすべての可能な値で区別できるようにしたい場合は、以下のようにコードを記述する:

(while-no-input
  (list
    (progn . body)))
Function: discard-input

この関数は端末入力バッファーの内容を破棄して定義処理中かもしれないキーボードマクロをキャンセルする。この関数はnilをリターンする。

以下の例では、フォームの評価開始直後にユーザーが数字か文字をタイプするかもしれない。sleep-forがスリープを終えた後、discard-inputはスリープ中にタイプされた文字を破棄する。

(progn (sleep-for 2)
       (discard-input))
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.9 Special Events

特定のスペシャルイベント(special event)は、読み取られると即座に非常に低レベルで処理されます。read-event関数はそれらのイベントを自身で処理して、それらを決してリターンしません。かわりに、スペシャルイベント以外の最初のイベントを待ち、それをリターンします。

スペシャルイベントはエコーされず、決してキーシーケンスにグループ化されず、last-command-event(this-command-keys)の値として出現することもありません。スペシャルイベントは数引数を破棄し、unread-command-eventsによる読み戻しができず、キーボードマクロ内に出現することもないでしょうし、キーボードマクロ定義中にキーボードマクロに記録されることもありません。

しかし、スペシャルイベントは読み取られた直後にlast-input-event内に出現するので、これがイベント定義にたいして実際のイベントを探す方法になります。

イベント型iconify-framemake-frame-visibledelete-framedrag-n-droplanguage-change、およびsigusr1ようなユーザーシグナルは通常この方法により処理されます。何がスペシャルイベントで、スペシャルイベントをどのように処理するかを定義するキーマップは、変数special-event-map(Active Keymapsを参照)の中にあります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.10 Waiting for Elapsed Time or Input

待機関数(wait function)は特定の時間が経過するか、入力があるまで待機するようにデザインされています。たとえば、計算の途中でユーザーがディスプレイを閲覧できるように一時停止したいときがあるかもしれません。sit-forは一時停止して画面を更新、sleep-forは画面を更新せずに一時停止して、入力が到着したら即座にリターンします。

Function: sit-for seconds &optional nodisp

この関数は、(ユーザーからの保留中入力がない場合は)再描画を行ってから、seconds秒、または入力が利用可能になるまで待機する。sit-forの通常の目的は、ディスプレイしたテキストをユーザーが読み取る時間を与えるためである。入力が何も到着せず(Miscellaneous Event Input Featuresを参照)、時間をフルに待機した場合はt、それ以外はnilが値となる。

引数secondsは整数である必要はない。浮動小数点数の場合、sit-forは秒の少数点数を待機する。整数の秒だけをサポートするいくつかのシステムでは、secondsは切り捨てられる。

保留中の入力が存在しない場合、式(sit-for 0)は遅延なしに再描画をリクエストする(redisplay)と等価である。Forcing Redisplayを参照のこと。

nodispが非nilの場合sit-forは再描画を行わないが、それでも入力が利用可能になると(またはタイムアウト時間が経過すると)即座にリターンする。

バッチモード(Batch Modeを参照)では、たとえ標準入力ディスクリプタからの入力でも割り込みできまい。これは以下で説明するsleep-forでも同じである。

(sit-for seconds millisec nodisp)のように、3つの引数でsit-forを呼び出すことも可能だが時代遅れだと考えられている。

Function: sleep-for seconds &optional millisec

この関数は表示を更新せず、単にseconds秒間一時停止する。これは利用可能な入力に注意を払わない。この関数はnilをリターンする。

引数secondsは整数である必要はない。浮動小数点数の場合、sleep-forは秒の少数点数を待機する。整数の秒だけをサポートするいくつかのシステムでは、secondsは切り捨てられる。

オプション引数millisecはミリ秒単位で追加の待機期間を指定する。これはsecondsで指定された期間に追加される。システムが小数点の秒数をサポートしない場合、非0のmillisecを指定するとエラーとなる。

遅延を保証したい場合はsleep-forを使用する。

現在時刻を取得する関数については、Time of Dayを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.11 Quitting

Lisp関数を実行中にC-gをタイプすると、Emacsが何を行っていてもEmacsをquit(中止、終了)させます。これはアクティブなコマンドループの再内に制御がリターンすることを意味します。

コマンドループがキーボード入力待機中にC-gをタイプしてもquitはしません。これは通常の入力文字として機能します。もっともシンプルなケースでは、通常C-gはquitの効果をもつkeyboard-quitを実行するので、区別できませんしかしプレフィクスキーの後のC-gは、未定義のキー組み合わせになります。これはプレフィクスキーやプレフィクスキーも同様にキャンセルする効果をもちます。

ミニバッファー内では、C-gは異なる定義をもち、それはミニバッファーをabort(失敗、中止、中断)します。これは実際にはミニバッファーをexitしてquitします(単にquitするのはミニバッファー内のコマンドループにリターンするだろう)。C-gがなぜコマンドリーダーが入力読み取り時に直接quitしないかという理由は、ミニバッファー内でC-gの意味をこの方法により再定義可能にするためです。プレフィクスキーの後のC-gはミニバッファー内で再定義されておらず、プレフィクスキーおよびプレフィクス引数のキャンセルという通常の効果をもちます。もしC-ggヴぁ常に直接quitするなら、これは不可能でしょう。

C-gが直接quitを行うときは、変数quit-flagtにセットすることによりそれを行います。Emacsは適切なときにこの変数をチェックして、nilでない場合はquitします。どのような方法でも、quit-flagを非nilにセットするとquitが発生します。

Cコードのレベルでは、どこでもquitを発生させることはできず、quit-flagをチェックする特別な場所でのみquitが発生します。この理由は、他の場所でquitすると、Emacsの内部状態が矛盾が生じるかもしれないからです。安全な場所までquitが遅延されるので、quitがEmacsをクラッシュさせることがなくなります。

read-key-sequenceread-quoted-charのような特定の関数は、たとえ入力を待機中でもquitを抑制します。quitするかわりに、C-gは要求された入力として処理されます。read-key-sequenceの場合、これはコマンドループ内でのC-gの特別な振る舞いを引き起こすのに役立ちます。read-quoted-charの場合、これはC-gをクォートするのにC-qを使用できるようにします。

変数inhibit-quitを非nil値にバインドすることにより、Lisp関数の一部でquitを抑止できます。その場合は、quit-flagtにセットされていても、C-gの通常の結果であるquitは抑止されます。letフォームの最後でこのバインディングがunwindされるなどして、結果としてinhibit-quitは再びnilになります。このときquit-flagnilの場合には、即座に要求されたquitが発生します。この挙動は、プログラム中の“クリティカルセクション”内でquitが発生しないことを確実にしたいときに理想的です。

(read-quoted-charのような)いくつかの関数では、quitを起こさない特別な方法でC-gが処理されます。これはinhibit-quittにバインドして入力を読み取り、再びinhibit-quitnilになる前にquit-flagnilにセットすることにより行われます。以下は、これを行う方法を示すためのread-quoted-charの抜粋です。この例は入力の最初の文字の後で通常のquitを許す方法も示しています。

(defun read-quoted-char (&optional prompt)
  "…documentation…"
  (let ((message-log-max nil) done (first t) (code 0) char)
    (while (not done)
      (let ((inhibit-quit first)
            …)
        (and prompt (message "%s-" prompt))
        (setq char (read-event))
        (if inhibit-quit (setq quit-flag nil)))
      … 変数codeをセット …)
    code))
Variable: quit-flag

この変数が非nilinhibit-quitnilの場合、macsは即座にquitする。C-gをタイプすると、通常はinhibit-quitとは無関係にquit-flagを非nilにセットする。

Variable: inhibit-quit

この変数は、quit-flagが非nilにセットされているときEmacsがquitするかどうかを決定する。inhibit-quitが非nilの場合、quit-flagは特に効果がない。

Macro: with-local-quit body…

このマクロはbodyを順番に実行するが、たとえこの構成の外部でinhibit-quitが非nilでも、少なくともローカルにbody内でのquitを許す。このマクロはquitによりexitした場合はnil、それ以外はbody内の最後のフォームの値をリターンする。

inhibit-quitnilの場合with-local-quitへのエントリーでbodyだけが実行され、quit-flagをセットすることにより通常のquitが発生する。しかし通常のquitが遅延されるようにinhibit-quitが非nilにセットされている場合、非nilquit-flagは特別な種類のローカルquitを引き起こす。これはbodyの実行を終了して、quit-flagを非nilのままでwith-local-quitボディーをexitするので、許され次第(通常の)他のquitが発生する。bodyの先頭ですでにquit-flagが非nilの場合、即座にローカルquitが発生して結局ボディーは実行されない。

このマクロは主にタイマー、プロセスフィルター、プロセスセンチネル、pre-command-hookpost-command-hook、およびinhibit-quitが通常はtにバイドされている場所で役に立つ。

Command: keyboard-quit

この関数は(signal 'quit nil)によりquit条件をシグナルする。これはquitが行うことと同じである(Errorssignalを参照)。

quitに使用するC-g以外の文字を指定できます。Input Modes内の関数set-input-modeを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.12 Prefix Command Arguments

ほとんどのEmacsコマンドはプレフィクス引数(prefix argument)を使用できます。プレフィクス引数はコマンド自身の前に数字を指定するものです(プレフィクス引数とプレフィクスキーを混同しないように)。プレフィクス引数は常に値により表され、nilのときはカレントでプレフィクス引数が存在しないことを意味します。すべてのコマンドはプレフィクス引数を使用するか、あるいは無視します。

プレフィクス引数には2つの表現があります。それはraw(生の、加工していない、原料のままの、未加工の)数字(numeric)です。エディターコマンドループは内部的にraw表現を使用し、Lisp変数もその情報を格納するのにこれを使用しますが、コマンドはどちらかの表現を要求できます。

以下は利用できるrawプレフィクス引数の値です:

以下の関数をさまざまなプレフィクスで呼び出して、これらの可能なプレフィクスを説明しましょう:

(defun display-prefix (arg)
  "rawプレフィクス引数の値を表示する。"
  (interactive "P")
  (message "%s" arg))

以下はさまざまなrawプレフィクス引数でdisplay-prefixを呼び出した結果です:

        M-x display-prefix  -| nil

C-u     M-x display-prefix  -| (4)

C-u C-u M-x display-prefix  -| (16)

C-u 3   M-x display-prefix  -| 3

M-3     M-x display-prefix  -| 3      ; (C-u 3と同じ)

C-u -   M-x display-prefix  -| -

M--     M-x display-prefix  -| -      ; (C-u -と同じ)

C-u - 7 M-x display-prefix  -| -7

M-- 7   M-x display-prefix  -| -7     ; (C-u -7と同じ)

Emacsにはプレフィクス引数を格納するための2つの変数prefix-argcurrent-prefix-argがあります。他のコマンドにたいしてプレフィクス引数をセットアップするuniversal-argumentのようなコマンドは、プレフィクス引数をprefix-arg内に格納します。対照的にcurrent-prefix-argはカレントコマンドにプレフィクス引数を引き渡すので、これらの変数をセットしても将来のコマンドにたいするプレフィクス引数に効果はありません。

コマンドは通常はinteractive内で、プレフィクス引数にたいしてrawと数値のどちらの表現を使用するかを指定します(Using interactiveを参照)。そのかわりに関数は変数current-prefix-arg内のプレフィクス引数の値を直接調べるかもしれませんが、これは明確さで劣ります。

Function: prefix-numeric-value arg

この関数はargの有効なrawプレフィクス引数の数値的な意味をリターンする。引数はシンボル、数字、またはリストかもしれない。これがnilの場合は、値1がリターンsare,-の場合は-1がリターンされる。これが数字の場合は、その数字がリターンされる。リスト(数字であるべき)の場合は、そのリストのCARがリターンされる。

Variable: current-prefix-arg

この変数はカレントのコマンドにたいするrawプレフィクス引数を保持する。コマンドはこの変数を直接調べるかもしれないが、この変数にたいするアクセスには通常は(interactive "P")を使用する。

Variable: prefix-arg

この変数の値はの編集コマンドにたいするrawプレフィクス引数である。後続のコマンドにたいしてプレフィクス引数を指定するuniversal-argumentのようなコマンドは、この変数をセットすることにより機能する。

Variable: last-prefix-arg

rawプレフィクス引数の値は、前のコマンドにより使用された値である。

以下のコマンドは、後続のコマンドにたいしてプレフィクス引数をセットアップするために存在します。これらを他の用途で呼び出さないでください。

Command: universal-argument

このコマンドは入力を読み取り。後続のコマンドにたいするプレフィクス引数を指定する。何をしているかわかっているのでなければ、このコマンドを自分で呼び出してはならない。

Command: digit-argument arg

このコマンドは、後続のコマンドにたいしてプレフィクス引数を追加する。引数argはこのコマンドの前のrawプレフィクス引数であり、これはプレフィクス引数を更新するために使用される。何をしているかわかっているのでなければ、このコマンドを自分で呼び出してはならない。

Command: negative-argument arg

このコマンドは、次のコマンドにたいして数引数を追加する。引数argはこのコマンドの前のrawプレフィクス引数であり、この値に負の符号が付されて新しいプレフィクス引数を構築する。何をしているかわかっているのでなければ、このコマンドを自分で呼び出してはならない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.13 Recursive Editing

Emacsスタートアップ時に、自動的にEmacsコマンドループにエンターします。このトップレベルのコマンドループ呼び出しは決してexitせず、Emacs実行中は実行を続けます。Lispプログラムもコマンドループを呼び出せます。これは複数のコマンドループを活性化するため、これを再帰編集(recursive editing)と呼んでいます。再帰編集レベルは、呼び出したコマンドが何であれそれをサスペンドして、そのコマンドを再開する前にユーザーが任意の編集を行うことを可能にする効果をもちます。

再帰編集の間に利用可能なコマンドは、トップレベルの編集ループ内で利用できるコマンドと同じであり、キーマップ内で定義されます。数少ない特別なコマンドだけが再帰編集レベルをexitし、他のコマンドは再帰編集レベルが終了したときに再帰編集レベルからリターンします(exitするための特別なコマンドは常に利用できますが、再帰編集が行われていないときは何も行いません)。

再帰コマンドループを含むすべてのコマンドループは、コマンドループから実行されたコマンド内のエラーによりそのループをexitしないように、汎用エラーハンドラーをセットアップします。

ミニバッファー入力は、特殊な再帰編集です。これは、ミニバッファーとミニバッファーウィンドウの表示を有効にするなどの欠点をもちますが、それはあなたが思うより少ないでしょう。ミニバッファー内では特定のキーの振る舞いが異なりますが、これははミニバッファーのローカルマップによるものです。ウィンドウを切り替えれば、通常のEmacsコマンドを使用できます。

再帰編集レベルを呼び出すには、関数をrecursive-editを呼び出します。この関数はコマンドループを含んでいます。さらにexitをthrowすることにより再帰編集レベルのexitを可能にする、タグexitをともなうcatch呼び出しも含んでいます(Explicit Nonlocal Exits: catch and throwを参照)。t以外の値をthrowした場合、recursive-editは通常それを呼び出した関数にリターンします。コマンドC-M-c(exit-recursive-edit)がこれを行います。値tをthrowすることによりrecursive-editがquitされるので、1レベル上位のコマンドループに制御がリターンされます。これはabortと呼ばれ、C-](abort-recursive-edit)がこれを行います。

ほとんどのアプリケーションはミニバッファー使用の一部として使用する場合を除き、再帰編集を使用するべきではありません。カレントバッファーのメジャーモードから、特殊なメジャーモードに一時的に変更する場合に、そのモードに戻るコマンドをもつ必要があるときは、通常は再帰編集のほうが便利です(Rmailのeコマンドはこのテクニックを使用している)。またはユーザーが新たなバッファーの特殊なモードで、異なるテキストを“再帰的”に編集・作成・選択できるようにしたい場合が該当します。このモードでは処理を完了させるコマンドを定義して、前のバッファーに戻ります(Rmailのmコマンドはこれを使用している)。

再帰編集はデバッグに便利です。一種のブレークポイントとして関数定義内にdebugを挿入して、関数がそこに達したときにその箇所を調べることができます。debugは再帰編集を呼び出しますが、デバッガのその他の機能も提供します。

query-replace内でC-rをタイプしたときやC-x q(kbd-macro-query)を使用したときも、再帰編集レベルが使用されます。

Command: recursive-edit

この関数はエディターコマンドループを呼び出す。これはユーザーに編集を開始させるために、Emacsの初期化により自動的に呼び出されるLispプログラムから呼び出されたときは、再帰編集レベルにエンターする。

カレントバッファーが選択されたウィンドウのバッファーと異なる場合、recursive-editはカレントバッファーの保存とリストアを行う。それ以外では、バッファーを切り替えた場合には、recursive-editがリターンした後その切り替えたバッファーがカレントになる。

以下の例では、関数simple-recが最初にポイントを1単語分進めてからメッセージをエコーエリアにプリントして再帰編集にエンターする。その後ユーザーは望む編集を行い、C-M-cをタイプすれば再帰編集をexitして、simple-recの実行を継続できる。

(defun simple-rec ()
  (forward-word 1)
  (message "Recursive edit in progress")
  (recursive-edit)
  (forward-word 1))
     ⇒ simple-rec
(simple-rec)
     ⇒ nil
Command: exit-recursive-edit

この関数は最内の再帰編集(ミニバッファー入力を含む)からexitする。関数の実質的な定義は(throw 'exit nil)である。

Command: abort-recursive-edit

この関数は、再帰編集をexitした後にquitをシグナルすることにより、最内の再帰編集(ミニバッファー入力を含む)を要求したコマンドをabortする。関数の実質的な定義は(throw 'exit t)である。Quittingを参照のこと。

Command: top-level

この関数はすべての再帰編集レベルをexitする。これはすべての計算を直接抜け出してメインのコマンドループに戻り、値をリターンしない。

Function: recursion-depth

この関数は再帰編集のカレントの深さをリターンする。アクティブな再帰編集が存在しない場合は、0をリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.14 Disabling Commands

コマンドを無効化(disabling a command)とは、それを実行可能にする前にユーザーによる確認を要求するようにコマンドをマークすることです。無効化は初めてのユーザーを混乱させるかもしれないコマンドにたいして、アクシデントによりそのコマンドが使用されるのを防ぐために使用されます。

コマンド無効化の低レベルにおけるメカニズムは、そのコマンドにたいするLispシンボルのdisabledプロパティに非nilをputすることです。これらのプロパティは、通常はユーザーのinitファイル(The Init Fileを参照)で以下のようなLisp式によりセットアップされます:

(put 'upcase-region 'disabled t)

いくつかのコマンドにたいしては、これらのプロパティがデフォルトで与えられています(これらを削除したい場合はinitファイルで削除できる)。

disabledプロパティの値が文字列の場合、そのコマンドが無効化されていることを告げるメッセージにその文字列が含まれます。たとえば:

(put 'delete-region 'disabled
     "この方法で削除されたテキストはyankで戻せない!\n")

無効化されたコマンドをインタラクティブに呼び出したときに何が起こるかの詳細は、See Disabling in The GNU Emacs Manualを参照してください。コマンドの無効化は、それをLispプログラムから関数として呼び出したときは効果がありません。

Command: enable-command command

その時点より、特別な確認なしでcommand(シンボル)が実行されることを許す。さらにユーザーのinitファイル(The Init Fileを参照)も修正するので、将来のセッションにもこれが適用される。

Command: disable-command command

その時点より、command(シンボル)の実行に特別な確認を要求する。さらにユーザーのinitファイル(The Init Fileを参照)も修正するので、将来のセッションにもこれが適用される。

Variable: disabled-command-function

この変数の値は関数であること。ユーザーが無効化されたコマンドを呼び出したときは、無効化されたコマンドのかわりにその関数が呼び出される。そのコマンドを実行するためにユーザーが何のキーをタイプしたかを判断するためにthis-command-keysを使用して、そのコマンド自体を探すことができる。

値がnilの場合もあり得る。その場合は、たとえ無効化されたコマンドでも、すべてのコマンドが通常に機能する。

デフォルトでは、値はユーザーに処理を行うか尋ねる関数である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.15 Command History

コマンドループは複雑なコマンドを手軽に繰り返せるように、実行された複雑なコマンドのヒストリー(history: 履歴)を保持します。複雑なコマンド(complex command)とは、ミニバッファーを使用してinteractive引数を読み取るコマンドです。これにはM-xコマンド、M-:コマンド、およびinteractive指定によりミニバッファーから引数を読み取る任意のコマンドが含まれます。コマンド自身の実行の間に明示的にミニバッファーを使用するものは、複雑なコマンドとは判断されません。

Variable: command-history

この変数の値は最近実行された複雑なコマンドのリストであり、それぞれが評価されるべきフォームとして表現される。このリストは編集セッションの間、すべての複雑なコマンドを蓄積するが、最大サイズ(Minibuffer Historyを参照)に達したときは、もっとも古い要素が削除されて、新たな要素が追加される。

command-history
⇒ ((switch-to-buffer "chistory.texi")
    (describe-key "^X^[")
    (visit-tags-table "~/emacs/src/")
    (find-tag "repeat-complex-command"))

実際には、このヒストリーリストはミニバッファーヒストリーの特殊ケースであり、それは要素が文字列ではなく式であることです。

以前のコマンドを編集したり再呼び出しするためのコマンドがいくつかあります。コマンドrepeat-complex-commandおよびlist-command-historyは、ユーザーマニュアルで説明されています(Repetition in The GNU Emacs Manualを参照)。ミニバッファー内では、通常のミニバッファーヒストリーコマンドが理由できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

20.16 Keyboard Macros

キーボードマクロ(keyboard macro)は、コマンドとして考えることが可能な、入力イベントの記録されたシーケンスであり、キー定義により作成されます。キーボードマクロのLisp表現は、イベントを含む文字列またはベクターです。キーボードマクロとLispマクロ(Macrosを参照)を混同しないでください。

Function: execute-kbd-macro kbdmacro &optional count loopfunc

この関数は、イベントシーケンスとしてkbdmacroを実行する。kbdmacroが文字列かベクターの場合、たとえそれがユーザーによる入力であっても、その中のイベントは忠実に実行される。シーケンスは、単一のキーシーケンスであることを要求されない。キーボードマクロ定義は、通常は複数のキーシーケンスを結合して構成される。

kbdmacroがシンボルの場合、そのシンボルの関数定義はkbdmacroの箇所に使用される。それが別のシンボルの場合は、このプロセスを繰り返す。最終的に結果は文字列かベクターになる。結果がシンボル、文字列、ベクターでない場合は、エラーがシグナルされる。

引数countは繰り返すカウントであり、kbdmacroがその回数実行される。countが省略、またはnilの場合は1回実行される。0の場合、kbdmacroはエラーに出会うか検索が失敗するまで、何度も実行される。

loopfuncが非nilの場合、それはマクロの繰り返しごとに呼び出される、引数なしの関数である。loopfuncnilをリターンすると、マクロの実行が停止する。

execute-kbd-macroの使用例は、Reading One Eventを参照のこと。

Variable: executing-kbd-macro

この変数は、カレントで実行中のキーボードマクロを定義する文字列かベクターである。nilの場合、カレントで実行中のマクロは存在しない。マクロの実行により実行されたときに異なる振る舞いをするように、コマンドはこの変数をテストできる。この変数を自分でセットしてはならない。

Variable: defining-kbd-macro

この変数は、キーボードマクロの定義中のときだけ非nilである。マクロ定義中の間は異なる振る舞いをするように、コマンドはこの変数をテストできる。既存のマクロ定義に追加する間、値はappendになる。コマンドstart-kbd-macrokmacro-start-macroend-kbd-macroは、この変数をセットする。この変数を自分でセットしてはならない。

この変数は常にカレント端末にたいしてローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。

Variable: last-kbd-macro

この変数は、もっとも最近定義されたキーボードマクロの定義である。値は文字列、ベクター、またはnilである。

この変数は常にカレント端末にたいしてローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。

Variable: kbd-macro-termination-hook

これはキーボードマクロが終了したときに実行されるノーマルフックであり、何がキーボードマクロを終了させたか(マクロの最後に達したのか、あるいはエラーにより最後に達する前に終了したのか)は問わない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21 Keymaps

入力イベントのコマンドバインディングは、キーマップ(keymap)と呼ばれるデータ構造に記録されます。キーマップ内の各エントリーは個別のイベント型(他のキーマップ、またはコマンド)に関連づけ(またはバインド)されます。イベント型がキーマップにバインドされる場合、そのキーマップは次の入力イベントを調べるために使用されます。これはコマンドが見つかるまで継続されます。このプロセス全体をキールックアップ(key lookup: キー照合)と呼びます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.1 Key Sequences

キーシーケンス(key sequence)、短くはキー(key)とは、1つの単位を形成する1つ以上の入力イベントのシーケンスです。入力イベントには文字、ファンクションキー、マウスアクション、またはiconify-frameのようなEmacs外部のシステムイベントが含まれます(Input Eventsを参照)。キーシーケンスにたいするEmacs Lispの表現は文字列かベクターです。特に明記しない限り、引数としてキーシーケンスを受け取るEmacs Lisp関数は両方の表現を処理することができます。

文字列表現では、たとえば、"a"a"2"2を表すといったように、英数字はその文字自身を意味します。コントロール文字イベントは部分文字列"\C-"、メタ文字は"\M-"によりプレフィクスされます。たとえば"\C-x"はキーC-xを表します。それらに加えて、TABRETESCDELなどのイベントはそれぞれ"\t""\r""\e""\d"で表されます。複雑なキーシーケンスの文字列表現は、イベント成分の文字列表現を結合したものです。したがって"\C-xl"はキーシーケンスC-x lを表します。

キーシーケンスにはファンクションキー、マウスボタンイベント、システムイベント、またはC-=H-aのような文字列で表現できない非ASCII文字が含まれます。これらはベクターとして表現される必要があります。

ベクター表現ではベクターの各要素は1つの入力イベントをイベントのLisp形式で表します。Input Eventsを参照してください。たとえば、ベクター[?\C-x ?l]はキーシーケンスC-x lを表します。

キーシーケンスを文字列やベクターによる表現で記述する例は、Init Rebinding in The GNU Emacs Manualを参照してください。

Function: kbd keyseq-text

この関数はテキストkeyseq-text(文字列定数)をキーシーケンス(文字列かベクターの定数)に変換する。keyseq-textの内容はC-x C-k RET(kmacro-edit-macro) コマンドにより呼び出されたバッファー内と同じ構文を使用するべきであ特にファンクションキーの名前は‘<…>’で囲まなければならない。Edit Keyboard Macro in The GNU Emacs Manualを参照のこと。

(kbd "C-x") ⇒ "\C-x"
(kbd "C-x C-f") ⇒ "\C-x\C-f"
(kbd "C-x 4 C-f") ⇒ "\C-x4\C-f"
(kbd "X") ⇒ "X"
(kbd "RET") ⇒ "\^M"
(kbd "C-c SPC") ⇒ "\C-c "
(kbd "<f1> SPC") ⇒ [f1 32]
(kbd "C-M-<down>") ⇒ [C-M-down]

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.2 Keymap Basics

キーマップは、さまざまなキーシーケンスにたいしてキーバインディング(key binding)を指定するLispデータ構造です。

1つのキーマップが、個々のイベントにたいする定義を直接指定します。 A single keymap directly specifies definitions for individual events. 単一のイベントでキーシーケンスが構成されるとき、そのキーシーケンスのキーマップ内でのバインディングは、そのイベントにたいするそのキーマップの定義です。それより長いキーシーケンスのバインディングは対話的プロセスにより見つけ出されます。まず、最初のイベント(これ自身がキーマップでなければならない)の定義を探します。次にそのキーマップ内で2つ目のイベントを探すといったように、そのキーシーケンス内のすべてのイベントが処理されるまで、これを続けます。

あるキーシーケンスのバインディングがキーマップであるような場合、わたしたちはそのキーシーケンスをプレフィクスキー(prefix key)と呼び、それ以外の場合は(それ以上イベントを追加できないので)コンプリートキー(complete keylと呼んでいます。バインディングがnilの場合、わたしたちはそのキーを未定義(undefined)と呼びます。C-cC-xC-x 4などはプレフィクスキーの例です。XRETC-x 4 C-fなどは定義されたコンプリートキーの例です。C-x C-gC-c 3などは未定義なコンプリートキーの例です。詳細はPrefix Keysを参照してください。

キーシーケンスのバインディングを見つけ出すルールは、(最後のイベントの前までに見つかる)中間的なバインディングがすべてキーマップであると仮定します。もしそうでなければ、そのイベントシーケンスは単位を形成せず、実際の単一キーシーケンスではありません。他の言い方をすると、任意の有効なキーシーケンスから1つ以上のイベントを取り除くと、常にプレフィクスキーにならなければなりません。たとえばC-f C-nはキーシーケンスではありません。C-fはプレフィクスキーではないので、C-fで始まるこれより長いシーケンスは、キーシーケンスであり得ないのです。

利用可能な複数イベントキーシーケンスのセットは、プレフィクスキーにたいするバインディングに依存します。したがって、これはキーマップが異なれば異なるかもしれず、バインディングが変更されたとき変更されるかもしれません。しかし、単一イベントキーシーケンスは適格性において任意のプレフィクスキーに依存しないので、常に単一のキーシーケンスです。

常に複数のプライマリーキーマップ(primary keymap: 主キーマップ)がアクティブであり、これらはキーバインディングを見つけるために使用されます。すべてのバッファーで共有されるグローバルキーマップ(global map)というキーマップが存在します。ローカルキーマップ(local keymap)は通常、特定のメジャーモードに関連します。そして0個以上のマイナーモードキーマップ(minor mode keymap)はカレントで有効なマイナーモードに属します(すべてのマイナーモードがキーマップをもつわけでなない)。ローカルキーマップは、対応するグローバルバインディングをshadow(優先される)します。マイナーモードキーマップは、ローカルキーマップとグローバルキーマップの両方をshadowします。詳細は、Active Keymapsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.3 Format of Keymaps

キーマップはそれぞれ、CARがシンボルkeymapであるようなリストです。このリストの残りの要素は、そのキーマップのキーバインディングを定義します。関数定義がキーマップであるようなシンボルもキーマップです。あるオブジェクトがキーマップかどうかテストするには、関数keymapp(以下参照)を使用してください。

キーマップを開始するシンボルkeymapの後には、いくつかの種類の要素が出現します:

(type . binding)

これは型typeのイベントにたいする1つのバインディングを指定する。通常のバインディングはそれぞれ、常に文字かシンボルであるような特定のイベント型(event type)のイベントに適用される。Classifying Eventsを参照のこと。この種のバインディングでは、bindingはコマンドである。

(type item-name . binding)

これは、メニュー内でitem-nameとして表示されるシンプルなメニューアイテムでもあるようなバインディングを指定する。Simple Menu Itemsを参照のこと。

(type item-name help-string . binding)

これは、ヘルプ文字列help-stringのシンプルなメニューアイテムである。

(type menu-item . details)

これは、拡張されたメニューアイテムでもあるようなバインディングを指定する。これは他の機能も使用できる。Extended Menu Itemsを参照のこと。

(t . binding)

これはデフォルトキーバインディング(default key binding)を指定する。キーマップの他の要素でバインドされないイベントは、バインディングとしてbindingが与えられる。デフォルトバインディングにより、利用可能なすべてのイベント型を列挙することなくバインドできる。デフォルトバインディングをもつキーマップは、明示的にnilにバインドされるイベント(以下参照)を除き、より低い優先度にあるすべてのキーマップをマスクする。

char-table

キーマップのある要素が文字テーブル(char-table)の場合、それは修飾ビットなしのすべての文字イベントにたいするバインディングを保持するとみなされる。 If an element of a keymap is a it counts as holding bindings for all character events with no modifier bits (see modifier bits): 要素nは、コードnの文字にたいするバインディングである。これは多量のバインディングを記録するための、コンパクトな方法である。そのような文字テーブルのキーマップは、fullキーマップ(full keymap: 完全なキーマップ)と呼ばれる。それにたいし他のキーマップはsparseキーマップ(sparse keymaps: 疎なキーマップ)と呼ばれる。

string

キーにたいするバインディングを指定する要素は別として、キーマップは要素として文字列ももつことができる。これはoverallプロンプト文字列(overall prompt string: 全般的なプロンプト文字列)と呼ばれ、メニューとしてキーマップを使用することを可能にする。Defining Menusを参照のこと。

(keymap …)

キーマップのある要素それ自身がキーマップの場合、それは外側のキーマップ内でこれが内側のキーマップとしてinline指定されているかのようにみなされる。これはmake-composed-keymap内で行なわれるような多重継承にたいして使用される。

バインディングがnilの場合、それは定義の構成要素ではありませんが、デフォルトバインディングや親キーマップ内のバインディングに優先されます。一方、nilのバインディングは、より低い優先度のキーマップをオーバーライドしませんしたがって、ローカルマップでnilのバインディングが与えられた場合、Emacsはグローバルマップのバインディングを使用します。

キーマップはメタ文字にたいするバインディングを直接記録しません。かわりに、メタ文字は1文字目がESC(または何であれmeta-prefix-charのカレント値)の、2文字のキーシーケンスをルックアップするものとみなされます。したがって、キーM-aは内部的にESC aで表され、そのグローバルバインディングは、esc-map内のaにたいするスロットで見つけることができます(Prefix Keysを参照)。

この変換は文字にたいしてのみ適用され、ファンクションキーや他の入力イベントには適用されないので、M-endESC endと何も関係ありません。

以下に例としてLispモードにたいするローカルキーマップ(sparseキーマップ)を挙げます。以下ではDELC-c C-zC-M-qC-M-xにたいするバインディングを定義しています(実際の値はメニューバインディングも含みますが、簡潔にするためここでは省略しています)。

lisp-mode-map
⇒
(keymap
 (3 keymap
    ;; C-c C-z
    (26 . run-lisp))
 (27 keymap
     ;; C-M-xESC C-xとして扱われる
     (24 . lisp-send-defun))
 ;; この部分はlisp-mode-shared-mapから継承
 keymap
 ;; DEL
 (127 . backward-delete-char-untabify)
 (27 keymap
     ;; C-M-qESC C-qとして扱われる
     (17 . indent-sexp)))
Function: keymapp object

この関数は、objectがキーマップならt、それ以外はnilをリターンする。より正確には、この関数はリストにたいしてそのCARkeymapか、あるいはシンボルにたいしてその関数定義がkeymappかをテストする。

(keymapp '(keymap))
    ⇒ t
(fset 'foo '(keymap))
(keymapp 'foo)
    ⇒ t
(keymapp (current-global-map))
    ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.4 Creating Keymaps

以下はキーマップを作成する関数です。

Function: make-sparse-keymap &optional prompt

この関数はエントリーをもたない新たなsparseキーマップを作成して、それをリターンする(sparseキーマップは、あなたが通常望む類のキーマップのこと)。make-keymapとは異なり、新たなキーマップは文字テーブルを含まず、何のイベントもバインドしない。

(make-sparse-keymap)
    ⇒ (keymap)

promptを指定した場合、それはキーマップにたいするoverallプロンプト文字列になる。これはメニューキーマップ(Defining Menusを参照)にたいしてのみ指定すべきである。overallプロンプト文字列をともなうキーマップがアクティブな場合は、次の入力イベントのルックアップにたいしてマウスメニューとキーボードメニューを常に提示する。これはコマンドループにたいして毎回キーボードメニューを提示するので、overallプロンプト文字列をメインマップ、メジャーモードマップ、マイナーモードマップに指定しないこと。

Function: make-keymap &optional prompt

この関数は、新たなfullキーマップを作成して、それをリターンする。このキーマップは修飾されないすべての文字にたいするスロットをもつ文字テーブル(Char-Tablesを参照)を含む。この新たなキーマップは、初期状態ではすべての文字、およびその他の種類のイベントがnilにバインドされている。引数promptは、make-sparse-keymapのようにプロンプト文字列を指定する。

(make-keymap)
    ⇒ (keymap #^[nil nil keymap nil nil nil …])

fullキーマップは、多くのスロットを保持するときはsparseキーマップより効果的であり、少ししかスロットを保持しないときはsparseキーマップのほうが適している。

Function: copy-keymap keymap

この関数は、keymapのコピーをリターンする。keymap内でバインディングとして直接出現するすべてのキーマップも、すべてのレベルまで再帰的にコピーされる。しかし、ある文字の定義が関数定義にキーマップをもつ関数のときは、再帰的なコピーは行われず、新たにコピーされたキーマップには同じシンボルがコピーされる。

(setq map (copy-keymap (current-local-map)))
⇒ (keymap
     ;; (これはメタ文字を実装する)
     (27 keymap
         (83 . center-paragraph)
         (115 . center-line))
     (9 . tab-to-tab-stop))

(eq map (current-local-map))
    ⇒ nil
(equal map (current-local-map))
    ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.5 Inheritance and Keymaps

キーマップは、他のキーマップを継承することができ、この継承元のキーマップを親キーマップ(parent keymap)と呼びます。そのようなキーマップは、以下のようなキーマップです:

(keymap elements… . parent-keymap)

これの効果は、このキーマップがキールックアップ時にparent-keymapのすべてのバインディングを継承するが、それらにバインディングを追加したり、elementsでオーバーライドできるということです。

define-keyや他のキーバインディング関数を使用してparent-keymap内のバインディングを変更した場合、変更されたバインディングはelementsで作られたバインディングにshadowされない限り、継承されたキーマップ内で可視になります。逆は真ではありません。define-keyを使用して継承されたキーマップ内のバインディングを変更した場合、これらの変更はelements内に記録されますが、parent-keymapに影響はありません。

親キーマップからキーマップを構築するには、set-keymap-parentを使用するのが正しい方法です。親キーマップから直接キーマップを構築するコードがある場合は、かわりにset-keymap-parentを使用するようにプログラムを変更してください。

Function: keymap-parent keymap

これは、keymapの親キーマップをリターンする。keymapに親キーマップがない場合、keymap-parentnilをリターンする。

Function: set-keymap-parent keymap parent

これはkeymapの親キーマップをparentにセットして、parentをリターンする。parentnilの場合、この関数はkeymapに親キーマップを与えない。

keymapがサブマップ(プレフィクスキーにたいするバインディング)をもつ場合は、それらも新たな親キーマップを受け取り、それらのプレフィクスキーにたいしてparentが何を指定するかが反映される。

以下はtext-mode-mapから継承してキーマップを作成する方法を示す例です:

(let ((map (make-sparse-keymap)))
  (set-keymap-parent map text-mode-map)
  map)

非sparseキーマップも親キーマップをもつことができますが、便利とは言えません。非sparseキーマップは、修飾ビットをもたないすべての数値文字コードにたいするバインディングとして、たとえそれがnilであっても常に何かを指定するので、これらの文字のバインディングが親キーマップから継承されることは決してないのです。

複数のマップからキーマップを継承したいときがあるかもしれません。これにたいしては、関数make-composed-keymapが使用できます。

Function: make-composed-keymap maps &optional parent

この関数は、既存のキーマップから構成される新たなキーマップをリターンする。また、オプションで親キーマップparentから継承する。mapsには単一のキーマップ、または複数のキーマップのリストを指定できる。リターンされた新たなマップ内でキーをルックアップするとき、Emacsはmaps内のキーマップを順に検索してからparent内を検索する。この検索は最初のマッチで停止される。mapsのどれか1つのキーマップ内のnilバインディングは、parent内の任意のバインディングをオーバーライドするが、mapsにないキーマップの非nilバインディングはオーバーライドしない。

For example, here is how Emacs sets the parent of 【FIXME】たとえば、以下はbutton-buffer-mapspecial-mode-mapの両方を継承するhelp-mode-mapのようなキーマップの親キーマップをEmacsがセットする方法です:

(defvar help-mode-map
  (let ((map (make-sparse-keymap)))
    (set-keymap-parent map
      (make-composed-keymap button-buffer-map special-mode-map))
    ... map) ... )

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.6 Prefix Keys

プレフィクスキー(prefix key)とは、バインディングがキーマップであるようなキーシーケンスです。このキーマップは、プレフィクスキーを拡張するキーシーケンスが何を行うか定義します。たとえば、C-xはプレフィクスキーであり、これはキーマップを使用し、そのキーマップは変数ctl-x-mapにも格納されています。このキーマップはC-xで始まるキーシーケンスにたいするバインディングを定義します。

標準的なEmacsのプレフィクスキーのいくつかは、Lisp変数でも見い出すことができるキーマップを使用していますl:

プレフィクスキーのキーマップバインディングは、プレフィクスキーに続くイベントをルックアップするために使用されます。(これは、関数定義がキーマップであるようなシンボルかもしれません。効果は同じですが、シンボルはプレフィクスキーにたいする名前の役割を果たします。) したがって、C-xのバインディングはシンボルControl-X-prefixであり、このシンボルの関数セルがC-xコマンドにたいするキーマップを保持します(ctl-x-mapの値も同じキーマップです)。

プレフィクスキー定義は、任意のアクティブなキーマップ内に置くことができます。プレフィクスキーとしてのC-cC-xC-hESCの定義はグローバルマップ内にもあるので、これらのプレフィクスキーは常に使用できます。メジャーモードとマイナーモードは、ローカルマップやマイナーモードのマップ内にプレフィクスキー定義を置くことにより、キーをプレフィクスキーとして再定義できます。 Active Keymapsを参照してください。

あるキーが複数のアクティブなマップ内でプレフィクスキーとして定義されている場合、それぞれの定義がマージされて効果をもちます。まずマイナーモードキーマップ内で定義されたコマンド、次にローカルマップのプレフィクス定義されたコマンド、そしてグローバルマップのコマンドが続きます。

以下の例では、ローカルキーマップ内でC-pC-xと等価なプレフィクスキーにしています。すると、C-p C-fにたいするバインディングは、C-x C-fと同様に関数find-fileになります。キーシーケンスC-p 6は、すべてのアクティブなキーマップで見つけることができません。

(use-local-map (make-sparse-keymap))
    ⇒ nil
(local-set-key "\C-p" ctl-x-map)
    ⇒ nil
(key-binding "\C-p\C-f")
    ⇒ find-file

(key-binding "\C-p6")
    ⇒ nil
Function: define-prefix-command symbol &optional mapvar prompt

この関数は、プレフィクスキーのバインディングとして使用するために、symbolを用意する。これはsparseキーマップを作成して、それをsymbolの関数定義として格納する。その後はsymbolにキーシーケンスをバインディングすると、そのキーシーケンスはプレフィクスキーになるだろう。リターン値はsymbolである。

この関数は、値がそのキーマップであるような変数としてもsymbolをセットする。しかしmapvarが非nilの場合は、かわりにmapvarを変数としてセットする。

promptが非nilの場合、これはそのキーマップにたいするoverallプロンプト文字列になる。プロンプト文字列はメニューキーマップにたいして与えられるべきである(Defining Menusを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.7 Active Keymaps

Emacsは多くのキーマップを含んでいますが、常にいくつかのキーマップだけがアクティブです。Emacsがユーザー入力を受け取ったとき、それは入力イベントに変換されて(Keymaps for Translating Sequences of Eventsを参照)、アクティブなキーマップ内でキーバインディングが照合されます。

アクティブなキーマップは通常、(1) keymapプロパティにより指定されるキーマップ、(2) 有効なマイナーモードのキーマップ、(3) カレントバッファーのローカルキーマップ、(4) グローバルキーマップの順です。Emacsは入力キーシーケンスそれぞれにたいして、これらすべてのキーマップ内を検索します。

これらの“通常”のキーマップのうち最優先されるのは、もしあればポイント位置のkeymapテキストにより指定されるキーマップ、またはoverallプロパティです。(マウス入力イベントにたいしては、Emacsはポイント位置のかわりにイベント位置を使用する。 Searching the Active Keymapsを参照のこと。)

次に優先されるのは、有効なマイナーモードにより指定されるキーマップです。もしあれば、これらのキーマップは変数emulation-mode-map-alistsminor-mode-overriding-map-alistminor-mode-map-alistにより指定されます。Controlling the Active Keymapsを参照してください。

次に優先されるのは、バッファーのローカルキーマップ(local keymap)で、これにはそのバッファー特有なキーバインディングが含まれます。ミニバッファーもローカルキーマップをもちます(Introduction to Minibuffersを参照)。ポイント位置にlocal-mapテキスト、またはoverlayプロパティがある場合、それはバッファーのデフォルトローカルキーマップのかわりに使用するローカルキーマップを指定します。

ローカルキーマップは通常はそのバッファーのメジャーモードによりセットされます。同じメジャーモードをもつすべてのバッファーは、同じローカルキーマップを共有します。したがって、あるバッファーでローカルキーマップを変更するためにlocal-set-key(Commands for Binding Keysを参照)を呼び出した場合、それは同じメジャーモードをもつ他のバッファーのローカルキーマップにも影響を与えます。

最後は、C-fのようなカレントバッファーとは関係なく定義されるキーバインディングを含む、グローバルキーマップ(global keymap)です。kこのキーマップは常にアクティブであり、変数global-mapにバインドされています。

これら“通常”のキーマップとは別に、Emacsはプログラムが他のキーマップをアクティブにするための特別な手段を提供します。1つ目は、グローバルキーマップ以外の通常アクティブなキーマップを置き換えるキーマップを指定する変数overriding-local-mapです。2つ目は、他のすべてのキーマップより優先されるキーマップを指定する、端末ローカル変数overriding-terminal-local-mapです。この端末ローカル変数は通常、modal(訳注: 他のキーマップを選択できない状態)かつ一時的なキーバインディングに使用されます(ここの変数にたいして関数set-transient-mapは便利なインターフェイスを提供する)。詳細は、Controlling the Active Keymapsを参照のこと。

これらを使用するのがキーマップをアクティブにする唯一の方法ではありません。キーマップは、read-key-sequenceによるイベントの変換のような、他の用途にも使用されます。Keymaps for Translating Sequences of Eventsを参照してください。

いくつかの標準的なキーマップのリストは、Standard Keymapsを参照してください。

Function: current-active-maps &optional olp position

これは、カレントの状況下でコマンドループによりキーシーケンスをルックアップするために使用される、アクティブなキーマップのリストをリターンする。これは通常、overriding-local-mapoverriding-terminal-local-mapを無視するが、olpが非nilの場合には、それらのキーマップにも注意を払う。オプションでpositionevent-startによりリターンされるイベント位置、またはバッファー位置を指定でき、key-bindingで説明されているようにキーマップを変更するかもしれない。

Function: key-binding key &optional accept-defaults no-remap position

この関数は、カレントのアクティブキーマップでkeyにたいするバインディングをリターンする。そのキーマップ内でkeyが未定義の場合、結果はnilになる。

引数accept-defaultsは、lookup-key(Functions for Key Lookupを参照)のようにデフォルトバインディングをチェックするかを制御する。

コマンドがリマップ(remap: 再マップ。Remapping Commandsを参照)されたとき、key-bindingは通常、実際に実行されるであろうリマップされたコマンドをリターンするように、コマンドのリマップを行う。しかし、no-remapが非nilの場合、key-bindingはリマップを無視して、keyにたいして直接指定されたバインディングをリターンする。

keyがマウスイベント(もしかしたらプレフィクスイベントが先行するかもしれない)で始まる場合、照合されるマップはそのイベントの位置を元に決定される。それ以外では、それらのマップはポイント値に基づき決定される。しかし、positionを指定することにより、これらをオーバーライドできる。positionが非nilの場合、それはバッファー位置かevent-startの値のようなイベント位置のいずれかである。その場合、照合されるマップはpositionに基づき決定される。

keyが文字列とベクターのいずれでもない場合、Emacsはエラーをシグナルする。

(key-binding "\C-x\C-f")
    ⇒ find-file

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.8 Searching the Active Keymaps

以下は、macsがアクティブなキーマップを検索する方法を示す、Lisp処理概要です:

(or (if overriding-terminal-local-map
        (find-in overriding-terminal-local-map))
    (if overriding-local-map
        (find-in overriding-local-map)
      (or (find-in (get-char-property (point) 'keymap))
          (find-in-any emulation-mode-map-alists)
          (find-in-any minor-mode-overriding-map-alist)
          (find-in-any minor-mode-map-alist)
          (if (get-text-property (point) 'local-map)
              (find-in (get-char-property (point) 'local-map))
            (find-in (current-local-map)))))
    (find-in (current-global-map)))

ここで、find-infind-in-anyはそれぞれ、1つのキーマップとキーマップのalistを検索する仮の関数です。関数set-transient-mapoverriding-terminal-local-map(Controlling the Active Keymapsを参照)をセットすることにより機能する点に注意してください。

上記の処理概要では、キーシーケンスがマウスイベント(Mouse Eventsを参照)で始まる場合、ポイント位置のかわりにそのイベント位置、カレントバッファーのかわりにそのイベントのバッファーが使用されます。これは特に、プロパティkeymapおよびlocal-mapをルックアップする方法に影響を与えます。displaybefore-stringafter-stringプロパティ(Properties with Special Meaningsを参照)が埋め込まれていて、keymapまたはlocal-mapプロパティが非nilの文字列上でマウスイベントが発生した場合、それは基調となるバッファーテキストの対応するプロパティをオーバーライドします(バッファーテキストにより指定されたプロパティは無視される)。

アクティブなキーマップの1つでキーバインディングが見つかり、そのバインディングがコマンドの場合、検索は終了し、そのコマンドが実行されます。しかし、そのバインディングが値をもつ変数、または文字列の場合、Emacsは入力キーシーケンスをその変数の値、または文字列で置き換えて、アクティブなキーマップの検索を再開します。 Key Lookupを参照してください。

最終的に見つかったコマンドもリマップされるかもしれません。Remapping Commandsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.9 Controlling the Active Keymaps

Variable: global-map

この変数は、Emacsキーボード入力をコマンドにマップするデフォルトのグローバルキーマップを含む。通常は、このキーマップがグローバルキーマップである。デフォルトグローバルキーマップは、self-insert-commandをすべてのプリント文字にバインドするfullキーマップである。

これはグローバルキーマップ内のバインディングを変更する通常の手段だが、この変数に開始時のキーマップ以外の値を割り当てるべきではない。

Function: current-global-map

この関数は、カレントのグローバルキーマップをリターンする。デフォルトグローバルキーマップとカレントグローバルキーマップのいずれも変更していない場合は、global-mapと同じ値になる。リターン値はコピーではなく参照である。これにdefine-keyなどの関数を使用すると、グローバルバインディングが変更されるだろう。

(current-global-map)
⇒ (keymap [set-mark-command beginning-of-line …
            delete-backward-char])
Function: current-local-map

この関数はカレントバッファーのローカルキーマップをリターンする。ローカルキーマップがない場合はnilをリターンする。以下の例では、(Lisp Interactionモードを使用する)*scratch*バッファーにたいするキーマップは、ESC(ASCIIコード27)にたいするエントリーが別のsparseキーマップであるようなsparseキーマップである。

(current-local-map)
⇒ (keymap
    (10 . eval-print-last-sexp)
    (9 . lisp-indent-line)
    (127 . backward-delete-char-untabify)
    (27 keymap
        (24 . eval-defun)
        (17 . indent-sexp)))

current-local-mapはローカルキーマップのコピーではなく参照をリターンする。これにdefine-keyなどの関数を使用すると、ローカルバインディングが変更されるだろう。

Function: current-minor-mode-maps

この関数は、カレントで有効なメジャーモードのキーマップリストをリターンする。

Function: use-global-map keymap

この関数は、keymapを新たなカレントグローバルキーマップにする。これはnilをリターンする。

グローバルキーマップの変更は、異例である。

Function: use-local-map keymap

この関数は、keymapをカレントバッファーの新たなローカルキーマップにする。keymapnilの場合、そのバッファーはローカルキーマップをもたない。use-local-mapnilをリターンする。ほとんどのメジャーモードコマンドは、この関数を使用する。

Variable: minor-mode-map-alist

この変数は、アクティブかどうかに関わらず、特定の変数の値にたいするキーマップを示すalistである。要素は、以下のようになる:

(variable . keymap)

キーマップkeymapは、 variableが非nil値をもつときはアクティブである。通常、variableはメジャーモードを有効、または無効にする変数である。Keymaps and Minor Modesを参照のこと。

minor-mode-map-alistの要素が、minor-mode-alistの要素と異なる構造をもつことに注意されたい。マップは要素のCDRでなければならず、そうでなければ2つ目の要素にマップリストは用いられないだろう。CDRはキーマップ(リスト)、または関数定義がキーマップであるようなシンボルである。

1つ以上のマイナーモードキーマップがアクティブなとき、minor-mode-map-alist内で前のキーマップが優先される。しかし、互いが干渉しないようにマイナーモードをデザインすべきである。これを正しく行えば、順序は問題にならない。

マイナーモードについての詳細な情報は、Keymaps and Minor Modesを参照のこと。minor-mode-key-binding(see section Functions for Key Lookupを参照)も確認されたい。

Variable: minor-mode-overriding-map-alist

この変数は、メジャーモードによる特定のマイナーモードにたいするキーバインディングのオーバーライドを可能にする。このalistの要素は、minor-mode-map-alistの要素のように、(variable . keymap)のような形式である。

ある変数がminor-mode-overriding-map-alistの要素として出現する場合、その要素により指定されるマップは、minor-mode-map-alist内の同じ変数にたいして指定される任意のマップを完全に置き換える。

すべてのバッファーにおいて、minor-mode-overriding-map-alistは自動的にバッファーローカルである。

Variable: overriding-local-map

この変数が非nilの場合は、バッファーのローカルキーマップ、テキストプロパティまたはoverlayによるキーマップ、マイナーモードキーマップのかわりに使用されるするキーマップを保持する。このキーマップが指定された場合、カレントグローバルキーマップ以外のアクティブだった他のすべてのマップがオーバーライドされる。

Variable: overriding-terminal-local-map

この変数が非nilの場合は、overriding-local-map、バッファーのローカルキーマップ、テキストプロパティまたはoverlayによるキーマップ、およびすべてのマイナーモードキーマップのかわりに使用されるキーマップを保持する。

この変数は、カレント端末にたいして常にローカルであり、バッファーローカルにできない。Multiple Terminalsを参照のこと。これはインクリメンタル検索モードの実装に使用される。

Variable: overriding-local-map-menu-flag

この変数が非nilの場合は、overriding-local-mapまたはoverriding-terminal-local-mapの値がメニューバーの表示に影響し得る。デフォルト値はnilなので、これらのマップ変数なメニューバーに影響をもたない。

これら2つのマップ変数は、たとえこれらの変数がメニューバー表示に影響し得るを与えない場合でも、メニューバーを使用してエンターされたキーシーケンスの実行には影響を与えることに注意されたい。したがって、もしメニューバーキーシーケンスが到着したら、そのキーシーケンスをルックアップ・実行する前に変数をクリアーすべきである。この変数を使用するモードは通常、何らかの方法でこれを行っている。これらのモードは通常“読み戻し(unread)”とexitにより処理されないイベントに応答する。

Variable: special-event-map

この変数は、スペシャルイベントにたいするキーマップを保持する。あるイベント型がこのキーマップ内でバインディングをもつ場合、それはスペシャルであり、そのイベントにたいするバインディングはread-eventにより直接実行される。Special Eventsを参照のこと。

Variable: emulation-mode-map-alists

この変数は、エミュレーションモードにたいして使用するキーマップalistのリストを保持する。この変数は、複数マイナーモードキーマップを使用するモードとパッケージを意図している。リストの各要素はminor-mode-map-alistと同じフォーマットと意味をもつキーマップalistか、そのようなalist形式の変数バインディングをもつシンボルである。それぞれのalist内の“アクティブ”なキーマップは、minor-mode-map-alistminor-mode-overriding-map-alistの前に使用される。

Function: set-transient-map keymap &optional keep

この関数は一時的(transient)なキーマップとしてkeymapを追加する。一時的なキーマップは1つ以上の後続するキーにたいして、他のキーマップより優先される。

通常、keymapは直後のキーをルックアップするために、1回だけ使用される。しかし、オプション引数predtの場合、そのマップはユーザーがkeymap内で定義されたキーをタイプするまでアクのままとなる。keymap内にないキーをユーザーがタイプしたとき、一時的キーマップは非アクティブとなり、そのキーにたいして通常のキールックアップが継続される。

predには関数も指定できる。。この場合、keymapがアクティブの間は、各コマンドの実行に優先して、その関数が引数なしで呼び出される。keymapがアクティブの間、関数は非nilをリターンすべきである。

この関数は、他のすべてのアクティブなキーマップに優先される変数overriding-terminal-local-mapにたいして、keymapを追加、または削除することにより機能する(Searching the Active Keymapsを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.10 Key Lookup

キールックアップ(key lookup: キー照合)とは、与えられたキーマップからキーシーケンスのバインディングを見つけ出すことです。そのバインディングの使用や実行は、キールックアップの一部ではありません。

キールックアップは、キーシーケンス内の各イベントのイベント型だけを使用し、そのイベントの残りは無視します。実際のところ、キールックアップに使用されるキーシーケンスは、マウスイベントをイベント全体(リスト)のかわりにイベント型のみ(シンボル)を用いるでしょう。Input Eventsを参照してください。そのような“キーシーケンス”は、command-executeによる実行には不十分ですが、キーのルックアップやリバインドには十分です。

キーシーケンスが複数イベントから構成されるとき、キールックアップはイベントを順に処理します。最初のイベントのバインディングが見つかったとき、それはキーマップでなければなりません。そのキーマップ内で2つ目のイベントを見つけ出し、そのキーシーケンス内のすべてのイベントが消費されるまで、このプロセスを続けます(故に、最後のイベントにたいして見つかったイベントはキーマップかどうかわからない)。したがって、キールックアッププロセスは、キーマップ内で単一イベントを見つけ出す、よりシンプルなプロセスで定義されます。これが行なわれる方法は、キーマップ内でそのイベントに関連するオブジェクトの型に依存します。

キーマップ内のイベント型ルックアップによる値発見を説明するために、キーマップエントリー(keymap entry)という用語を導入しましょう。(これにはメニューアイテムにたいするキーマップ内のアイテム文字列や、他の余計な要素は含まれません。なぜなら、lookup-keyや他のキーマップルックアップ関数が、リターン値にそれらを含まないからです。) 任意のLispオブジェクトがキーマップエントリーとしてキーマップに格納されるかもしれませんが、すべてがキールックアップに意味をもつわけではありません。以下のテーブルは、キーマップエントリーで重要な型です:

nil

nilは、それまでにルックアップに使用されたイベントが、未定義キーを形成することを意味する。最終的にキーマップがイベント型を調べるのに失敗して、デフォルトバインディングも存在しないときは、そのイベント型のバインディングがnilであるのと同じである。

command

それまでにルックアップに使用されたイベントがコンプリートキーを形成し、そのバインディングはcommandである。What Is a Function?を参照のこと。

array

array(文字列かベクター)は、キーボードマクロである。それまでにルックアップに使用されたイベントはコンプリートキーを形成し、そのバインディングはarrayである。詳細はKeyboard Macrosを参照のこと。

keymap

それまでにルックアップに使用されたイベントはプレフィクスキーを形成する。そのキーシーケンスの次のイベントは、keymap内でルックアップされる。

list

listの意味は、そのリストが何を含んでいるかに依存する:

symbol

symbolの関数定義がsymbolのかわりに使用される。もし関数定義もシンボルの場合は、任意の回数このプロセスが繰り返される。これは最終的にキーマップであるようなオブジェクト、コマンド、またはキーボードマクロに行き着くはずである。それがキーマップかコマンドの場合はリストも許されるが、シンボルを通じて見つけ出された場合、インダイレクトエントリーは理解されない。

キーマップおよびキーボードマクロ(文字列かベクター)は有効な関数ではないので、関数定義にキーマップ、文字列、ベクターをもつシンボルは、関数としては無効であることに注意されたい。しかし、キーバインディングとしては有効である。その定義がキーボードマクロの場合、そのシンボルはcommand-execute(Interactive Callを参照)の引数としても有効である。

シンボルundefinedは特記するに値する。これはそのキーを未定義として扱うことを意味する。厳密に言うと、そのキーは定義されているが、そのバインディングがコマンドundefinedなのである。しかし、このコマンドは未定義キーにたいして自動的に行われるのと同じことを行う。これは(dingを呼び出して)bellを鳴らすが、エラーはシグナルしない。

undefinedは、グローバルキーバインディングをオーバーライドして、そのキーをローカルに“未定義”にするために使用される。nilにローカルにバインドしても、グローバルバインディングをオーバーライドしないであろうから、これを行うのに失敗するだろう。

anything else

オブジェクトの他の型が見つかった場合、それまでにルックアップで使用されたイベントはコンプリートキーを形成し、そのオブジェクトがバインディングになるが、そのバインディングはコマンドとして実行不可能である。

要約すると、キーマップエントリーはキーマップ、コマンド、キーボードマクロ、あるいはそれらに導出されるシンボル、インダイレクトエントリー、あるいはnilのいずれかです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.11 Functions for Key Lookup

以下は、キールックアップに関連する関数および変数です。

Function: lookup-key keymap key &optional accept-defaults

この関数は、keymap内のkeyの定義をリターンする。このチャプターで説明されている、キーをルックアップする他のすべての関数がlookup-keyを使用する。以下は例である:

(lookup-key (current-global-map) "\C-x\C-f")
    ⇒ find-file
(lookup-key (current-global-map) (kbd "C-x C-f"))
    ⇒ find-file
(lookup-key (current-global-map) "\C-x\C-f12345")
    ⇒ 2

文字列、またはベクターのkeyが、keymap内で指定されるプレフィクスキーとして有効なキーシーケンスでない場合、それは最後に余計なイベントをもつ、単一のキーシーケンスに適合しない、“長過ぎる”キーのはずである。その場合のリターン値は数となり、この数はコンプリートキーを構成するkeyの前にあるイベントの数である。

accept-defaultsが非nilの場合、lookup-keykey内の特定のイベントにたいするバインディングと同様に、デフォルトバインディングも考慮する。それ以外では、lookup-keyは特定のkeyのシーケンスにたいするバインディングだけを報告し、明示的に指定したとき以外はデフォルトバインディングを無視する。(これを行うには、keyの要素としてtを与える。Format of Keymapsを参照のこと。)

keyがメタ文字(ファンクションキーではない)を含む場合その文字は暗黙にmeta-prefix-charの値と対応する非メタ文字からなる、2文字シーケンスに置き換えられる。したがって、以下に1つ目の例は、2つ目の例に変換されて処理される。

(lookup-key (current-global-map) "\M-f")
    ⇒ forward-word
(lookup-key (current-global-map) "\ef")
    ⇒ forward-word

read-key-sequenceとは異なり、この関数は指定されたイベントの情報を破棄する変更(Key Sequence Inputを参照)を行わない。特に、この関数はアルファベット文字を小文字に変更せず、ドラッグイベントをクリックイベントに変更しない。

Command: undefined

キーを未定義にするために、キーマップ内で使用される。これはdingを呼び出すが、エラーを起こさない。

Function: local-key-binding key &optional accept-defaults

この関数は、カレントのローカルキーマップ内の、keyにたいするバインディングをリターンする。カレントのローカルキーマップ内で未定義の場合は、nilをリターンする。

引数accept-defaultsは、lookup-key(上記)と同じように、デフォルトバインディングのチェックを制御する。

Function: global-key-binding key &optional accept-defaults

この関数は、カレントのグローバルキーマップ内で、コマンドkeyにたいするバインディングをリターンする。カレントのグローバルキーマップ内で未定義の場合は、nilをリターンする。

引数accept-defaultsは、lookup-key(上記)と同じように、デフォルトバインディングのチェックを制御する。

Function: minor-mode-key-binding key &optional accept-defaults

この関数は、アクティブなマイナーモードのkeyのバインディングを、リストでリターンする。より正確には、この関数は(modename . binding)のとうなペアーのalistをリターンする。ここでmodenameなそのマイナーモードを有効にする変数、bindingはそのモードでのkeyのバインディングである。keyがマイナーモードバインディングをみたない場合、値はnilである。

最初に見つかったバインディングがプレフィクス定義(キーマップ、またはキーマップとして定義されたシンボル)でない場合は、他のマイナーモード由来のすべての後続するバインディングは、完全にshadowされるため省略される。同様に、このリストはプレフィクスバインディングに後続する非プレフィクスバインディングは省略される。

引数accept-defaultsは、lookup-key(上記)と同じように、デフォルトバインディングのチェックを制御する。

User Option: meta-prefix-char

この変数はメタ/プレフィクス文字コードである。これはメタ文字をキーマップ内でルックアップできるように、2文字シーケンスに変換する。有用な結果を得るために、値はプレフィクスイベント(Prefix Keysを参照)であること。デフォルト値は27で、これはESCにたいするASCIIコードである。

meta-prefix-charの値が27であるような限り、キールックアップは通常backward-wordコマンドとして定義されるM-bを、ESC bに変換する。しかし、meta-prefix-charを24(C-xのコード)にセットした場合、EmacsはM-bC-x bに変換するだろうが、これの標準のバインディングはswitch-to-bufferコマンドである。以下に何が起こるかを示す(実際にこれを行ってはならない!):

meta-prefix-char                    ; デフォルト値
     ⇒ 27
(key-binding "\M-b")
     ⇒ backward-word
?\C-x                               ; 文字.の
     ⇒ 24                          ; プリント表現
(setq meta-prefix-char 24)
     ⇒ 24
(key-binding "\M-b")
     ⇒ switch-to-buffer            ; 今やM-bをタイプすると
                                    ;   C-x bをタイプしたようになる

(setq meta-prefix-char 27)          ; 混乱を避ける!
     ⇒ 27                          ; デフォルト値をリストア!

この単一イベントから2イベントへの変換は文字にたいしてのみ発生し、他の種類の入力イベントには発生しない。したがって、ファンクションキーM-F1ESC F1に変換されない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.12 Changing Key Bindings

キーのリバインド(rebind: 再バインド、再束縛)は、キーマップ内でそのキーのバインディングエントリーを変更することにより行います。グローバルキーマップ内のバインディングを変更した場合、その変更は(たとえローカルバインディングによりグローバルバインディングをshadowしているバッファーでは直接影響しないとしても)すべてのバッファーに影響します。カレントバッファーのローカルマップを変更した場合は、通常は同じメジャーモードを使用するすべてのバッファーに影響します。関数global-set-keyおよびlocal-set-keyは、これらの操作のための使いやすいインターフェイスです(Commands for Binding Keysを参照)。より汎用的な関数define-keyを使用することもできます。その場合は、変更するマップを明示的に指定しなければなりません。

Lispプログラムでリバインドするキーシーケンスを選択するときは、さまざまなキーの使用についてのEmacsの慣習にしたがうようお願いします(Key Binding Conventionsを参照)。

リバインドするキーシーケンスの記述では、コントロール文字とメタ文字にたいして、特別なエスケープシーケンスを使用すると良いでしょう(String Typeを参照)。構文‘\C-’は後続する文字がコントロール文字でることを意味し、‘\M-’は後続する文字がメタ文字であることを意味します。したがって、文字列"\M-x"は1つのM-x"\C-f"は1つのC-f"\M-\C-x"および"\C-\M-x"は1つのC-M-xとして読み取られます。ベクター内でも、このエスケープシーケンス、および文字列では使用できない他のエスケープシーケンスを使用できます。1例は‘[?\C-\H-x home]’です。Character Typeを参照してください。

キー定義、およびルックアップ関数は、ベクターであるようなキーシーケンス内のイベント型にたいして、別の構文を受け入れます。修飾名に基本イベント(文字かファンクションキー名)を付加したものを含むリストを使用できます。たとえば、(control ?a)?\C-a(hyper control left)C-H-leftと等価です。このようなリストの利点の1つは、コンパイル済みファイル内に修飾ビットの正確な数値コードが出現しないことです。

以下の関数は、keymapがキーマップでない場合、およびkeyがキーシーケンスを表す文字列やベクターでない場合はエラーをシグナルします。リストであるようなイベントにたいする略記として、イベント型(シンボル)を使用できます。kbd関数(Key Sequencesを参照)は、キーシーケンスを指定するための便利な方法です。

Function: define-key keymap key binding

この関数は、keymap内でkeyにたいするバインディングをセットする(keyが長さ2以上のイベントの場合、その変更は実際はkeymapから辿られる他のキーマップで行なわれる)。引数bindingには任意のLispオブジェクトを指定できるが、意味があるのは特定のオブジェクトだけである(意味のある型のリストは、Key Lookupを参照のこと)。define-keyのリターン値はbindingである。

key[t]の場合、これはkeymap内でデフォルトバインディングをセットする。イベントが自身のバインディングをもたないとき、そのキーマップ内にデフォルトバインディングが存在するなら、Emacsコマンドループはそれを使用する。

keyのすべてのプレフィクスは、プレフィクスキー(キーマップにバインドされる)、または未定義でなけらばならず、それ以外はエラーがシグナルされる。keyのいくつかのプレフィクスが未定義の場合は、define-keyはそれをプレフィクスキーとして定義するので、残りのkeyは指定されたように定義できる。

前にkeymap内でkeyにたいするバインディングが存在しなかった場合は、新たなバインディングがkeymapの先頭に追加される。キーマップ内のバインディングの順序はキーボード入力にたいし影響を与えないが、メニューキーマップにたいしては問題となる(Menu Keymapsを参照)。

以下は、sparseキーマップを作成して、その中にバインディングをいくつか作成する例である:

(setq map (make-sparse-keymap))
    ⇒ (keymap)
(define-key map "\C-f" 'forward-char)
    ⇒ forward-char
map
    ⇒ (keymap (6 . forward-char))

;; C-xにたいしsparseサブマップを作成し、
;; その中でfをバインドする
(define-key map (kbd "C-x f") 'forward-word)
    ⇒ forward-word
map
⇒ (keymap
    (24 keymap                ; C-x
        (102 . forward-word)) ;      f
    (6 . forward-char))       ; C-f

;; C-pctl-x-mapにバインド
(define-key map (kbd "C-p") ctl-x-map)
;; ctl-x-map
⇒ [nil … find-file … backward-kill-sentence]

;; ctl-x-map内でC-ffooにバインド
(define-key map (kbd "C-p C-f") 'foo)
⇒ 'foo
map
⇒ (keymap     ; ctl-x-map内のfooに注目
    (16 keymap [nil … foo … backward-kill-sentence])
    (24 keymap
        (102 . forward-word))
    (6 . forward-char))

C-p C-fにたいする新たなバインディングの格納は、実際にはctl-x-map内のエントリーを変更することにより機能し、これはデフォルトグローバルマップ内のC-p C-fC-x C-fの両方のバインディングを変更する効果をもつことに注意されたい。

関数substitute-key-definitionは、キーマップから特定のバインディングをもつキーをスキャンして、それらを異なるバインディングにリバインドする。より明快で、多くの場合は同じ結果を生成できる他の機能として、あるコマンドから別のコマンドへのリマップがあります(Remapping Commandsを参照)。

Function: substitute-key-definition olddef newdef keymap &optional oldmap

この関数は、keymap内でolddefにバインドされるすべてのキーについて、olddefnewdefに置き換える。別の言い方をすると、olddefが出現する箇所すべてをnewdefに置き換える。この関数はnilをリターンする。

たとえば、以下をEmacsの標準バインディングで行うと、C-x C-fを再定義する:

(substitute-key-definition
 'find-file 'find-file-read-only (current-global-map))

oldmapが非nilの場合は、どのキーをリバインドするかをoldmap内のバインディングが決定するよう、substitute-key-definitionの動作を変更する。リバインディングは依然としてoldmapではなく、keymapで発生する。したがって、他のマップ内のバインディングの制御下で、マップを変更することができる。たとえば、

(substitute-key-definition
  'delete-backward-char 'my-funny-delete
  my-map global-map)

これは、標準的な削除コマンドにグローバルにバインドされたキーにたいして、my-map内の特別な削除コマンドを設定する。

以下は、キーマップの置き換え(substitution)の前後を示す例である:

(setq map '(keymap
            (?1 . olddef-1)
            (?2 . olddef-2)
            (?3 . olddef-1)))
⇒ (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1))

(substitute-key-definition 'olddef-1 'newdef map)
⇒ nil
map
⇒ (keymap (49 . newdef) (50 . olddef-2) (51 . newdef))
Function: suppress-keymap keymap &optional nodigits

この関数は、self-insert-commandをコマンドundefinedにリマップ(Remapping Commandsを参照)することにより、fullキーマップのコンテンツを変更する。これは、すべてのプリント文字を未定義にする効果をもすので、通常のテキスト挿入は不可能になる。suppress-keymapnilをリターンする。

nodigitsnilの場合、suppress-keymapは数字がdigit-argument-negative-argumentを実行するように定義する。それ以外は、残りのプリント文字と同じように、それらの文字も未定義にする。

suppress-keymap関数は、yankquoted-insertのようなコマンドを抑制(suppress)しないので、バッファーの変更は可能である。バッファーの変更を防ぐには、バッファーを読み取り専用(read-only)にする(Read-Only Buffersを参照)。

この関数はkeymapを変更するので、通常は新たに作成したキーマップにたいして使用するだろう。するだろう。他の目的のために使用されている既存のキーマップに操作を行うと、恐らくトラブルの原因となる。たとえば、global-mapの抑制は、Emacsの使用をほとんど不可能に

この関数は、テキストの挿入が望ましくないメジャーモードの、ローカルキーマップ初期科に使用され得る。しかし、そのようなモードは通常はspecial-mode(Basic Major Modesを参照)から継承される。この場合、そのモードのキーマップは既に抑制済みのspecial-mode-mapから自動的に受け継がれる。以下にspecial-mode-mapが定義される方法を示す:

(defvar special-mode-map
  (let ((map (make-sparse-keymap)))
    (suppress-keymap map)
    (define-key map "q" 'quit-window)
    …
    map))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.13 Remapping Commands

あるコマンドから他のコマンドへのリマップ(remap)には、特別な種類のキーバインディングが使用できます。この機能を使用するためには、ダミーイベントremapで始まり、その後にリマップしたいコマンド名が続くようなキーシーケンスにたいするキーバインディングを作成します。そして、そのバインディングにたいしては、新たな定義(通常はコマンド名だが、キーバインディングにたいして有効な他の任意の定義を指定可能)を指定します。

たとえば、Myモードというモードが、kill-lineのかわりに呼び出されるmy-kill-lineという特別なコマンドを提供するとします。これを設定するには、このモードのキーマップに以下のようなリマッピングが含まれるはずです:

(define-key my-mode-map [remap kill-line] 'my-kill-line)

その後は、my-mode-mapがアクティブなときは常に、ユーザーがC-k(kill-lineについてデフォルトのグローバルキーシーケンス)をタイプすると、Emacsはかわりにmy-kill-lineを実行するでしょう。

リマップはアクティブなキーマップでのみ行なわれることに注意してください。たとえば、ctl-x-mapのようなプレフィクスキーマップ内にリマッピングを置いても、そのようなキーマップはそれ自体がアクティブでないので、通常は効果がありません。それに加えて、リマップは1レベルを通じてのみ機能します。以下の例では、

(define-key my-mode-map [remap kill-line] 'my-kill-line)
(define-key my-mode-map [remap my-kill-line] 'my-other-kill-line)

これはkill-linemy-other-kill-lineにリマップしません。かわりに、通常のキーバインディングがkill-lineを指定する場合は、それがmy-kill-lineにリマップされます。通常のバインディングがmy-kill-lineを指定した場合は、my-other-kill-lineにリマップされます。

コマンドのリマップをアンドゥするには、以下のようにそれをnilにリマップします:

(define-key my-mode-map [remap kill-line] nil)
Function: command-remapping command &optional position keymaps

この関数は、カレントアクティブキーマップにより与えられる、command(シンボル)にたいするリマッピングをリターンする。commandがリマップされていない(これは普通の状況である)、またはシンボル以外の場合、この関数はnilをリターンする。positionは、key-bindingの場合と同様、使用するキーマップを決定するために、オプションバッファー位置、またはイベント位置をオプションで指定できる。

オプション引数keymapsが非nilの場合、それは検索するキーマップのリストを指定する。この引数は、positionが非nilの場合は無視される。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.14 Keymaps for Translating Sequences of Events

read-key-sequence関数がキーシーケンス(Key Sequence Inputを参照)を読み取るときは、特定のイベントシーケンスを他のものに変換(translate)するために、変換キーマップ(translation keymaps)を使用します。input-decode-maplocal-function-key-mapkey-translation-map(優先順)は変換キーマップです。

変換キーマップは、他のキーマップと同じ構造をもちますが、使われ方は異なります。変換キーマップは、キーシーケンスを読み取るときに、コンプリートキーシーケンスにたいするバインディングではなく、キーシーケンスに行う変換を指定します。キーシーケンスが読み取られると、それらのキーシーケンスは変換キーマップにたいしてチェックされます。ある変換キーマップがkをベクターvに“バインド”する場合、キーシーケンス内のどこかにサブシーケンスとしてkが出現すると、それはvないのでイベントに置き換えられます。

たとえば、キーパッドキーPF1が押下されたとき、VT100端末はESC O Pを送信します。そのような端末では、Emacsはそのイベントシーケンスを単一イベントpf1に変換しなければなりません。これは、input-decode-map内でESC O P[pf1]に“バインド”することにより行われます。したがって、その端末上でC-c PF1をタイプしたとき、端末は文字シーケンスC-c ESC O Pを発行し、read-key-sequenceがそれをC-c PF1に変換してベクター[?\C-c pf1]としてリターンします。

変換キーマップは、(keyboard-coding-systemで指定された入力コーディングシステムを通じて)Emacsがキーボード入力をデコードした直後だけ効果をもちます。Terminal I/O Encodingを参照してください。

Variable: input-decode-map

この変数は、通常の文字端末上のファンクションキーから送信された文字シーケンスを記述するキーマップを保持する。

input-decode-mapの値は、通常はその端末のTerminfoかTermcapのエントリーに応じて、自動的にセットアップされるが、Lispの端末仕様ファイルの助けが必要なときもある。Emacsには、多くの一般的な端末の端末仕様ファイルが同梱されている。これらのファイルの主な目的は、TermcapやTerminfoから推定できないエントリーをinput-decode-map内に作成することである。Terminal-Specific Initializationを参照のこと。

Variable: local-function-key-map

この変数は、input-decode-mapと同じようにキーマップを保持するが、通常優先される解釈候補(alternative interpretation)に変換されるべきキーシーケンスを記述するキーマップを保持する。このキーマップはinput-decode-mapの後、key-translation-mapの前に適用される。

local-function-key-map内のエントリーは、マイナーモード、ローカルキーマップ、グローバルキーマップによるバインディングと衝突する場合は無視される。つまり、元のキーシーケンスが他にバインディングをもたない場合だけ、リマッピングが適用される。

local-function-key-mapfunction-key-mapを継承するが、function-key-mapを直接使用すべきではない。

Variable: key-translation-map

この変数は、入力イベントを他のイベントに変換するために、input-decode-mapと同じように使用される、別のキーマップを保持する。input-decode-mapとの違いは、local-function-key-mapの前ではなく、後に機能する点である。このキーマップは、local-function-key-mapによる変換結果を受け取る。

input-decode-mapと同様、ただしlocal-function-key-mapとは異なり、このキーマップは入力キーシーケンスが通常のバインディングをもつかどうかかに関わらず適用される。しかし、このキーマップによりキーバインディングがオーバーライドされても、key-translation-mapでは実際のキーバインディングが効果をもち得ることに注意されたい。確かに、実際のキーバインディングはlocal-function-key-mapをオーバーライドし、したがってkey-translation-mapが受け取るキーシーケンスは変更されるだろう。明確にするためには、このような類の状況は避けたほうがよい。

key-translation-mapは、通常はself-insert-commandにバインディングされるような通常文字を含めて、ユーザーがある文字を他の文字にマップすることを意図している。

キーシーケンスのかわりにキーの“変換”として関数を使用することにより、シンプルなエイリアスより多くのことにinput-decode-maplocal-function-key-mapkey-translation-mapを使用できます。その場合、この関数はそのキーの変換を計算するために呼び出されます。

キー変換関数は、引数を1つ受け取ります。この引数はread-key-sequence内で指定されるプロンプトです。キーシーケンスがエディターコマンドループに読み取られる場合は、nilです。ほとんどの場合、プロンプト値は無視できます。

関数が自身で入力を読み取る場合、その関数は後続のイベントを変更する効果をもつことができます。たとえば、以下はC-c hをハイパー文字に後続する文字とするために定義する方法の例です:

(defun hyperify (prompt)
  (let ((e (read-event)))
    (vector (if (numberp e)
                (logior (lsh 1 24) e)
              (if (memq 'hyper (event-modifiers e))
                  e
                (add-event-modifier "H-" e))))))

(defun add-event-modifier (string e)
  (let ((symbol (if (symbolp e) e (car e))))
    (setq symbol (intern (concat string
                                 (symbol-name symbol))))
    (if (symbolp e)
        symbol
      (cons symbol (cdr e)))))

(define-key local-function-key-map "\C-ch" 'hyperify)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.14.1 Interaction with normal keymaps

そのキーシーケンスがコマンドにバインドされたとき、またはさらにイベントを追加してもコマンドにバインドされるシーケンスにすることができないとEmacsが判断したときに、キーシーケンスの終わりが検出されます。

これは、元のキーシーケンスがバインディングをもつかどうかに関わらず、input-decode-mapおよびkey-translation-mapを適用するとき、そのようなバインディングが変換の開始を妨げることを意味します。たとえば、前述のVT100の例に戻って、グローバルマップにC-c ESCを追加してみましょう。すると、ユーザーがC-c PF1をタイプしたとき、EmacsはC-c ESC O PC-c PF1に変換するのに失敗するでしょう。これは、EmacsがC-x ESCの直後に読み取りを停止して、O Pは読み取られずに残るからです。この場合、ユーザーが実際にC-c ESCをタイプした場合、ユーザーが実際にESCを押下したのか、あるいはPF1を押下したのか判断するために、Emacsが待つべきではないのです。

この理由により、キーシーケンスの終わりがキー変換のプレフィクスであるようなキーシーケンスをコマンドにバインドするのは、避けたほうがよいでしょう。そのような問題を起こす主なサフィックス、およびプレフィクスはESCM-O(実際はESC O)、M-[(実際はESC [)です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.15 Commands for Binding Keys

このセクションでは、キーバインディングを変更するための便利な対話的インターフェイスを説明します。これらはdefine-keyを呼び出すことにより機能します。

ユーザーはinitファイルにたいしてシンプルなカスタマイズを行うとき、しばしばglobal-set-keyを使用します。たとえば、

(global-set-key (kbd "C-x C-\\") 'next-line)

または

(global-set-key [?\C-x ?\C-\\] 'next-line)

または

(global-set-key [(control ?x) (control ?\\)] 'next-line)

は、次の行に移動するようにC-x C-\を再定義します。

(global-set-key [M-mouse-1] 'mouse-set-point)

は、メタキーを押してマウスの第一ボタン(左ボタン)をクリックすると、クリックした箇所にポイントをセットするように再定義します。

バインドするキーのLisp指定に非ASCII文字のテキストを使用するときは、注意してください。マルチバイトとして読み取られたテキストがある場合には、Lispファイル内でマルチバイトテキストが読み取られるときのように(see section Loading Non-ASCII Characters)、マルチバイトとしてキーをタイプしなければなりません。たとえば、

(global-set-key "ö" 'my-function) ; bind o-umlaut

または

(global-set-key ?ö 'my-function) ; bind o-umlaut

をLatin-1のマルチバイト環境で使用した場合、これらのコマンドはLatin-1端末より送信されたバイトコード246(M-v)ではなく、コード246のマルチバイト文字に実際にバインドされます。このバインディングを使用するためには、適切な入力メソッド(Input Methods in The GNU Emacs Manualを参照)を使用して、キーボードをデコードする方法をEmacsに教える必要があります。

Command: global-set-key key binding

この関数は、カレントグローバルマップ内で、keyのバインディングをbindingにセットする。

(global-set-key key binding)
≡
(define-key (current-global-map) key binding)
Command: global-unset-key key

この関数は、カレントグローバルマップから、keyのバインディングを削除する。

プレフィクスとしてkeyを使用する、長いキーの定義の準備に使用するのも、この関数の1つの使い方である。keyが非プレフィクスのようなバインディングをもつ場合、この使い方は許されないだろう。たとえば、

(global-unset-key "\C-l")
    ⇒ nil
(global-set-key "\C-l\C-l" 'redraw-display)
    ⇒ nil

この関数は、以下のようにdefine-keyを使用するのと等しい:

(global-unset-key key)
≡
(define-key (current-global-map) key nil)
Command: local-set-key key binding

この関数は、カレントローカルキーマップ内のkeyのバインディングを、bindingにセットする。

(local-set-key key binding)
≡
(define-key (current-local-map) key binding)
Command: local-unset-key key

この関数は、カレントローカルキーマップから、keyのバインディングを削除する。

(local-unset-key key)
≡
(define-key (current-local-map) key nil)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.16 Scanning Keymaps

このセクションでは、すべてのカレントキーマップをスキャンして、ヘルプ情報をプリントするために使用される関数を説明します。

Function: accessible-keymaps keymap &optional prefix

この関数は、(0個以上のプレフィクスキーを通じて)keymapから到達可能な、すべてのキーマップのリストをリターンする。リターン値は(key . map)のような形式の要素をもつ連想配列(alist)である。ここで、keykeymap内での定義がmapであるようなプレフィクスキーである。

alistの要素は、keyの長さにたいして昇順にソートされている。1つ目の要素は、常に([] . keymap)である。これは、指定されたキーマップがイベントなしのプレフィクスにより、自分自身からアクセス可能だからである。

prefixが与えられた場合、それはプレフィクスキーシーケンスである。その場合には、prefixで始まるプレフィクスキーをもつサブマップだけがaccessible-keymapsに含まれる。これらの要素の意味は、(accessible-keymaps)の値の場合と同様であり、いくつかの要素が省略されている点だけが異なる。

以下の例では、リターンされるalistにより、‘^[’と表示されるキーESCがプレフィクスキーであり、その定義がsparseキーマップ(keymap (83 . center-paragraph) (115 . foo))であること示される。

(accessible-keymaps (current-local-map))
⇒(([] keymap
      (27 keymap   ; 以降ESCにたいするこのキーマップが繰り返されることに注意
          (83 . center-paragraph)
          (115 . center-line))
      (9 . tab-to-tab-stop))

   ("^[" keymap
    (83 . center-paragraph)
    (115 . foo)))

また以下の例では、C-h(keymap (118 . describe-variable)…)で始まるsparseキーマップを使用するプレフィクスキーである。他のプレフィクスC-x 4は、変数ctl-x-4-mapの値でもあるキーマップを使用する。イベントmode-lineは、ウィンドウの特別な箇所でのマウスイベントにたいするプレフィクスとして使用される、いくつかのダミーイベントのうちの1つである。

(accessible-keymaps (current-global-map))
⇒ (([] keymap [set-mark-command beginning-of-line …
                   delete-backward-char])
    ("^H" keymap (118 . describe-variable) …
     (8 . help-for-help))
    ("^X" keymap [x-flush-mouse-queue …
     backward-kill-sentence])
    ("^[" keymap [mark-sexp backward-sexp …
     backward-kill-word])
    ("^X4" keymap (15 . display-buffer) …)
    ([mode-line] keymap
     (S-mouse-2 . mouse-split-window-horizontally) …))

これらは実際に目にするであろうキーマップのすべてではない。

Function: map-keymap function keymap

関数map-keymapは、keymap内のバインディングそれぞれにたいして1回functionを呼び出す。呼び出す際の引数はイベント型と、そのバインディングの値の2つである。keymapに親キーマップがある場合は、その親キーマップのバインディングも含まれる。これは再帰的に機能する。つまり、その親キーマップ自身が親キーマップをもつ場合は、それのバインディングも含まれる、といった具合である。

これは、キーマップ内のすべてのバインディングを検証する、もっとも明快な方法である。

Function: where-is-internal command &optional keymap firstonly noindirect no-remap

この関数は、where-isコマンド(Help in The GNU Emacs Manualを参照)により使用されるサブルーチンである。これは、キーマップのセット内でcommandにバインドされる、(任意の長さの)キーシーケンスすべてのリストをリターンする。

引数commandには、任意のオブジェクトを指定できる。このオブジェクトは、すべてのキーマップエントリーにたいし、eqを使用して比較される。

keymapnilの場合、overriding-local-mapの値とは無関係に(overriding-local-mapの値がnilであると装い)、カレントアクティブキーマップをマップとして使用する。keymapがキーマップの場合は、keymapとグローバルキーマップが検索されるマップとなる。keymapがキーマップのリストの場合は、それらのキーマップだけが検索される。

keymapにたいする式としては、通常はoverriding-local-mapを使用するのが最善である。その場合、where-is-internalは正にアクティブなキーマップを検索する。グローバルマップだけを検索するには、keymapの値に(keymap)(空のキーマップ)を渡せばよい。

firstonlynon-asciiの場合、値はすべての可能なキーシーケンスのリストではなく、最初に見つかったキーシーケンスを表す単一のベクターとなる。firstonlytの場合、値は最初のキーシーケンスだが、全体がASCII文字(またはメタ修飾されたASCII文字)で構成されるキーシーケンスが、他のすべてのキーシーケンスに優先され、リターン値がメニューバインディングになることは決してない。

noindirectが非nilの場合、where-is-internalはインダイレクトキーマップ(indirect keymap: 間接キーマップ)のバインディングを追跡しない。これにより、インダイレクト定義自体にたいして検索が可能になる。

5つ目の引数no-remapは、この関数がコマンドリマッピング(Remapping Commandsを参照)を扱う方法を決定する。興味深いケースが2つある:

コマンドother-commandcommandにリマップされる場合:

no-remapnilの場合は、other-commandにたいするバインディングを探して、commandにたいするバインディングであるかのようにそれらを扱う。no-remapが非nilの場合は、それらのバインディングを探すかわりに、利用可能なキーシーケンスリストに、ベクター[remap other-command]を含める。

If command is remapped to other-command:

no-remapnilの場合は、commandではなくother-commandにたいするバインディングをリターンする。no-remapが非nilの場合は、リマップされていることを無視して、commandにたいするバインディングをリターンする。

Command: describe-bindings &optional prefix buffer-or-name

この関数は、すべてのカレントキーバインディングのリストを作成して、*Help*という名前のバッファーにそれを表示する。テキストはモードごとにグループ化され、順番はマイナーモード、メジャーモード、グローバルバインディングの順である。

prefixが非nilの場合、それはプレフィクスキーである。その場合、リストに含まれるのはprefixで始まるキーだけになる。

複数の連続するASCIIコードが同じ定義をもつとき、それらは‘firstchar..lastchar’のようにまとめて表示される。この場合、それがどの文字に該当するかを理解するためには、そのASCIIコードを知っている必要がある。たとえば、デフォルトグローバルマップでは、文字‘SPC .. ~’は1行で記述される。SPCASCIIの32,~ASCIIの126で、その間のすべての文字には、通常のプリント文字(アルファベット文字、数字、句読点など)が含まれる。これらの文字はすべて、self-insert-commandにバインドされる。

buffer-or-nameが非nilの場合、それはバッファー、またはバッファー名である。その場合、describe-bindingsはカレントバッファーのかわりに、そのバッファーのバインディングをリストする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17 Menu Keymaps

キーマップは、キーボードキーやマウスボタンにたいするバインディング定義と同様に、メニューとして操作することができます。メニューは、通常はマウスにより操作されますが、キーボードでも機能させことができます。次の入力イベントにたいしてメニューキーマップがアクティブな場合は、キーボードメニュー機能がアクティブになります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1 Defining Menus

キーマップがoverallプロンプト文字列(overall prompt string)をもつ場合、そのキーマップはメニューとして動作します。overallプロンプト文字列とは、キーマップの要素として表される文字列です(Format of Keymapsを参照)。この文字列には、メニューコマンドの目的を記述します。Emacsは、(もしあれば)メニュー表示に使用されるツールキットに応じ、メニュータイトルとしてoverallメニュー文字列を表示します12。キーボードメニューもoverallプロンプト文字列を表示します。

プロンプト文字列をもつキーマップを構築するもっとも簡単な方法は、make-keymapmake-sparse-keymap(Creating Keymapsを参照)、define-prefix-command(Definition of define-prefix-commandを参照)を呼び出すときに引数で文字列を指定する方法です。キーマップをメニューとして操作したくない場合は、これらの関数にたいしてプロンプト文字列を指定しないでください。

Function: keymap-prompt keymap

この関数は、keymapのoverallプロンプト文字列を、もしなければnilをリターンする。

メニューのアイテムは、そのキーマップ内のバインディングです。各バインディングはイベント型と定義を関連付けますが、イベント型はメニューの外見に何の意味ももちません(通常は、イベント型としてキーボードが生成できない擬似イベントのシンボルをメニューアイテムのバインディングに使用する)。メニュー全体は、これらのイベントにたいするキーマップ内のバインディングから生成されます。

メニュー内のアイテムの順序は、キーマップ内のバインディングの順序と同じです。define-keyは新たなバインディングを先頭に置くので、メニューアイテムの順序が重要な場合は、メニューの最後から先頭へメニューアイテムを定義する必要があります。既存のメニューにアイテムを追加するときは、define-key-afterを使用してメニュー内の位置を指定できます(Modifying Menusを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1.1 Simple Menu Items

メニューアイテムを定義する単純(かつ初歩的)な方法は、何らかのイベント型(何のイベント型かは問題にならない)を以下のようにバインドすることです:

(item-string . real-binding)

CARitem-stringは、メニュー内で表示される文字列です。これは短いほうがよく、1から3の単語が望ましいでしょう。この文字列は、対応するコマンドの動作を説明します。すべてのグラフィカルツールキットが非ASCIIテキストを表示できる訳ではないことに注意してください(キーボードメニューとGTK+ツールキットの大部分では機能するだろう)。

以下のように、ヘルプ文字列と呼ばれる2つ目の文字列を与えることもできます:

(item-string help . real-binding)

helpは、マウスがそのアイテム上にあるときに、help-echoテキストプロパティ(Help displayを参照)と同じ方法で表示される“help-echo”文字列を指定します。

define-keyに関する限り、item-stringhelp-stringは、そのイベントのバインディングの一部です。しかし、lookup-keyは単にreal-bindingだけをリターンし、そのキーの実行にはreal-bindingだけが使用されます。

real-bindingnilの場合、メニューにitem-stringは表示されまづが、選択できなくなります。

real-bindingがシンボルで、menu-enableプロパティが非nilの場合、そのプロパティはメニューアイテムが有効か無効かを制御する式です。メニュー表示にキーマップが使用されるたびに、Emacsはその式を評価して、式の値が非nilの場合だけ、そのメニューのメニューアイテムを有効にします。メニューアイテム無効なとき、そのアイテムは“fuzzy”形式で表示され、選択できなくなります。

メニューバーはメニューを調べる際に、どのアイテムが有効なのか再計算しません。これは、Xツールキットが事前にメニュー全体を要求するからです。メニューバーの再計算を強制するには、force-mode-line-updateを呼び出してください(Mode Line Formatを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1.2 Extended Menu Items

メニューアイテムの拡張フォーマットは、単純なフォーマットに比べて、より柔軟かつ明快です。拡張フォーマットでは、メニューアイテムにバインドのイベント型に、シンボルmenu-itemで始まるシンボルのリストを指定します。選択できない文字列にたいしては、以下のようなバインディングになります:

(menu-item item-name)

2つ以上のダッシュで始まる文字列は、リストのセパレーターを指定します。Menu Separatorsを参照してください。

選択可能な実際のメニューアイテムを定義するには、以下のような拡張フォーマットでバインドします:

(menu-item item-name real-binding
    . item-property-list)

ここで、item-nameはメニューアイテム文字列を評価する式です。つまり、文字列は底数である必要はありません。3つ目の引数real-bindingは、実行するコマンドです。リストの最後の要素item-property-listは、プロパティリストの形式をもつ、その他の情報を含みます。

以下は、サポートされるプロパティのテーブルです:

:enable form

formの評価結果は、そのアイテムを有効にするかどうかを決定する(非nilの場合は有効)。アイテムが無効な場合は、実際にクリックできない。

:visible form

formの評価結果は、そのアイテムを実際にメニューに表示するかどうかを決定する(非nilの場合は表示)。アイテムが非表示の場合は、そのアイテムが定義されていないかのようにメニューが表示される。

:help help

このプロパティhelpの値は、そのアイテム上にマウスがある間表示する“help-echo”文字列を指定する。この文字列は、help-echoテキストプロパティ(Help displayを参照)と同じ方法で表示される。これは、テキストやoverlayにたいするhelp-echoプロパティと異なり、文字列定数でなければならないことに注意されたい。

:button (type . selected)

このプロパティは、ラジオボタンおよびトグルボタンを定義する手段を提供する。CARtypeは、:toggle:radioのいずれかを指定する。CDRselectedはフォームで、評価結果によりそのボタンがカレントで選択されているかどうかを指定する。

トグル(toggle)は、selectedの値に応じて“on”か“off”のいずれかがラベルされるメニューアイテムである。コマンド自身は、selectednilならtに、tならnilselectedを切り替える(toggle)こと。以下は、debug-on-errorフラグが定義されているときに、メニューアイテムをトグルする方法の例である:

(menu-item "Debug on Error" toggle-debug-on-error
           :button (:toggle
                    . (and (boundp 'debug-on-error)
                           debug-on-error)))

これは、toggle-debug-on-errorが変数debug-on-errorをトグルするコマンドとして定義されていることにより機能する。

ラジオボタンとは、メニューアイテムのグループであり、常にただ1つのメニューアイテムだけが“選択される(selected)”。そのためには、どのメニューアイテムが選択されているかを示す変数が存在する必要がある。グループ内の各ラジオボタンにたいするselectedフォームは、そのボタンを選択するために、その変数が正しい値をもつかどうかをチェックする。そして、ボタンのクリックにより変数をセットして、クリックされたボタンが選択される。

:key-sequence key-sequence

このプロパティは、そのメニューアイテムにより呼び出されるのと同じコマンドにバインドされるかもしれないキーシーケンスを指定する。正しいキーシーケンスを指定した場合は、メニュー表示の準備がより高速になる。

間違ったキーシーケンスを指定した場合は、何の効果もない。Emacsは、メニュー内のkey-sequenceを表示する前に、実際にそのkey-sequenceがそのメニューアイテムと等価なのか検証する。

:key-sequence nil

このプロパティは、そのメニューアイテムには等価なキーバインディングが通常は存在しないことを示す。このプロパティを使用することにより、Emacsはそのメニューアイテムにたいして等価なキーボード入力をキーマップから検索する必要がなくなるので、メニュー表示の準備時間が短縮される。

しかし、ユーザーがそのアイテムの定義をキーシーケンスにリバインドした場合、Emacsは:keysプロパティを無視して、結局は等価なキーボード入力を見つけ出す。

:keys string

このプロパティは、そのメニューにたいする等価なキーボード入力として表示される文字列stringを指定する。string内では、ドキュメント構成‘\\[...]’を使用できる。

:filter filter-fn

このプロパティは、メニューアイテムを直接計算する手段を提供する。このプロパティの値filter-fnは、引数が1つの関数で、呼び出し時の引数はreal-bindingである。この関数は、かわりに使用するバインディングをリターンするべきである。

Emacsは、メニューデータ構造を再表示、または操作する任意のタイミングでこの関数を呼び出し得るので、いつ呼び出されても安全なように関数を記述すべきである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1.3 Menu Separators

メニューセパレーターは、テキストを表示するかわりに、水平ラインでメニューをサブパーツに分割する、メニューアイテムの一種です。メニューキーマップ内で、セパレーターは以下のように見えます:

(menu-item separator-type)

ここで、separator-typeは2つ以上のダッシュで始まる文字列です。

もっとも単純なケースでは、ダッシュだけでseparator-typeが構成されます。これはデフォルトのセパレーターを指定します(互換性のため、""-もセパレーターとみなされる)。

separator-typeにたいする他の特定の値は、異なるスタイルのセパレーターを指定します。以下はそれらのテーブルです:

"--no-line"
"--space"

実際のラインではない、余分な垂直スペース。

"--single-line"

メニューのforegroundカラーの一重ライン。

"--double-line"

メニューのforegroundカラーの二重ライン。

"--single-dashed-line"

メニューのforegroundカラーの一重ダッシュライン。

"--double-dashed-line"

メニューのforegroundカラーの二重ダッシュライン。

"--shadow-etched-in"

3Dの窪んだ外観(3D sunken appearance)をもつ一重ライン。これはダッシュだけで構成されるセパレーターに使用されるデフォルトである。

"--shadow-etched-out"

3Dの浮き上がった外観(3D raised appearance)をもつ一重ライン。

"--shadow-etched-in-dash"

3Dの窪んだ外観(3D sunken appearance)をもつ一重ダッシュライン。

"--shadow-etched-out-dash"

3Dの浮き上がった外観(3D raised appearance)をもつ一重ダッシュライン。

"--shadow-double-etched-in"

3Dの窪んだ外観をもつ二重ライン。

"--shadow-double-etched-out"

3Dの浮き上がった外観をもつ二重ライン。

"--shadow-double-etched-in-dash"

3Dの窪んだ外観をもつ二重ダッシュライン。

"--shadow-double-etched-out-dash"

3Dの浮き上がった外観をもつ二重ダッシュライン。

2連ダッシュの後にコロンを追加して、1連ダッシュの後の単語の先頭の文字を大文字にすることにより、別のスタイルで名前を与えることもできます。つまり、"--:singleLine""--single-line"と等価です。

メニューセパレーターにたいして:enable:visibleのようなキーワードを指定するために、長い形式を使用できます。

(menu-item separator-type nil . item-property-list)

たとえば:

(menu-item "--" nil :visible (boundp 'foo))

いくつかのシステムおよびディスプレイツールキットは、これらすべてのセパレータータイプを実際に処理しません。サポートされないタイプのセパレーターを使用した場合、メニューはサポートされている似た種別のセパレーターを表示します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.1.4 Alias Menu Items

“同じ”コマンドを使用するが、有効条件が異なるメニューアイテムを作成すると便利な場合が時折あります。Emacsでこれを行う最善の方法は、拡張メニューアイテム(extended menu item)です。この機能が存在する以前は、エイリアスコマンドを定義して、それらをメニューアイテムで使用することによりこれを行っていました。以下は、read-only-modeにたいする2つのエイリアスを作成して、それらに異なる有効条件を与える例です:

(defalias 'make-read-only 'read-only-mode)
(put 'make-read-only 'menu-enable '(not buffer-read-only))
(defalias 'make-writable 'read-only-mode)
(put 'make-writable 'menu-enable 'buffer-read-only)

メニュー内でエイリアスを使用するときは、エイリアスではなく“実際”のコマンド名にたいする等価なキーバインディングを表示するのが便利な場合が多々あります(エイリアスはメニュー自身を除きキーバインディングを通常はもたない)。これを要求するには、エイリアスシンボルにmenu-aliasプロパティに非nilを与えます。したがって、

(put 'make-read-only 'menu-alias t)
(put 'make-writable 'menu-alias t)

は、make-read-onlymake-writableにたいするメニューアイテムに、read-only-modeのキーバインディングを表示します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.2 Menus and the Mouse

メニューキーマップがメニューを生成する通常の方法は、それをプレフィクスキーの定義とすることです。(Lispプログラムは明示的にメニューをポップアップして、ユーザーの選択を受け取ることができる。Pop-Up Menusを参照のこと。)

プレフィクスキーがマウスイベントで終わる場合、ユーザーがマウスで選択できるように、Emacsは可視なメニューをポップアップすることによりメニューキーマップを処理します。ユーザーがメニューアイテムをクリックしたときは、そのメニューアイテムによりもたらされるバインディングの文字、またはシンボルが何であれ、イベントが生成されます(メニューが複数レベルをもつ場合やメニューバー由来の場合、メニューアイテムは1連のイベントを生成するかもしれない)。

メニューのトリガーにbutton-downイベントを使用するのが最善な場合もしばしばあります。その場合、ユーザーはマウスボタンをリリースすることにより、メニューアイテムを選択できます。

メニューキーマップがネストされたキーマップにたいするバインディングを含む場合、そのネストされたキーマップはサブメニュー(submenu)を指定します。それにはネストされたキーマップのアイテム文字列によりラベル付けされたメニューアイテムがあり、そのアイテムをクリックすることにより、指定されたサブメニューが自動的にポップアップされます。特別な例外として、メニューキーマップが単一のネストされたキーマップを含み、それ以外のメニューアイテムを含まない場合、そのメニューはネストされたキーマップの内容を、サブメニューとしてではなく、直接メニューに表示します。

しかし、XツールキットのサポートなしでEmacsをコンパイルした場合、またはテキスト端末の場合、サブメニューはサポートされません。ネストされたキーマップはメニューアイテムとして表示されますが、それをクリックしても、サブメニューは自動的にポップアップされません。サブメニューの効果を模倣したい場合は、ネストされたキーマップに‘@’で始まるアイテム文字列を与えることにより、これを行うことができます。これにより、Emacsは別個のメニューペイン(menu pane)を使用してネストされたキーマップを表示します。‘@’の後の残りのアイテム文字列は、そのペインのラベルです。XツールキットのサポートなしでEmacsをコンパイルした場合、またはメニューがテキスト端末で表示されている場合、メニューペインは使用されません。この場合、アイテム文字列の先頭の‘@’は、メニューラベル表示時には省略され、他に効果はありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.3 Menus and the Keyboard

キーボードイベント(文字かファンクションキー)で終わるプレフィクスキーがメニューキーマップであるような定義をもつとき、そのキーマップはキーボードメニューのように動作します。ユーザーは、キーボードでメニューアイテムを選択して、次のイベントを指定します。

Emacsは、エコーエリアにキーボードメニュー、そのマップのoverallプロンプト文字列、その後に候補(そのマップのバインディングのアイテム文字列)を表示します。そのバインディングを一度に全部表示できない場合、ユーザーはSPCをタイプして、候補の次の行を確認できます。連続してSPCを使用するとメニューの最後に達し、その後は先頭へ巡回します。(変数menu-prompt-more-charはこのために使用する文字を指定する。デフォルトはSPC。)

ユーザーがメニューから望ましい候補を見つけたら、バインディングがその候補であるような、対応する文字をタイプする必要があります。

Variable: menu-prompt-more-char

この変数は、メニューの次の行を確認するために使用する文字を指定する。初期値は32で、これはSPCのコードである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.4 Menu Example

以下は、メニューキーマップを定義する、完全な例です。これは、メニューバー内の‘Edit’メニューにサブメニュー‘Replace’を定義して、その定義内で拡張メニューフォーマット(Extended Menu Itemsを参照)を使用します。例ではまずキーマップを作成して、それに名前をつけます:

(defvar menu-bar-replace-menu (make-sparse-keymap "Replace"))

次にメニューアイテムを定義します:

(define-key menu-bar-replace-menu [tags-repl-continue]
  '(menu-item "Continue Replace" tags-loop-continue
              :help "Continue last tags replace operation"))
(define-key menu-bar-replace-menu [tags-repl]
  '(menu-item "Replace in tagged files" tags-query-replace
              :help "Interactively replace a regexp in all tagged files"))
(define-key menu-bar-replace-menu [separator-replace-tags]
  '(menu-item "--"))
;; 

バインディングがそのシンボルのために“作成された”ことに注意してください。これらのシンボルは、定義されるキーシーケンス内の角カッコ内に記述されます。このシンボルはコマンド名と同じときもあれば、異なることもあります。これらのシンボルは“ファンクションキー”として扱われますが、これらはキーボード上の実際のファンクションキーではありません。これらはメニュー自体の機能に影響しませんが、ユーザーがメニューから選択したときにエコーエリアに“エコー”され、where-isaproposの出力に現れます。

この例のメニューは、マウスによる使用を意図しています。もしキーボードの使用を意図したメニュー、つまりキーボードイベントで終了するキーシーケンスにバインドされたメニューの場合、メニューアイテムはキーボードでタイプできる文字、または“実際”のファンクションキーにバインドされるべきです。

定義が("--")のバインディングは、セパレーターラインです。実際のメニューアイテムと同様、セパレーターはキーシンボルをもち、この例ではseparator-replace-tagsです。1つのメニューが2つのセパレーターをもつ場合、それらは2つの異なるキーシンボルをもたなければなりません。

以下では、親メニュー内のアイテムとしてこのメニューがどのように表示されるかを記述しています:

(define-key menu-bar-edit-menu [replace]
  (list 'menu-item "Replace" menu-bar-replace-menu))

これは、シンボルmenu-bar-replace-menu自体ではなく、変数menu-bar-replace-menuの値であるサブメニューキーマップを組み込むことに注意してください。menu-bar-replace-menuはコマンドではないので、親メニューアイテムにそのシンボルを使用するのは無意味です。

同じreplaceメニューをマウスクリックに割り当てたい場合は、以下のようにこれを行うことができます:

(define-key global-map [C-S-down-mouse-1]
   menu-bar-replace-menu)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.5 The Menu Bar

Emacsは通常、各フレームの最上部にメニューバー(menu bar)を表示します。Menu Bars in The GNU Emacs Manualを参照してください。メニューバーのアイテムは、アクティブキーマップ内で定義される偽りの“ファンクションキー”menu-barのサブコマンドです。

メニューバーにアイテムを追加するには、自分で偽りの“ファンクションキー”(これをkeyと呼ぶことにしましょう)を創作して、キーシーケンス[menu-bar key]にたいするキーバインディングを作成します。ほとんどの場合において、そのバインディングはメニューキーマップなので、メニューバーアイテム上でボタンを押下すると、他のメニューに導かれます。

メニューバーにたいして同じ“ファンクションキー”を定義するアクティブなキーマップが1つ以上存在するとき、そのアイテムは1回だけ出現します。ユーザーがメニューバーのそのアイテムをクリックした場合、そのアイテムのすべてのサブコマンド— グローバルサブコマンド、ローカルサブコマンド、マイナーモードサブコマンドが組み合わされた単一のメニューを表示します。

変数overriding-local-mapは通常、メニューバーのコンテンツを決定する際は無視されます。つまり、メニューバーはoverriding-local-mapnilの場合にアクティブになるであろうキーマップから計算されます。Active Keymapsを参照してください。

以下は、メニューバーのアイテムをセットアップする例です:

;; (プロンプト文字列とともに)メニューキーマップを作成して
;; それをメニューバーアイテムの定義にする
(define-key global-map [menu-bar words]
  (cons "Words" (make-sparse-keymap "Words")))

;; メニュー内に具体的なサブコマンドを定義する
(define-key global-map
  [menu-bar words forward]
  '("Forward word" . forward-word))
(define-key global-map
  [menu-bar words backward]
  '("Backward word" . backward-word))

ローカルキーマップは、グローバルキーマップにより作成されたメニューバーアイテムにたいして、同じ偽ファンクションキーをundefinedにリバインドしてキャンセルすることができます。たとえば、以下はDiredが‘Edit’メニューバーアイテムを抑制する方法です:

(define-key dired-mode-map [menu-bar edit] 'undefined)

ここで、editは‘Edit’メニューバーアイテムにたいしてグローバルキーマップにより使用される偽ファンクションキーです。グローバルメニューバーアイテムを抑制する主な理由は、モード特有のアイテムのためのスペースを確保するためです。

Variable: menu-bar-final-items

通常メニューバーナーグローバルアイテムの後にローカルマップにより定義されるアイテムを表示する。

この変数は、通常の順番による位置ではなく、メニューの最後に表示するアイテムのための偽ファンクションキーのリストを保持する。デフォルト値は(help-menu)である。したがって、‘Help’メニューアイテムはメニューバーの最後、ローカルメニューアイテムの後に表示される。

Variable: menu-bar-update-hook

このノーマルフックは、メニューバーの再表示の前に、メニューバーのコンテンツを更新するための再表示により実行される。コンテンツを変化させる必要があるメニューの更新に使用できる。このフックは頻繁に実行されるので、フックが呼び出す関数は、通常の場合は長い時間を要さないことを確実にするよう助言する。

Emacsは、すべてのメニューバーアイテムの隣に、(もしそのようなキーバインディングが存在するなら)同じコマンドを実行するキーバインディングを表示します。これは、キーバインディングを知らないユーザーにたいして便利なヒントを与える役目をもちます。コマンドが複数のバインディングをもつ場合、通常Emacsは最初に見つけたバインディングを表示します。コマンドのシンボルプロパティ:advertised-bindingに割り当てることにより、特定のキーバインディングを指定できます。Substituting Key Bindings in Documentationを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.6 Tool bars

ツールバー(tool bar)とは、フレームの最上部、メニューバー直下にある、クリック可能なアイコンの行のことです。Tool Bars in The GNU Emacs Manualを参照してください。Emacsは通常、グラフィカルなディスプレイ上でツールバーを表示します。

各フレームでは、ツールバーに何行分の高さを割り当てるかを、フレームパラメーターtool-bar-linesが制御します。値0は、ツールバーを抑制します。値が非0で、auto-resize-tool-barsが非nilの場合、指定されたコンテンツを維持するのに必要な分、ツールバーは拡大縮小されます。値がgrow-onlyの場合、ツールバーは自動的に拡大されますが、自動的に縮小はされません。

ツールバーのコンテンツは、(メニューバーが制御されるのと似た方法により)tool-barと呼ばれる偽りの“ファンクションキー”に割り当てられたメニューキーマップにより制御されます。したがって、以下のようにdefine-keyを使用して、ツールバーアイテムを定義します。

(define-key global-map [tool-bar key] item)

ここでkeyは、そのアイテムを他のアイテムと区別する偽“ファンクションキー”で、itemはそのアイテムを表示する方法とアイテムの振る舞いを示すメニューアイテムキーバインディングです(Extended Menu Itemsを参照)。

メニューキーマップの通常のプロパティ:visible:enable:button:filterはツールバーバインディングでも役に立ち、いずれのプロパティも通常通りの意味をもちます。アイテム内のreal-bindingは、キーマップではなくコマンドでなければなりません。別の言い方をすると、これはツールバーアイコンをプレフィクスキーとして定義するようには機能しないということです。

:helpプロパティは、そのアイテム上にマウスがある間表示する、“help-echo”文字列を指定します。これは、テキストプロパティhelp-echoと同じ方法で表示されます(Help displayを参照)。

これらに加えて、:imageプロパティも使用するべきでしょう。これは、ツールバー内にイメージを表示するには、このプロパティを使用します。

:image image

imagesは単一イメージ様式(single image specification)、または4ベクターイメージ様式(vector of four image specifications)で指定する。4ベクターを使用する場合、状況に応じてそれらのうち1つが使用される:

item 0

アイテムが有効かつ選択されているとき使用される。

item 1

アイテムが有効かつ未選択のとき使用される。

item 2

アイテムが無効かつ選択されているとき使用される。

item 3

アイテムが無効かつ未選択のとき使用される。

GTK+およびNSバージョンのEmacsは、無効、および/または未選択のイメージをitem0から自動的に計算するので、item1からitem3は無視されます。

imageが単一イメージ様式の場合、Emacsはそのイメージにエッジ検出アルゴリズム(edge-detection algorithm)を適用することにより、ツールバーの無効な状態のボタンを描画します。

:rtlプロパティには、右から左に記述する言語のためのイメージ候補を指定します。現在のところ、これをサポートするのはGTK+バージョンのEmacsだけです。

メニューバーと同様、ツールバーはセパレーター(Menu Separatorsを参照)を表示できます。ツールバーのセパレーターは水平ラインではなく垂直ラインであり、1つのスタイルだけがサポートされます。これらは、ツールバーキーマップ内では(menu-item "--")エントリーで表されます。ツールバーのセパレーターでは、:visibleのようなプロパティはサポートされません。GTK+とNextstepのツールバーでは、セパレーターはネイティブに描画されます。それ以外では、セパレーターは垂直ラインイメージを使用して描画されます。

デフォルトツールバーは、コマンドシンボルのmode-classプロパティにspecialをもつメジャーモードにたいしては、編集に特化したアイテムは表示されないよう定義されています(Major Mode Conventionsを参照)。メジャーモードは、ローカルマップ内でバインディング[tool-bar foo]によって、グローバルバーにアイテムを追加するかもしれません。デフォルトツールバーの多くを適宜流用するのができないかもしれないため、デフォルトツールバーを完全に置き換えることは、いくつかのメジャーモードにとっては意味があります。デフォルトバインディングでtool-bar-mapを通じてインダイレクトすることにより、これを簡単に行うことができます。

Variable: tool-bar-map

デフォルトでは、グローバルマップは[tool-bar]を以下のようにバインドする:

(global-set-key [tool-bar]
                `(menu-item ,(purecopy "tool bar") ignore
                            :filter tool-bar-make-keymap))

関数tool-bar-make-keymapは、変数tool-bar-mapの値より、順に実際のツールバーマップをダイナミックに継承する。したがって、通常はそのマップを変更することにより、デフォルト(グローバル)ツールバーを調整すべきである。Infoモードのようないくつかのメジャーモードは、tool-bar-mapをバッファーローカルにして、それに異なるキーマップをセットすることにより、グローバルツールバーを完全に置き換える。

以下のような、ツールバーアイテムを定義するのに便利な関数があります。

Function: tool-bar-add-item icon def key &rest props

この関数は、tool-bar-mapを変更することにより、ツールバーにアイテムを追加する。使用するイメージはiconにより定義され、これはfind-imageに配置されたXPM、XBM、PBMのイメージファイルの拡張子を除いたファイル名(basename)である。たとえばカラーディスプレイ上では、値に‘"exit"’を与えるとexit.xpmexit.pbmexit.xbmの順に検索されるだろう。モノクロディスプレイでは、検索は‘.pbm’、‘.xbm’、‘.xpm’の順になる。使用するバインディングはコマンドdefで、keyはプレフィクスキーマップ内の偽ファンクションキーである。残りの引数propsは、メニューアイテム仕様に追加する、追加のプロパティリスト要素である。

あるローカルマップ内にアイテムを定義するためには、この関数呼び出しの周囲のlettool-bar-mapをバインドする:

(defvar foo-tool-bar-map
  (let ((tool-bar-map (make-sparse-keymap)))
    (tool-bar-add-item …)
    …
    tool-bar-map))
Function: tool-bar-add-item-from-menu command icon &optional map &rest props

この関数は、既存のメニューバインディングと矛盾しないツールバーアイテムの定義に有用である。commandのバインディングはmap(デフォルトはglobal-map)内よりルックアップ(lookup: 照合)され、iconにたいするイメージ仕様はtool-bar-add-itemと同じ方法で見つけ出される。結果のバインディングはtool-bar-mapに配されるので、この関数の使用はグローバルツールバーアイテムに限定される。

mapには、[menu-bar]にバインドされた適切なキーマップが含まれていなければならない。残りの引数propsは、メニューアイテム仕様に追加する、追加のプロパティリスト要素である。

Function: tool-bar-local-item-from-menu command icon in-map &optional from-map &rest props

この関数は、非グローバルツールバーアイテムの作成に使用される。in-mapに定義を作成するローカルマップを指定する以外は、tool-bar-add-item-from-menuと同じように使用する。引数from-mapは、tool-bar-add-item-from-menumapと同様である。

Variable: auto-resize-tool-bars

この変数が非nilの場合、定義されたすべてのツールバーアイテムを表示するために、ツールバーは自動的にリサイズ — ただし、そのフレーム高さの1/4を超えてリサイズされることはない。

値がgrow-onlyの場合、ツールバーは自動的に拡張されるが、自動的に縮小はされない。ツールバーを縮小するために、ユーザーはC-lをエンターしてフレームを再描画する必要がある。

GTK、またはNextstepとともにEmacsがビルドされた場合、ツールバーが表示できるのは1行だけであり、この変数は効果がない。

Variable: auto-raise-tool-bar-buttons

この変数が非nilの場合、ツールバーアイテムの上をマウスが通過したとき、浮き上がった形式(raised form)で表示される。

Variable: tool-bar-button-margin

この変数は、ツールバーアイテムの周囲に追加する余白(extra margin)を指定する。値はピクセル数を整数で指定し、デフォルトは4である。

Variable: tool-bar-button-relief

この変数は、ツールバーアイテムの影(shadow)を指定する。値はピクセル数を整数で指定し、デフォルトは1である。

Variable: tool-bar-border

この変数は、ツールバーエリアの下に描画するボーダー高さを指定する。値が整数の場合は、高さのピクセル数である。値がinternal-border-width(デフォルト)かborder-widthのいずれの場合、ツールバーのボーダー高さは、そのフレームの対応するパラメーターとなる。

シフト、メタ等の修飾キーを押下した状態でのツールバーアイテムのクリックにたいして、特別な意味を付与できます。偽りのファンクションキーを通じて、元のアイテムに関連する追加アイテムをセットアップすることにより、これを行うことができます。より具体的には、追加アイテムは、元のアイテムの命名に使用されたのと同じ偽ファンクションキーの修飾されたバージョンを使用するべきです。

つまり、元のアイテムが以下のように定義されている場合、

(define-key global-map [tool-bar shell]
  '(menu-item "Shell" shell
              :image (image :type xpm :file "shell.xpm")))

シフト修飾とともに同じツールバーイメージをクリックしたときは、以下のような方法で定義することができます:

(define-key global-map [tool-bar S-shell] 'some-command)

ファンクションキーにたいして修飾を追加する方法についての詳細な情報は、Function Keysを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.7 Modifying Menus

既存のメニューに新たなアイテムを挿入するときは、そのメニューの既存のアイテムの中の特定の位置にアイテムを追加したいと思うかもしれません。define-keyを使用してアイテムを追加した場合は通常、そのアイテムはメニューの先頭に追加されます。メニュー内の他の位置にアイテムを追加するには、define-key-afterを使用します:

Function: define-key-after map key binding &optional after

define-keyと同じように、map内にkeyにたいする値bindingのバインディングを定義するが、map内でそのバインディングの位置は、イベントafterにたいするバインディングの後になる。引数keyは長さ1 — 1要素だけのベクターか文字列にすべきである。しかしafterは単一のイベント型 — シーケンスではないシンボルか文字にすべきである。新たなバインディングは、afterにたいするバインディングの後に追加される。aftert、または省略された場合、新たなバインディングはそのキーマップの最後に追加される。しかし、新たなバインディングは、すべての継承されたキーマップの前に追加される。

以下に例を示す:

(define-key-after my-menu [drink]
  '("Drink" . drink-command) 'eat)

これは、偽ファンクションキーDRINKにたいするバインディングを作成して、EATにたいするバインディングの直後に追加する。

以下に、Shellモードの‘Signals’メニュー内のアイテムbreakの後に、‘Work’と呼ばれるアイテムを追加する方法を示す:

(define-key-after
  (lookup-key shell-mode-map [menu-bar signals])
  [work] '("Work" . work-command) 'break)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

21.17.8 Easy Menu

以下のマクロは、ポップアップメニュー、および/またはメニューバーメニューを定義する便利な方法を提供します。

Macro: easy-menu-define symbol maps doc menu

このマクロは、menuにより与えるコンテンツのポップアップメニュー、および/またはメニューバーサブメニューを定義する。

symbolが非nilの場合、それはシンボルである。その場合、このマクロはドキュメント文字列docをもつ、メニューをポップアップ(Pop-Up Menusを参照)する関数としてsymbolをを定義する。symbolはクォートされるべきではない。

symbolの値とは関係なく、mapsがキーマップの場合、メニューはメニューバーのトップレベルのメニュー(The Menu Barを参照)としてmapsに追加される。これにはキーマップのリストも指定でき、その場合メニューはそれらのキーマップに個別に追加される。

menuの最初の要素は文字列でなければならず、それはメニューラベルの役割をもつ。値には、以下のキーワード/引数ペアーが任意の個数続くかもしれない:

:filter function

functionは1つの引数(他のメニューアイテムのリスト)で呼び出される関数でなければならず、メニュー内に表示される実際のアイテムをリターンする。

:visible include

includeには式を指定する。その式がnilに評価された場合、メニューは不可視になる。:includedは、:visibleにたいするエイリアスである。

:active enable

enableは式を。指定する。その式がnilに評価された場合、メニューは選択不可になる。:enableは、:activeにたいするエイリアスである。

menu内の残りの要素は、メニューアイテムである。

メニューアイテムには、3要素のベクター[name callback enable]を指定できる。ここでnameはメニューアイテム名(文字列)、callbackはアイテム選択時に実行するコマンド、または評価される式である。enableは式であり、nilに評価された場合、そのアイテムにたいする選択は無効になる。

かわりに、メニューアイテムは以下の形式をもつかもしれない:

   [ name callback [ keyword arg ]... ]

ここでnamecallbackは上記と同じ意味をもち、オプションのkeywordargの各ペアーは、以下のいずれかである:

:keys keys

keysは、メニューアイテムにたいする等価なキーボード入力(文字列)である。等価なキーボード入力は自動的に計算されるので、通常は必要ない。keysは、表示される前にsubstitute-command-keysにより展開される(Substituting Key Bindings in Documentationを参照)。

:key-sequence keys

keysは、最初にメニューを表示されるかをする際、Emacsを高速化するヒントになる。等価なキーボード入力のないことが既知の場合は、nilを指定すべきである。それ以外では、メニューアイテムにたいする等価なキーボード入力を指定する文字列、またはベクターを指定すべきである。

:active enable

enableには式を指定する。その式がnilに評価された場合、アイテムは選択不可になる。enableは、:activeにたいするエイリアスである。

:visible include

includeには式を指定する。その式がnilに評価された場合、アイテムは不可視になる。:includedは、:visibleにたいするエイリアスである。

:label form

formは、メニューアイテムのラベル(デフォルトはname)の役目をもつ値を取得するために表示される式である。

:suffix form

formは、動的に評価される式であり、値はメニューエントリーのラベルに結合される。

:style style

styleは、メニューアイテムの型を記述するシンボルであり、toggle(チェックボックス)、radio(ラジオボタン)、またはそれ以外(通常のメニューアイテムであることを意味する)のいずれかである。

:selected selected

selectedには式を指定し、その式の値が非nilのときはチェックボックス、またはラジオボタンが選択状態になる。

:help help

helpは、メニューアイテムを説明する文字列である。

かわりに、メニューアイテムに文字列を指定できる。その場合、文字列は選択不可なテキストとしてメニューに表示される。ダッシュから構成される文字列は、セパレーターとして表示される(Menu Separatorsを参照)

かわりに、メニューアイテムにmenuと同じフォーマットのリストを指定できる。これはサブメニューとなる。

以下は、easy-menu-defineを使用して、The Menu Bar内で定義したメニューと同等なメニューを定義する例である:

(easy-menu-define words-menu global-map
  "単語単位コマンドにたいするメニュー"
  '("Words"
     ["Forward word" forward-word]
     ["Backward word" backward-word]))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22 Major and Minor Modes

モード(mode)とは、Emacsをカスタマイズする定義のセットであり、編集時にオン/オフを切り替えることができます。モードには2つの種類があります。メジャーモード(major modes)とは、互いに排他なモードであり、特定の種類のテキストの編集にたいして使用されます。マイナーモード(minor modes)とは、ユーザーが個別に有効にすることができる機能を提供します。

このチャプターでは、メジャーモード、およびマイナーモードを記述する方法、モードラインにそれらを示す方法、そしてそれらのモードがユーザーが提供するフックを実行する方法について説明します。キーマップ(keymaps)や構文テーブル(syntax tables)のような関連するトピックについてはKeymapsおよびSyntax Tablesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.1 Hooks

フック(hook)とは、既存のプログラムから特定のタイミングで呼び出される関数(複数可)を格納することができる変数のことです。Emacsはカスタマイズ用にフックを提供します。ほとんどの場合は、initファイル内(The Init Fileを参照)でフックをセットアップしますが、Lispプログラムもフックをセットできます。標準的なフック変数のリストは、Standard Hooksを参照してください。

Emacsのほとんどのフックは、ノーマルフック(normal hooks)です。これらの変数は、引数なしで呼び出される、関数のリストを含んでいます。慣習により、フック名が‘-hook’で終わるフックは、そのフックがノーマルフックであることを意味します。わたしたちは、一貫した方法でフックを使用できるよう、すべてのフックが可能な限りノーマルフックとなるよう努力しています。

すべてのメジャーモードコマンドは、初期化の最終ステップの1つとして、モードフック(mode hook)と呼ばれるノーマルフックを実行するとみなされます。これにより、そのモードによりすでに作成されたバッファーローカル変数割り当てをオーバーライドすることにより、ユーザーがそのモードの動作をカスタマイズするのが簡単になります。ほとんどのマイナーモード関数も、最後にモードフックを実行します。しかし、フックは他のコンテキストでも使用されます。たとえばフックsuspend-hookは、Emacsが自身をサスペンド(Suspending Emacsを参照)する直前に実行されます。

フックにフック関数を追加するには、add-hook(Setting Hooksを参照)を呼び出す方法が推奨です。フック関数は、funcall(What Is a Function?を参照)が受け入れる任意の種類の関数を指定できます。ほとんどのフック変数の初期値はvoidです。add-hookは、これを扱う方法を知っています。add-hookにより、グローバルフック、またはバッファーローカルフックのどちらを追加することも可能です。

フック変数の名前が‘-hook’で終わらない場合は、それが恐らくアブノーマルフック(abnormal hook)であることを示しています。こええは、フック関数が引数とともに呼ぶ出されること、または何らかの方法により、そのリターン値が使用されることを意味します。その関数の呼び出し方は、フックのドキュメントに記載されています。アブノーマルフックとして関数を追加するためにadd-hookを使用できますが、その関数はフック呼び出しの慣習にしたがって記述しななければなりません。慣習により、アブノーマルフックの名前は‘-functions’で終わります。

変数の名前が‘-function’で終わる場合、その値は関数のリストではなく単一の関数です。add-hookを、単一関数フックのように修正して使用することはできないので、かわりにadd-functionを使用します(Advising Emacs Lisp Functionsを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.1.1 Running Hooks

このセクションでは、ノーマルフックを実行するために使用される、run-hooksについて説明します。また、さまざまな種類のアブノーマルフックを実行する関数についても説明します。

Function: run-hooks &rest hookvars

この関数は、引数として1つ以上のノーマルフック変数名をとり、各フックを順に実行する。引数はそれぞれ、ノーマルフック変数であるようなシンボルであること。これらの引数は、指定された順に処理される。

フック変数の値が非nilの場合、その値は関数のリストであること。run-hooksは、すべての関数を引数なしで1つずつ呼び出す。

フック変数の値には、単一の関数(ラムダ式、またはシンボルの関数定義)も指定でき、その場合run-hooksはそれを喚び出す。しかし、この使い方は時代遅れである。

フック変数がバッファーローカルな場合、グローバル変数のかわりにそのバッファーローカル変数が使用される。しかし、そのバッファーローカル変数が要素tを含む場合は、そのグローバルフック変数も同様に実行されるだろう。

Function: run-hook-with-args hook &rest args

この関数は、hook内のすべての関数に、1つの引数argsを渡して喚び出すことにより、アブノーマルフックを実行する。

Function: run-hook-with-args-until-failure hook &rest args

この関数は、各フック関数を順に呼び出すことによりアブノーマルフック関数を実行し、それらのうち1つがnilをリターンして“失敗”したときは停止する。それぞれのフック関数は、引数にargsを渡される。この関数は、フック関数の1つが失敗して停止した場合はnil、それ以外は非nil値をリターンする。

Function: run-hook-with-args-until-success hook &rest args

この関数は、各フック関数を順に呼び出すことによりアブノーマルフック関数を実行し、それらのうち1つが非nil値をリターンして“成功”したときは停止する。それぞれのフック関数は、引数にargsを渡される。この関数は、フック関数の1つが失敗して停止した場合はその値を、それ以外はnilをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.1.2 Setting Hooks

以下は、Lisp Interactionモードのときに、モードフックを使用してAuto Fillモードをオンに切り替える例です:

(add-hook 'lisp-interaction-mode-hook 'auto-fill-mode)
Function: add-hook hook function &optional append local

この関数は、フック変数に関数functionを追加する手軽な方法である。ノーマルフックと同じように、アブノーマルフックにたいしてもこの関数を使用できる。functionには、正しい数の引数を受け付ける任意のLisp関数を指定できる。たとえば、

(add-hook 'text-mode-hook 'my-text-hook-function)

は、text-mode-hookと呼ばれるフックにmy-text-hook-functionを追加する。

hook内にfunctionがすでに存在する場合(比較にはequalを使用)、add-hookは2回目の追加を行わない。

functionのプロパティpermanent-local-hookが非nilの場合、kill-all-local-variables(またはメジャーモードを変更しても)、そのフック変数のローカル値から関数を削除しない。

ノーマルフックにたいして、フック関数は実行される順序に無関係であるようにデザインされるべきである。順序への依存は、トラブルを招く。とはいえ、その順序は予測可能である。通常、functionはフックリストの先頭に追加されるので、(他のadd-hook呼び出しがなければ)それは最初に実行される。オプション引数appendが非nilの場合、新たなフック関数はフックリストの最後に追加され、実行されるのも最後になる。

add-hookは、hookがvoidのとき、または値が単一の関数の場合、値を関数リストにセットまたは変更して、それらを扱うことができる。

localが非nilの場合、それはグローバルフックリストではなくバッファーローカルフックリストにfunctionを追加する。これはフックをバッファーローカルにして、そのバッファーローカルな値にtを追加する。バッファーローカルな値へのtの追加は、ローカル値と同じようにデフォルト値でもフック関数を実行するためのフラグである。

Function: remove-hook hook function &optional local

この関数は、フック変数hookからfunctionを削除する。これは、equalを使用してfunctionhook要素を比較するので、その比較はシンボルとラムダ式の両方で機能する。

localが非nilの場合、それはグローバルフックリストではなく、バッファーローカルフックリストからfunctionを削除する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2 Major Modes

メジャーモードは特定の種類のテキスト編集にEmacsを特化します。すべてのバッファーは1度に1つのメジャーモードをもちます。すべてのメジャーモードは、メジャーモードコマンド(major mode command)に関連付けられ、そのコマンド名は‘-mode’で終わるべきです。このコマンドは、ローカルキーマップのようなさまざまなバッファーローカル変数をセットすることにより、カレントバッファーないでそのモードに切り替える配慮をします。Major Mode Conventionsを参照してください。

Fundamentalモードと呼ばれるはもっとも特化されていないメジャーモードであり、モード特有な定義や変数セッティングをもちません。

Command: fundamental-mode

これは、Fundamentalモードにたいするメジャーモードコマンドである。他のモードコマンドと異なり、このモードはカスタマイズしてはならないことになっているので、モードフックは何も実行されない(Major Mode Conventionsを参照)。

メジャーモードを記述するもっとも簡単な方法は、マクロdefine-derived-modeを使用する方法です。これは、既存のメジャーモードを変形して、新たなモードをセットアップします。Defining Derived Modesを参照してください。define-derived-modeは多くのコーディング規約を自動的に強要するので、たとえ新たなモードが他のモードから明示的に派生されない場合でも、わたしたちはdefine-derived-modeの使用を推奨します。派生元とするための一般的なモードについては、Basic Major Modesを参照してください。

標準的なGNU EmacsのLispディレクトリーツリーには、いくつかのメジャーモードがtext-mode.eltexinfo.ellisp-mode.elrmail.elのようなファイルとして含まれています。モードの記述方法を確認するために、これらのライブラリーを学ぶことができます。

User Option: major-mode

この変数のバッファーローカル値は、カレントのメジャーモードにたいするシンボルを保持する。この変数のデフォルト値は、新たなバッファーにたいするデフォルトのメジャーモードを保持する。標準的なデフォルト値は、fundamental-modeである。

デフォルト値がnilの場合、C-x b(switch-to-buffer)のようなコマンドを通じてEmacsが新たなバッファーを作成したとき、新たなバッファーは以前カレントだったバッファーのメジャーモードになる。例外として、以前のバッファーのメジャーモードのシンボルプロパティmode-classが値specialをもつ場合、新たなバッファーはFundamentalモードになる(Major Mode Conventionsを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.1 Major Mode Conventions

メジャーモードにたいするすべてのコードはさまざまなコーディング規約にしたがうべきであり、それらの規約にはローカルキーマップおよび構文テーブルの初期化、関数名や変数名、フックにたいする規約が含まれます。

define-derived-modeマクロを使用した場合は、これらの規約を自動的に配慮します。Defining Derived Modesを参照してください。Fundamentalモードは、Emacsのデフォルト状態を表すモードなにで、これらの規約が当てはまらないことに注意してください。

以下の規約リストは、ほんの一部です。一般的に、すべてのメジャーモードは、Emacs全体が首尾一貫するよう、他のEmacsメジャーモードとの一貫性を目指すべきです。ここで、この問題を洗い出すすべての想定される要点をリストするのは不可能です。Emacs開発者が、自身の開発するメジャーモードが通常の規約を逸脱する領域を示す場合は、互換性を保つようにしてください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.2 How Emacs Chooses a Major Mode

ファイルをvisitするとき、ファイル名やファイル自体の内容などの情報を元に、Emacsはそのバッファーにたいするメジャーモードを選択します。また、ファイルのテキスト内で指定されたローカル変数も処理します。

Command: normal-mode &optional find-file

この関数は、カレントバッファーにたいして適切なメジャーモードと、バッファーローカル変数のバインディングを設定する。これはまずset-auto-mode(以下参照)を呼び出し、その後にhack-local-variablesを実行してパース処理を行って、そのファイルのローカル変数(File Local Variablesを参照)を適切にバインド、または評価する。

normal-modefind-file引数が非nilの場合、normal-modefind-file関数が自身を呼び出したとみなす。この場合、normal-modeはそのファイル内の‘-*-’行の、またはファイルの最後にあるローカル変数を処理するかもしれない。これを行うかどうかは、変数enable-local-variablesが制御する。ファイルのローカル変数セクションの構文は、See Local Variables in Files in The GNU Emacs Manualを参照のこと。

インタラクティブにnormal-modeを実行した場合、引数find-fileは通常nilである。この場合、normal-modeは無条件に任意のファイルローカル変数を処理する。

この関数は、メジャーモードを選択するためにset-auto-modeを呼び出す。この関数がモードを特定しない場合、そのバッファーのmajor-mode(以下参照)のデフォルト値により決定されるメジャーモードに留まる。

normal-modeは、メジャーモードコマンド呼び出しの周囲にcondition-caseを使用するので、エラーはcatchされて、‘File mode specification error’とともに、元のエラーメッセージがその後に報告される。

Function: set-auto-mode &optional keep-mode-if-same

この関数は、カレントバッファーにたいして適切なメジャーモードを選択する。この選択は、関数自身の(優先順位による)決定にもとづく。優先順位は、‘-*-行、ファイル終端近傍の任意の‘mode:’ローカル変数、‘#!行(interpreter-mode-alistを使用)、バッファーの先頭のテキスト(magic-mode-alistを使用)、最後がvisitされるファイル名(auto-mode-alistを使用)の順である。How Major Modes are Chosen in The GNU Emacs Manualを参照のこと。enable-local-variablesnilの場合、set-auto-modeは‘-*-行、およびファイル終端近傍にたいして、modeタグのチェックを何もしない。

モード特定のためにファイル内容をスキャンするのがふさわしくないファイルタイプがいくつかある。たとえば、tarアーカイブファイルの終わり付近に、特定のファイルにたいしてモードを指定するローカル変数セクションをもつアーカイブメンバーファイルが、たまたま含まれているかもしれない。これは、そのファイルを含むtarファイルに適用されるべきではないだろう。同様に、tiffイメージファイルが、‘-*-パターンにマッチするように見える行を、最初の行に偶然含むかもしれない。これらの理由により、これらのファイル拡張子はどちらもinhibit-local-variables-regexpsリストのメンバーになっている。Emacsが、(モード指定に限らず)ファイルから任意の種類のローカル変数を検索することを防ぐには、このリストにパターンを追加する。

keep-mode-if-sameが非nilの場合は、すでにそのバッファーが適切なメジャーモードをもつとき、この関数はモードコマンドを呼び出さない。たとえばset-visited-file-nameは、ユーザーがセットしたかもしれないバッファーローカル変数をkillするのを防ぐために、これをtにセットする。

Function: set-buffer-major-mode buffer

この関数は、bufferのメジャーモードを、major-modeのデフォルト値にセットする。major-modenilの場合は、(それが適切なら)カレントバッファーのメジャーモードを使用する。例外として、bufferの名前が*scratch*の場合は、モードをinitial-major-modeにセットする。

バッファーを作成する低レベルのプリミティブはこの関数を使用しないが、switch-to-bufferfind-file-noselectのような中位レベルのコマンドは、バッファーを作成するときは、常にこの関数を使用する。

User Option: initial-major-mode

この変数の値は、*scratch*バッファーの初期のメジャーモードを決定する。値は、メジャーモードコマンドであるようなシンボルであること。デフォルト値はlisp-interaction-modeである。

Variable: interpreter-mode-alist

この変数は、‘#!’行内のコマンドインタープリターを指定するスクリプトにたいして使用するメジャーモードを指定する。変数の値は、(regexp . mode)の形式の要素をもつalistである。これは、そのファイルが\\`regexp\\'にマッチするインタープリターを指定する場合は、modeを使用することを意味する。たとえば、デフォルト要素の1つは("python[0-9.]*" . python-mode)である。

Variable: magic-mode-alist

この変数の値は、(regexp function)という形式の要素をもつalistである。ここで、regexpは正規表現、functionは関数、またはnilである。ファイルをvisitした後に、バッファーの先頭のテキストがregexpにマッチした場合、functionが非nilならset-auto-modefunctionを呼び出す。functionnilの場合は、auto-mode-alistがモードを決定する。

Variable: magic-fallback-mode-alist

これはmagic-mode-alistと同様に機能するが、そのファイルにたいしてauto-mode-alistがモードを指定しない場合だけ処理される点が異なる。

Variable: auto-mode-alist

この変数は、ファイル名パターン(正規表現)と対応するメジャーモードコマンドの連想配列を含む。通常、ファイル名パターンは、‘.el’や‘.c’のようなサフィックスをテストするが、必須ではない。このalistの通常の要素は(regexp . mode-function)のようになる。

たとえば、

(("\\`/tmp/fol/" . text-mode)
 ("\\.texinfo\\'" . texinfo-mode)
 ("\\.texi\\'" . texinfo-mode)
 ("\\.el\\'" . emacs-lisp-mode)
 ("\\.c\\'" . c-mode)
 ("\\.h\\'" . c-mode)
 …)

バージョン番号およびバックアップ用サフィックスをもつファイルをvisitしたとき、それらはfile-name-sans-versions(File Name Componentsを参照)を使用して展開されたファイル名(Functions that Expand Filenamesを参照)から取り除かれてregexpとマッチされて、set-auto-modeは対応するmode-functionを呼び出す。この機能により、ほとんどのファイルにたいしてEmacsが適切なメジャーモードを選択することが可能になる。

auto-mode-alistの要素が(regexp function t)という形式の場合は、functionを呼び出した後、Emacsは前回マッチしなかったファイル名部分にたいしてマッチするために、再度auto-mode-alistを検索する。この機能は、圧縮されたパッケージにたいして有用である。("\\.gz\\'" function t)という形式のエントリーは、ファイルを解凍してから、‘.gz’抜きのファイル名にたいして適切なモードに解凍されたファイルを配す。

以下はauto-mode-alistの先頭に、複数のパターンペアーを追加する方法の例である(あなたは、initファイル内でこの種の式を使ったことがあるかもしれない)。

(setq auto-mode-alist
  (append
   ;; ドットで始まる(ディレクトリー名付きの)ファイル名
   '(("/\\.[^/]*\\'" . fundamental-mode)
     ;; ドットのないファイル名
     ("/[^\\./]*\\'" . fundamental-mode)
     ;; .C’で終わるファイル名
     ("\\.C\\'" . c++-mode))
   auto-mode-alist))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.3 Getting Help about a Major Mode

describe-mode関数は、メジャーモードに関する情報を提供します。これは通常、C-h mにバインドされています。この関数は、変数major-mode(Major Modesを参照)の値を使用します。すべてのメジャーモードがこの変数をセットする必要があるのは、これが理由です。

Command: describe-mode &optional buffer

このコマンドは、カレントバッファーのメジャーモードとマイナーモードのドキュメントを表示する。この関数は、メジャーモードおよびマイナーモードのコマンドのドキュメント文字列を取得するために、documentation関数を使用する(Access to Documentation Stringsを参照)。

buffer引数に非nilを指定してLispから呼び出された場合、この関数はカレントバッファーではなく、そのバッファーのメジャーモードとマイナーモードのドキュメントを表示する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.4 Defining Derived Modes

新しいメジャーモードを定義する推奨された方法は、define-derived-modeを使用して既存のメジャーモードから派生させる方法です。それほど近いモードが存在しない場合はtext-modespecial-mode、またはprog-modeから継承するべきです。Basic Major Modesを参照してください。これらがどれも適切でない場合は、fundamental-modeから継承することができます(Major Modesを参照)。

Macro: define-derived-mode variant parent name docstring keyword-args… body…

このマクロは、variantをメジャーモードコマンドとして定義し、nameをモード名の文字列形式とする。variantparentは、クォートされていないシンボルであること。

新たなコマンドvariantは、関数parentを呼び出すよう定義され、その後その親モードの特定の性質をオーバーライドする。

これらに加えて、bodyparentのその他の性質をオーバーライドする方法を指定できます。コマンドvariantはー、通常のオーバーライドをセットアップした後、そのモードのフックを実行する直前にbody内のフォームを評価します。

parentが非nilmode-classシンボルプロパティをもつ場合、define-derived-modevariantmode-classプロパティに、同じ値をセットします。これは、たとえばparentがspecialモードの場合は、variantもspecialモードになることを保証します(Major Mode Conventionsを参照)。

parentにたいしてnilを指定することもできます。これにより、新たなモードは親をもたなくなります。その後、define-derived-modeは上述のように振る舞いますが、当然parentにつながるすべてのアクションは省略されます。

引数docstringは、新たなモードにたいするドキュメント文字列を指定します。define-derived-modeは、このドキュメント文字列の最後にそのモードフックに関する一般的な情報と、その後にそのモードのキーマップを追加します。docstringを省略した場合は、define-derived-modeがドキュメント文字列を生成します。

keyword-argsは、キーワードと値のペアーです。値は評価されます。現在、以下のキーワードがサポートされています:

:syntax-table

新たなモードにたいする構文テーブルを明示的に指定するために、これを使用できる。nil値を指定した場合、新たなモードはparentと同じ構文テーブル、parentnilの場合は標準的な構文テーブルを使用する(これは、nil値の非キーワード引数は引数を指定しないのと同じという通常の慣習にはしたがわないことに注意されたい)。

:abbrev-table

新たなモードにたいするabbrevテーブルを明示的に指定するために、これを使用できる。nil値を指定した場合、新たなモードはparentと同じabbrevテーブル、parentnilの場合は、fundamental-mode-abbrev-tableを使用する(繰り返すが、nil値はこのキーワードを指定しないことではない)。

:group

これが指定された場合、値はそのモードにたいするカスタマイズグループ(customization group)であること(すべてのメジャーモードがカスタマイズグループをもつ訳ではない)。(まだ実験的かつ未公表だが)現在のところ、これを使用するのはcustomize-modeコマンドだけである。define-derived-modeは、指定されたカスタマイズグループを自動的に定義しない

以下は架空の例である:

(define-derived-mode hypertext-mode
  text-mode "Hypertext"
  "ハイパーテキスト用のメジャーモード
\\{hypertext-mode-map}"
  (setq case-fold-search nil))

(define-key hypertext-mode-map
  [down-mouse-3] 'do-hyper-link)

define-derived-modeが自動的に行うので、この定義内にinteractive指定を記述してはならない。

Function: derived-mode-p &rest modes

この関数は、シンボルmodesで与えられたメジャーモードのいずれかから、カレントメジャーモードが派生された場合は非nilをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.5 Basic Major Modes

Fundamentalモードは別として、他のメジャーモードの一般的な派生元となるメジャーモードが3つあります。それはTextモード、Progモード、およびSpecialです。Textモードはその本来もつ機能から有用なモードです(たとえば.txtファイルの編集など)。一方、ProgモードとSpecialモードは主にそのようなモード以外のモードの派生元として存在します。

新たなモードは、直接または間接を問わず、可能な限りれら3つのモードから派生させるべきです。その理由の1つは、関連のあるモードファミリー全体(たとえばすべてのプログラミング言語のモード)にたいして、ユーザーが単一のモードフックをカスタマイズできる空からです。

Command: text-mode

Textモードは、人間の言語を編集するためのメジャーモードである。このモードは、文字‘"’および‘\’を区切り文字構文(punctuation syntax: Table of Syntax Classesを参照)としてもち、M-TABispell-complete-wordにバインドする(Spelling in The GNU Emacs Manualを参照)。

Textモードから派生されたメジャーモードの例として、HTMLモードがある。SGML and HTML Modes in The GNU Emacs Manualを参照のこと。

Command: prog-mode

Progモードは、プログラミング言語のソースコードを含むバッファーにたいする、基本的なメジャーモードである。Emacsビルトインのプログラミング言語用メジャーモードは、このモードから派生されている。

Progモードは、parse-sexp-ignore-commentst(Motion Commands Based on Parsingを参照)にバインドし、bidi-paragraph-directionleft-to-right(Bidirectional Displayを参照)にバインドする。

Command: special-mode

Specialモードは、ファイルから直接ではなく、Emacsにより特別(specially)に生成されたテキストを含むバッファーにたいする、基本的なメジャーモードである。Specialモードから派生されたメジャーモードは、mode-classプロパティにspecialーが与えられる(Major Mode Conventionsを参照)。

Specialモードは、バッファーを読み取り専用にセットする。このモードのキーマップは、いくつかの一般的なバインディングを定義し、それにはquit-windowにたいするqrevert-buffer(Revertingを参照)にたいするgが含まれる。

Specialから派生されたメジャーモードの例としてはBuffer Menuモードがあり、これは*Buffer List*バッファーにより使用される。Listing Existing Buffers in The GNU Emacs Manualを参照のこと。

これらに加えて、表形式データのバッファーにたいするモードはTabulated Listモードから継承できます。このモードは、Specialモードから順に派生されているモードです。Tabulated List modeを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.6 Mode Hooks

すべてのメジャーモードコマンドは、モード独自のノーマルフックchange-major-mode-after-body-hook、そのモードのモードフック、ノーマルフックafter-change-major-mode-hookを実行することにより終了すべきです。これは、run-mode-hooksを呼び出すことにより行われます。もしそのモードが派生モードなら、自身のbody内で他のメジャーモード(親モード)を呼び出す場合は、親モードが自身でこれらのフックを実行しないように、delay-mode-hooksの中でこれを行うべきです。そのかわりに、派生モードは親のモードフックも実行する、run-mode-hooksを呼び出すのです。Major Mode Conventionsを参照してください。

Emacs 22より前のバージョンのEmacsには、delay-mode-hooksがありません。また、Emacs 24より前のバージョンには、change-major-mode-after-body-hookがありません。ユーザー実装のメジャーモードがrun-mode-hooksを使用せず、これらの新しい機能を使用するようにアップデートされていないときは、これらのメジャーモードは以下の慣習に完全にしたがわないでしょう。それらのモードは、親のモードフックをあまりに早く実行したり、after-change-major-mode-hookの実行に失敗するかもしれません。そのようなメジャーモードに遭遇した場合は、以下の慣習にしたがって修正をお願いします。

define-derived-modeを使用してメジャーモードを定義したときは、自動的にこれらの慣習にしたがうことが確実になります。define-derived-modeを使用せずにメジャーモードを“手動”で定義した場合は、これらの慣習を自動的に処理するように、以下の関数を使用してください。

Function: run-mode-hooks &rest hookvars

メジャーモード、この関数を使用してそれらのモードフックを実行すべきである。これはrun-hooks(Hooksを参照)と似ているが、change-major-mode-after-body-hookafter-change-major-mode-hookも実行する。

この関数が、delay-mode-hooksフォーム実行中に呼び出されたときは、それらのフックを即座には実行しない。かわりに、次のrun-mode-hooks呼び出しでそれらを実行するようにアレンジする。

Macro: delay-mode-hooks body…

あるメジャーモードコマンドが他のメジャーモードコマンドを呼び出すとき、それはdelay-mode-hooksの内部で行われるべきである。

このマクロはbodyを実行するが、body実行中はすべてのrun-mode-hooks呼び出しにたいして、それらのフックの実行を遅延するよう指示する。それらのフックは、実際にはdelay-mode-hooks構造の最後の後、次のrun-mode-hooks呼び出しの間に実行されるだろう。

Variable: change-major-mode-after-body-hook

これは、run-mode-hooksにより実行されるノーマルフックである。これは、そのモードのフックの前に実行される。

Variable: after-change-major-mode-hook

これは、run-mode-hooksにより実行されるノーマルフックである。これは、すべての適切に記述されたメジャーモードコマンドの一番最後に実行される。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.7 Tabulated List mode

Tabulated Listモードとは、表形式データ(エントリーから構成されるデータであり、各エントリーはそれぞれテキストの1行を占め、エントリーの内容は列に分割されるようなデータ)を表示するためのメジャーモードです。Tabulated Listモードは、行列の見栄えよくプリントする機能、および各列の値に応じて行をソートする機能を提供します。これは、Specialモードから派生されたモードです(Basic Major Modesを参照)。

Tabulated Listモードは、より特化したメジャーモードの親モードとして使用されることを意図しています。例としては、Process Menuモード(Process Informationを参照)や、Package Menuモード(Package Menu in The GNU Emacs Manualを参照)が含まれます。

このような派生されたモードは、tabulated-list-modeを2つ目の引数に指定して、通常の方法でdefine-derived-modeを使用するべきです(Defining Derived Modesを参照)。define-derived-modeフォームのbodyは、以下にドキュメントされている変数に値を割り当てることにより、表形式データのフォーマットを指定するべきです。その後、ヘッダー行を初期化するために関数tabulated-list-init-headerを呼び出すべきです。

派生されたモードは、リスティングコマンドも定義するべきです。これはモードコマンドではなく、(M-x list-processesのように)ユーザーが呼び出すコマンドです。リスティングコマンドは、バッファーを作成または切り替えて、派生モードをオンにして、表形式データを指定し、最後にそのバッファーを事前設定(populate)するためにtabulated-list-printを呼び出すべきです。

Variable: tabulated-list-format

このバッファーローカル変数は、表形式データのフォーマットを指定する。値はベクターで、ベクターの各要素はデータ列を表すリスト(name width sort)である。ここで

Variable: tabulated-list-entries

このバッファーローカル変数は、Tabulated Listバッファー内に表示されるエントリーを指定する。値にはリスト、または関数のいずれかであること。

値がリストの場合、各リスト要素は1つのエントリーに対応し、(id contents)という形式であること。ここで

それ以外の場合、値は引数なしで呼び出され上記形式のリストをリターンする関数であること。

Variable: tabulated-list-revert-hook

このノーマルフックはTabulated Listバッファーのリバートに先立ち実行される。派生モードは、tabulated-list-entriesを再計算するために、このフックに関数を追加できる。

Variable: tabulated-list-printer

この変数の値は、ポイント位置にエントリー(エントリーを終端する改行を含む)を挿入するために呼び出される関数である。この関数は、tabulated-list-entriesと同じ意味をもつ2つの引数idcontentsを受け取る。デフォルト値は、エントリーをそのまま挿入する関数である。より複雑な方法によりTabulated Listモードを使用するモードは、別の関数を指定できる。

Variable: tabulated-list-sort-key

この変数の値は、Tabulated Listバッファーにたいするカレントのソートキーを指定する。nilの場合、ソートは行われていない。それ以外では、(name . flip)という形式の値をもつ。ここでnametabulated-list-format内の列目の1つとマッチする文字列、flipが非nilの場合は逆順でのソートを意味する。

Function: tabulated-list-init-header

この関数は、Tabulated Listバッファーにたいするheader-line-formatを計算してセットし、列ヘッダー上でのクリックでソートを可能にするキーマップをヘッダー行に割り当てる。

Tabulated Listから派生したモードは、上記の変数(特にtabulated-list-formatをセットした後のみ)をセットした後にこれを呼び出すべきである。

Function: tabulated-list-print &optional remember-pos

この関数は、カレントバッファーにエントリーを準備(populate)する。これはリスティングコマンドとして呼び出されるべきである。この関数は、バッファーを消去してtabulated-list-entriesで指定されるエントリーをtabulated-list-sort-keyにしたがってソートした後、各エントリーを挿入するためにtabulated-list-printerで指定される関数を呼び出す。

オプション引数remember-posが非nilの場合、この関数はカレント行でid要素を探して、もしあればすべてのエントリーを(再)挿入して、その後へそのエントリーの移動を試みる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.8 Generic Modes

genericモード (generic mode:汎用モード))とは、コメント構文にたいする基本的なサポートとFont Lockモードをもつ、シンプルなメジャーモードです。genericモードを定義するには、マクロdefine-generic-modeを使用します。define-generic-modeの使い方の例は、ファイルgeneric-x.elを参照してください。

Macro: define-generic-mode mode comment-list keyword-list font-lock-list auto-mode-list function-list &optional docstring

このマクロは、mode(クォートされていないシンボル)という名前のgenericモードコマンドを定義する。オプション引数docstringは、そのモードコマンドにたいするドキュメント文字列である。これを与えない場合は、define-generic-modeがデフォルトのドキュメント文字列を生成する。

引数comment-listは、要素が文字、2文字以下の文字列、またはコンスセルである。文字か文字列の場合には、そのモードの構文テーブル内で“コメント開始識別子”としてセットアップされる。エントリーがコンスセルの場合、CARは“コメント開始識別子”、CDRは“コメント終了識別子”としてセットアップされる(行末によりコメントを終端させたい場合は、後者にnilを使用する)。構文テーブルのメカニズムには、実際にコメントの開始および終了識別子に関する制限があることに注意されたい。 Syntax Tablesを参照のこと。

引数keyword-listは、font-lock-keyword-faceでハイライトするキーワードのリストである。キーワードは文字列であること。一方、font-lock-listはハイライトするための追加の式リストである。このリストの各要素は、font-lock-keywordsの要素と同じ形式をもつべきである。Search-based Fontificationを参照のこと。

引数auto-mode-listは、変数auto-mode-alistに追加する正規表現のリストである。これらの式は、マクロ呼び出しの展開時ではなく、define-generic-modeの実行時に追加される。

最後にfunction-listは、追加セットアップのためにモードコマンドに呼び出される関数のリストである。これらの関数は、モードフック変数mode-hookの実行の直前に呼び出される。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.2.9 Major Mode Examples

Textモードは、Fundamentalを除き、おそらくもっともシンプルなモードです。上述した慣習の多くを説明するために、以下にtext-mode.elの抜粋を示します:

;; このモード用に構文テーブルを作成
(defvar text-mode-syntax-table
  (let ((st (make-syntax-table)))
    (modify-syntax-entry ?\" ".   " st)
    (modify-syntax-entry ?\\ ".   " st)
    ;; M-cで`hello'が`hello'でなく`Hello'になるよう`p'を追加
    (modify-syntax-entry ?' "w p" st)
    st)
  "`text-mode'で使用される構文テーブル")

;; このモード用にキーマップを作成
(defvar text-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "\e\t" 'ispell-complete-word)
    map)
  "`text-mode'のキーマップ
`mail-mode'、`outline-mode'、`indented-text-mode'のような
他の多くのモードはこのマップ内で定義した全コマンドを継承する")

そして、実際にモードコマンドが定義される方法です:

(define-derived-mode text-mode nil "Text"
  "人間が読むために記述されたテキストを編集するためのメジャーモード
このモードではパラグラフを区切るのはブランク行か空白行だけである
したがって適応型フィル(adaptive filling)の全恩恵を受けられる
 (変数`adaptive-fill-mode'を参照のこと)
\\{text-mode-map}
Textモードのオンによりノーマルフック`text-mode-hook'が実行される"
  (set (make-local-variable 'text-mode-variant) t)
  (set (make-local-variable 'require-final-newline)
       mode-require-final-newline)
  (set (make-local-variable 'indent-line-function) 'indent-relative))

(indent-relativeがデフォルト値の現在では、最後の行は冗長なので、将来のバージョンで削除するつもりです。)

3つのLisp用モード(Lispモード、Emacs Lispモード、Lisp Interactionモード)は、Textモードより多くの機能をもち、それにふさわしくコードもより複雑です。そのようなモードの記述方法を説明するために、lisp-mode.elの抜粋を示します。

以下は、Lispモードの構文テーブルとabbrevテーブルを定義する方法です:

;; モード固有のテーブル変数の作成
(defvar lisp-mode-abbrev-table nil)
(define-abbrev-table 'lisp-mode-abbrev-table ())

(defvar lisp-mode-syntax-table
  (let ((table (copy-syntax-table emacs-lisp-mode-syntax-table)))
    (modify-syntax-entry ?\[ "_   " table)
    (modify-syntax-entry ?\] "_   " table)
    (modify-syntax-entry ?# "' 14" table)
    (modify-syntax-entry ?| "\" 23bn" table)
    table)
  "`lisp-mode'で使用される構文テーブル")

Lisp用の3つのモードは、コードの多くを共有します。たとえば、以下の関数呼び出しにより、さまざまな変数がセットされます:

(defun lisp-mode-variables (&optional syntax keywords-case-insensitive)
  (when syntax
    (set-syntax-table lisp-mode-syntax-table))
  (setq local-abbrev-table lisp-mode-abbrev-table)
  …

その中でも特に、以下の関数はLispコメントを処理するために、変数comment-startをセットアップします:

  (make-local-variable 'comment-start)
  (setq comment-start ";")
  …

これら異なるLisp用モードは、微妙に異なるキーマップをもちます。たとえば、LispモードはC-c C-zrun-lispにバインドしますが、他のLisp用モードはこれを行いません。とはいえ、すべてのLisp用モードに共通なコマンドがいくつかあります。以下のコードは、それらの共通コマンドをセットアップします:

(defvar lisp-mode-shared-map
  (let ((map (make-sparse-keymap)))
    (define-key map "\e\C-q" 'indent-sexp)
    (define-key map "\177" 'backward-delete-char-untabify)
    map)
  "すべてのLisp用モードでコマンドを共有するためのキーマップ")

そして、以下がLispモードのためのキーマップをセットアップするコードです:

(defvar lisp-mode-map
  (let ((map (make-sparse-keymap))
	(menu-map (make-sparse-keymap "Lisp")))
    (set-keymap-parent map lisp-mode-shared-map)
    (define-key map "\e\C-x" 'lisp-eval-defun)
    (define-key map "\C-c\C-z" 'run-lisp)
    …
    map)
  "Keymap for ordinary Lisp mode.
All commands in `lisp-mode-shared-map' are inherited by this map.")

最後は、Lispモードのためのメジャーモードコマンドです:

(define-derived-mode lisp-mode prog-mode "Lisp"
  "GNU Emacs Lisp以外のLispコードを編集するためのメジャーモード
コマンド:
後方に移動させるかのようにタブをスペースに削除変換する。
パラグラフ区切りはブランク行。コメント開始はセミコロン。

\\{lisp-mode-map}
`run-lisp'はinferior Lispジョブの開始と既存ジョブ
から戻るための両方に使われるかもしれないことに注意

このモードへのエントリーにより、
`lisp-mode-hook'の値が非nilならそれを呼び出す"
  (lisp-mode-variables nil t)
  (set (make-local-variable 'find-tag-default-function)
       'lisp-find-tag-default)
  (set (make-local-variable 'comment-start-skip)
       "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\)\\(;+\\|#|\\) *")
  (setq imenu-case-fold-search t))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.3 Minor Modes

マイナーモード(minor mode)は、メジャーモードの選択とは無関係にユーザーが有効、あるいは無効にする可能性のある、オプション機能を使用を提供します。マイナーモードは個別に、あるいは組み合わせて有効にできます。

ほとんどのマイナーモードは、メジャーモードとは独立した機能を実装し、それゆえにほとんどのメジャーモードとともに使用することができます。たとえば、Auto Fillモードはテキスト挿入を許す任意のメジャーモードとともに機能します。しかし少数ながら、特定のメジャーモードに特化した少数のマイナーモードもあります。たとえば、Diff Auto Refineモードは、Diffモードとともに使用されることだけを意図したマイナーモードです。

理想的には、マイナーモードは他のマイナーモードの効果と無関係に、期待する効果をもつべきです。これは、任意の順序でマイナーモードをアクティブ、あるいは非アクティブにしても可能なはずです。

Variable: minor-mode-list

この変数の値は、すべてのマイナーモードコマンドのリストである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.3.1 Conventions for Writing Minor Modes

メジャーモードにあるように、マイナーモードの記述にも慣習があります。以下で、その慣習について説明します。これらの慣習にしたがうには、マクロdefine-minor-modeを使用するのがもっとも簡単な方法です。Defining Minor Modesを参照してください。

これらに加えて、メジャーモードにたいする慣習のいくつかは、マイナーモードにたいしても同様に適用されます。それらの慣習はグローバルシンボルの名前、初期化関数の最後でのフックの使用、キーマップおよびその他のテーブルの使用です。

マイナーモードは、可能ならばCustom(Customization Settingsを参照)を通じての有効化および無効化をサポートするべきです。これを行うには、モード変数はは通常は:type 'booleanとともにdefcustomで定義されるべきです。その変数をセットするだけではモードの有効化に不足なら、モードコマンドを呼び出すことによりモードを有効にする:setメソッドも指定するべきです。そして、その変数のドキュメント文字列にCustomを通じて変数をセットしなければ効果がないことを注記してください。さらに、その定義をautoload cookie(autoload cookieを参照)でマークして、その変数のカスタマイズによりモードを定義するライブラリーがロードされるように:requireを指定します。たとえば:

;;;###autoload
(defcustom msb-mode nil
  "msb-modeをトグルする
この変数を直接セットしても効果がない
\\[customize]か関数`msb-mode'を使用すること"
  :set 'custom-set-minor-mode
  :initialize 'custom-initialize-default
  :version "20.4"
  :type    'boolean
  :group   'msb
  :require 'msb)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.3.2 Keymaps and Minor Modes

マイナーモードはそれぞれ自身のキーマップをもつことができ、そのモードが有効になるとそのキーマップがアクティブになります。マイナーモード用のキーマップをセットアップするには、minor-mode-map-alistというalistに要素を追加します。Definition of minor-mode-map-alistを参照してください。

特定の自己挿入文字にたいして、自己挿入と同様に他の何かを行うように振る舞いを変更するのは、マイナーモードキーマップの1つの使い方です。(self-insert-commandをカスタマイズする別の方法は、post-self-insert-hookを通じて行う方法です。これ以外のself-insert-commandカスタマイズ用機能は特別なケースに限定されていて、abbrevモードとAuto Fillモードのためにデザインされています。self-insert-commandにたいする標準定義を、あなた独自の定義に置き換えることを試みてはなりません。エディターコマンドループは、この関数を特別に処理します。)

マイナーモードは、コマンドをC-cとその後の区切り文字より構成されるキーシーケンスにバインドするかもしれません。しかし、C-cとその後の{}<>:;のいずれかの文字、またはコントロール文字、数字より構成されるシーケンスは、メジャーモード用に予約されています。また、C-c letterはユーザー用に予約されています。Key Binding Conventionsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.3.3 Defining Minor Modes

マクロdefine-minor-modeは、1つの自己完結した定義内にモードを実装する便利な方法を提供します。

Macro: define-minor-mode mode doc [init-value [lighter [keymap]]] keyword-args… body…

このマクロは、名前がmode(シンボル)の新たなマイナーモードを定義する。これは、ドキュメント文字列としてdocをもつ、マイナーモードをトグルするための、modeという名前のコマンドを定義する。

トグルコマンドは1つのオプション(プレフィクス)引数をとる。引数なしでinteractiveに呼び出された場合は、そのモードのオンとオフをトグルする。正のプレフィクス引数はモードを有効にし、それ以外のプレフィクス引数はモードを無効にする。Lispから呼び出した場合、引数がtoggleの場合はモードをトグルし、引数が省略もしくはnilの場合はモードを有効にする。これはたとえば、メジャーモードフック内でマイナーモードを有効にするのを簡便にする。docnilの場合、このマクロは上記を説明するデフォルトのドキュメント文字列を提供する。

デフォルトでは、これはモードを有効にするとt、無効にするとnilにセットされる、modeという名前の変数も定義する。この変数は、init-valueに初期化される。通常では(以下参照)、この値はnilでなければならない。

文字列lighterは、モード有効時にモードライン内に何を表示するか指定する。これがnilの場合は、このモードはモードライン内に表示されない。

オプション引数keymapは、そのマイナーモードにたいするキーマップを指定する。非nilの場合、それは(値がキーマップであるような)変数の名前、キーマップ、または以下の形式のalistであること

(key-sequence . definition)

ここで、それぞれのkey-sequencedefinitionは、define-keyに渡すのに適した引数である(Changing Key Bindingsを参照)。keymapはキーマップまたはalistであり、これは変数mode-mapも定義する。

上記の3つの引数init-valuelighterkeymapは、keyword-argsが使用されたときは、(部分的に)省略できる。keyword-argsは、キーワードとその後の対応する値により構成され、いくつかのキーワードは特別な意味をもつ:

:group group

生成されるすべてのdefcustomフォームで使用されるカスタムグループ名。mode(後の‘-mode’がある場合はそれを除く)にたいするデフォルトである。警告: そのグループを定義するためdefgroupを正しく記述していない場合は、このデフォルトグループ名を使用してはならない。Defining Customization Groupsを参照のこと。

:global global

nilの場合、これはそのマイナーモードがバッファーローカルでなくグローバルであることを指定する。デフォルトはnil

マイナーモードをグローバルにしたときの効果の1つは、mode変数がカスタマイズ変数になることである。Customizeインターフェイスを通じてこの変数をトグルするとモードがオン、またはオフになり、変数の値は将来のEmacsセッション用に保存できるようになる(Saving Customizations in The GNU Emacs Manualを参照)。保存された変数が機能するためには、Emacsが開始されるたびにdefine-minor-modeフォームが確実に評価されるようにすべきである。Emacsの一部ではないパッケージにたいしては、:requireキーワードを指定するのが、これを行う一番簡単な方法である。

:init-value init-value

これは、init-value引数を指定するのと等しい。

:lighter lighter

これは、lighter引数を指定するのと等しい。

:keymap keymap

これは、keymap引数を指定するのと等しい。

:variable place

これは、そのモードの状態を格納するために使用される、デフォルトの変数modeを置き換える。これを指定した場合、mode変数は定義されず、すべてのinit-value引数は使用されない。placeは異なる名前の変数(あなた自身が定義しなければならない)、またはsetf関数とともに使用され得るすべてのもの(Generalized Variablesを参照)。placeにはコンス(get . set)も指定できる。ここで、getはカレント状態をリターンする式であり、setはそれをセットする1つの引数(状態)をとる関数である。

:after-hook after-hook

これは、モードフック実行後に評価される、単一のLispフォームを定義する。これはクォートすべきでない。

その他のすべてのキーワード引数は、変数modeにたいして生成されたdefcustomに直接渡される。

modeという名前のコマンドは、最初にmodeという名前の変数をセットする等の標準的な動作を処理した後に、もしあればbodyフォームを実行する。それからモードフック変数mode-hookを実行し、:after-hook内のフォームを評価して終了する。

init-valueの値はnilでなければなりません。ただし、(1)Emacsによりそのモードが事前ロードされている、または(2)たとえユーザーが要求しなくともモードを有効にするためにロードするのが容易な場合を除きます。たとえば、他の何かが有効でなければそのモードの効果がなく、常にそのタイミングでロードされるような場合は、デフォルトでそのモードを有効にすることに害はありません。しかし、この状況は通常はあり得ません。通常は、init-valueの値はnilでなければならないのです。

easy-mmode-define-minor-modeという名前は、このマクロにたいするエイリアスです。

以下は、define-minor-modeの使い方の例です:

(define-minor-mode hungry-mode
  "Hungryモードをトグルする。
引数なしでinteractiveに呼び出すとモードをトグルする。
正のプレフィクス引数でモードを有効に、その他のプレフィクス引数で
無効にする。Lispから呼び出す場合、引数を省略、またはnilなら
モードを有効に、`toggle'なら状態をトグルする。

Hungryモードが有効なときは、C-DELキーは、
最後を除く先行するすべての空白を飲み込む。
コマンド \\[hungry-electric-delete] を参照のこと。"
 ;; 初期値
 nil
 ;; モードラインの標示
 " Hungry"
 ;; マイナーモードのバインディング
 '(([C-backspace] . hungry-electric-delete))
 :group 'hunger)

これは、“Hungry mode”という名前のマイナーモード、モードをトグルするhungry-modeという名前のコマンド、モードが有効かどうかを示すhungry-modeという名前の変数、モードが有効なときそのキーマップを保持するhungry-mode-mapという名前の変数を定義します。これは、C-DELにたいするキーバインディングでキーマップを初期化します。また、変数hungry-modeをカスタムグループhungerに置きます。bodyフォームはありません — 多くのマイナーモードは必要としません。

以下は、これを記述する等価な方法です:

(define-minor-mode hungry-mode
  "Hungryモードをトグルする。
...省略..."
 ;; 初期値
 :init-value nil
 ;; モードラインへのインジケーター
 :lighter " Hungry"
 ;; マイナーモードのバインディング
 :keymap
 '(([C-backspace] . hungry-electric-delete)
   ([C-M-backspace]
    . (lambda ()
        (interactive)
        (hungry-electric-delete t))))
 :group 'hunger)
Macro: define-globalized-minor-mode global-mode mode turn-on keyword-args…

これは、global-modeという名前をグローバルにトグルする。この意味は、modeという名前のバッファーローカルなマイナーモードを、すべてのバッファーで有効、または無効にするということである。あるバッファー内でそのマイナーモードをオンにするには、関数turn-onを使用する。マイナーモードをオフにするには、-1を引数としてmodeを呼び出す。

モードをグローバルに有効にすると、それ以降ファイルをvisitすることにより作成されるバッファー、Fundamental以外のメジャーモードを使用するバッファーにも影響がある。しかし、Fundamentalで作成される新たなバッファーは検知しない。

これは、Customizeインターフェイス内でそのマイナーモードのオン/オフを切り替える、カスタムオプションglobal-mode(Customization Settings)を定義する。define-minor-modeと同様に、たとえば:requireを与える等により、毎回のEmacs開始時に確実にdefine-globalized-minor-modeフォームが評価されるようにすべきである。

グローバルマイナーモードのモード変数にたいしてカスタムグループを指定するには、keyword-args内で:group groupを使用する。

一般的には、グローバル化されたマイナーモードを定義するときは、ユーザーがバッファーごとにモードを使用(または無効に)できるように、非グローバル版も定義すべきである。ことにより、特定のメジャーモード内でそのモードのフックを使用することにより、グローバル有効化されたマイナーモードを無効にすることができるようになる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4 Mode Line Format

Emacsの各ウィンドウ(ミニバッファーウィンドウを除く)には通常、最下部にモードラインがあり、そのウィンドウ内に表示されたバッファーについてステータス情報がモードラインに表示されます。モードラインには、バッファー名、関連するファイル、再帰編集の深さ、およびメジャーモードやマイナーモードなどのような、そのバッファーに関する情報が含まれています。ウィンドウはヘッダーライン(header line)をもつこともでき、これはモードラインによく似ていますが、ウィンドウの最上部に表示されます。

このセクションでは、モードラインおよびヘッダーラインのコンテンツの制御の仕方について説明します。このチャプターにモードラインを含めた理由は、モードラインに表示される情報の多くが、有効化されたメジャーモードとマイナーモードに関係があるからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.1 Mode Line Basics

それぞれのモードラインのコンテンツは、バッファーローカル変数mode-line-formatにより指定されます(The Top Level of Mode Line Controlを参照)。この変数はモードライン構成(mode line construct)を保持します。これは、そのバッファーのモードラインに何を表示するかを制御するテンプレートです。header-line-formatの値は、同じ方法によりそのバッファーのヘッダーラインを指定します。同一のバッファーにたいするすべてのウィンドウは、同じmode-line-formatheader-line-formatを使用します。

効率的な理由により、Emacsは各ウィンドウのモードラインとヘッダーラインを、連続して再評価しません。たとえばウィンドウ設定(window configuration)の変更、バッファーの切り替え、バッファーのナローイング(narrowing)またはワイドニング(widening)、スクロール、バッファーの変更等、それを呼び出す状況が出現したときに、Emacsは再評価を行います。mode-line-formatheader-line-format(Variables Used in the Mode Lineを参照)により参照される任意の変数、またはテキストが表示される方法に影響を与えるデータ構造(Emacs Displayを参照)を変更した場合は、表示を更新するために関数force-mode-line-updateを使用するべきです。

Function: force-mode-line-update &optional all

この関数は、次の再表示サイクルの間に、すべての関連する変数の最新の値にもとづき、カレントバッファーのモードラインとヘッダーラインの更新をEmacsに強制する。オプション引数allが非nilの場合は、すべてのモードラインとヘッダーラインの更新を強制する。

この関数は、メニューバーとフレームタイトルの更新も強制する。

選択されたウィンドウのモードラインは、通常はフェイスmode-lineを使用して異なるカラーで表示されます。かわりに、他のウィンドウのモードラインは、フェイスmode-line-inactiveで表示されます。Facesを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.2 The Data Structure of the Mode Line

モードラインのコンテンツは、モードライン構成(mode line construct)と呼ばれるデータ構造により制御されます。モードライン構成はリスト、シンボル、数字を保持するバッファーローカル変数により構成されます。それぞれのデータ型は、以下で説明するようにモードラインの外見にたいして特別な意味をもちます。フレームタイトル(Frame Titlesを参照)とヘッダーライン(Window Header Linesを参照)にたいしても、同じデータ構造が使用されます。

固定文字列のようにシンプルなモードライン構成の場合もありますが、通常はモードライン構成のテキストを構築するために、固定文字列と変数の値を組み合わせる方法を指定します。これらの変数の多くは、その変数自体がその値によりモードライン構成を定義する変数です。

以下は、モードライン構成における、さまざまなデータ型の意味です:

string

モードライン構成においての文字列は、文字列内に%構成(%-constructs)を含む以外は、そのまま表現される。これらは、他のデータによる置換を意味する。%-Constructs in the Mode Lineを参照のこと。

文字列の一部がfaceプロパティをもつ場合は、バッファー内でそれらが表示されるときと同じように、テキスト表示を制御する。faceプロパティをもたない文字は、デフォルトのフェイスmode-line、またはmode-line-inactiveで表示される(Standard Faces in The GNU Emacs Manualを参照)。string内のhelp-echoプロパティとkeymapプロパティは、特別な意味をもつ。Properties in the Mode Lineを参照のこと。

symbol

モードライン構成においてのシンボルは、その値を意味する。モードライン構成としては、symbolの値はsymbolの位置に使用される。しかし、シンボルtnilは、値がvoidであるようなシンボルとして無視される。

例外が1つある。symbolの値が文字列の場合、それはそのまま表示され、%構成は認識されない。

symbolが“危険”とマークされていない(非nilrisky-local-variableプロパティをもつ)場合は、symbolの値中で指定されたテキストプロパティはすべて無視される。これには、symbolの値中の文字列のテキストプロパティ、同様に文字列内の:evalフォームと:propertizeフォームがすべて含まれる。(これはセキュリティー上の理由による。危険とマークされていない変数は、ユーザーへの問い合わせなしでファイル変数から自動的にセットされ得る。)

(string rest…)
(list rest…)

最初の要素が文字列またはリストであるようなリストは、すべての要素を再帰的に処理して、その結果を結合することを意味する。これは、モードライン構成において、もっとも一般的なフォームである。

(:eval form)

最初の要素がシンボル:evalであるようなリストは、formを評価して、その結果を表示する文字列として使用するよう指示する。この評価がファイルをロードできないことを確認すること。ファイルをロードすると、無限再帰が発生するかもしれない。

(:propertize elt props…)

最初の要素がシンボル:propertizeであるようなリストは、モードライン構成eltを再帰的に処理して、propsにより指定されるテキストプロパティに結果を加えるよう指示する。引数propsは、0個以上のtext-propertyvalueのペアーで構成されるべきである。

(symbol then else)

最初の要素がキーワード以外のシンボルであるようなリストは、条件文を指定する。その意味は、symbolの値に依存する。symbolが非nil値をもつ場合は、モードライン構成として、2つ目の要素thenが再帰的に処理され、それ以外は3つ目の要素elseが再帰的に処理される。elseは省略でき、その場合symbolの値がnilかvoidならば、モードライン構成は何も表示しない。

(width rest…)

最初の要素が整数であるようなリストは、restの結果の切り詰め、またはパディングを指定する。残りの要素restは、モードライン構成として再帰的に処理され、互いに結合される。widthが正の場合、結果の幅がwidthより少ないときは、右側にスペースがパディングされる。widthが負の場合、結果の幅が-widthより大きいときは、右側が切り詰められる。

たとえば、ウィンドウ最上部からのバッファー位置をパーセント表示するには、(-3 "%p")のようなリストを使用すればよい。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.3 The Top Level of Mode Line Control

変数mode-line-formatは、モードラインの全体的な制御を行います。

User Option: mode-line-format

この変数の値は、モードラインのコンテンツを制御するモードライン構成である。これは、すべてのバッファーにおいて、常にバッファーローカルである。

あるバッファー内でこの変数にnilをセットした場合、そのバッファーはモードラインをもたない(高さが1行しかないウィンドウも、モードラインを表示しない)。

mode-line-formatのデフォルト値は、mode-line-positionmode-line-modes(これはmode-nameminor-mode-alistの値を組み込む)のような、他の変数の値を使用するようデザインされています。mode-line-format自体を変更する必要があるモードは、ほとんどありません。ほとんどの用途にたいしては、mode-line-formatが直接、または間接的に参照する、いくつかの変数を修正すれば十分です。

mode-line-formatl自体の変更を行った場合、新たな値は他の様式でコンテンツを複製したり情報を表示するのではなく、デフォルト値(Variables Used in the Mode Lineを参照)に現れるのと同じ変数を使用するべきです。この方法を使用すれば、ユーザーや(display-timeやメジャーモードのような)Lispプログラムにより行われたカスタマイズは、それらの変数への変更を通じて、効力を保ちます。

以下は、Shellモードにたいして有用かもしれない、架空のmode-line-formatの例です(実際には、Shellモードはmode-line-formatをセットしない):

(setq mode-line-format
  (list "-"
   'mode-line-mule-info
   'mode-line-modified
   'mode-line-frame-identification
   "%b--"
   ;; これはリスト作成中に評価されることに注意。
   ;; これは単なる文字列のモードライン構成を作成する。
   (getenv "HOST")
   ":"
   'default-directory
   "   "
   'global-mode-string
   "   %[("
   '(:eval (mode-line-mode-name))
   'mode-line-process
   'minor-mode-alist
   "%n"
   ")%]--"
   '(which-func-mode ("" which-func-format "--"))
   '(line-number-mode "L%l--")
   '(column-number-mode "C%c--")
   '(-3 "%p")))

(変数line-number-modecolumn-number-modewhich-func-modeは特定のマイナーモードを有効にする。通例どおり、これらの変数名は、マイナーモードコマンド名でもある。)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.4 Variables Used in the Mode Line

このセクションでは、mode-line-formatの標準的な値として、モードラインテキストに組み込まれる変数を説明します。これらの変数は、本質的には特別なものではありません。mode-line-formatが使用する変数を他の変数に変更すれば、それらはモードライン上で同様の効果をもちます。しかし、Emacsのさまざまな部分は、それらの変数がモードラインを制御するという認識の元、それらの変数をセットします。したがって、事実上モードラインがそれらの変数を使用するのは必須なのです。

Variable: mode-line-mule-info

この変数は、言語環境(language environment)、バッファーコーディングシステム、カレント入力メソッド(current input method)に関する情報のモードライン構成の値を保持する。Non-ASCII Charactersを参照のこと。

Variable: mode-line-modified

この変数は、カレントバッファーが変更されたかどうかを表示する、モードライン構成の値を保持する。デフォルト値ではバッファーが変更されていれば‘**’、バッファーが変更されていなければ‘--’、バッファーが読み取り専用なら‘%%’、読み取り専用だが変更されているときは‘%*’を表示する。

この変数を変更しても、モードラインは強制的に更新されない。

Variable: mode-line-frame-identification

この変数は、カレントフレームを識別する。デフォルト値では、複製フレームを表示可能なウィンドウシステムを使用している場合は" "、一度に1つのフレームだけを表示する通常の端末では"-%F "を表示する。

Variable: mode-line-buffer-identification

この変数は、そのウィンドウ内で表示されているバッファーを識別する。デフォルト値では、少なくとも12列になるようスペースパディングされたバッファー名を表示する。

User Option: mode-line-position

この変数は、バッファー内での位置を標示する。デフォルト値ではバッファーのパーセントを表示し、オプションでバッファーサイズ、行番号、列番号を表示する。

Variable: vc-mode

変数vc-modeは、各バッファーにたいしてバッファーローカルであり、そのバッファーがvisitしているファイルがバージョンコントロールで保守されているかどうかと、保守されている場合はバージョンコントロールシステムの種別を表示する。新しいモードラインに表示される文字列、バージョンコントロールされていない場合はnilである。

User Option: mode-line-modes

この変数は、そのバッファーのメジャーモードとマイナーモードを表示する。デフォルト値では再帰編集レベル(recursive editing level)、プロセス状態の情報、ナローイング(narrowing)効果の有無を表示する。

Variable: mode-line-remote

この変数は、カレントバッファーにたいするdefault-directoryがリモートかどうかを表示するために使用される。

Variable: mode-line-client

この変数は、emacsclientフレームを識別するために使用される。

以下の3つの変数は、mode-line-modes内で使用されます:

Variable: mode-name

このバッファーローカル変数は、カレントバッファーのメジャーモードの“愛称(pretty name)”を保持する。モード名がモードラインに表示されるように、それぞれのメジャーモードは、この変数をセットすべきである。値は文字列である必要はなく、モードライン構成内で有効な任意のデータ型(The Data Structure of the Mode Lineを参照)を使用できる。モードライン内でモード名を識別する文字列の計算には、format-mode-lineを使用する(Emulating Mode Line Formattingを参照)。

Variable: mode-line-process

このバッファーローカル変数には、そのモードにおいて、サブプロセスとの通信にたいするプロセス状態のモードライン情報が含まれる。これはメジャーモード名の直後(間のスペースはない)に表示される。たとえば、*shell*バッファーでの値は(":%s")であり、これは‘(Shell:run)’のように、メジャーモードとともにその状態を表示する。通常、この変数はnilである。

Variable: minor-mode-alist

この変数は、マイナーモードがアクティブかをモードラインに示す方法を指定する要素をもつ、連想リスト(association list)を保持する。minor-mode-alistの各要素は、2要素のリストであること:

(minor-mode-variable mode-line-string)

より一般的には、mode-line-stringは任意のモードライン構成であり得る。minor-mode-variableの値が非nilの場合はモードラインに表示され、それ以外では表示されない。一緒に実行されないよう、これらの文字列はスペースで始まるべきである。慣例的に、特定のモードにたいするminor-mode-variableは、そのマイナーモードがアクティブになった際には、非nil値にセットされる。

minor-mode-alist自体はバッファーローカルではない。このalist内で参照される各変数は、そのマイナーモードをバッファーごとに個別に有効にできる場合は、バッファーローカルであること。

Variable: global-mode-string

この変数は、モードライン内でマイナーモードwhich-func-modeがセットされている場合はその直後、セットされていなければmode-line-modesの後に表示されるモードライン構成を保持する(デフォルト)。コマンドdisplay-timeは、時間とロードの情報を含む文字列を保持する変数display-time-stringを参照する、global-mode-stringをセットする。

%M’構成は、global-mode-stringの値を置き換えるが、この変数はmode-line-formatからモードラインにincludeされるので、時代遅れである。

以下は、mode-line-formatのデフォルト値の簡略化バージョンです。実際のデフォルト値には、追加のテキストプロパティ指定も含まれます。

("-"
 mode-line-mule-info
 mode-line-modified
 mode-line-frame-identification
 mode-line-buffer-identification
 "   "
 mode-line-position
 (vc-mode vc-mode)
 "   "
 mode-line-modes
 (which-func-mode ("" which-func-format "--"))
 (global-mode-string ("--" global-mode-string))
 "-%-")

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.5 %-Constructs in the Mode Line

モードライン構成として使用される文字列は、さまざまな種類のデータを置き換えるために、%構成を使用できます。以下は、定義済みの%構成と意味のリストです。

%%’以外の構成では、フィールドの最小幅を指定するために、‘%’の後に10進整数を追加できます。幅がそれより小さい場合、そのフィールドは最小幅にパディングされます。純粋に数値的な構成(‘c’、‘i’、‘I’、‘l’)は左側、それ以外は右側にスペースを追加してパディングされます。

%b

buffer-name関数により取得されるカレントバッファー名。Buffer Namesを参照のこと。

%c

ポイント位置のカレント列番号。

%e

EmacsがLispオブジェクトにたいしてメモリー不足になりそうなときは、それを伝える簡略なメッセージを示す。それ以外の場合は空である。

%f

buffer-file-name関数により取得される、visitしているファイル名。Buffer File Nameを参照のこと。

%F

選択されたフレームのタイトル(ウィンドウシステム上のみ)、または名前。Basic Parametersを参照のこと。

%i

カレントバッファーのアクセス可能な範囲のサイズ。基本的には(- (point-max) (point-min))

%I

%i’と同様だが、10^3は‘k’、10^6は‘M’、10^9は‘G’を使用して省略することにより、より読みやすい方法でサイズをプリントする。

%l

ポイント位置のカレント行番号。そのバッファーのアクセス可能な範囲内でカウントされる。

%n

ナローイングが有効なときは‘Narrow’、それ以外は何も表示しない(Narrowingnarrow-to-regionを参照されたい)。

%p

ウィンドウの最上部より上にあるバッファーテキストのパーセント表示、または‘Top’、‘Bottom’、‘All’のいずれか。デフォルトのモードライン構成は、これを3文字に切り詰めることに注意されたい。

%P

ウィンドウの最下部より上にあるバッファーテキスト(ウィンドウ内の可視なテキストと、最上部の上にあるテキスト)のパーセント表示、およびバッファーの最上部がスクリーン上で可視な場合は、それに加えて‘Top’。または‘Bottom’か‘All’。

%s

process-statusにより取得される、カレントバッファーに属するサブプロセスの状態。Process Informationを参照のこと。

%z

キーボード、端末、およびバッファーコーディングシステムのニーモニック。

%Z

%z’と同様だが、EOL形式(end-of-line format: 改行形式)を含む。

%*

バッファーが読み取り専用(buffer-read-onlyを参照)の場合は‘%’、
変更されている場合(buffer-modified-pを参照)は‘*’、
それ以外は‘-’。Buffer Modificationを参照のこと。

%+

バッファーが変更されている場合(buffer-modified-pを参照)は‘*
バッファーが読み取り専用(buffer-read-onlyを参照)の場合は‘%’、
それ以外は‘-’。これは、読み取り専用バッファーの変更にたいしてのみ‘%*’と異なる。Buffer Modificationを参照のこと。

%&

バッファーが変更されている場合は‘*’、それ以外は‘-’。

%[

再帰編集レベルの深さを標示する(ミニバッファーレベルは勘定しない)。1つの編集レベルが‘[’。Recursive Editingを参照のこと。

%]

1つの編集レベルが‘]’(ミニバッファーレベルは勘定しない)。

%-

モードラインの残りを充填するのに十分なダッシュ。

%%

文字‘%’。%構成が許される文字列内に、リテラル‘%’を含めるには、この方法を使用する。

以下の2つの%構成はまだサポートされていますが、同じ結果を変数mode-nameglobal-mode-stringで取得できるので、これらは時代遅れです。

%m

mode-nameの値。

%M

global-mode-stringの値。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.6 Properties in the Mode Line

モードライン内では、特定のテキストプロパティが意味をもちます。faceプロパティは、テキストの外見に影響します。help-echoプロパティはそのテキストのヘルプ文字列に関連し、keymapによりテキストをマウスに感応させることができます。

モードライン内のテキストにたいしてテキストプロパティを指定するには、4つの方法があります:

  1. モードラインデータ構造内に、テキストプロパティをもつ文字列を直接配する。
  2. %12b’のような、モードライン%構成に、テキストプロパティを配する。その場合、%構成を展開すると、同じテキストプロパティをもつことになる。
  3. propsで指定されるテキストプロパティをeltに与えるために、(:propertize elt props…)構成を使用する。
  4. formがテキストプロパティをもつ文字列に評価されるように、モードラインデータ構造内に:eval formを含むリストを使用する。

キーマップを指定するために、keymapプロパティを使用できます。このキーマップは、マウスクリックにたいしてのみ、実際の効果をもちます。モードライン内にポイントを移動させるのは不可能なので、文字キーやファンクションキーをこれにバインドしても、効果はありません。

モードラインが、risky-local-variableが非nilであるようなプロパティをもつ変数を参照する場合、その変数の値により与える、または指定されるテキストプロパティは、すべて無視されます。これは、そのようなプロパティは呼び出される関数を指定するかもしれず、その関数はファイルローカル変数が由来かもしれないからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.7 Window Header Lines

ウィンドウは、最下部にモードラインをもつことができるのと同じように、最上部にヘッダーライン(header line)をもつことができます。ヘッダーライン機能は、それがheader-line-formatにより制御されることを除けば、モードラインと同じように機能します。

Variable: header-line-format

すべてのバッファーにたいしてローカルなこの変数は、そのバッファーを表示するバッファーにたいして、ヘッダーラインを表示する方法を指定する。この変数の値のフォーマットは、mode-line-formatにたいするフォーマットと同じである(The Data Structure of the Mode Lineを参照)。通常、この変数はnilなので、通常のバッファーはヘッダーラインをもたない。

Function: window-header-line-height &optional window

この関数は、windowのヘッダーラインの高さを、ピクセルでリターンする。windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。

高さが1行しかないウィンドウは、決してヘッダーラインを表示しません。また、高さが2行しかないウィンドウは、一度にモードラインとヘッダーラインを表示できません。そのようなウィンドウがモードラインをもつ場合、ヘッダーラインは表示されません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.4.8 Emulating Mode Line Formatting

関数format-mode-lineを使用して、特定のモードライン構成にもとづきモードライン、またはヘッダーラインに表示されるテキストを計算できます。

Function: format-mode-line format &optional face window buffer

この関数は、あたかもwindowにたいしてモードラインを生成するかのように、formatに応じてテキスト行をフォーマットするが、さらにそのテキストを文字列としてリターンする。引数windowのデフォルトは、選択されたウィンドウである。bufferが非nilの場合、使用されるすべての情報はbufferから取得される。デフォルトでは、windowのバッファーから取得される。

文字列の値は通常、モードラインがもつであろうフェイス、キーマップ等に対応するテキストプロパティをもつ。formatにより指定されたfaceプロパティのないすべての文字は、faceにより決定されるデフォルト値を取得する。facetの場合は、windowが選択されていればmode-line、それ以外はmode-line-inactiveであることを意味する。facenil、または省略された場合は、デフォルトのフェイスを意味する。faceが整数の場合、この関数はテキストプロパティをもたない値をリターンするだろう。

faceの値として、他の有効なフェイスを指定することもできる。指定された場合、それはformatでフェイスを指定されていない文字のfaceプロパティのフェイスを提供する。

faceとしてmode-linemode-line-inactiveheader-lineを使用することにより、フォーマットされた文字列のリターンに加えて、対応するフェイスのカレント定義を使用して、実際にモードラインやヘッダーラインが再描画されるだろうということに注意されたい(他のフェイスでは、再描画は行われない)。

たとえば、(format-mode-line header-line-format)は選択されたウィンドウに表示されるテキスト(ヘッダーラインがない場合は"")をリターンするだろう。(format-mode-line header-line-format 'header-line)は、各文字がヘッダーライン内でもつであろうフェイスをもつ、同じテキストをリターンし、加えてヘッダーラインの再描画も行う。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.5 Imenu

Imenuとは、バッファー内の定義やセクションをすべてリストするメニューをユーザー選択することにより、バッファー内の該当箇所に直接移動する機能です。Imenuは、定義(またはバッファーのその他の名前つき範囲)の名前とその定義のバッファー内での位置をリストする、バッファーインデックスを構築して、ユーザーがそれを選択すればポイントをおこに移動できるようにして機能します。メジャーモードは、imenu-add-to-menubarを使用して、メニューバーアイテムを追加することができます。

Command: imenu-add-to-menubar name

この関数は、nameという名前のImenuを実行するためのローカルメニューバーを定義する。

Imenuを使用ためのユーザーレベルコマンドは、Emacsマニュアル内で説明されています(Imenu in the Emacs Manualを参照)。このセクションでは、特定のメジャーモードにたいして、定義や名前つき範囲を見つける、Imenuメソッドのカスタマイズ方法を説明します。

変数imenu-generic-expressionをセットするのが通常の、そしてもっともシンプルな方法です:

Variable: imenu-generic-expression

この変数が非nilの場合、それはImenuにたいして定義を探すための正規表現を指定するリストである。シンプルなimenu-generic-expressionの要素は、以下のようになる:

(menu-title regexp index)

ここで、menu-titleが非nilの場合、それはこの要素にたいするマッチが、バッファーインデックスのサブメニューとなることを告げる。menu-title自体は、そのサブメニューにたいして名前を指定する。menu-titlenil,の場合は、この要素にたいするマッチは、直接トップレベルのバッファーインデックスとなる。

このリストの2つ目の要素regexpは、正規表現である(Regular Expressionsを参照)。これは、バッファー内でこれにマッチするものは定義、あるいはバッファーインデックス内に記載すべき何かであると判断される。3つ目の要素indexは、0以上の整数の場合は、regexp内の部分式(subexpression)が定義名にマッチすることを示します。

以下のような要素もある:

(menu-title regexp index function arguments…)

この要素にたいする各マッチはインデックスアイテムを作成し、ユーザーによりそのインデックスアイテムが選択されたとき、アイテム名、バッファー位置、およびargumentsから構成される引数で、functionを呼び出す。

Emacs Lispモードにたいしては、imenu-generic-expressionは以下のようになるだろう:

((nil "^\\s-*(def\\(un\\|subst\\|macro\\|advice\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2)
 ("*Vars*" "^\\s-*(def\\(var\\|const\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2)
 ("*Types*"
  "^\\s-*\
(def\\(type\\|struct\\|class\\|ine-condition\\)\
\\s-+\\([-A-Za-z0-9+]+\\)" 2))

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

Variable: imenu-case-fold-search

この変数は、imenu-generic-expressionの値中の正規表現マッチが、大文字小文字を区別するかどうかを制御する。t,(デフォルト)の場合は、大文字小文字の違いを無視することを意味する。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

Variable: imenu-syntax-alist

この変数は、imenu-generic-expression処理中に、カレントバッファーの構文テーブルをオーバーライドして使用する、構文テーブル変更用のalistである。このalistの各要素は、以下の形式をもつべきである:

(characters . syntax-description)

CARcharactersには、文字または文字列を指定できる。この要素は、その文字、または文字列がsyntax-descriptionにより指定される構文でありことを示し、modify-syntax-entryに渡される(Syntax Table Functionsを参照)。

典型的には、この機能は通常はシンボル構文(symbol syntax)をもつ文字にたいして単語構文(word syntax)を与えるために使用され、それによりimenu-generic-expressionが単純になり、マッチングのスピードも向上する。たとえば、Fortranモードは以下のようにこれを使用する:

(setq imenu-syntax-alist '(("_$" . "w")))

imenu-generic-expressionの正規表現は、‘\\(\\sw\\|\\s_\\)+’のかわりに、‘\\sw+’を使用できる。このテクニックは、モードの名前として許されるより短い、頭文字に名前を制限する必要があるときは、不便かもしれないことに注意されたい。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

あるメジャーモードにたいしてImenuをカスタマイズする別の方法には、imenu-prev-index-position-functionimenu-extract-index-name-functionがあります:

Variable: imenu-prev-index-position-function

この変数が非nilの場合、その値はポイント位置からバッファーを後方にスキャンして、バッファーインデックスに配すべき、次の“定義”を探すための関数であること。そして、ポイントより前に他の“定義”が見つからなければ、nilをリターンすべきである。見つかった場合は、“definition”を見つけた場所にポイントを残し、任意の非nil値をリターンすべきである。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

Variable: imenu-extract-index-name-function

この変数が非nilの場合、その値はポイントが定義中にある(imenu-prev-index-position-function関数がポイントを残す場所)という想定の元、その定義の名前をリターンする関数であること。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。

メジャーモードにたいしてImenuをカスタマイズするための最後の方法は、変数imenu-create-index-functionのセットです:

Variable: imenu-create-index-function

この変数は、バッファーインデックスを作成するために使用する関数を指定する。この関数は、引数がをとらず、カレントバッファーにたいするインデックスalist(index alist)をリターンすべきである。この関数はsave-excursion内で呼び出されるので、どこにポイントを残しても違いはない。

このインデックスalistは、3つのタイプの要素をもつことができる。以下は、シンプル要素(simple element)の例である:

(index-name . index-position)

シンプル要素の選択は、そのバッファー内の位置index-positionに移動する効果をもつ。スペシャル要素(special element)は、以下のようなものである:

(index-name index-position function arguments…)

スペシャル要素の選択により、以下が処理される:

(funcall function
         index-name index-position arguments…)

ネストされたサブalist要素(nested sub-alist element)は、以下のようなものである:

(menu-title . sub-alist)

これは、sub-alistにより指定される、サブメニューmenu-titleを作成する。

imenu-create-index-functionのデフォルト値は、imenu-default-create-index-functionである。この関数は、インデックスalistを生成するために、imenu-prev-index-position-functionの値と、imenu-extract-index-name-functionの値を呼び出す。しかし、これら2つ変数のいずれかがnilの場合、デフォルト関数はかわりにimenu-generic-expressionを使用する。

この変数をセットすることにより、カレントバッファーにたいしてバッファーローカルになる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6 Font Lock Mode

Font Lockモードとは、バッファーの特定の部分にたいして、それらの構文的役割(syntactic role)にもとづき、自動的にfaceプロパティをアタッチする、バッファーローカルなマイナーモードです。このモードがバッファーをパースする方法は、そのメジャーモードに依存します。ほとんどのメジャーモードは、どのコンテキストでどのフェイスを使用するかにたいして、構文的条件(syntactic criteria)を定義します。このセクションでは、特定のメジャーモードにたいして、Font Lockをカスタマイズする方法を説明します。

Font Lockモードは、2つの方法によりハイライトするテキストを探します。それは構文テーブル(syntax table)にもとづく構文解析と、(通常は正規表現にたいする)検索です。最初に構文的フォント表示(syntactic fontification)が発生します。これはコメントと文字列定数を見つけて、それらをハイライトします。検索ベースのフォント表示が発生するのは、2番目です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.1 Font Lock Basics

Font Lockモードがテキストをハイライトする方法を制御する変数が、いくつかあります。しかし、メジャーモードは、これらの変数を直接セットするべきではありません。かわりに、メジャーモードはバッファーローカル変数として、font-lock-defaultsをセットするべきです。Font Lockモードが有効なときは、他のすべての変数をセットするために、この変数に割り当てられた値が使用されます。

Variable: font-lock-defaults

この変数は、そのモード内のテキストをフォント表示する方法を指定するために、メジャーモードによりセットされる。この変数は、セットした際に自動的にバッファーローカルになる。変数の値がnilの場合、Font Lockモードはハイライトを行わず、バッファー内のテキストに明示的にフェイスを割り当てるために、‘Faces’メニュー(メニューバーの‘Edit’の下の‘Text Properties’)を使用できる。

nilの場合、値は以下のようであること:

(keywords [keywords-only [case-fold
 [syntax-alist [syntax-begin other-vars…]]]])

1つ目の要素keywordsは、検索ベースのフォント表示を制御するfont-lock-keywordsの値を、間接的に指定する。値にはシンボル、変数、またはfont-lock-keywordsにたいして使用するリストが値であるような関数を指定できる。また、それぞれのシンボルがフォント表示の可能なレベルであるような、いくつかのシンボルからなるリストも指定できる。この場合、1つ目のシンボルはフォント表示の‘モードデフォルト(mode default)’レベル、次のシンボルはフォント表示のレベル1、その次はレベル2、のようになる。通常、‘モードデフォルト’レベルはレベル1と等しい。これは、font-lock-maximum-decorationnil値をもつとき使用される。Levels of Font Lockを参照のこと。

2つ目の要素keywords-onlyは、変数font-lock-keywords-onlyの値を指定する。これが省略、またはnilの場合は、(文字列とコメントの)構文的フォント表示も行われる。非nilの場合は、構文的フォント表示は行われない。Syntactic Font Lockを参照のこと。

3つ目の要素case-foldは、font-lock-keywords-case-fold-searchの値を指定する。非nilの場合、検索ベースフォント表示の間、Font Lockモードは大文字小文字の違いを無視する。

4つ目の要素syntax-alistが非nilの場合、それは(char-or-string . string)という形式のコンスセルのリストであること。これらは、構文的フォント表示にたいする構文テーブルのセットアップに使用される。結果となる構文テーブルは、font-lock-syntax-tableに格納される。syntax-alistが省略、またはnilの場合、構文的フォント表示はsyntax-table関数によりリターンされる構文テーブルを使用する。Syntax Table Functionsを参照のこと。

5つ目の要素syntax-beginは、font-lock-beginning-of-syntax-functionの値を指定する。この変数はnilにセットして、かわりにsyntax-begin-functionの使用を推奨する。

(もしあれば)残りすべての要素は、まとめてother-varsと呼ばれる。これらの要素はすべて、(variable . value)という形式をもつべきである。これは、variableをバッファーローカルにしてから、それにvalueをセットすることを意味する。これらother-varsを使用して、最初の5つの要素による制御とは別に、フォント表示に影響する他の変数をセットできる。Other Font Lock Variablesを参照のこと。

モードがfont-lock-faceプロパティ追加により明示的にテキストをフォント表示する場合は、自動的なフォント表示すべてをオフにするために、font-lock-defaults(nil t)を指定できます。しかし、これは必須ではありません。font-lock-faceを使用して何かをフォント表示して、それ以外の部分のテキストを自動的にフォント表示するようにセットアップするのは可能です。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.2 Search-based Fontification

検索ベースフォント表示を直接制御する変数は、font-lock-keywordsです。この変数は通常、font-lock-defaults内の要素keywordsを通じて指定されます。

Variable: font-lock-keywords

この変数の値は、ハイライトするキーワードのリストである。Lispプログラムは、この変数を直接セッすべきでない。通常は、font-lock-defaults内の要素keywordsを使用して、Font Lockモードが自動的に値をセットする。この値は、関数font-lock-add-keywordsおよびfont-lock-remove-keywordsを使用して、変更されることもあり得る(Customizing Search-Based Fontificationを参照)。

font-lock-keywordsの各要素は、特定のケースに該当するテキストを見つける方法、およびそれらをハイライトする方法を指定します。Font Lockモードは、font-lock-keywordsの要素をちくじ処理してマッチを探して、すべてのマッチを処理します。通常は、テキストの一部はすでに一度はフォント表示されており、同じテキスト内で連続するマッチによるこれをオーバーライドはできません。しかし、subexp-highlighterの要素overrideを使用して、異なる挙動を指定できます。

font-lock-keywordsの各要素は、以下の形式のいずれかをもつべきです:

regexp

font-lock-keyword-faceを使用して、regexpにたいするすべてのマッチをハイライトする。たとえば、

;; font-lock-keyword-faceを使用して
;; 単語‘foo’をハイライトする
"\\<foo\\>"

これらの正規表現を作成するときは、慎重に行うこと。下手に記述されたパターンにより、スピードが劇的に低下し得る! 関数regexp-opt(Regular Expression Functionsを参照)は、いくつかのキーワードとマッチするために最適な正規表現の計算に有用である。

function

functionを呼び出すことによりテキストを探し、font-lock-keyword-faceを使用して見つかったマッチをハイライトする。

functionは、呼び出される際に1つの引数(検索のリミット)を受け取る。検索はポイント位置から開始し、そのリミットを超えた検索は行うべきではない。これは、検索が成功した場合は非nilをリターンして、見つかったマッチを表すマッチデータをセットすべきである。nilのリターンは、検索の失敗を示す。

フォント表示は、前の呼び出しでポイントが残された位置から、同じリミットを用いてfunctionを呼び出し、functionが失敗するまでfunctionを繰り返し呼び出すだろう。検索が失敗しても、何らかの特別な方法により、functionがポイントをリセットする必要はない。

(matcher . subexp)

この種の要素では、matcherは上述のregexpかfunctionのいずれかである。CDRsubexpは、(matcherがマッチするテキスト全体のかわりに)matcherのどの部分式(subexpression)がハイライトされるべきかを指定する。

;; font-lock-keyword-faceHを使用して
;; bar’が‘fubar’の一部のときに
;; ハイライトする
("fu\\(bar\\)" . 1)

正規表現matcherの生成にregexp-optを使用する場合は、subexpにたいする値の計算にregexp-opt-depth(Regular Expression Functionsを参照)を使用できる。

(matcher . facespec)

この種の要素では、facespecの値がハイライトに使用するフェイスを指定する。もっともシンプルな例では、facespecは値がフェイス名であるようなはLisp変数(シンボル)である。

;; fubar-faceの値のフェイスを使用して
;; fubar’をハイライトする
("fubar" . fubar-face)

しかし、facespecは以下のような形式のリストに評価されてもよい:

(face face prop1 val1 prop2 val2…)

これは、マッチしたテキストにフェイスfaceを指定し、さまざまなテキストプロパティをputする。これを行う場合は、この方法によりfont-lock-extra-managed-propsに値をセットする、他のテキストプロパティ名を確実に追加すること。そうすれば、それらのプロパティが妥当性を失ったとき、それらのプロパティもクリアーされるだろう。これらのプロパティをクリアーする関数を、変数font-lock-unfontify-region-functionにセットすることもできる。Other Font Lock Variablesを参照のこと。

(matcher . subexp-highlighter)

この種の要素では、subexp-highlightermatcherにより見つかったマッチをハイライトする方法を指定するリストである。これは、以下の形式をもつ。

(subexp facespec [override [laxmatch]])

CARsubexpは、マッチのどの部分式をフォント表示するかを指定する整数である(0はマッチしたテキスト全体を意味する)。これの2つ目の要素facespecは、上述したような値がフェイスを指定するような式である。

subexp-highlighter内の残りの値overridelaxmatchは、オプションのフラグである。overridetの場合、この要素は前のfont-lock-keywordsの要素により作成された既存のフォント表示をオーバーライドできる。値がkeepの場合は、すでに他の要素によりフォント表示されていない文字がフォント表示される。値がprependの場合は、facespecにより指定されたフェイスが、font-lock-faceプロパティの先頭に追加される。値がappendの場合は、そのフェイスがfont-lock-faceプロパティの最後に追加される。

laxmatchが非nilの場合、それはmatcher内で番号付けされた部分式subexpが存在しなくても、エラーにならないことを意味する。当然、番号付けされた部分式subexpのフォント表示は発生しない。しかし、他の部分式(と他のregexp)のフォント表示は継続されるだろう。laxmatchnilで、指定された部分式が存在しない場合は、エラーがシグナルされて検索ベースのフォント表示は終了する。

以下はこのタイプの要素と、それが何を行うかの例である:

;; foo-bar-faceを使用して、たとえハイライト済みでも
;; foo’と‘bar’をハイライトする
;; foo-bar-faceは値がフェイスであるような変数であること
("foo\\|bar" 0 foo-bar-face t)

;; fubar-faceの値のフェイスを使用して
;; 関数fubar-matchが見つけた各マッチの
;; 最初の部分式をハイライトする
(fubar-match 1 fubar-face)
(matcher . anchored-highlighter)

この種の要素では、anchored-highlightermatcherが見つけたマッチに後続するテキストをハイライトする方法を指定する。つまり、matcherが見つけたマッチは、anchored-highlighterにより指定されるその先の検索にたいする、アンカー(anchor)として機能する。anchored-highlighterは、以下の形式のリストである:

(anchored-matcher pre-form post-form
                        subexp-highlighters…)

ここで、anchored-matchermatcherと同様、正規表現か関数である。matcherにたいするマッチを見つけた後に、ポイントはそのマッチの終端に移動する。そこで、Font Lockはフォームpre-formを評価する。それからanchored-matcherにたいするマッチを検索し、subexp-highlightersを使用して、それらのマッチをハイライトする。subexp-highlighterについては上記を参照のこと。最後にFont Lockはpost-formを評価する。

フォームpre-formおよびpost-formは、anchored-matcher使用時の事前の初期化、事後のクリーンアップに使用され得る。通常、pre-formanchored-matcherを開始する前に、matcherのマッチに関連する何らかの位置にポイントを移動するために使用される。post-formは、matcherを再開する前に、ポイントを戻すために使用されるかもしれない。

pre-formを評価した後、Font Lockはその行の終端の先にたいして、anchored-matcherの検索を行わない。しかし、pre-formpre-form評価後のポイント位置より大きいバッファー位置をリターンした場合には、かわりにpre-formによりリターンされた位置が検索リミットとして使用される。一般的に、その行の終端より大きい位置をリターンするのは、よいアイデアではない。別の言い方をすると、anchored-matcher検索は複数行にわたる(span lines)べきではないと言えよう。

たとえば、

;; item-faceの値を使用して
;; 単語‘anchor’に(同一行内で)
;; 後続する単語‘item’をハイライトする
("\\<anchor\\>" "\\<item\\>" nil nil (0 item-face))

ここで、pre-formpost-formnilである。したがって、‘item’にたいする検索は‘anchor’にたいするマッチの終端から開始され、後続する‘anchor’インスタンスにたいする検索は、‘item’にたいする検索が終了した位置から再開される。

(matcher highlighters…)

この種の要素は、単一のmatcherにたいして、複数のhighlighterリストを指定する。highlighterリストには、上述したsubexp-highlighter、またはanchored-highlighterのいずれかを指定できる。

たとえば、

;; anchor-faceの値内に現れる単語‘anchor’、
;; および、(同じ行の)後続のitem-face
;;  値内に現れる単語‘item’をハイライトする
("\\<anchor\\>" (0 anchor-face)
                ("\\<item\\>" nil nil (0 item-face)))
(eval . form)

ここでformは、バッファー内でこのfont-lock-keywordsの値が最初に使用されるときに評価される式である。この値は、上述のこのテーブルで説明した、いずれかの形式をもつべきである。

警告: 複数行にわたるテキストにたいするマッチさせるために、font-lock-keywordsの要素をデザインしてはならない。これは確実に機能するとは言えない。詳細は、Multiline Font Lock Constructsを参照のこと。

検索ベースのフォント表示が大文字小文字を区別すべきかどうかを告げるfont-lock-keywords-case-fold-searchの値を指定するために、font-lock-defaults内でcase-foldを使用できる。

Variable: font-lock-keywords-case-fold-search

nilは、font-lock-keywordsのための正規表現マッチングが、大文字小文字を区別すべきではないことを意味する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.3 Customizing Search-Based Fontification

メジャーモードにたいして検索ベースフォント表示ルールを追加するためにfont-lock-add-keywords、削除にはfont-lock-remove-keywordsを使用することができます。

Function: font-lock-add-keywords mode keywords &optional how

この関数は、カレントバッファー、またはメジャーモードmodeにたいして、ハイライトするkeywordsを追加する。引数keywordsは、変数font-lock-keywordsと同じ形式のリストであること。

modeが、c-modeのような、あるメジャーモードのコマンド名であるようなシンボルの場合には、そのmode内でFont Lockモードを有効にすることにより、keywordsfont-lock-keywordsに追加される効果がある。非nil値のmodeによる呼び出しは、~/.emacsファイル内でのみ正しい。

modenilの場合、この関数はカレントバッファーのfont-lock-keywordskeywordsを追加する。この方法でのfont-lock-add-keywords呼び出しは、通常はモードフック関数内で使用される。

デフォルトでは、keywordsfont-lock-keywordsの先頭に追加される。オプション引数howsetの場合、それらはfont-lock-keywordsの値の置換に使用される。howがそれ以外の非nil値の場合、これらはfont-lock-keywordsの最後に追加される。

追加のハイライトパターンの使用を可能にする、特別なサポートを提供するモードがいくつかある。それらの例については、変数c-font-lock-extra-typesc++-font-lock-extra-typesjava-font-lock-extra-typesを参照のこと。

警告: メジャーモードコマンドは、モードフックを除き、いかなる状況においても、直接間接を問わずfont-lock-add-keywordsを呼び出してはならない(これを行うと、いくつかのマイナーモードは不正な振る舞いを起こしかねない)。メジャーモードコマンドは、font-lock-keywordsをセットすることにより、検索ベースフォント表示のルールをセットアップすべきである。

Function: font-lock-remove-keywords mode keywords

この関数は、カレントバッファー、またはメジャーモードmodeにたいして、font-lock-keywordsからkeywordsを削除する。font-lock-add-keywordsの場合と同様、modeはメジャーモードコマンド名かnilであること。font-lock-add-keywordsにたいするすべての制約と条件は、この関数にも適用される。

たとえば、以下はCモードに2つのフォント表示パターンを追加するコードの例である。フォント表示の1つは、たとえコメント内であろうとも単語‘FIXME’をフォント表示し、もう1つは‘and’、‘or’、‘not’をキーワードとしてフォント表示する。

(font-lock-add-keywords 'c-mode
 '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
   ("\\<\\(and\\|or\\|not\\)\\>" . font-lock-keyword-face)))

この例は、正にCモードだけに効果がある。Cモード、およびその派生モードにたいして同じパターンを追加するには、かわりに以下を行う:

(add-hook 'c-mode-hook
 (lambda ()
  (font-lock-add-keywords nil
   '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
     ("\\<\\(and\\|or\\|not\\)\\>" .
      font-lock-keyword-face)))))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.4 Other Font Lock Variables

このセクションでは、font-lock-defaults内のother-varsを用いて、メジャーモードがセットできる追加の変数について説明します(Font Lock Basicsを参照)。

Variable: font-lock-mark-block-function

この変数が非nilの場合、それはコマンドM-o M-o(font-lock-fontify-block)で再フォント表示するテキスト範囲を選択するために、引数なしで呼び出される関数であること。

この関数は、結果を報告するために、選択されたテキスト範囲にリージョンを配すべきである。正しい結果を与えるのに十分、かつ再フォント表示が低速にならない程度のテキスト範囲を選択するのがよい。プログラミングのモードにたいしてはmark-defun、テキストを扱うモードにたいしてはmark-paragraphが典型的な値である。

Variable: font-lock-extra-managed-props

この変数は、(font-lock-face以外の)Font Lockにより管理される追加プロパティを指定する。これらの追加プロパティは、通常はfont-lock-faceプロパティだけを管理する、font-lock-default-unfontify-regionにより使用される。他のプロパティも同様にFont Lockに管理させたい場合は、このリストに追加するのと同じように、font-lock-keywords内のfacespec内でもこれらを指定しなければならない。Search-based Fontificationを参照のこと。

Variable: font-lock-fontify-buffer-function

そのバッファーをフォント表示するために使用する関数。デフォルト値はfont-lock-default-fontify-buffer

Variable: font-lock-unfontify-buffer-function

そのバッファーを非フォント表示するために使用する関数。デフォルト値はfont-lock-default-unfontify-buffer

Variable: font-lock-fontify-region-function

リージョンをフォント表示するための関数。この関数は、リージョンの開始と終了の2つを引数にとり、オプションで3つ目の引数verboseをとるべきである。verboseが非nilの場合、その関数はステータスメッセージをプリントすべきである。デフォルト値はfont-lock-default-fontify-region

Variable: font-lock-unfontify-region-function

リージョンを非フォント表示するための関数。この関数は、リージョンの開始と終了の2つを引数にとるべきである。デフォルト値はfont-lock-default-unfontify-region

Function: jit-lock-register function &optional contextual

この関数は、カレントバッファーの一部をフォント表示/非表示する必要がある任意のタイミングで、Font LockモードがLisp関数functionを実行することを宣言する。これは、デフォルトのフォント表示関数が呼び出される前に、フォント表示/非表示するリージョンを指定する2つの引数startendfunctionを呼び出す。

オプション引数contextualが非nilの場合は、行が更新されたときに限らず、そのバッファーの構文的に関連する部分を常にフォント表示するよう、Font Lockモードに強制する。この引数は、通常は省略できる。

Function: jit-lock-unregister function

以前にjit-lock-registerを使用して、フォント表示関数としてfunctionを登録した場合は、その関数を未登録にする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.5 Levels of Font Lock

フォント表示にたいして3つの異なるレベルを提供するモードが、いくつかあります。font-lock-defaults内のkeywordsにたいしてシンボルのリストを使用することにより、複数のレベルを定義できます。このリストのシンボルはそれぞれ、フォント表示の1レベルを指定します。これらのレベルの選択は、通常はfont-lock-maximum-decorationをセットすることにより、ユーザーの責任で行われます(Font Lock in the GNU Emacs Manualを参照)。選択されたレベルのシンボルの値は、font-lock-keywordsの初期化に使用されます。

フォント表示レベルの定義方法に関する慣習を以下に挙げます:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.6 Precalculated Fontification

list-buffersoccurのようないくつかのメジャーモードは、バッファーのテキストをプログラム的に構築します。これらにたいしてFont Lockモードをサポートするには、そのバッファーにテキストを挿入するタイミングで、テキストのフェイスを指定するのが、もっとも簡単な方法です。

これは、スペシャルテキストプロパティfont-lock-face(Properties with Special Meaningsを参照)により、テキスト内にフェイスを指定することにより行われます。Font Lockモードが有効になったとき、このプロパティはfaceと同じように、表示を制御します。Font Lockモードが無効になると、font-lock-faceは表示に効果をもちません。

モードが、通常のFont Lockメカニズムとともに、あるテキストにたいしてfont-lock-faceを使用しても問題はありません。しかし、そのモードが通常のFont Lockメカニズムを使用しない場合は、変数font-lock-faceをセットするべきではありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.7 Faces for Font Lock

Font Lockモードは、ハイライトに任意のフェイスを使用できますが、Emacsは、特にFontLockがテキストのハイライトに使用するいくつかのフェイスを定義しています。これらのFont Lockフェイス(Font Lock faces)を、以下にリストします。これらのフェイスは、FontLockモードの外部における構文的なハイライトでメジャーモードが使用することもできます(Major Mode Conventionsを参照)。

以下の各シンボルは、フェイス名であり、かつデフォルト値がシンボル自身であるような変数でもあります。つまり、font-lock-comment-faceのデフォルト値はfont-lock-comment-faceです。

リストは、そのフェイスの典型的な使い方の説明とともに、“重要性”が大きい順にソートされています。あるモードの構文的カテゴリーが、以下の使い方の説明にうまく適合しない場合、この並び順をガイドとして使用することにより、フェイスを割り当てることができるでしょう。

font-lock-warning-face

Emacs Lispの‘;;;###autoload’、Cの‘#error’のような、特有な構文、またはその他のテキスト意味を大きく変更する構文にたいして使用される。

font-lock-function-name-face

定義、または宣言される関数の名前にたいして使用される。

font-lock-variable-name-face

定義、または宣言される変数の名前にたいして使用される。

font-lock-keyword-face

Cの‘for’や‘if’のように、特別な構文的意味をもつキーワードにたいして使用される。

font-lock-comment-face

コメントにたいして使用される。

font-lock-comment-delimiter-face

Cの‘/*’と‘*/’のような、コメント区切りにたいして使用される。ほとんどの端末では、このフェイスはfont-lock-comment-faceを継承する。

font-lock-type-face

ユーザー定義データ型にたいして使用される。

font-lock-constant-face

Cの‘NULL’のような、定数の名前にたいして使用される。

font-lock-builtin-face

ビルトイン関数の名前にたいして使用される。

font-lock-preprocessor-face

プロセッサーコマンドにたいして使用される。デフォルトでは、font-lock-builtin-faceを継承する。

font-lock-string-face

文字列定数にたいして使用される。

font-lock-doc-face

コード内のドキュメント文字列にたいして使用される。デフォルトでは、font-lock-string-faceを継承する。

font-lock-negation-char-face

見逃されやすい否定文字にたいして使用される。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.8 Syntactic Font Lock

構文的フォント表示(syntactic fontification)は、構文的に関連性のあるテキストを探してハイライトするために、構文テーブル(syntax table: Syntax Tablesを参照)を使用します。有効な場合は、検索ベースフォント表示に先立ち実行されます。以下で説明する変数font-lock-syntactic-face-function,は、どの構文的構造をハイライトするかを決定します。構文的フォント表示に影響を与える変数が、いくつかあります。font-lock-defaultsのために、それらをセットするべきです(Font Lock Basicsを参照)。

Font Lockモードが一連のテキストにたいして構文的フォント表示を処理するときは、常にsyntax-propertize-functionで指定される関数を最初に呼び出します。メジャーモードは、特別なケースではsyntax-tableテキストプロパティを適用してバッファーの構文テーブルをオーバーライドするために、これを使用することができます。Syntax Propertiesを参照してください。

Variable: font-lock-keywords-only

この変数の値が非nilの場合、Font Lockは構文的フォント表示を行わず、font-lock-keywordsにもとづく検索ベースフォント表示だけを行う。これは通常、font-lock-defaults内のkeywords-only要素にもとづき、Font Lockモードによりセットされる。

Variable: font-lock-syntax-table

この変数は、コメントと文字列のフォント表示に使用するための構文テーブルを保持する。これは通常、font-lock-defaults内のsyntax-alist要素にもとづき、Font Lockモードによりセットされる。この値がnilの場合、構文的フォント表示は、バッファーの構文テーブル(関数syntax-tableがリターンする構文テーブル。see section Syntax Table Functionsを参照)を使用する。

Variable: font-lock-beginning-of-syntax-function

この変数が非nilの場合、それは構文的に“トップレベル”で、かつ文字列やコメントの外部であるような位置に戻すようにポイントを移動する関数であること。この値は通常、font-lock-defaults内のother-vars要素を通じてセットされる。これがnilの場合、Font Lockはコメント、文字列、sexpの外部に戻って移動するためにsyntax-begin-functionを使用する(Finding the Parse State for a Positionを参照)。

この変数は、半ば時代遅れであり、通常はかわりにsyntax-begin-functionをセットすることを推奨する。これの用途の1つは、たとえば異なる種類の文字列やコメントを異なるようにハイライトする等、構文的フォント表示の振る舞いの調整する場合である。

指定された関数は、引数なしで呼び出される。この関数は、周囲の構文的ブロックの先頭にポイントを残すべきである。典型的な値はbeginning-of-line(行頭が構文的ブロック外部であることが既知の場合に使用)、プログラミングのモードにたいしてはbeginning-of-defun、テキストを扱うモードにたいしてはbackward-paragraphが使用される。

Variable: font-lock-syntactic-face-function

この変数が非nilの場合、それは与えられた構文的要素にどのフェイスを使用するかを決定する関数であること。この値は通常、font-lock-defaults内のother-vars要素を通じてセットされる。

この関数は1つの引数で呼び出され、parse-partial-sexpがリターンするポイントの状態をパースして、フェイスをリターンすべきである。コメントにたいしてはfont-lock-comment-face、文字列にたいしてはfont-lock-string-faceが、リターンされるデフォルト値である(Faces for Font Lockを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.9 Multiline Font Lock Constructs

通常は、font-lock-keywordsの要素は複数行にわたるマッチを行うべきではありません。それらの動作に信頼性はありません。なぜなら、Font Lockは通常はバッファーのごく一部をスキャンするので、そのスキャンが開始される行境界をまたがる複数行構造を見逃しかねないからです(スキャンは通常、行頭から開始される)。

ある要素にたいして、複数行構造にたいするマッチを正しく機能させるには、2つの観点があります。それは識別(identification)の補正と、再ハイライト(rehighlighting)の補正です。1つ目は、Font Lockがすべての複数行構造を探すことを意味します。2つ目は、複数行構造が変更されたとき、たとえば以前は複数行構造の一部だったテキストが、複数行構造から除外されたときに、関連するすべてのテキストをFont Lockに正しく再ハイライトさせることを意味します。これら2つの観点は密接に関連しており、一方を機能させることがもう一方を機能させるようなことが多々あります。しかし、信頼性のある結果を得るためには、これら2つの観点双方にたいして、明示的に注意しなければなりません。

複数行構造の識別を確実に補正するには、3つの方法があります:

複数行構造の再ハイライトを行うには、3つの方法があります:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.9.1 Font Lock Multiline

複数行構造のFont Lockを確実に再ハイライトする方法の1つは、それらをテキストプロパティfont-lock-multilineにputする方法です。複数行構造の一部であるようなテキストにたいしては、このプロパティが存在し、値が非nilであるべきです。

Font Lockがテキスト範囲をハイライトしようとする際は、それらがfont-lock-multilineプロパティでマークされたテキストにならないように、まず必要に応じて範囲の境界を拡張します。それから、その範囲のすべてのfont-lock-multilineを削除して、ハイライトします。ハイライト指定(大抵はfont-lock-keywords)は、適宜このプロパティを毎回再インストールしなければなりません。

警告: ハイライトが低速になるので、大きなテキスト範囲にたいしてfont-lock-multilineを使用してはならない。

Variable: font-lock-multiline

font-lock-multiline変数がtにセットされている場合、Font Lockは自動的に複数行構造にたいしてfont-lock-multilineプロパティの追加を試みる。しかし、これによりFont Lockが幾分遅くなるので、普遍的解ではない。これは、何らかの複数行構造を見逃したり、必要なものより多く、または少なくプロパティをセットするかもしれない。

matcherが関数であるような要素は、たとえ少量のサブパート(subpart)だけがハイライトされるような場合でも、submatch 0(訳注:正規表現の後方参照においてsubmatch 0はマッチした文字列全体を指す)が関連する複数行構造全体を確実に網羅するようにすべきである。単に手動でfont-lock-multilineを追加するのが容易な場合も多々ある。

font-lock-multilineプロパティは、正しい再フォント表示を確実に行うことを意図しています。これは、新たな複数行構造を自動的に認識しません。Font Lockの処理を要するものにたいする認識は、一度に処理を行うのに十分な大きさのchunkにたいして行われます。これは多くの場合にアクシデントにより発生し得るかもしれないので、複数行構造が不可解に機能するような印象を与えるかもしれません。変数font-lock-multilineを非nilにセットした場合、発見されたこれらの構造にたいするハイライトは、変数をセットした後は正しく更新されるので、さらにこの印象が強くなるでしょう。しかし、これは信頼性をもって機能しません。

信頼性を保ち複数行構造を見つけるためには、Font Lockが調べる前にテキストのfont-lock-multilineプロパティを手動で配すか、font-lock-fontify-region-functionを使用しなければなりません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.6.9.2 Region to Fontify after a Buffer Change

バッファーが変更されたとき、Font Lockが再フォント表示するリージョンは、デフォルトではその変更に関連する、最小の行全体からなるシーケンスです。これはほとんどの場合は良好に機能しますが、うまく機能しないとき(たとえば、その変更がそれより前の行のテキストの構文的な意味を変更してしまうとき)もあります。

以下の変数をセットすることにより、再フォント表示するリージョンを拡張(または縮小さえ)することができます:

Variable: font-lock-extend-after-change-region-function

このバッファーローカル変数はnil、またはFont Lockモードにたいしてスキャンしてフォント表示すべきリージョンを決定するために呼び出される関数である。

この関数には、標準的なbegend、およびafter-change-functionsold-len(Change Hooksを参照)という、3つのパラメーターが渡される。この関数はフォント表示するリージョンのバッファー位置の開始と終了(この順で)からなるコンスセル、またはnil(標準的な方法でリージョンを選択することを意味する)のいずれかをリターンすべきである。この関数は、ポイント位置、match-data、カレントのナローイングを保つ必要がある。これがリターンするリージョンは、行の途中で開始、または終了するかもしれない。

この関数はバッファーを変更するたびに呼び出されるので、有意に高速であること。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7 Automatic Indentation of code

プログラミング言語のメジャーモードにとって、自動的なインデントの提供は、重要な機能です。これには2つのパートがあります。1つ目は正しい行のインデントが何か、そして2つ目はいつ行を再インデントするかの判断です。デフォルトでは、electric-indent-charsに含まれる文字(デフォルトでは改行のみ)をタイプしたとき、Emacsは常に行を再インデントします。メジャーモードは、その言語の構文に合わせて、electric-indent-charsに文字を追加できます。

正しいインデントの決定は、indent-line-functionによりEmacs内で制御されます(Indentation Controlled by Major Modeを参照)。いくつかのモードでは、へのインデントは信頼性がないことが知られています。これは通常、複数のインデントが有効だが、それぞれが異なる意味をもつので、インデント自体が重要だからです。そのような場合、そのモードは行が常にユーザーの望み通り再インデントされないことを念押しするために、electric-indent-inhibitをセットするべきです。

よいインデント関数の記述は難しく、その広範な領域において、未だ黒魔術の域を脱していません。メジャーモード作者の多くは、単純なケース(たとえば前のテキスト行のインデントとの比較)にたいして機能する、単純な関数の記述からスタートすることでしょう。実際には行ベースではないほとんどのプログラミング言語にたいして、これは貧弱なスケールになりがちです。そのような関数にたいして、より多様な状況を処理するような改良を行うと、関数はより一層複雑になり、最終的な結果は誰にも触れようとする気を起こさせない、巨大で複雑な保守不可能のインデント関数になる傾向があります。

よいインデント関数は通常、その言語の構文に応じて、実際にテキストをパースする必要があるでしょう。幸運なことに、このテキストパースはコンパイラーが要するほど詳細である必要はないでしょうが、その一方でインデントコードに埋め込まれたパーサーは、構文的に不正なコードにたいして、コンパイラーより幾分寛容な振る舞いを求められるでしょう。

保守可能なよいインデント関数は、通常2つのカテゴリーに落ち着きます。どちらも何らかの“安全”な開始ポイントから、関心のある位置まで前方にパースを行うか、あるいは後方へパースを行います。この2つの方法は、どちらも一方が他方に明快に優る選択ではありません。後方へのパースは、プログラミング言語が前方にパースされるようデザインされているため、前方へのパースに比べて難しいことが多々ありますが、インデントという目的においては“安全”な開始ポイントを推測する必要がないという利点があり、一般的にある行のインデントの判断のために分析を要するのは最小限のテキストだけという特性に恵まれているので、前の無関係なコード片内にある、何らかの構文エラーの影響をインデントが受けにくくなる傾向があります。一方で前方へのパースは、通常はより簡単であり、一度のパースで、リージョン全体を効果的に再インデントすることが可能になるという利点があります。

インデント関数をスクラッチから記述するよりも、既存のインデント関数の試用と再利用、または一般的なインデントエンジンに委ねるほうが優る場合が、しばしばあります。しかし、そのようなエンジンは悲しむべきほど少数しかありません。CCモードのインデントコード(C、C++、Java、Awk、およびその類のモードが使用)は年月を経てより一般化されてきているので、あなたの言語にこれらの言語と何らかの相似点があるなら、このエンジンの使用を試みるかもしれません。もう一方のSMIEはLispのsexp精神によるアプローチを採用して、それを非Lisp言語に適応します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1 Simple Minded Indentation Engine

SMIEは、一般的な操作とインデントを提供するエンジンです。これは“演算子順位文法(operator precedence grammar)”を使用する、非常にシンプルなパーサーにもとづいたエンジンであり、メジャーモードがLispのS式ベースの操作を非Lisp言語に拡張するのを助け、同様にシンプルに使用できるにも関わらず、信頼できる自動インデントを提供します。

演算子順位文法は、コンパイラー内で使用されるより一般的なパーサーと比較すると、非常に原始的なパーステクノロジーです。このパーサーには次のような特徴があります。このパーサーのパース能力は非常に限定的で、大概は構文エラーを検出できません。しかし、アルゴリズム的に前方パースと同様に後方パースを効果的に行うことが可能です。実際にそれはSMIEが後方パースにもとづくインデントを使用でき、forward-sexpbackward-sexpの両方の機能を提供できるとともに、特別な努力を要さずに構文的に不正なコードにたいして自然に機能するであろうことを意味します。欠点は、ほとんどのプログラミング言語は、少なくとも何らかの特別なトリック(Living With a Weak Parserを参照)で再分類しなければ、SMIEを使用して正しくパースできないことも意味するからです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.1 SMIE Setup and Features

SMIEは、構造的な操作と、コードの構造的構造にもとづくその他さまざまな機能、特に自動インデントにたいするワンストップショップ(一カ所で必要な全ての買い物ができること、またはそのような場所)であることを意図しています。メインのエントリーポイントはsmie-setupで、これは通常メジャーモードセットアップの間に呼び出される関数です。

Function: smie-setup grammar rules-function &rest keywords

SMIEの操作とインデントをセットアップする。grammarsmie-prec2->grammarにより生成される文法テーブル(grammar table)、rules-functionsmie-rules-functionで使用されるインデントルールのセット、keywordsは追加の引数であり以下のキーワードを含むことができる:

この関数を呼び出せば、forward-sexpbackward-sexptranspose-sexpsのようなコマンドが、すでに構文テーブルにより処理されている単なるカッコのペアー以外の、構造的な要素を正しく扱うことができるようになります。たとえば、与えられた文法が十分に明快ならば、transpose-sexpsはその言語の優先順位のルールを考慮して、+演算子の2つの引数を正しく入れ替えることができます。

‘smie-setup’の呼び出しもまた、TABによるインデントを期待通り機能させ、begin...endのような要素に適用するためにblink-matching-parenを拡張し、そのメジャーモードのキーマップ内でバインドできるいくつかのコマンドを提供するのに十分です。

Command: smie-close-block

このコマンドは、もっとも最近オープンされた(まだクローズされていない)ブロックをクローズする。

Command: smie-down-list &optional arg

このコマンドはdown-listと似ているが、begin...endのようなカッコ以外のネストされたトークンにも注意を払う。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.2 Operator Precedence Grammars

SMIEの演算子順位文法は、各トークンにたいしてシンプルに左優先(left-precedence)と右優先(right-precedence)という順位ペアーを与えます。トークンT1の右優先が、トークンT2の左優先より小さい場合は、T1 < T2であると言うことにしましょう。これを解読するには、<をカッコの一種だとみなすのがよい方法です。... T1 something T2 ...を見つけたら、これは... T1 something) T2 ...ではなく... T1 (something T2 ...とパースされるべきです。... T1 something) T2 ...と解釈するのは、T1 > T2を見つけた場合でしょう。T1 = T2を見つけた場合、それはトークンT2とその後のトークンT1が同じ構文構成にあり、通常は"begin" = "end"を得ます。このような優先順位のペアーは、2項演算子(infix operator)、カッコのようなネストされたトークン、およびその他多くのケースにたいして左結合(left-associativity)や右結合(right-associativity)を表現するのに十分です。

Function: smie-prec2->grammar table

この関数は、prec2文法tableを引数にとり、smie-setupで使用するのに適したalistをリターンする。prec2文法tableは、それ自体が以下の関数のいずれかによりビルドされることを意図している。

Function: smie-merge-prec2s &rest tables

この関数は、複数のprec2文法tablesを、新たなprec2テーブルにマージする。

Function: smie-precs->prec2 precs

この関数は、順位テーブルprecsからprec2テーブルをビルドする。precsは優先順(たとえば"+""*"より前にくる)にソートされたリストで、要素は(assoc op ...)の形式であること。ここで、opは演算子として振る舞うトークン、assocはそれらの結合法則であり、leftrightassocnonassocのいずれかである。与えられた要素内のすべての演算子は、同じ優先レベルと結合法則を共有する。

Function: smie-bnf->prec2 bnf &rest resolvers

この関数により、BNF記法を使用した文法を指定することができる。これは、その文法のbnf表記と、同様に競合解決ルールresolversを受け取り、prec2テーブルをリターンする。

bnf(nonterm rhs1 rhs2 ...)という形式の非終端定義で、各rhsは終端記号(トークンとも呼ばれる)、または非終端記号の(空でない)リストである。

すべての文法が許される訳ではない:

さらに、競合が発生し得る:

順位の競合は、resolversを通じて解決され得る。これはprecsテーブル(smie-precs->prec2を参照)のリストである。それぞれの順位競合にたいして、これらのprecsテーブルが特定の制約を指定している場合は、かわりにこの制約により競合が解決され、それ以外は競合する制約のうち任意の1つが報告され、他は単に無視される。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.3 Defining the Grammar of a Language

ある言語にたいしてSMIE文法を定義する通常の方法は、順位のテーブルを保持する新たなグローバル変数を定義して、BNFルールのセットを与える方法です。たとえば、小規模なPascal風言語の文法定義は、以下のようになるでしょう:

(require 'smie)
(defvar sample-smie-grammar
  (smie-prec2->grammar
   (smie-bnf->prec2
    '((id)
      (inst ("begin" insts "end")
            ("if" exp "then" inst "else" inst)
            (id ":=" exp)
            (exp))
      (insts (insts ";" insts) (inst))
      (exp (exp "+" exp)
           (exp "*" exp)
           ("(" exps ")"))
      (exps (exps "," exps) (exp)))
    '((assoc ";"))
    '((assoc ","))
    '((assoc "+") (assoc "*")))))

注意すべき点がいくつかあります:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.4 Defining Tokens

SMIEには、事前定義された字句解析プログラムが付属しており、それは次の方法で構文テーブルを使用します: 文字の任意のシーケンスは、トークンとみなせる単語構文(word syntax)、またはシンボル構文(symbol syntax)をもち、句読点構文(punctuation syntax)をもつ任意の文字シーケンスもトークンとみなされます。このデフォルトのlexerは、開始ポイントとして適している場合が多々ありますが、任意の与えられた言語にたいして、実際に正しいことは稀です。たとえば、これは"2,+3"が3つのトークン"2"",+""3"から構成されていると判断するでしょう。

あなたの言語のlexerルールをSMIEにたいして説明するためには、次のトークンをfetchする関数と、前のトークンをfetchする関数の、2つの関数が必要になります。これらの関数は通常、最初に空白文字とコメントをスキップして、その後に次のテキストchunk(塊)を調べて、それが特別なトークンか確認します。これは通常、バッファーから単に抽出された文字列ですが、あなたが望む他の何かでも構いません。たとえば:

(defvar sample-keywords-regexp
  (regexp-opt '("+" "*" "," ";" ">" ">=" "<" "<=" ":=" "=")))
(defun sample-smie-forward-token ()
  (forward-comment (point-max))
  (cond
   ((looking-at sample-keywords-regexp)
    (goto-char (match-end 0))
    (match-string-no-properties 0))
   (t (buffer-substring-no-properties
       (point)
       (progn (skip-syntax-forward "w_")
              (point))))))
(defun sample-smie-backward-token ()
  (forward-comment (- (point)))
  (cond
   ((looking-back sample-keywords-regexp (- (point) 2) t)
    (goto-char (match-beginning 0))
    (match-string-no-properties 0))
   (t (buffer-substring-no-properties
       (point)
       (progn (skip-syntax-backward "w_")
              (point))))))

これらのlexerがカッコの前にあるとき、空文字列をリターンする方法に注目してください。これは、SMIEが構文テーブル内で定義されているカッコにたいして、自動的に配慮するからです。より厳密には、lexerがnil、または空文字列をリターンした場合、SMIEは構文テーブルにしたがい、対応するテキストをsexpとして処理します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.5 Living With a Weak Parser

SMIEが使用するパーステクニックは、異なるコンテキストでトークンが異なる振る舞いをすることを許しません。ほとんどのプログラミング言語にたいして、これは順位の競合によりBNF文法を変換するとき明らかになります。

その文法を若干異なるように表現することにより、これらの競合を回避できる場合があります。たとえばModula-2にたいしては、以下のようなBNF文法をもつのが自然に思えるかもしれません:

  ...
  (inst ("IF" exp "THEN" insts "ELSE" insts "END")
        ("CASE" exp "OF" cases "END")
        ...)
  (cases (cases "|" cases)
         (caselabel ":" insts)
         ("ELSE" insts))
  ...

しかし、これは"ELSE"にたいする競合を生み出すでしょう。その一方でIFルールは、(他の多くのものの中でも特に)"ELSE" = "END"を暗示します。しかしその一方では、"ELSE"cases内に出現しますが、cases"END"の左に出現するので、わたしたちは"ELSE" > "END"も得ることになります。これは、以下を使用して解決できます:

  ...
  (inst ("IF" exp "THEN" insts "ELSE" insts "END")
        ("CASE" exp "OF" cases "END")
        ("CASE" exp "OF" cases "ELSE" insts "END")
        ...)
  (cases (cases "|" cases) (caselabel ":" insts))
  ...

または

  ...
  (inst ("IF" exp "THEN" else "END")
        ("CASE" exp "OF" cases "END")
        ...)
  (else (insts "ELSE" insts))
  (cases (cases "|" cases) (caselabel ":" insts) (else))
  ...

文法を書き換えによる競合の解決には欠点があります。なぜなら、SMIEはその文法がコードの論理的構造を反映すると仮定するからです。そのため、BNFと意図する抽象的構文木の関係を密接に保つことが望まれます。

注意深く考慮した後に、これらの競合は深刻ではなく、smie-bnf->prec2resolvers引数を通じて解決する決心する場合もあるでしょう。これは通常、その文法が単に不明瞭だからです。その文法により記述されるプログラムセットは競合の影響を受けませんが、それらのプログラムにたいする唯一の方法はパースだけです。'((assoc "|"))のようなリゾルバ(resolver: 解決するもの)を追加したいと望むような場合、通常それはセパレーターと2項結合演算子にたいするケースです。これが発生し得る他のケースは、'((assoc "else" "then"))を使用するような場合における、古典的なぶら下がりelse問題dangling else problemです。これは実際に競合があり解決不能だが、実際のところ問題が発生しそうにないケースにたいしても、発生し得ます。

最後に、多くのケースでは、すべての文法再構築努力にも関わらず、いくつかの競合が残るでしょう。しかし失望しないでください。パーサーをより賢くすることはできませんが、あなたの望むようにlexerをスマートにすることは可能です。その方法は、競合が発生したら競合を引き起こしたトークンを調べて、それらのうちの1つを2つ以上の異なるトークンに分割する方法です。たとえば、トークン"begin"にたいする互換性のない2つの使用を文法が区別する必要があり、見つかった"begin"の種類により、lexerに異なるトークン(たとえば"begin-fun""begin-plain")をリターンさせる場合です。これはlexerにたいして、異なるケースを区別する処理を強い、そのためにlexerは特別な手がかりを見つけるために、周囲のテキストを調べる必要があるでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.6 Specifying Indentation Rules

提供された文法にもとづき、他に特別なことを行わなくても、SMIEは自動的なインデントを提供できるでしょう。しかし実際には、このデフォルトのインデントスタイルでは、恐らく十分ではありません。多くの異なる状況において、これを微調整したいと思うかもしれません。

SMIEのインデントは、インデントルールは可能な限りローカルであるべきという考えにもとづきます。バーチャルインデント(virtual indentation)という考えによって、この目的を達成します。これは、特定のプログラムポイント(program point)は行頭にバーチャルインデントがある場合は、それをもつだろう、という発想です。もちろん、そのプログラムポイントが正に行頭にある場合は、そのプログラムポイントのバーチャルインデントは、プログラムポイントのカレントのインデントです。しかしそうでない場合は、SMIEがそのポイントのバーチャルインデントを計算するために、インデントアルゴリズムを使用します。ところで実際には、あるプログラムポイントのバーチャルインデントは、その前に改行を挿入した場合にプログラムポイントがもつであろうインデントと等しい必要はありません。これが機能する方法を確認するためには、Cにおける{の後のSMIEのインデントルールは、{がインデントする行自体にあるか、あるいは前の行の終端にあるかを配慮しないことが挙げられます。かわりに、これらの異なるケースは、{の前のインデントを決定するインデントルール内で処理されます。

他の重要な考え方として、parentの概念があります。あるトークンparentは、周囲にある直近の構文構造の代表トークン(head token)です。たとえば、elseのparentは、それが属するifであり、ifのparentは周囲を取り囲む構造の先導トークン(lead token)です。コマンドbackward-sexpは、あるトークンからトークンのparentにジャンプしますが、注意点がいくつかあります。opener(ifのような、ある構造を開始するトークン)にたいしては、他のトークンではそのトークンの後のポイントから開始する必要があるのにたいして、opnerではそのトークンの前のポイントから開始する必要があります。backward-sexpはparentトークンがそのトークンのopenerの場合はparentトークンの前のポイントで停止し、それ以外ではparentトークンの後のポイントで停止します。

SMIEのインデントルールは、2つの引数methodargをとる関数により指定されます。ここでargの値と期待されるリターン値は、methodに依存します。

methodは、以下のいずれかを指定できます:

argがトークンのとき、関数はそのトークンの直前のポイントで呼び出されます。リターン値nilは常にデフォルトの振る舞いへのフォールバックを意味するので、関数は期待した引数でないときはnilをリターンするべきです。

offsetは、以下のいずれかを指定できます:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.7 Helper Functions for Indentation Rules

SMIEは、インデントを決定する関数内で使用するために特別にデザインされた、さまざまな関数を提供します(これらの関数のうちのいくつかは、異なるコンテキスト内で使用された場合は中断する)。これらの関数はすべて、プレフィックスsmie-rule-で始まります。

Function: smie-rule-bolp

カレントトークンが行の先頭にある場合は、非nilをリターンする。

Function: smie-rule-hanging-p

カレントトークンがhanging(ぶら下がり)の場合は、非nilをリターンする。トークンがその行の最後のトークンであり、他のトークンが先行する場合、そのトークンはhangingである。行に単独のトークンはhangingではない。

Function: smie-rule-next-p &rest tokens

次のトークンがtokens内にある場合は、非nilをリターンする。

Function: smie-rule-prev-p &rest tokens

前のトークンがtokens内にある場合は、非nilをリターンする。

Function: smie-rule-parent-p &rest parents

カレントトークンのparentがparents内にある場合は、非nilをリターンする。

Function: smie-rule-sibling-p

カレントトークンのparentが実際はsibling(兄弟)の場合は、非nilをリターンする。たとえば","のparentが直前の","のような場合が該当する。

Function: smie-rule-parent &optional offset

カレントトークンをparentとアライン(align: 桁揃え)するための適切なオフセットをリターンする。offsetが非nilの場合、それは追加オフセットとして適用される整数であること。

Function: smie-rule-separator method

セパレーター(separator)としてカレントトークンをインデントする。

ここでのセパレーターは、周囲を取り囲む何らかの構文構造内でさまざまな要素を区切ることを唯一の目的とするトークンであり、それ自体は何も意味をもたないトークン(通常は抽象構文木内でノードとして存在しない)を意味する。

このようなトークンは結合構文をもち、その構文的parentと密に結び付けられることが期待される。典型的な例としては引数リスト内の","(カッコで括られた内部)、または命令文シーケンス内の";"({...}begin...endで括られたブロックの内部)が挙げられる。

methodは、‘smie-rules-function’に渡されるメソッド名であること。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.8 Sample Indentation Rules

以下は、インデント関数の例です:

(defun sample-smie-rules (kind token)
  (pcase (cons kind token)
    (`(:elem . basic) sample-indent-basic)
    (`(,_ . ",") (smie-rule-separator kind))
    (`(:after . ":=") sample-indent-basic)
    (`(:before . ,(or `"begin" `"(" `"{")))
     (if (smie-rule-hanging-p) (smie-rule-parent)))
    (`(:before . "if")
     (and (not (smie-rule-bolp)) (smie-rule-prev-p "else")
          (smie-rule-parent)))))

注意すべき点がいくつかあります:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.7.1.9 Customizing Indentation

SMIEにより提供されるインデントを使用するモードを使っている場合は、好みに合わせてインデントをカスタマイズできます。これはモードごと(オプションsmie-configを使用)、またはファイルごと(ファイルローカル変数指定内で関数smie-config-localを使用)に行うことができます。

User Option: smie-config

このオプションにより、モードごとにインデントをカスタマイズできる。これは(mode . rules)という形式の要素をもつalistである。rulesの正確な形式については、変数のドキュメントを参照のこと。しかし、コマンドsmie-config-guessを使用したほうが、より簡単に見つけられるかもしれない。

Command: smie-config-guess

このコマンドは、好みのスタイルのインデントを生成する、適切セッティングの解決を試みる。あなたのスタイルでインデントされたファイルをvisitしているときに、単にこのコマンドを呼び出せばよい。

Command: smie-config-save

smie-config-guessを使用した後にこのコマンドを呼び出すと、将来のセッション用にセッティングを保存する。

Command: smie-config-show-indent &optional move

このコマンドは、カレント行のインデントに使用されているルールを表示する。

Command: smie-config-set-indent

このコマンドは、カレント行のインデントに合わせて、ローカルルールを追加する。

Function: smie-config-local rules

この関数は、カレントバッファーにたいするインデントルールとして、rulesを追加する。これらのルールは、smie-configオプションにより定義された、任意のモード固有ルールに追加される。特定のファイルにたいしてカスタムインデントルールを指定するには、eval: (smie-config-local '(rules))の形式のエントリーを、そのファイルのローカル変数に追加する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

22.8 Desktop Save Mode

Desktop Saveモードとは、あるセッションから別のセッションへ、Emacs状態を保存する機能です。Desktop Saveモードの使用に関するユーザーレベルのコマンドについては、GNU Emacsマニュアルに記載されています(Saving Emacs Sessions in the GNU Emacs Manualを参照)。バッファーでファイルをvisitしているモードでは、この機能を使うために何も行う必要はありません。

ファイルをvisitしていないバッファーについて状態を保存するには、そのメジャーモードがバッファーローカル変数desktop-save-bufferを非nil値にバインドしなければなりません。

Variable: desktop-save-buffer

このバッファーローカル変数が非nilの場合は、デスクトップ保存時にそのバッファー状態がdesktopファイルに保存される。値が関数の場合、その関数はデスクトップ保存時に引数desktop-dirnameで呼び出され、関数が呼び出されたバッファーの状態とともに、関数の値がdesktopファイルに保存される。補助的な情報の一部としてファイル名がリターンされたとき、それらは以下を呼び出してフォーマットされるべきである

(desktop-file-name file-name desktop-dirname)

ファイルをvisitしていないバッファーがリストアされるようにするには、その初を行う関数をメジャーモードが定義しなければならず、その関数はalist desktop-buffer-mode-handlersにリストされなければならない。

Variable: desktop-buffer-mode-handlers

以下を要素にもつalistである

(major-mode . restore-buffer-function)

関数restore-buffer-functionは、以下の引数リストで呼び出されるだろう

(buffer-file-name buffer-name desktop-buffer-misc)

この関数は、リストアされたバッファーをリターンすべきである。ここで、desktop-buffer-miscは、オプションでdesktop-save-bufferにバインドされる関数によりリターンされる値である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23 Documentation

GNU Emacsには便利なビルトインのヘルプ機能があり、それらのほとんどは、関数や変数のドキュメント文字列に付属するドキュメント文字列の情報が由来です。このチャプターでは、Lispプログラムからドキュメント文字列にアクセスする方法について説明します。

ドキュメント文字列のコンテンツは、ある種の慣習にしたがうべきです。特に、最初の行は、その関数または変数を簡単に説明する1つ、または2つの完全なセンテンスであるべきです。よいドキュメント文字列を記述する方法については、Tips for Documentation Stringsを参照してください。

Emacs向けのドキュメント文字列は、Emacsマニュアルと同じものではないことに注意してください。マニュアルは、Texinfo言語で記述された独自のソースファイルをもちます。それにたいしドキュメント文字列は、それが適用される関数および変数の定義内で指定されます。ドキュメント文字列をコレクションしても、それはマニュアルとしては不十分です。なぜなら、よいマニュアルとは、そのやり方でまとめられたものではなく、議論のトピックという観点によりまとめられているからです。

ドキュメント文字列を表示するコマンドについては、Help in The GNU Emacs Manualを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.1 Documentation Basics

ドキュメント文字列は、テキストをダブルクォート文字で囲んだ、文字列にたいするLisp構文を使用して記述されます。実はこれは実際のLisp文字列です。関数または変数の定義内の適切な箇所に文字列があると、それは関数または変数のドキュメントの役割を果たします。

関数定義(lambdadefunフォーム)の中では、ドキュメント文字列は引数リストの後に指定され、通常は関数オブジェクト内に直接格納されます。Documentation Strings of Functionsを参照してください。関数名のfunction-documentationプロパティに関数ドキュメントをputすることもできます(Access to Documentation Stringsを参照)。

変数定義(defvarフォーム)の中では、ドキュメント文字列は初期値の後に指定されます。Defining Global Variablesを参照してください。この文字列は、その変数のvariable-documentationプロパティに格納されます。

Emacsがメモリー内にドキュメント文字列を保持しないときがあります。それには、2つの状況があります。1つ目はメモリーを節約するためで、事前ロードされた関数および変数(プリミティブを含む)のドキュメントは、doc-directoryで指定されたディレクトリー内の、DOCという名前のファイルに保持されます(Access to Documentation Stringsを参照)。2つ目は関数または変数がバイトコンパイルされたファイルからロードされたときで、Emacsはそれらのドキュメント文字列のロードを無効にします(Documentation Strings and Compilationを参照)。どちらの場合も、ある関数にたいしてユーザーがC-h f(describe-function)を呼び出したときなど、Emacsは必要なときだけファイルのドキュメント文字列を照会します。

ドキュメント文字列には、ユーザーがドキュメントを閲覧するときのみ照会されるキーバインディングを参照する、特別なキー置換シーケンス(key substitution sequences)を含めることができます。これにより、たとえユーザーがデフォルトのキーバインディングを変更していても、ヘルプコマンドが正しいキーを表示できるようになります。

オートロードされたコマンド(Autoloadを参照)のドキュメント文字列では、これらのキー置換シーケンスは特別な効果をもち、そのコマンドにたいするC-h fにより、オートロードをトリガーします(これは*Help*バッファー内のハイパーリンクを正しくセットアップするために必要となる)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.2 Access to Documentation Strings

Function: documentation-property symbol property &optional verbatim

この関数は、プロパティproperty配下のsymbolのプロパティリスト内に記録されたドキュメント文字列をリターンする。ほとんどの場合、これはpropertyvariable-documentationにして、変数のドキュメント文字列の照会に使用される。しかし、カスタマイゼーショングループのような、他の種類のドキュメント照会にも使用できる(が、関数のドキュメントには、以下のdocumentation関数を使用する)。

そのプロパティの値がDOCファイルやバイトコンパイル済みファイルに格納されたドキュメント文字列を参照する場合、この関数はその文字列を照会して、それをリターンする。

プロパティの値がnilや文字列以外で、ファイル内のテキストも参照しない場合は、文字列を取得するLisp式として評価される。

最終的に、この関数はキーバインディングを置換するために、文字列をsubstitute-command-keysに引き渡す(Substituting Key Bindings in Documentationを参照)。verbatimが非nilの場合、このステップはスキップされる。

(documentation-property 'command-line-processed
   'variable-documentation)
     ⇒ "Non-nil once command line has been processed"
(symbol-plist 'command-line-processed)
     ⇒ (variable-documentation 188902)
(documentation-property 'emacs 'group-documentation)
     ⇒ "Customization of the One True Editor."
Function: documentation function &optional verbatim

この関数は、functionのドキュメント文字列をリターンする。この関数はマクロ、名前付きキーボードマクロ、およびスペシャルフォームも通常の関数と同様に処理する。

functionがシンボルの場合は、そのシンボルのfunction-documentationプロパティを最初に調べる。それが非nil値をもつなら、その値(プロパティの値が文字列以外の場合は、それを評価した値)がドキュメントとなる。

functionがシンボル以外、あるいはfunction-documentationプロパティをもたない場合、documentationは必要ならファイルを読み込んで、実際の関数定義のドキュメント文字列を抽出する。

最後に、verbatimnilなら、この関数はsubstitute-command-keysを呼び出す。結果はリターンするための文字列である。

documentation関数は、functionが関数定義をもたない場合は、void-functionエラーをシグナルする。しかし、関数定義がドキュメントをもたない場合は問題ない。その場合、documentationnilをリターンする。

Function: face-documentation face

この関数は、faceのドキュメント文字列をフェイスとしてリターンする。

以下は、documentationdocumentation-propertyを使用した例で、いくつかのシンボルのドキュメント文字列を*Help*バッファー内に表示します。

(defun describe-symbols (pattern)
  "PATTERNにマッチするEmacs Lispシンボルを説明する。
名前にPATTERNをもつすべてのシンボルの説明が
`*Help*'バッファーに表示される。"
  (interactive "sDescribe symbols matching: ")
  (let ((describe-func
         (function
          (lambda (s)
            ;; シンボルの説明をプリントする
            (if (fboundp s)             ; これは関数
                (princ
                 (format "%s\t%s\n%s\n\n" s
                   (if (commandp s)
                       (let ((keys (where-is-internal s)))
                         (if keys
                             (concat
                              "Keys: "
                              (mapconcat 'key-description
                                         keys " "))
                           "Keys: none"))
                     "Function")
                   (or (documentation s)
                       "not documented"))))

            (if (boundp s)              ; これは変数
                (princ
                 (format "%s\t%s\n%s\n\n" s
                   (if (custom-variable-p s)
                       "Option " "Variable")
                   (or (documentation-property
                         s 'variable-documentation)
                       "not documented")))))))
        sym-list)

    ;; PATTERNにマッチするシンボルのリストを構築
    (mapatoms (function
               (lambda (sym)
                 (if (string-match pattern (symbol-name sym))
                     (setq sym-list (cons sym sym-list))))))

    ;; データを表示
    (help-setup-xref (list 'describe-symbols pattern) (interactive-p))
    (with-help-window (help-buffer)
      (mapcar describe-func (sort sym-list 'string<)))))

describe-symbols関数はaproposのように機能しますが、より多くの情報を提供します。

(describe-symbols "goal")

---------- Buffer: *Help* ----------
goal-column     Option
Semipermanent goal column for vertical motion, as set by …

set-goal-column Keys: C-x C-n
Set the current horizontal position as a goal for C-n and C-p.
Those commands will move to this position in the line moved to
rather than trying to keep the same horizontal position.
With a non-nil argument, clears out the goal column
so that C-n and C-p resume vertical motion.
The goal column is stored in the variable `goal-column'.

temporary-goal-column   Variable
Current goal column for vertical motion.
It is the column where point was
at the start of current run of vertical motion commands.
When the `track-eol' feature is doing its job, the value is 9999.
---------- Buffer: *Help* ----------
Function: Snarf-documentation filename

この関数は、Emacsビルド時の実行可能なEmacsダンプ直前に使用される。これは、ファイルfilename内に格納されたドキュメント文字列の位置を探して、メモリー上の関数定義および変数のプロパティリスト内にそれらの位置を記録する。Building Emacsを参照のこと。

Emacsは、emacs/etcディレクトリーから、ファイルfilenameを読み込む。その後、ダンプされたEmacs実行時に、ディレクトリーdoc-directory内の同じファイルを照会する。filenameは通常"DOC"である。

Variable: doc-directory

この変数は、ビルトインおよび事前ロードされた関数および変数のドキュメント文字列を含む、ファイル"DOC"があるべきディレクトリーの名前を保持する。

ほとんどの場合、これはdata-directoryと同一である。実際にインストールしたEmacsではなく、EmacswpeyビルドしたディレクトリーからEmacsを実行したときは、異なるかもしれない。Definition of data-directoryを参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.3 Substituting Key Bindings in Documentation

ドキュメント文字列がキーシーケンスを参照する際、それらはカレントである実際のキーバインディングを使用するべきです。これらは、以下で説明する特別なキーシーケンスを使用して行うことができます。通常の方法によるドキュメント文字列へのアクセスは、これらの特別なキーシーケンスをカレントキーバインディングに置き換えます。これは、substitute-command-keysを呼び出すことにより行われます。あなた自身がこの関数を呼び出すこともできます。

以下は、それら特別なシーケンスと、その意味についてのリストです:

\[command]

これは、commandを呼び出すキーシーケンス、またはcommandがキーバインディングをもたない場合は‘M-x command’である。

\{mapvar}

これは、変数mapvarの値であるようなキーマップの要約を意味する。この要約は、describe-bindingsを用いて作成される。

\<mapvar>

これ自体は、何のテキストも意味せず、副作用のためだけに使用される。これは、このドキュメント文字列内にある、後続のすべての‘\[command]’にたいするキーマップとして、mapvarの値を指定する。

\=

これは、後続の文字をクォートして、無効にする。したがって、‘\=\[’は‘\[’、‘\=\=’は‘\=’を出力に配する。

注意してください: Emacs Lisp内の文字列として記述する際は、‘\’を2つ記述しなければなりません。

Function: substitute-command-keys string

この関数は、上述の特別なシーケンスをstringからスキャンして、それらが意味するもので置き換え、その結果を文字列としてリターンする。これにより、そのユーザー自身がカスタマイズした、実際のキーシーケンスを参照するドキュメントが表示できる。

あるコマンドが複数のバインディングをもつ場合、通常この関数は最初に見つかったバインディングを使用する。以下のようにして、コマンドのシンボルプロパティ:advertised-bindingに割り当てることにより、特定のキーバインディングを指定できる:

(put 'undo :advertised-binding [?\C-/])

:advertised-bindingプロパティは、メニューアイテム(The Menu Barを参照)に表示されるバインディングにも影響する。コマンドが実際にもたないキーバインディングを指定した場合、このプロパティは無視される。

以下は、特別なキーシーケンスの例である:

(substitute-command-keys
   "再帰編集者abortするには、次をタイプする: \\[abort-recursive-edit]")
⇒ "再帰編集者abortするには、次をタイプする: C-]"

(substitute-command-keys
   "ミニバッファーにたいして定義されたキーは:
  \\{minibuffer-local-must-match-map}")
⇒ "ミニバッファーにたいして定義されたキーは:

?               minibuffer-completion-help
SPC             minibuffer-complete-word
TAB             minibuffer-complete
C-j             minibuffer-complete-and-exit
RET             minibuffer-complete-and-exit
C-g             abort-recursive-edit
"

(substitute-command-keys
   "ミニバッファーにたいして再帰編集をabortするには、次をタイプ:
\\<minibuffer-local-must-match-map>\\[abort-recursive-edit].")
⇒ "ミニバッファーにたいして再帰編集をabortするには、次をタイプ: C-g."

ドキュメント文字列内のテキストにたいしては、他にも特別な慣習があります。たとえば、このマニュアルの関数、変数、およびセクションで参照できます。詳細はTips for Documentation Stringsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.4 Describing Characters for Help Messages

以下の関数はイベント、キーシーケンス、文字をテキスト表記(textual descriptions)に変換します。これらの変換された表記は、メッセージ内に任意のテキスト文字やキーシーケンスを含める場合に有用です。なぜなら非プリント文字や空白文字は、プリント文字シーケンスに変換されるからです。空白文字以外のプリント文字は、その文字自身が表記になります。

Function: key-description sequence &optional prefix

この関数は、sequence内の入力イベントにたいして、Emacsの標準表記を含む文字列をリターンする。prefixが非nilの場合、それはsequenceに前置される入力イベントシーケンスであり、リターン値にも含まれる。引数はどちらも文字列、ベクター、またはリストかもしれない。有効なイベントに関する詳細は、Input Eventsを参照のこと。

(key-description [?\M-3 delete])
     ⇒ "M-3 <delete>"
(key-description [delete] "\M-3")
     ⇒ "M-3 <delete>"

以下のsingle-key-descriptionの例も参照されたい。

Function: single-key-description event &optional no-angles

この関数は、キーボード入力にたいするEmacsの標準表記として、eventを表記する文字列をリターンする。通常のプリント文字はその文字自身で表れるが、コントロール文字は‘C-’で始まる文字列、メタ文字は‘M-’で始まる文字列、スペース、タブなどは‘SPC’や‘TAB’のように変換される。ファンクションキーのシンボルは、‘<…>’のように角カッコ(angle brackets)の内側に表れる。リストであるようなイベントは、そのリストのCAR内のシンボル名が、角カッコの内側に表れる。

オプション引数no-anglesが非nilの場合、ファンクションキーおよびイベントシンボルを括る角カッコは省略される。これは、角カッコを使用しない古いバージョンのEmacsとの互換性のためである。

(single-key-description ?\C-x)
     ⇒ "C-x"
(key-description "\C-x \M-y \n \t \r \f123")
     ⇒ "C-x SPC M-y SPC C-j SPC TAB SPC RET SPC C-l 1 2 3"
(single-key-description 'delete)
     ⇒ "<delete>"
(single-key-description 'C-mouse-1)
     ⇒ "<C-mouse-1>"
(single-key-description 'C-mouse-1 t)
     ⇒ "C-mouse-1"
Function: text-char-description character

この関数は、テキスト内に出現する文字にたいするEmacsの標準表記として、characterを表記する文字列をリターンする。これはsingle-key-descriptionと似ているが、コントロール文字にカレットが前置されて表される点が異なる(これはEmacsバッファー内でコントロール文字を表示する通常の方法である)。他にも、single-key-descriptionが2**27ビットをメタ文字とするのにたいし、text-char-descriptionは2**7ビットをメタ文字とする点が異なる。

(text-char-description ?\C-c)
     ⇒ "^C"
(text-char-description ?\M-m)
     ⇒ "\xed"
(text-char-description ?\C-\M-m)
     ⇒ "\x8d"
(text-char-description (+ 128 ?m))
     ⇒ "M-m"
(text-char-description (+ 128 ?\C-m))
     ⇒ "M-^M"
Command: read-kbd-macro string &optional need-vector

この関数は主にキーボードマクロを操作するために使用されるが、key-descriptionの大雑把な意味で逆の処理にも使用できる。キー表記を含むスペース区切りの文字列でこれを呼び出すと、それに対応するイベントを含む文字列、またはベクターをリターンする。(これは単一の有効なキーシーケンスであるか否かは問わず、何のイベントを使用するかに依存する。Key Sequencesを参照されたい。) need-vectorが非nilの場合、リターン値は常にベクターになる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

23.5 Help Functions

Emacsは、さまざまなビルトインのヘルプ関数を提供し、それらはすべてプレフィックスC-hのサブコマンドとして、ユーザーがアクセスできます。それらについての詳細は、Help in The GNU Emacs Manualを参照してください。ここでは、同様な情報についてプログラムレベルのインターフェイスを説明します。

Command: apropos pattern &optional do-all

この関数は、名前にaproposパターン(apropos pattern: 適切なパターン) patternを含む、“重要”なすべてのシンボルを探す。マッチに使用されるaproposパターンは単語、最低2つはマッチしなければならないスペース区切りの単語、または(特別な正規表現文字があれば)正規表現のいずれかである。あるシンボルが関数、変数、フェイスとしての定義、あるいはプロパティをもつ場合、そのシンボルは“重要”とされる。

関数は、以下のような要素のリストをリターンする:

(symbol score function-doc variable-doc
 plist-doc widget-doc face-doc group-doc)

ここで、scoreはマッチの面からそのシンボルがどれだけ重要に見えるかを比較する整数である。残りの各要素は、symbolにたいする関数、変数、...等のドキュメント文字列(またはnil)である。

これは*Apropos*という名前のバッファーにもシンボルを表示し、その際各行にはドキュメント文字列の先頭から取得した1行説明とともに表示される。

do-allが非nil、またはユーザーオプションapropos-do-allが非nilの場合、aproposは見つかった関数のキーバインディングも表示する。これは重要なものだけでなく、のinternされたすべてのシンボルも表示する(同様にリターン値としてもそれらをリストする)。

Variable: help-map

この変数の値は、HelpキーC-hに続く文字にたいするローカルキーマップである。

Prefix Command: help-command

このシンボルは関数ではなく、関数定義セルにはhelp-mapとして知られる、キーマップを保持する。これは、help.el内で以下のように定義されている:

(define-key global-map (string help-char) 'help-command)
(fset 'help-command help-map)
User Option: help-char

この変数の値は、ヘルプ文字(help character: Helpを意味する文字としてEmacsが認識する文字)である。デフォルトでは、C-hを意味する8が値である。この文字を読み取った際、help-formが非nilのLisp式ならば、Emacsはその式を評価して、結果が文字列の場合はウィンドウ内にそれを表示する。

通常、help-formの値はnilである。その場合、ヘルプ文字はコマンド入力のレベルにおいて特別な意味を有せず、通常の方法におけるキーシーケンスの一部となる。C-hの標準的なキーバインディングは、複数の汎用目的をもつヘルプ機能のプレフィックスキーである。

ヘルプ文字は、プレフィックスキーの後でも特別な意味をもつ。ヘルプ文字がプレフィックスキーのサブコマンドとしてバインディングをもたない場合は、そのプレフィックスキーのすべてのサブコマンドのリストを表示する、describe-prefix-bindingsを実行する。

User Option: help-event-list

この変数の値は、“ヘルプ文字”の代役を果たすイベント型のリストである。これらのイベントは、help-charで指定されるイベントと同様に処理される。

Variable: help-form

この変数が非nilの場合、その値は文字help-charが読み取られるたびに評価されるフォームである。そのフォームの評価により文字列が生成された場合は、その文字列が表示される。

read-eventread-char-choiceread-charを呼び出すコマンドは、それが入力を行う間は、恐らくhelp-formを非nilにバインドすべきであろう(C-hが他の意味をもつ場合は、これを行うべきではない)。この式を評価した結果は、何にたいする入力なのか、そしてそれを正しくエンターする方法を説明する文字列であること。

ミニバッファーへのエントリーにより、この変数はminibuffer-help-formの値にバインドされる(Definition of minibuffer-help-formを参照)。

Variable: prefix-help-command

この変数は、プレフィックスキーにたいするヘルプをプリントする関数を保持する。その関数は、ユーザーが後にヘルプ文字を伴うプレフィックスキーをタイプし、そのヘルプ文字がプレフィックスの後のバインディングをもたないたときに呼び出される。この変数のデフォルト値はdescribe-prefix-bindingsである。

Command: describe-prefix-bindings

この関数は、もっとも最近のプレフィックスキーのサブコマンドすべてにたいするリストを表示する。プレフィックスの説明は、そのキーシーケンスの最後のイベントを除くすべてから構成される(最後のイベントは、恐らくヘルプ文字であろう)。

以下の2つの関数は、“electric”モードのように制御を放棄することなくヘルプを提供したいモードを意図しています。これらは、通常のヘルプ関数と区別するため、名前が‘Helper’で始まります。

Command: Helper-describe-bindings

このコマンドは、ローカルキーマップとグローバルキーマップの両方のキーバインディングすべてのリストを含むヘルプバッファーを表示するウィンドウをポップアップする。これはdescribe-bindingsを呼び出すことにより機能する。

Command: Helper-help

このコマンドは、カレントモードにたいするヘルプを提供する。これはミニバッファー内でメッセージ‘Help (Type ? for further options)’とともにユーザーに入力を求め、その後キーバインディングが何か、何を意図するモードなのかを探すための助けを提供する。これはnilをリターンする。

これは、マップHelper-help-mapを変更することによりカスタマイズできる。

Variable: data-directory

この変数は、Emacsに付随する特定のドキュメントおよびテキストファイルを探すディレクトリーの名前を保持する。

Function: help-buffer

この関数は、ヘルプバッファーの名前(通常は*Help*)をリターンする。そのようなバッファーが存在しない場合は、最初にそれを作成する。

Macro: with-help-window buffer-name body…

このマクロは、with-output-to-temp-buffer(Temporary Displaysを参照)のようにbodyを評価して、そのフォームが生成したすべての出力を、buffer-nameという名前のバッファーに挿入する(buffer-nameは、通常は関数help-bufferによりリターンされる値であるべきだろう)。これは、指定されたバッファーをHelpモードに置き、ヘルプウィンドウをquit、およびスクロールする方法を告げるメッセージを表示する。これは、ユーザーオプションhelp-window-selectのカレント値が適切にセットされていれば、ヘルプウィンドウの選択も行う。これはbody内の最後の値をリターンする。

Function: help-setup-xref item interactive-p

この関数は、*Help*バッファー内のクロスリファレンスデータを更新する。このクロスリファレンスは、ユーザーが‘Back’ボタンまたは‘Forward’ボタン上でクリックした際に、ヘルプ情報の再生成に使用される。*Help*バッファーを使用するほとんどのコマンドは、バッファーをクリアーする前に、この関数を呼び出すべきである。item引数は、(function . args)という形式であること。ここで、functionは引数リストargsで呼び出されるヘルプバッファーを再生成する関数である。コマンド呼び出しがinteractiveに行われた場合、interactive-p引数は非nilである。この場合、*Help*バッファーの‘Back’ボタンにたいするitemのスタックはクリアーされる。

help-bufferwith-help-windowhelp-setup-xrefの使用例は、describe-symbols exampleを参照してください。

Macro: make-help-screen fname help-line help-text help-map

このマクロは、提供するサブコマンドのリストを表示するプレフィックスキーのように振る舞う、fnameという名前のヘルプコマンドを定義する。

呼び出された際、fnameはウィンドウ内にhelp-textを表示してから、help-mapに応じてキーシーケンスの読み取りと実行を行う。文字列help-textは、help-map内で利用可能なバインディングを説明すべきである。

コマンドfnameは、help-textの表示をスクロールすることによる、自身のいくつかのイベントを処理するために定義される。fnameがこれらのスペシャルイベントのいずれかを読み取った際は、スクロールを行った後で他のイベントを読み取る。自身が処理する以外のイベントを読み取り、そのイベントがhelp-map内にバインディングを有す際は、そのキーのバインディングを実行した後リターンする。

引数help-lineは、help-map内の候補の1行要約であること。Emacsのカレントバージョンでは、オプションthree-step-helptにセットした場合のみ、この引数が使用される。

このマクロは、C-h C-hにバインドされるコマンドhelp-for-help内で使用される。

User Option: three-step-help

この変数が非nilの場合、make-help-screenで定義されたコマンドは、最初にエコーエリア内に自身のhelp-line文字列を表示し、ユーザーが再度ヘルプ文字をタイプした場合のみ、長いhelp-text文字列を表示する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24 Files

このチャプターでは検索、作成、閲覧、保存、その他ファイルとディレクトリーにたいして機能する、Emacs Lispの関数および変数について説明します。その他のいくつかのファイルに関する関数についてはBuffers、バックアップとauto-save(自動保存)に関する関数についてはBackups and Auto-Savingで説明されています。

ファイル関数の多くは、ファイル名であるような引数を1つ以上とります。このファイル名は文字列です。これらの関数のほとんどは、関数expand-file-nameを使用してファイル名引数を展開するので、~は相対ファイル名(../を含む)として正しく処理されます。Functions that Expand Filenamesを参照してください。

加えて、特定のmagicファイル名は特別に扱われます。たとえば、リモートファイル名が指定された際、Emacsは適切なプロトコルを通じて、ネットワーク越しにファイルにアクセスします。Remote Files in The GNU Emacs Manualを参照してください。この処理は非常に低いレベルで行われるので、注記されたものを除き、このチャプターで説明するすべての関数が、ファイル名引数としてmagicファイル名を受け入れると想定しても良いでしょう。詳細は、See section Making Certain File Names “Magic”を参照してください。

ファイルI/O関数がLispエラーをシグナルする際、通常はコンディションfile-errorを使用します(Writing Code to Handle Errorsを参照)。ほとんどの場合、オペレーティングシステムからロケールsystem-messages-localeに応じたエラーメッセージが取得され、コーディングシステムlocale-coding-systemを使用してデコードされます(Localesを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.1 Visiting Files

ファイルのvisitとは、ファイルをバッファーに読み込むことを意味します。一度これを行うと、わたしたちはバッファーがファイルをvisit(訪問)していると言い、ファイルのことをバッファーの“visit”されたファイルと呼んでいます。

ファイルとバッファーは、2つの異なる事柄です。ファイルとは、(削除しない限り)コンピューター内に永続的に記録された情報です。一方バッファーとは、編集セッションの終了(またはバッファーのkill)とともに消滅する、Emacs内部の情報です。あるバッファーがファイルをvistしているとき、バッファーぬはファイルからコピーされた情報が含まれます。編集コマンドにより変更されるのは、バッファー内のコピーです。バッファーへの変更によりファイルは変更されません。その変更を永続化させるには、バッファーを保存(save)しなければなりません。これは変更されたバッファーのコンテンツをファイルにコピーして戻すことを意味します。

ファイルとバッファーは異なるにも関わらず、人はバッファーという意味でファイルを呼んだり、その逆を行うことが多々あります。実際のところ、“わたしは間もなく同じ名前のファイルに保存するバッファーを編集している”ではなく、“わたしはファイルを編集している”と言います。人間がこの違いを明示する必要は、通常はありません。しかし、コンピュータープログラムに対処する際は、この違いを心に留めておくのが良いでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.1.1 Functions for Visiting Files

このセクションでは、ファイルのvisitに通常使用される関数を説明します。歴史的な理由により、これらの関数は‘visit-’ではなく、‘find-’で始まる名前をもちます。バッファーをvisitしているファイルの名前へのアクセスや、visitされたファイル名から既存のバッファーを見つける関数および変数については、Buffer File Nameを参照してください。

Lispプログラム内では、ファイル内容を見たいものの変更したくない場合はテンポラリーバッファー(temporary buffer: 一時的なバッファー)でinsert-file-contentsを使用例するのが、もっとも高速な方法です。時間を要するファイルのvisitは必要ありません。Reading from Filesを参照してください。

Command: find-file filename &optional wildcards

このコマンドは、ファイルfilenameをvisitしているバッファーを選択する。visitしている既存のバッファーがあればそのバッファーを使用し、なければバッファーを新たに作成して、そのバッファーにファイルを読み込む。これはそのバッファーをリターンする。

技術的な詳細を別とすると、find-file関数のbodyは基本的には以下と等価である:

(switch-to-buffer (find-file-noselect filename nil nil wildcards))

(Switching to a Buffer in a Windowswitch-to-bufferを参照されたい。)

wildcardsが非nil(これはinteractiveに呼び出された場合は常にtrueである)の場合、find-filefilename内のワイルドカード文字を展開して、マッチするすべてのファイルをvisitする。

find-fileがinteractiveに呼び出された際は、ミニバッファー内でfilenameの入力を求める。

Command: find-file-literally filename

このコマンドは、find-fileが行うようにfilenameをvisitするが、フォーマット変換(File Format Conversionを参照)、文字コード変換(Coding Systemsを参照)、EOL変換(End of line conversionを参照)を何も行わない。ファイルをvisitしているバッファーはunibyteになり、ファイル名とは無関係にバッファーのメジャーモードはFundamentalモードになる。ファイル内で指定されたファイルローカル変数(File Local Variablesを参照)は無視され、自動的な解凍とrequire-final-newlineによるファイル終端への改行追加(require-final-newlineを参照)も無効になる。

Emacsがすでにリテラリー(literally: 文字通り、そのまま)でない方法で同じファイルをvisitしているバッファーをもつ場合、Emacsはその同じファイルをリテラリーにvisitせず、単に既存のバッファーに切り替わることに注意されたい。あるファイルのコンテンツにたいして、確実にリテラリーにアクセスしたい場合は、テンポラリーバッファーを作成し、insert-file-contents-literallyを使用してファイルのコンテンツを読み込むべきである(Reading from Filesを参照)。

Function: find-file-noselect filename &optional nowarn rawfile wildcards

この関数は、ファイルをvisitするすべての関数の要である。これは、ファイルfilenameをvisitしているバッファーをリターンする。望むならそのバッファーをカレントにしたり、あるウィンドウ内に表示することができるだろうが、この関数はそれを行わない。

関数は、既存のバッファーがあればそれをリターンし、なければ新たにバッファーを作成し、それにファイルを読み込む。find-file-noselectが既存のバッファーを使用する際は、まずファイルがそのバッファーに最後にvisit、または保存したときから変更されていないことを検証する。ファイルが変更されている場合、この関数は変更されたファイルを再読み込みするかどうかをユーザーに尋ねる。ユーザーが‘yes’と応えた場合、以前に行われたそのバッファー内での編集は失われる。

ファイルの読み込みは、EOL変換、フォーマット変換(File Format Conversionを参照)を含む、ファイルコンテンツのデコードを要する(Coding Systemsを参照)。wildcardsが非nilの場合、find-file-noselectfilename内のワイルドカード文字を展開して、マッチするすべてのファイルをvisitする。

この関数は、オプション引数nowarnnilの場合は、さまざまな特殊ケースにおいて、警告メッセージ(warning message)、および注意メッセージ(advisory message)を表示する。たとえば、関数がバッファーの作成を必要とし、かつfilenameという名前のファイルが存在しない場合は、エコーエリア内にメッセージ‘(New file)’を表示して、そのバッファーを空のままに留める。

find-file-noselect関数は通常、ファイルを読み込んだ後にafter-find-fileを呼び出す(Subroutines of Visitingを参照)。この関数はバッファーのメジャーモードのセット、ローカル変数のパース、正にvisitしたファイルより新しいauto-saveファイルが存在する場合のユーザーへの警告を行い、find-file-hook内の関数を実行することにより終了する。

オプション引数rawfileが非nilの場合、after-find-fileは呼び出されず、失敗時にfind-file-not-found-functionsは呼び出されない。さらに、非nil値のrawfileは、コーディングシステム変換およびフォーマット変換を抑制する。

find-file-noselect関数は、通常はファイルfilenameをvisitしているバッファーをリターンする。しかし、ワイルドカードが実際に使用、展開された場合は、それらのファイルをvisitしているバッファーのリストをリターンする。

(find-file-noselect "/etc/fstab")
     ⇒ #<buffer fstab>
Command: find-file-other-window filename &optional wildcards

このコマンドは、ファイルfilenameをvisitしているバッファーを選択するが、選択されたウィンドウではない他のウィンドウでこれを行う。これは、別の既存ウィンドウを使用したり、ウィンドウを分割するかもしれない。Switching to a Buffer in a Windowlを参照のこと。

このコマンドがinteractiveに呼び出された際は、filenameの入力を求める。

Command: find-file-read-only filename &optional wildcards

このコマンドは、find-fileのようにファイルfilenameをvisitしているバッファーを選択するが、そのバッファーを読み取り専用(read-only)とマークする。関連する関数および変数については、Read-Only Buffersを参照のこと。

このコマンドがinteractiveに呼び出された際は、filenameの入力を求める。

User Option: find-file-wildcards

この変数が非nilの場合、各種find-fileコマンドはワイルドカード文字をチェックして、それらにマッチするすべてのファイルをvisitする(interactiveに呼び出されたとき、またはwildcards引数が非nilのとき)。このオプションがnilの場合、find-fileコマンドはそれらのwildcards引数を無視して、ワイルドカード文字を特別に扱うことは決してない。

User Option: find-file-hook

この変数の値は、ファイルがvisitされた後に呼び出される、関数のリストである。ファイルのローカル変数指定は、(もしあれば)このフックが実行される前に処理されるだろう。フック関数実行時は、そのファイルをvisitしているバッファーがカレントになる。

この変数はノーマルフックである。Hooksを参照のこと。

Variable: find-file-not-found-functions

この変数の値は、find-fileまたはfind-file-noselectが存在しないファイル名を受け取った際に呼び出される、関数のリストである。存在しないファイルを検知すると、find-file-noselectは直ちにこれらの関数を呼び出す。これらのうち、いずれかが非nilをリターンするまで、リストの順に関数を呼び出す。buffer-file-nameはすでにセットアップ済みである。

関数の値が使用され、多くの場合いくつかの関数だけが呼び出されるので、これはノーマルフックではない。

Variable: find-file-literally

このバッファーローカル変数が非nil値にセットされた場合、save-bufferはあたかもそのバッファーがリテラリー、つまり何の変換も行わずにファイルをvisitしていたかのように振る舞う。コマンドfind-file-literallyは、この変数のローカル値をセットするが、その他の等価な関数およびコマンドも、たとえばファイル終端への改行の自動追加を避けるために、同様にこれを行うことができる。この変数は恒久的にローカルなので、メジャーモードの変更により影響を受けない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.1.2 Subroutines of Visiting

find-file-noselect関数は、2つの重要なサブルーチンcreate-file-bufferおよびafter-find-fileを使用します。これらはユーザーのLispコードでも役に立つことがあります。このセクションでは、それらの使い方について説明します。

Function: create-file-buffer filename

この関数は、filenameのvisitにたいして適切な名前のバッファーを作成して、それをリターンする。これはfilename(ディレクトリー含まず)の名前がフリーならバッファー名にそれを使用し、フリーでなければ未使用の名前を取得するために‘<2>’のような文字列を付加する。Creating Buffersも参照のこと。uniquifyライブラリーは、この関数の結果に影響を与えることに注意されたい。Uniquify in The GNU Emacs Manualを参照のこと。

注意してください: create-file-bufferはファイルに新たなバッファーを関連付けません。バッファーの選択もせず、さらにデフォルトのメジャーモードも使用しません。

(create-file-buffer "foo")
     ⇒ #<buffer foo>
(create-file-buffer "foo")
     ⇒ #<buffer foo<2>>
(create-file-buffer "foo")
     ⇒ #<buffer foo<3>>

この関数は、find-file-noselectにより使用される。この関数自身はgenerate-new-bufferを使用する(Creating Buffersを参照)。

Function: after-find-file &optional error warn noauto after-find-file-from-revert-buffer nomodes

この関数は、バッファーのメジャーモードをセットして、ローカル変数をパースする(How Emacs Chooses a Major Modeを参照)。これはfind-file-noselect、およびデフォルトのリバート関数(Revertingを参照)により呼び出される。

ファイルが存在しない理由によりファイルの読み込みがエラーを受け取るが、ディレクトリーは存在する場合、呼び出し側はerrorにたいして非nil値を綿すべきである。この場合、after-find-fileは警告‘(New file)’を発する。より深刻なエラーにたいしては、呼び出し側は通常はafter-find-fileを呼び出すべきでない。

warnが非nilの場合、もしauto-saveファイルが存在し、かつそれがvisitされているファイルより新しいなら、この関数は警告を発する。

noautoが非nilの場合、それはAuto-Saveモードを有効、または無効にしないことを告げる。以前にAuto-Saveモードが有効ならば、有効のまま留まる。

after-find-file-from-revert-bufferが非nilの場合、それはこの関数がrevert-bufferから呼び出されたことを意味する。これに直接的な効果はないが、モード関数およびフック関数の中には、この変数の値をチェックするものがいくつかある。

nomodesが非nilの場合、それはバッファーのメジャーモードを変更せず、ファイル内のローカル変数指定を処理せず、find-file-hookを実行しないことを意味する。この機能は、あるケースにおいてrevert-bufferにより使用される。

after-find-fileが最後に行うのは、リストfind-file-hook内のすべての関数を呼び出すことである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.2 Saving Buffers

Emacs内でファイルを編集とき、実際にはそのファイルをvisitしているバッファーにたいして編集を行っています。つまり、ファイルのコンテンツをバッファーにコピーして、編集しているのはそのコピーなのです。そのバッファーにを変更しても、バッファーを保存(save)するまでファイルは変更されません。保存とは、バッファーのコンテンツをファイルにコピーすることを意味します。

Command: save-buffer &optional backup-option

この関数は、バッファーが最後にvisitされたとき、または保存されたときから変更されている場合は、カレントバッファーのコンテンツを、バッファーによりvisitされているファイルに保存し、変更されていなければ何も行わない。

save-bufferは、バックアップファイルの作成に責任を負う。通常、backup-optionnilであり、save-bufferはファイルをvisit以降、それが最初の保存の場合のみバックアップファイルを作成する。backup-optionにたいする他の値は、別の条件によるバックアップファイル作成を要求する:

Command: save-some-buffers &optional save-silently-p pred

このコマンドは、ファイルをvisitしている変更されたバッファーのいくつかを保存する。これは通常、各バッファーごとにユーザーに確認を求める。しかし、save-silently-pが非nilの場合は、ユーザーに質問せずにファイルをvisitしているすべてのバッファーを保存する。

オプション引数predは、どのバッファーで確認を求めるか(またはsave-silently-pが非nilの場合は、どのバッファーで確認せずに保存するか)を制御する。これがnilの場合、それはファイルをvisitしているバッファーにたいしてのみ確認を求めることを意味する。tの場合、それは、buffer-offer-saveのバッファーローカル値がnilであるような、非ファイルバッファー以外の特定のバッファーの保存も提案することを意味する(Killing Buffersを参照)。ユーザーが、非ファイルバッファーの保存にたいして‘yes’と応えると、保存に使用するファイル名の指定を求める。save-buffers-kill-emacs関数は、predにたいして値tを渡す。

predtnilのどちらでもない場合、それは引数なしの関数であること。その関数は、そのバッファーの保存するを提案するか否かを決定するために、バッファーごとに呼び出されるだろう。これが特定のバッファーで非nil値をリターンした場合は、バッファーの保存を提案することを意味する。

Command: write-file filename &optional confirm

この関数は、カレントバッファーをファイルfilenameに書き込み、バッファーがそのファイルをvisitしていることにして、未変更とマークする。次にfilenameにもとづいてバッファー名をリネームする。バッファー名を一意にするため、必要なら‘<2>’のような文字列を付加する。処理のほとんどは、set-visited-file-name(Buffer File Nameを参照)、およびsave-bufferを呼び出すことにより行われる。

confirmが非nilの場合、それは既存のファイルを上書きする前に確認を求めることを意味する。ユーザーがプレフィックス引数を与えない場合、interactiveに確認が求められる。

filenameが既存のディレクトリーであったり、既存のディレクトリーへのシンボリックリンクの場合、write-fileはディレクトリーfilename内でvisitされているファイルの名前を使用する。そのバッファーがファイルをvisitしていない場合は、かわりにバッファーの名前を使用する。

バッファーの保存により、複数のフックが実行される。これはフォーマット変換も処理する(File Format Conversionを参照)。

Variable: write-file-functions

この変数の値は、バッファーをvisitされているファイルに書き出す前に呼び出される、関数のリストである。それらのうちのいずれかが非nilをリターンした場合、そのファイルは書き込み済みだと判断され、残りの関数は呼び出されないし、ファイルを書き込むための通常のコードも実行されない。

write-file-functions内の関数が非nilをリターンした場合、(それが適切であれば)その関数はファイルをバックアップする責任を負う。これを行うには、以下のコードを実行する:

(or buffer-backed-up (backup-buffer))

backup-bufferによりリターンされるファイルモードの値を保存して、(もし非nilなら)書き込むファイルのモードビットをセットしたいと思うかもしれない。これは正にsave-bufferが通常行うことである。Making Backup Filesを参照のこと。

write-file-functions内のフック関数は、データのエンコード(が望ましければ)にも責任を負う。これらは適切なコーディングシステムと改行規則(Coding Systems in Lispを参照)を選択してエンコード(Explicit Encoding and Decodingを参照)を処理し、使用されていたコーディングシステム(Encoding and I/Oを参照)をlast-coding-system-usedにセットしなければならない。

バッファー内でこのフックをローカルにセットした場合、バッファーはそのファイル、またはバッファーのコンテンツを取得したファイルに類するものに関連付けられる。このようにして、変数は恒久的にローカルであるとマークされるので、メジャーモードの変更がバッファーローカルな値を変更することはない。その一方で、set-visited-file-nameを呼び出すことにより、変数はリセットされるだろう。これを望まない場合は、かわりにwrite-contents-functionsを使用したいと思うだろう。

たとえこれがノーマルフックでないとしても、このリストを操作するためにadd-hookおよびremove-hookを使用することはできる。Hooksを参照のこと。

Variable: write-contents-functions

これは正にwrite-file-functionsと同様に機能するが、こちらはvisitしている特定のファイルやファイルの場所ではなく、バッファーのコンテンツに関連するフックを意図している。そのようなフックは、この変数にたいするバッファーローカルなバインディングとして、通常はメジャーモードにより作成される。この変数は、セットされた際は、常に自動的にバッファーローカルになる。新たなメジャーモードへの切り替えは、常にこの変数をリセットするが、set-visited-file-nameの呼び出しではリセットされない。

このフック内の関数のいずれかが非nilをリターンした場合、そのファイルはすでに書き込み済みとみなされ、残りの関数は呼び出されず、write-file-functions内の関数も呼び出されない。

User Option: before-save-hook

このノーマルフックは、visitしているファイルにバッファーが保存される前に実行される。保存が通常の方法で行われるか、あるいは上述のフックのいずれかで行われたかは問題にしない。たとえば、copyright.elプログラムは、ファイルの保存において、それの著作権表示が今年であることを確認するために、このフックを使用する。

User Option: after-save-hook

このノーマルフックは、visitしているファイルにバッファーを保存した後に実行される。このフックの使用例の1つは、Fast Lockモードにある。このモードは、キャッシュファイルにハイライト情報を保存するために、このフックを使用している。

User Option: file-precious-flag

この変数が非nilの場合、save-bufferは保存ファイルがもつ名前のかわりに、一時的な名前で新たなファイルに書き込み、エラーがないと明確になった後にファイルを意図する名前にリネームすることにより、保存中のI/Oエラーから防御する。この手順は、無効なファイルが原因となるディスク容量逼迫のような問題を防ぐ。

副作用として、バックアップ作成にコピーが必要になる。Backup by Renaming or by Copying?を参照のこと。しかし同時に、この高価なファイル保存により、保存したファイルと他のファイル名との間のすべてのハードリンクは切断される。

いくつかのモードは、特定のバッファーにおいて、この変数に非nilのバッファーローカル値を与える。

User Option: require-final-newline

この変数は、ファイルが改行で終わらないように書き込まれるかどうかを決定する。変数の値がtの場合、save-bufferはバッファーの終端に改行がなければ暗黙理に改行を追加する。値がvisitの場合、Emacsはファイルをvisitした直後に不足している改行を追加する。値がvisit-saveの場合、Emacsはvisitと保存の両方のタイミングで、不足している改行を追加する。その他の非nil値にたいしては、そのようなケースが生じるたびに、改行を追加するかどうか、save-bufferがユーザーに尋ねる。

変数の値がnilの場合、save-bufferは改行を追加しない。デフォルト値はnilだが、特定のバッファーでこれをtにセットするメジャーモードも少数存在する。

Buffer File Nameの関数set-visited-file-nameも参照されたい。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.3 Reading from Files

ファイルのコンテンツをバッファーにコピーするためには、関数insert-file-contentsを使用しします(マークをセットするので、Lispプログラム内でコマンドinsert-fileは使用してはならない)。

Function: insert-file-contents filename &optional visit beg end replace

この関数は、ファイルfilenameのコンテンツを、カレントバッファーのポイントの後に挿入する。これは絶対ファイル名と、挿入だれたデータの長さからなるリストをリターンする。filenameが読み取り可能なファイルの名前でない場合は、エラーがシグナルされる。

この関数は、定義されたファイルフォーマットに照らしてファイルのコンテンツをチェックして、適切ならそのコンテンツの変換、およびリストafter-insert-file-functions内の関数の呼び出しも行う。File Format Conversionを参照のこと。通常は、リストafter-insert-file-functions内のいずれかの関数が、EOL変換を含むファイルコンテンツのデコードに使用される、コーディングシステム(Coding Systemsを参照)を判断する。しかし、ファイルにnullバイトが含まれる場合、デフォルトではコード変換なしでvisitされる。inhibit-null-byte-detectionを参照のこと。

visitが非nilの場合、この関数は追加でそのバッファーを未変更とマークして、そのバッファーのさまざまなフィールドをセットアップして、バッファーがファイルfilenameをvisitしているようにする。これらのフィールドにはバッファーがvisitしたファイルの名前、最終保存したファイルのmodtimeが含まれる。これらの機能はfind-file-noselectにより使用され、恐らくあなた自身が使用するべきではない。

begおよびendが非nilの場合、それらはファイル挿入範囲を指定する、バイトオフセット数値であること。この場合、visitnilでなければならない。たとえば、

(insert-file-contents filename nil 0 500)

これはファイルの先頭500文字(バイト)を挿入する。

引数replaceが非nilの場合、それはバッファーのコンテンツ(実際にはアクセス可能な範囲)を、ファイルのコンテンツで置き換えることを意味する。これは単にバッファーのコンテンツを削除してファイル全体を挿入するより優る。なぜなら、(1)マーカー位置を維持し、(2)undoリストに配すデータも少ないからである。

replacevisitnilであれば、insert-file-contentsで(FIFOやI/Oデバイスのような)スペシャルファイルの読み取りが可能である。

Function: insert-file-contents-literally filename &optional visit beg end replace

この関数はinsert-file-contentsのように機能するが、find-file-hookを実行せず、フォーマットのデコード、文字コード変換、自動解凍、...などを行わない点が異なる。

他のプログラムがファイルを読めるように、他のプロセスにファイル名を渡したい場合は、関数file-local-copyを使用します。Making Certain File Names “Magic”を参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.4 Writing to Files

関数append-to-fileおよびwrite-regionを使用することにより、ディスク上のファイルに直接、バッファーのコンテンツ、またはバッファーの一部を書き込むことができます。visitされているファイルに書き込むために、これらの関数を使用しないでください。これにより、visitにたいするメカニズムが混乱するかもしれません。

Command: append-to-file start end filename

この関数は、カレントバッファー内で、startendによるリージョンのコンテンツを、ファイルfilenameの終端に追加する。そのファイルが存在しない場合は作成する。この関数はnilをリターンする。

filenameに書込不可能なファイル、またはファイルを作成不可なディレクトリー内の存在しないファイルを指定した場合は、エラーがシグナルされる。

Lispから呼び出した場合、この関数は以下と完全に等価である:

(write-region start end filename t)
Command: write-region start end filename &optional append visit lockname mustbenew

この関数は、カレントバッファー内のstartendで区切られたリージョンを、filenameで指定されたファイルに書き込む。

startnilの場合、このコマンドはバッファーのコンテンツ全体(アクセス可能な範囲だけではない)をファイルに書き込み、endは無視する。

startが文字列の場合、write-regionはバッファーのテキストではなく、その文字列を追加する。その場合、endは無視される。

appendが非nilの場合は、指定されたテキストが(もしあれば)既存のファイルコンテンツに追加される。appendが数字の場合、write-regionはファイル開始位置からそのバイトオフセットをseekして、データをそこに書き込む。

mustbenewが非nilの場合、write-regionはもしfilenameが既存ファイルの名前なら確認を求める。mustbenewがシンボルexclなら、ファイルがすでに存在する場合はwrite-regionは確認を求めるかわりに、エラーfile-already-existsをシグナルする。

mustbenewexclのときは、存在するファイルのテストに特別なシステム機能を使用する。少なくともローカルディスク上のファイルにたいしては、Emacsがファイルを作成する前に、Emacsに通知せずに他のプログラムが同じ名前のファイルを作成することはありえない。

visittの場合、Emacsはバッファーとファイルの関連付けを設定し、そのバッファーがそのファイルをvictimする。また、カレントバッファーにたいする最終ファイル変更日時にfilenameをセットして、そのバッファーを未変更としてマークする。この機能はsave-bufferにより使用されるが、おそらくあなた自身が使用するべきではないだろう。

visitが文字列の場合、それはvisitするファイルの名前を指定する。この方法を使えば、そのバッファーが別のファイルをvisitしていると記録しつつ、1つのファイル(filename)にデータを書き込むことができる。引数visitは、エコーエリアに使用される他に、ファイルのロックにも使用され、visitbuffer-file-nameに格納される。この機能は、file-precious-flagの実装に使用される。自分が何をしているか本当にわかっているのでなければ、これを使用してはならない。

オプション引数locknameが非nilの場合、それはロックとアンロックの目的に使用する、filenameおよびvisitをオーバーライドするファイル名を指定する。

関数write-regionは、書き込むデータをbuffer-file-formatにより指定される、適切なファイルフォーマットに変換しするとともに、リストwrite-region-annotate-functions内の関数の呼び出しも行う。File Format Conversionを参照のこと。

通常、write-regionはエコーエリア内にメッセージ‘Wrote filename’を表示する。visittnil、文字列のいずれでもない場合、このメッセージは抑制される。この機能は、内部的な目的のために、ユーザーが知る必要がないファイルを使用する場合に有用である。

Macro: with-temp-file file body…

with-temp-fileマクロは、一時バッファー(temporary buffer)をカレントバッファーとしてbodyフォームを評価して、最後にそのバッファーのコンテンツをfileに書き込む。これは終了時に一時バッファーをkillして、with-temp-fileフォームの前にカレントだったバッファーをリストアする。その後、body内の最後のフォームの値をリターンする。

throwやエラーによる異常なexit(abnormal exit)でも、カレントバッファーはリストアされる(Nonlocal Exitsを参照)。

The Current Bufferwith-temp-bufferも参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.5 File Locks

2人のユーザーが同時に同じファイルを編集する際、おそらく彼らは互いに干渉しあうでしょう。Emacsは、ファイルが変更される際にファイルロック(file lock)を記録することにより、このような状況の発生を防ぎます。そして、Emacsは他のEmacsジョブにロックされているファイルをvisitしているバッファーへの変更の最初の試みを検知して、ユーザーに何を行うか尋ねます。このファイルロックの実態は、編集中のファイルと同じディレクトリーに格納される、特別な名前をもつシンボリックリンクです(シンボリックリンクをサポートしないファイルシステムでは、通常のファイルが使用される)。

ファイルのアクセスにNFSを使用する際には、可能性は小さいものの、他のユーザーと同じファイルを“同時”にロックするかもしれません。これが発生した場合、2人のユーザーが同時にファイルを変更することが可能になりますが、それでもEmacsは2番目に保存するユーザーにたいして警告を発するでしょう。たファイルをvisitしているバッファーで、ディスク上でファイル変更の検知により、ある種の同時編集を捕捉できます。Buffer Modification Timeを参照してください。

Function: file-locked-p filename

この関数は、ファイルfilenameがロックされていなければnilをリターンする。このEmacsプロセスによりロックされている場合はtをリターンし、他のEmacsジョブによりロックされている場合はロックしたユーザーの名前をリターンする。

(file-locked-p "foo")
     ⇒ nil
Function: lock-buffer &optional filename

この関数は、カレントバッファーが変更されている場合は、ファイルfilenameをロックする。引数filenameのデフォルトは、カレントバッファーがvisitしているファイルである。カレントバッファーがファイルをvisitしていない、またはバッファーが変更されていない、またはシステムがロックをサポートしない場合は、何もしない。

Function: unlock-buffer

この関数は、カレントバッファーが変更されている場合は、バッファーによりvisitされているファイルをアンロックする。バッファーが変更されていない場合は、そのファイルはロックされてはならないので、この関数は何もしない。カレントバッファーがファイルをvisitしていない、またはシステムがロックをサポートしない場合、この関数は何もしない。

User Option: create-lockfiles

この変数がnilの場合、Emacsはファイルをロックしない。

Function: ask-user-about-lock file other-user

この関数は、ユーザーがfileの変更を試みたが、それが名前other-userのユーザーにロックされていたとき呼び出される。この関数のデフォルト定義は、何を行うかユーザーに尋ねる関数である。この関数がリターンする値は、Emacsが次に何を行うかを決定する:

望むなら、他の方法で判定を行う独自のバージョンで、ask-user-about-lock関数を置き換えることができる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6 Information about Files

このセクションでは、ファイル(またはディレクトリーやシンボリックリンク)に関して、ファイルが読み込み可能か、書き込み可能か、あるいはファイルのサイズなmのような、さまざまなタイプの情報を取得する関数を説明します。これらの関数はすべて、引数にファイルの名前を取ります。注記した場合を除き、これらの引数には既存のファイルを指定する必要があり、ファイルが存在しない場合はエラーをシグナルします。

スペースで終わるファイル名には気をつけてください。いくつかのファイルシステム(特にMS-Windows)では、ファイル名の末尾の空白文字は、暗黙かつ自動的に無視されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.1 Testing Accessibility

以下の関数は、あるファイルを読み取り、書き込み、実行するためのパーミッションをテストします。明示しない限り、これらの関数はファイル名引数にたいするシンボリックリンクを、すべてのレベル(ファイル自身のレベルおよび親ディレクトリーのレベル)において再帰的にフォローします。

いくつかのオペレーティングシステムでは、ACL(Access Control Lists: アクセス制御リスト)のような機構を通じて、より複雑なアクセスパーミッションセットが指定できます。それらのパーミッションにたいする問い合わせやセットの方法については、Extended File Attributesを参照してください。

Function: file-exists-p filename

この関数は、ファイル名filenameが存在しているようならtをリターンする。これは、そのファイルが読み取り可能である必要はなく、ファイルの属性を調べることが可能なこと意味する(UnixおよびGNU/Linuではなく、そのファイルが存在し、かつそのファイルを含むディレクトリーの実行パーミッションをもつ場合にtとなり、そのファイル自体のパーミッションは無関係である)。

ファイルが存在しない、またはACLポリシーがファイル属性を調べることを禁止する場合、この関数はnilをリターンする。

ディレクトリーはファイルなので、ディレクトリー名が与えられた場合、file-exists-ptをリターンする。しかし、シンボリックリンクは特別に扱われる。file-exists-pはターゲットファイルが存在する場合のみ、シンボリックリンクにたいしてtをリターンする。

Function: file-readable-p filename

この関数は、filenameという名前のファイルが存在し、それを読み取ることが可能な場合はtをリターンする。それ以外はnilをリターンする。

Function: file-executable-p filename

この関数は、filenameという名前のファイルが存在し、それを実行することが可能な場合はtをリターンする。それ以外はnilをリターンする。UnixおよびGNU/Linuxシステムでは、そのファイルがディレクトリーの場合、実行パーミッションはディレクトリー内のファイルの存在と属性をチェックでき、ファイルのモードが許せばオープンできることを意味する。

Function: file-writable-p filename

この関数は、filenameという名前のファイルに書き込み可能、または作成可能可能な場合はtをリターンする。それ以外はnilをリターンする。ファイルが存在し、それに書き込むことができるなら、ファイルは書き込み可能である。ファイルが存在せず、指定されたディレクトリーが存在して、そのディレクトリーに書き込むことができるなら、書き込み可能である。

以下の例では、fooは親ディレクトリーが存在しないので、たとえユーザーがそのディレクトリーを作成可能であっても、ファイルは書き込み可能ではない。

(file-writable-p "~/no-such-dir/foo")
     ⇒ nil
Function: file-accessible-directory-p dirname

この関数は、ファイルとしての名前がdirnameであるようなディレクトリー内にある既存のファイルをオープンするパーミッションをもつ場合は、tをリターンする。それ以外(またはそのようなディレクトリーが存在しない場合)はnilをリターンする。dirnameの値はディレクトリー名(/foo/など)、または名前がディレクトリー(最後のスラッシュがない/fooなど)であるようなファイルである。

たとえば、以下では/foo/内の任意のファイルを読み取る試みは、エラーになると推測される:

(file-accessible-directory-p "/foo")
     ⇒ nil
Function: access-file filename string

この関数は、読み取り用にファイルfilenameをオープンして、クローズした後にnilをリターンする。しかし、オープンに失敗した場合は、stringをエラーメッセージのテキストに使用して、エラーをシグナルする。

Function: file-ownership-preserved-p filename &optional group

この関数は、ファイルfilenameを削除して、それを新たに作成しても、そのファイルの所有者が変更されずに維持される場合は、tをリターンする。これは、存在しないファイルにたいしてもtをリターンする。

オプション引数groupが非nilの場合、この関数はファイルのグループが変更されないこともチェックする。

filenameがシンボリックリンクの場合は、ここで述べる他の関数と異なり、file-ownership-preserved-pfilenameをターゲットで置き換えない。しかし、この関数は親ディレクトリーのすべての階層において、シンボリックリンクを再帰的にフォローする(follow: 辿る)。

Function: file-modes filename

この関数は、filenameモードビット(mode bits)をリターンする。これは読み取り、書き込み、実行パーミッションを要約する整数である。filenameでのシンボリックリンクは、すべての階層において再帰的にフォローされる。ファイルが存在しない場合のリターン値はnilである。

モードビットの説明は、See File permissions in The GNU Coreutils Manualを参照のこと。たとえば最下位ビットが1なら、そのファイルは実行可能、2ビット目が1なら書き込み可能、...となる。設定できる最大の値は4095(8進の7777)であり、これはすべてのユーザーが読み取り、書き込み、実行のパーミッションをもち、他のユーザーとグループにたいしてSUIDビット、およびstickyビットがセットされる。

これらのパーミッションのセットに使用されるset-file-modes関数については、Changing File Names and Attributesを参照のこと。

(file-modes "~/junk/diffs")
     ⇒ 492               ; 10進整数
(format "%o" 492)
     ⇒ "754"             ; 8進に変換した値

(set-file-modes "~/junk/diffs" #o666)
     ⇒ nil

$ ls -l diffs
-rw-rw-rw- 1 lewis lewis 3063 Oct 30 16:00 diffs

MS-DOSにたいする注意: MS-DOSでは、“実行可能”を表すようなファイルのモードビットは存在しない。そのため、file-modesはファイル名が.com.bat.exeなどのような標準的な実行可能な拡張子のいずれかで終わる場合は、ファイルを実行可能であると判断する。Unix標準の‘#!’署名で始まるshellスクリプトやPerlスクリプトも、実行可能と判断される。Unixとの互換性のために、ディレクトリーも実行可能と報告される。file-attributes(File Attributesを参照)も、これらの慣習にしたがう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.2 Distinguishing Kinds of Files

このセクションでは、ディレクトリー、シンボリックリンク、および通常ファイルのような、さまざまな種類のファイルを区別する方法を説明します。

Function: file-symlink-p filename

ファイルfilenameがシンボリックリンクの場合、file-symlink-p関数は(非再帰的な)リンクターゲットを文字列としてリターンする(リンクターゲット文字列は、そのターゲットの完全な絶対ファイル名である必要はない。リンクが指すのが完全なファイル名か判断するのは、簡単な処理ではない。以下を参照されたい)。filenameのディレクトリー部分(leading directory)にシンボリックリンクが含まれる場合、この関数はそれらを再帰的にフォローする。

ファイルfilenameがシンボリックリンクではない、または存在しない場合、file-symlink-pnilをリターンする。

この関数の使用例をいくつか示す:

(file-symlink-p "not-a-symlink")
     ⇒ nil
(file-symlink-p "sym-link")
     ⇒ "not-a-symlink"
(file-symlink-p "sym-link2")
     ⇒ "sym-link"
(file-symlink-p "/bin")
     ⇒ "/pub/bin"

3つ目の例では、関数はsym-linkをリターンするものの、たとえそれ自体がシンボリックリンクであっても、リンク先の解決を行わないことに注意されたい。これが上述した“非再帰的(non-recursive)”の意味するところであり、シンボリックリンクをフォローする処理は、そのリンクターゲット自体がリンクの場合、再帰的には行われない。

この関数がリターンするのは、そのシンボリックリンクに何が記録されているかを示す文字列であり、それにはディレクトリー部分が含まれていても、いなくても構わない。この関数は完全修飾されたファイル名を生成するためにリンクターゲットを展開しないし、リンクターゲットが絶対ファイル名でなければ、(もしあっても)filename引数のディレクトリー部分は使用しない。以下に例を示す:

(file-symlink-p "/foo/bar/baz")
     ⇒ "some-file"

ここでは、たとえ与えられた/foo/bar/bazが完全修飾されたファイル名であるにも関わらず、その結果は異なり、実際には何のディレクトリー部分ももたない。some-file自体がシンボリックリンクかもしれないので、単にその前に先行ディレクトリーを追加することはできず、絶対ファイル名を生成するために、単にexpand-file-name(Functions that Expand Filenamesを参照)を使用することもできないからである。

この理由により、あるファイルがシンボリックリンクか否かという単一の事実よりも多くを判定する必要がある場合に、この関数が有用であることは稀である。実際にリンクターゲットのファイル名が必要な場合は、Truenamesで説明するfile-chase-linksまたはfile-truenameを使用すること。

以下の2つの関数は、filenameにたいして、シンボリックリンクを全階層において再帰的にフォローする。

Function: file-directory-p filename

この関数は、filenameが既存のディレクトリー名ならt、それ以外はnilをリターンする。

(file-directory-p "~rms")
     ⇒ t
(file-directory-p "~rms/lewis/files.texi")
     ⇒ nil
(file-directory-p "~rms/lewis/no-such-file")
     ⇒ nil
(file-directory-p "$HOME")
     ⇒ nil
(file-directory-p
 (substitute-in-file-name "$HOME"))
     ⇒ t
Function: file-regular-p filename

この関数は、ファイルfilenameが存在し、かつそれが通常ファイル(ディレクトリー、名前付きパイプ、端末、その他I/Oデバイス以外)の場合はtをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.3 Truenames

ファイルの実名(truename)とは、全階層においてシンボリックリンクを残らずフォローした後、名前コンポーネントに出現する‘.’と‘..’を除いて簡略化した名前のことです。これは、そのファイルにたいする正規名(canonical name)の一種です。ファイルが常に一意な実名をもつ訳ではありません。あるファイルにたいする異なる実名の個数は、そのファイルにたいするハードリンクの個数と同じです。しかし、実名はシンボリックリンクによる名前の変動を解消するのに有用です。

Function: file-truename filename

この関数は、ファイルfilenameの実名をリターンする。引数が絶対ファイル名でない場合、この関数は最初にdefault-directoryにたいしてこれを展開する。

この関数は、環境変数を展開しない。これを行うのはsubstitute-in-file-nameだけである。Definition of substitute-in-file-nameを参照のこと。

名前コンポーネントに出現する‘..’に先行するシンボリックリンクリンクをフォローする必要がある場合は、直接間接を問わずexpand-file-nameを呼び出す前に、file-truenameを呼び出すこと。そうしないと、‘..’の直前にある名前コンポーネントは、file-truenameが呼び出される前に“簡略化”により取り除かれてしまう。expand-file-name呼び出しの必要を無くすため、file-truenameexpand-file-nameが行うのと同じ方法で‘~’を扱う。Functions that Expand Filenamesを参照のこと。

Function: file-chase-links filename &optional limit

この関数は、filenameで始まるシンボリックリンクを、シンボリックリンクではない名前のファイル名までフォローして、そのファイル名をリターンする。この関数は、親ディレクトリーの階層にあるシンボリックリンクをフォローしない

limitに数を指定した場合は、その数のリンクを追跡した後、この関数はたとえそれが依然としてシンボリックリンクであっても、それをリターンする。

file-chase-linksfile-truenameの違いを説明するために、/usr/fooがディレクトリー/home/fooへのシンボリックリンクであり、/home/foo/helloが(少なくともシンボリックリンクではない)通常ファイル、または存在しないファイルであるとします。この場合は以下のようになります:

(file-chase-links "/usr/foo/hello")
     ;; 親ディレクトリーのリンクはフォローしない
     ⇒ "/usr/foo/hello"
(file-truename "/usr/foo/hello")
     ;; /homeはシンボリックリンクではないと仮定
     ⇒ "/home/foo/hello"
Function: file-equal-p file1 file2

この関数は、ファイルfile1file2の名前が同じファイルの場合はtをリターンする。これは、リモートファイル名も適切な方法で処理することを除き、実名の比較と似ている。file1またはfile2が存在しない場合、リターン値は不定である。

Function: file-in-directory-p file dir

この関数は、fileがディレクトリーdir内のファイル、またはサブディレクトリーの場合は、tをリターンする。また、filedirが同じディレクトリーの場合も、tをリターンする。この関数は、2つのディレクトリーの実名を比較する。dirが既存のディレクトリーの名前でない場合、リターン値はnilである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.4 File Attributes

このセクションでは、ファイルの詳細な情報を取得する関数について説明します。それらの情報にはファイルの所有者やグループの番号、ファイル名の個数、inode番号、サイズやアクセス日時、変更日時が含まれます。

Function: file-newer-than-file-p filename1 filename2

この関数は、ファイルfilename1がファイルfilename2より新しい場合は、tをリターンする。filename1が存在しない場合はnilfilename1は存在するがfilename2が存在しない場合はtをリターンする。

以下の例では、aug-19が19日、aug-20が20日に書き込まれ、ファイルno-fileは存在しないものとする。

(file-newer-than-file-p "aug-19" "aug-20")
     ⇒ nil
(file-newer-than-file-p "aug-20" "aug-19")
     ⇒ t
(file-newer-than-file-p "aug-19" "no-file")
     ⇒ t
(file-newer-than-file-p "no-file" "aug-19")
     ⇒ nil

以下の2つの関数のfilename引数がシンボリックリンクの場合、これらの関数はそれをリンクターゲットで置き換えません。しかしどちらの関数も、親ディレクトリーのすべての階層において、シンボリックリンクを再帰的にフォローします。

Function: file-attributes filename &optional id-format

この関数は、ファイルfilenameの属性(attributes)のリストをリターンする。オープンできないファイルが指定された場合は、nilをリターンする。オプション引数id-formatは、属性UIDおよびGID(以下参照)にたいして望ましいフォーマットを指定し、有効な値は'stringおよび'integerである。デフォルトは'integerだが、わたしたちはこれの変更を計画しているので、リターンされるUIDまたはGIDを使用する場合は、id-formatにたいして非nil値を指定するべきである。

リストの要素は順に:

  1. ディレクトリーにたいしてはt、シンボリックリンクにたいしては文字列(リンクされる名前)、テキストファイルにたいしてはnil
  2. そのファイルがもつ名前の個数。ハードリンクとして知られる代替え名は、関数add-name-to-fileを使用して作成できる(Changing File Names and Attributesを参照)。
  3. ファイルのUIDで、通常は文字列。しかし、名前をもつユーザーに対応しない場合、値は整数。
  4. 同様に、ファイルのGID
  5. 最終アクセス時刻を表す、4つの整数(sec-high sec-low microsec picosec)からなるリスト(これはcurrent-timeの値と似ている。Time of Dayを参照されたい)。いくつかのFATベースのファイルシステムでは、最終アクセスの日付だけが記録されるので、この時刻には常に最終アクセス日の真夜中が保持されることに注意。
  6. 最終変更時刻を表す4つの整数からなるリスト(上記参照)。これは、ファイルのコンテンツが変更された最終時刻である。
  7. ステータスの最終変更時刻を表す4つの整数からなるリスト(上記参照)。これはファイルのアクセスモードビット、所有者とグループ、およびファイルにたいしてファイルのコンテンツ以外にファイルシステムが記録するその他の情報にたいする最終変更時刻である。
  8. ファイルのサイズ(バイト)。Lisp整数の範囲を超える大きさのサイズでは浮動小数点数。
  9. ls -l’で表示されるような、10個の文字、またはダッシュからなる文字列で表されるファイルのモード。
  10. 後方互換のために提供される不定値。
  11. ファイルのinode番号。可能な場合は整数。Emacs Lispの整数として表せる範囲より大きいinode番号は、整数で表現可能な値を得るために2^{16}で除され(high . low)という形式の値になる。ここでlowは下位16ビットである。それにたいしてさえinode番号が大きい場合、値は(high middle . low)という形式になる。ここでhighは上位ビット、middleは中位24ビット、lowは下位16ビットを保持する。
  12. そのファイルがあるデバイスのファイルシステム番号。その大きさにより、値は整数、またはinode番号と同じ様式のコンスセルとなる。この要素とファイルのinode番号を併せれば、システム上の2つを区別するに足る情報が得られる(2つのファイルがこれら両方の番号で同じ値をもつことはできない)。

たとえば、以下はfiles.texiのファイル属性である:

(file-attributes "files.texi" 'string)
     ⇒  (nil 1 "lh" "users"
          (20614 64019 50040 152000)
          (20000 23 0 0)
          (20614 64555 902289 872000)
          122295 "-rw-rw-rw-"
          t (5888 2 . 43978)
          (15479 . 46724))

この結果を解釈すると:

nil

ディレクトリーでもシンボリックリンクでもない。

1

(カレントデフォルトディレクトリー内で名前files.texiは)単一の名前をもつ。

"lh"

名前"lh"のユーザーにより所有される。

"users"

名前"users"のグループ。

(20614 64019 50040 152000)

最終アクセスがOctober 23, 2012, at 20:12:03.050040152 UTC。

(20000 23 0 0)

最終更新がJuly 15, 2001, at 08:53:43 UTC。

(20614 64555 902289 872000)

最終ステータス変更がOctober 23, 2012, at 20:20:59.902289872 UTC。

122295

バイト長は122295バイト(しかしマルチバイトシーケンスが含まれていたり、EOLフォーマットがCRLFの場合は122295文字が含まれないだろう)。

"-rw-rw-rw-"

所有者、グループ、その他にたいして読み取り、書き込みアクセスのモードをもつ。

t

単なるプレースホルダーであり、何の情報ももたない。

(5888 2 . 43978)

inode番号は6473924464520138。

(15479 . 46724)

ファイルシステムのデバイス番号は1014478468。

Function: file-nlinks filename

この関数は、ファイルfilenameがもつ名前(ハードリンク)の個数をリターンする。ファイルが存在しない場合、この関数はnilをリターンする。シンボリックリンクは、リンク先のファイルの名前とは判断されないので、この関数に影響しないことに注意。

$ ls -l foo*
-rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo
-rw-rw-rw- 2 rms rms 4 Aug 19 01:27 foo1

(file-nlinks "foo")
     ⇒ 2
(file-nlinks "doesnt-exist")
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.5 Extended File Attributes

いくつかのオペレーティングシステムでは、それぞれのファイルを任意の拡張ファイル属性(extended file attributes)に関連付けることができます。現在のところ、Emacsは拡張ファイル属性のうち2つの特定セット(ACL: Access Control List、およびSELinuxコンテキスト)にたいする問い合わせと設定をサポートします。これらの拡張ファイル属性は、前のセクションで議論した“Unixスタイル”の基本的なパーミッションより洗練されたファイルアクセス制御を強いるために、いくつかのシステムで利用されます。

ACLとSELinuxについての詳細な解説は、このマニュアルの範囲を超えます。わたしたちの目的のためには、それぞれのファイルはACL(ACLベースのファイル制御システムの元でACLのプロパティを指定)および/またはSELinuxコンテキスト(SELinuxシステムの元でSELinuxのプロパティを指定)に割り当てることができる、という理解でよいでしょう。

Function: file-acl filename

この関数は、ファイルfilenameにたいするACLをリターンする。ACLにたいする正確なLisp表現は不確定(かつ将来のEmacsバージョンで変更され得る)だが、これはset-file-aclが引数aclにとる値と同じである(Changing File Names and Attributesを参照)。

根底にあるACL実装はプラットフォーム固有である。EmacsはGNU/LinuxおよびBSDではPOSIX ACLインターフェイスを使用し、MS-WindowsではネイティブのファイルセキュリティAPIをPOSIX ACLインターフェイスでエミュレートする。

ACLサポートなしでEmacsがコンパイルされた場合、ファイルが存在しないかアクセス不能な場合、またはその他の理由によりEmacsがACLエントリーを判断できない場合、リターン値はnilである。

Function: file-selinux-context filename

この関数は、ファイルfilenameのSELinuxコンテキストを、(user role type range)という形式のリストでリターンする。リストの要素は、そのコンテキストのユーザー、ロール、タイプ、レンジを文字列として表す値である。これらの実際の意味についての詳細は、SELinuxのドキュメントを参照のこと。リターン値は、set-file-selinux-contextcontext引数でとるのと同じ形式である(Changing File Names and Attributesを参照)。

SELinuxサポートなしでEmacsがコンパイルされた場合、ファイルが存在しないかアクセス不能な場合、またはシステムがSELinuxをサポートしない場合、リターン値は(nil nil nil nil)である。

Function: file-extended-attributes filename

この関数は、Emacsが認識するファイルfilenameの拡張属性をalistでリターンする。現在のところ、この関数はACLとSELinuxの両方を取得するための便利な方法としての役目を果たす。他のファイルに同じファイルアクセス属性を適用するために、リターンされたalistを2つ目の引数としてset-file-extended-attributesを呼び出すことができる(Changing File Names and Attributesを参照)。

要素のうちの1つは(acl . acl)で、aclfile-aclがリターンするのと同じ形式である。

他の要素は(selinux-context . context)で、contextfile-selinux-contextがリターンするのと同じ形式である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.6.6 Locating Files in Standard Places

このセクションでは、ディレクトリーのリスト(パス(path))からファイルを検索したり、標準の実行可能ファイル用ディレクトリーから実行可能ファイルを検索する方法を説明します。

ユーザー固有の設定ファイル(configuration file)の検索については、Standard File Namesの関数locate-user-emacs-fileを参照してください。

Function: locate-file filename path &optional suffixes predicate

この関数は、pathで与えられるディレクトリーリスト内で、filenameという名前のファイルを検索して、suffixes内のサフィックスの検索を試みる。そのようなファイルが見つかった場合はファイルの絶対ファイル名(Absolute and Relative File Namesを参照)をリターンし、それ以外はnilをリターンする。

オプション引数suffixesは、検索時にfilenameに追加するファイル名サフィックスのリストを与える。locate-fileは、検索するディレクトリーごとに、それらのサフィックスを試みる。suffixesnil、または("")の場合は、サフィックスなしで、filenameだけがそのまま使用される。suffixesの典型的な値はexec-suffixes(Functions that Create Subprocessesを参照)、load-suffixesload-file-rep-suffixes、および関数get-load-suffixes(Load Suffixesを参照)である。

実行可能プログラムを探すときはexec-path(Functions that Create Subprocessesを参照)、Lispファイルを探すときはload-path(Library Searchを参照)がpathの典型的な値である。filenameが絶対ファイル名の場合、pathは効果がないが、サフィックスにたいするsuffixesは依然として試行される。

オプション引数predicateが非nilの場合、それは候補ファイルが適切かどうかテストする述語関数を指定する。述語関数には、単一の引数として候補ファイル名が渡される。predicatenil、または省略された場合は、述語としてfile-readable-pを使用する。file-executable-pfile-directory-pなど、その他の有用な述語については、Distinguishing Kinds of Filesを参照のこと。

互換性のために、predicateにはexecutablereadablewritableexists、またはこれらシンボルの1つ以上のリストも指定できる。

Function: executable-find program

この関数は、programという名前の実行可能ファイルを検索して、その実行可能ファイルの絶対ファイル名と、もしあればファイル名の拡張子も含めてリターンする。ファイルが見つからない場合は、nilをリターンする。この関数は、exec-path内のすべてのディレクトリーを検索し、exec-suffixes内のすべてのファイル名拡張子の検索も試みる(Functions that Create Subprocessesを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.7 Changing File Names and Attributes

このセクションの関数は、ファイルのリネーム(rename: 改名)、コピー、削除(delete)、リンク、およびモード(パーミッション)のセットを行います。

newnameという引数をもつ関数では、newnameという名前のファイルが既に存在する場合の振る舞いは、引数ok-if-already-existsの値に依存します。

以下の4つのコマンドはすべて、1つ目の引数にたいして親ディレクトリーの全階層のシンボリックリンクを再帰的にフォローしますが、その引数自体がシンボリックリンクの場合は、copy-fileだけが(再帰的な)ターゲットを置き換えます。

Command: add-name-to-file oldname newname &optional ok-if-already-exists

この関数は、oldnameという名前のファイルに、newnameという名前を追加で与える。これはnewnameという名前が、oldnameにたいする新たな“ハードリンク”になることを意味する。

以下の例の最初の部分として、2つのファイルfoofoo3をリストする。

$ ls -li fo*
81908 -rw-rw-rw- 1 rms rms 29 Aug 18 20:32 foo
84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3

ここで、add-name-to-fileを呼び出してハードリンクを作成し、再度ファイルをリストする。このリストには、1つのファイルにたいして2つの名前foofoo2が表示される。

(add-name-to-file "foo" "foo2")
     ⇒ nil

$ ls -li fo*
81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo
81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo2
84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3

最後に以下を評価する:

(add-name-to-file "foo" "foo3" t)

そして、ファイルを再度リストする。今度は1つのファイルにたいして3つの名前foofoo2foo3がある。foo3の古いコンテンツは失われた。

(add-name-to-file "foo1" "foo3")
     ⇒ nil

$ ls -li fo*
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo2
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo3

この関数は、1つのファイルにたいして複数の名前をもつことが許されないオペレーティングシステムでは無意味である。いくつかのシステムでは、かわりにファイルをコピーすることにより複数の名前を実装している。

File Attributesfile-nlinksも参照のこと。

Command: rename-file filename newname &optional ok-if-already-exists

このコマンドは、filenamenewnameにリネームする。

filenamefilenameとは別に追加の名前をもつ場合、それらは自身の名前をもち続ける。実際のところ、add-name-to-fileで名前newnameを追加してからfilenameを削除するのは、瞬間的な遷移状態を別とすると、リネームと同じ効果がある。

Command: copy-file oldname newname &optional ok-if-exists time preserve-uid-gid preserve-extended-attributes

このコマンドは、ファイルoldnamenewnameにコピーする。oldnameが存在しない場合は、エラーをシグナルする。newnameがディレクトリーの場合は、その最後の名前コンポーネントを保持するように、そのディレクトリーの中にoldnameをコピーする。

timeが非nilの場合、この関数は新たなファイルにたいして、古いファイルと同じ最終変更時刻を与える(これはいくつかの限られたオペレーティングシステムでのみ機能する)。時刻のセットでエラーが発生した場合、copy-filefile-date-errorエラーをシグナルする。インタラクティブに呼び出された場合、プレフィックス引数はtimeにたいして非nil値を指定する。

引数preserve-uid-gidnilの場合は、新たなファイルのユーザーおよびグループの所有権の決定を、オペレーティングシステムに委ねる(通常はEmacsを実行中のユーザーである)。preserve-uid-gidが非nilの場合は、そのファイルのユーザーとグループの所有権のコピーを試みる。これはいくつかのオペレーティングシステムで、かつそれを行うための正しいパーミッションをもつ場合のみ機能する。

オプション引数preserve-permissionsが非nilの場合、この関数はoldnameのファイルモード(または“パーミッション”)、同様にACL(Access Control List)とSELinuxコンテキストをnewnameにコピーする。Information about Filesを参照のこと。

それ以外では、newnameが既存ファイルならファイルモードは変更されず、新たに作成された場合はデフォルトのファイルパーミッション(以下のset-default-file-modesを参照)によりマスクされる。どちらの場合も、ACLまたはSELinuxコンテキストはコピーされない。

Command: make-symbolic-link filename newname &optional ok-if-exists

このコマンドは、filenameにたいしてnewnameという名前のシンボリックリンクを作成する。これは、コマンド‘ln -s filename newname’と似ている。

この関数は、シンボリックリンクをサポートしないシステムでは利用できない。

Command: delete-file filename &optional trash

このコマンドは、ファイルfilenameを削除する。ファイルが複数の名前をもつ場合は、他の名前で存在し続ける。filenameがシンボリックリンクの場合、delete-fileはシンボリックリンクだけを削除して、(たとえこれが親ディレクトリーの全階層のシンボリックリンクをフォローするとしても)ターゲットは削除しない。

ファイルが存在しない、または削除できない場合は、適切な種類のfile-errorエラーがシグナルされる(UnixおよびGNU/Linuxでは、ファイルのディレクトリーが書き込み可能ならファイルは削除可能である)。

オプション引数trashが非nil、かつ変数delete-by-moving-to-trashが非nilの場合、このコマンドはファイルを削除するかわりに、システムのTrash(ゴミ箱)にファイルを移動する。Miscellaneous File Operations in The GNU Emacs Manualを参照のこと。インタラクティブに呼び出された際は、プレフィックス引数がない場合trasht、それ以外はnilである。

Creating, Copying and Deleting Directoriesdelete-directoryも参照のこと。

Command: set-file-modes filename mode

この関数は、filenameファイルモード(またはパーミッション)をmodeにセットする。この関数は、filenameにたいして全階層でシンボリックリンクをフォローする。

非インタラクティブに呼び出された場合、modeは整数でなければならない。その整数の下位12ビットだけが使用される。ほとんどのシステムでは、意味があるのは下位9ビットだけである。modeを入力刷る、Lisp構文を使用できる。たとえば、

(set-file-modes #o644)

これは、そのファイルが所有者により読み取りと書き込み、グループメンバーにより読み取り、その他のユーザーにより読み取り可能であることを指定する。モードビットの仕様の説明は、File permissions in The GNU Coreutils Manualを参照のこと。

インタラクティブに呼び出された場合、moderead-file-modes(以下参照)を使用してミニバッファーから読み取られる。この場合、ユーザーは整数、またはパーミッションをシンボルで表現する文字列をタイプできる。

ファイルのパーミッションをリターンする関数file-modesについては、File Attributesを参照のこと。

Function: set-default-file-modes mode

この関数は、EmacsおよびEmacsのサブプロセスが新たに作成するファイルに、デフォルトのパーミッションをセットする。Emacsにより作成されたすべてのファイルはこれらのパーミッション、およびそれらのサブセットとなるパーミッションをもつ(デフォルトファイルパーミッションが実行を許可しても、write-regionは実行パーミッションを付与しないだろう)。UnixおよびGNU/Linuxでは、デフォルトのパーミッションは“umask”の値のビット単位の補数で与えられる。

引数modeは上記のset-file-modesと同様、パーミッションを指定する整数であること。下位9ビットだけに意味がある。

デフォルトのファイルパーミッションは、既存ファイルの変更されたバージョンを保存する際は効果がない。ファイルの保存では、既存のパーミッションが保持される。

Function: default-file-modes

この関数は、デフォルトのファイルモードを整数でリターンする。

Function: read-file-modes &optional prompt base-file

この関数は、ミニバッファーからファイルモードビットのセットを読み取る。1つ目のオプション引数promptは非デフォルトのプロンプトを指定する。2つ目のオプション引数base-fileは、ユーザーが既存ファイルのパーミッションに相対的なモードビット指定をタイプした場合に、この関数がリターンするモードビッの元となる権限をもつファイルの名前を指定する。

ユーザー入力が8進数で表される場合、この関数はその数字をリターンする。それが"u=rwx"のようなモードビットの完全なシンボル指定の場合、この関数はfile-modes-symbolic-to-numberを使用して、それを等価な数字に変換し、結果をリターンする。"o+g"のように相対的な指定の場合、その指定の元となるパーミッションは、base-fileのモードビットから取得される。base-fileが省略、またはnilの場合、この関数は元となるモードビットとして0を使用する。完全指定および相対指定は、"u+r,g+rx,o+r,g-w"のように組み合わせることができる。ファイルモード指定の説明は、File permissions in The GNU Coreutils Manualを参照のこと。

Function: file-modes-symbolic-to-number modes &optional base-modes

この関数は、modes内のシンボルによるファイルモード指定を、等価な整数に変換する。シンボル指定が既存ファイルにもとづく場合は、オプション引数base-modesからそのファイルのモードビットが取得される。その引数が省略、またはnilの場合は、0(すべてのアクセスが許可されない)がデフォルトになる。

Function: set-file-times filename &optional time

この関数は、filenameのアクセス時刻と変更時刻をtimeにセットする。時刻が正しくセットされればt、それ以外はnilがリターン値となる。timeのデフォルトはカレント時刻であり、current-timeがリターンするフォーマットでなければならない(Time of Dayを参照)。

Function: set-file-extended-attributes filename attribute-alist

この関数は、filenameにたいしてEmacsが認識する拡張ファイル属性をセットする。2つ目の引数attribute-alistは、file-extended-attributesがリターンするalistと同じ形式であること。Extended File Attributesを参照のこと。

Function: set-file-selinux-context filename context

この関数は、filenameにたいするSELinuxセキュリティコンテキストにcontextをセットする。context引数は、各要素が文字列であるような(user role type range)というリストであること。Extended File Attributesを参照されたい。

この関数は、filenameのSELinuxコンテキストのセットに成功した場合はtをリターンする。コンテキストがセットされなかった場合(SELinuxが無効、またはEmacsがSELinuxサポートなしでコンパイルされた場合等)は、nilをリターンする。

Function: set-file-acl filename acl

この関数は、filenameにたいするACLにaclをセットする。acl引数は、関数file-aclがリターンするのと同じ形式であること。Extended File Attributesを参照されたい。

この関数はfilenameのACLのセットに成功したらt、それ以外はnilをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8 File Names

ファイルは一般的に名前で参照され、Emacsでも他と同様です。Emacsでは、ファイル名は文字列で表現されます。ファイルを操作する関数はすべて、ファイル名引数に文字列を期待します。

ファイル自体の操作に加えて、Emacs Lispプログラムでファイル名を処理する必要(ファイル名の一部を取得して、関連するファイル名構築にその一部を使用する等)がしばしばあります。このセクションでは、ファイル名を扱う方法を説明します。

このセクションの関数は実際にファイルにアクセスする訳ではないので、既存のファイルやディレクトリーを参照しないファイル名を処理できます。

MS-DOSおよびMS-Windowsでは、これらの関数は(実際にファイルを操作する関数と同様)、MS-DOSおよびMS-Windowsのファイル名構文を受け入れます。この構文はUnix構文のようにバックスラッシュでコンポーネントを区切りますが、これらの関数は常にUnix構文をリターンします。これにより、Unix構文でファイル名を指定するLispプログラムが、変更なしですべてのシステムで正しく機能することが可能になるのです。13


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.1 File Name Components

オペレーティングシステムは、ファイルをディレクトリーにグループ化します。あるファイルを指定するためには、ディレクトリーと、そのディレクトリー内でのファイルの名前を指定しなければなりません。それゆえ、Emacsはファイル名をディレクトリー名パートと非ディレクトリー(またはディレクトリー内ファイル名)パートという、2つの主要パートから判断します。どちらのパートも空の場合があり得ます。これら2つのパートを結合することにより、元のファイル名が再作成されます。

ほとんどのシステムでは、最後のスラッシュ(MS-DOSおよびMS-Windowsではバックスラッシュも許される)までのすべてがディレクトリーパートです。残りが非ディレクトリーパートです。

ある目的のために、非ディレクトリーパートはさらに正式名称(the name proper)とバージョン番号に細分されます。ほとんどのシステムでは、名前にバージョン番号をもつのは、バックアップファイルだけです。

Function: file-name-directory filename

この関数は、filenameのディレクトリーパートをディレクトリー名(Directory Namesを参照)としてリターンする。filenameがディレクトリーパートを含まない場合は、nilをリターンする。

GNUおよびUnixシステムでは、この関数がリターンする文字列は常にスラッシュで終わる。MS-DOSでは、コロンで終わることもあり得る。

(file-name-directory "lewis/foo")  ; Unixの例
     ⇒ "lewis/"
(file-name-directory "foo")        ; Unixの例
     ⇒ nil
Function: file-name-nondirectory filename

この関数は、filenameの非ディレクトリーパートをリターンする。

(file-name-nondirectory "lewis/foo")
     ⇒ "foo"
(file-name-nondirectory "foo")
     ⇒ "foo"
(file-name-nondirectory "lewis/")
     ⇒ ""
Function: file-name-sans-versions filename &optional keep-backup-version

この関数は、任意のファイルバージョン番号、バックアップバージョン番号、末尾のチルダを取り除いてfilenameをリターンする。

keep-backup-versionが非nilの場合は、ファイルシステムなどが理解するような真のファイルバージョン番号は破棄されるが、バックアップバージョン番号は保持される。

(file-name-sans-versions "~rms/foo.~1~")
     ⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo~")
     ⇒ "~rms/foo"
(file-name-sans-versions "~rms/foo")
     ⇒ "~rms/foo"
Function: file-name-extension filename &optional period

この関数は、filenameからもしあればすべてのバージョン番号とバックアップ番号を取り除いた後、終端の“拡張子(extension)”をリターンする。ファイル名の拡張子とは、最後の名前コンポーネント(からすべてのバージョン番号とバックアップ番号を取り去った後)の最後の‘.’に後続するパートである。

この関数は、fooのような拡張子のないファイル名にたいしては、nilをリターンする。foo.のようなnull拡張子にたいしては、""をリターンする。ファイル名の最終コンポーネントが‘.’で始まる場合、その‘.’は拡張子の開始とはみなされない。したがって、.emacsの拡張子は‘.emacs’ではなくnilである。

periodが非nilの場合、拡張子を区切るピリオドもリターン値に含まれるようにななる。その場合、もしfilenameが拡張子をもたないなら、リターン値は""である。

Function: file-name-sans-extension filename

この関数は、もしあればfilenameから拡張子を除いてリターンする。もしバージョン番号またはバックアップ番号があるなら、ファイルが拡張子をもつ場合のみ、それを削除する。たとえば、

(file-name-sans-extension "foo.lose.c")
     ⇒ "foo.lose"
(file-name-sans-extension "big.hack/foo")
     ⇒ "big.hack/foo"
(file-name-sans-extension "/my/home/.emacs")
     ⇒ "/my/home/.emacs"
(file-name-sans-extension "/my/home/.emacs.el")
     ⇒ "/my/home/.emacs"
(file-name-sans-extension "~/foo.el.~3~")
     ⇒ "~/foo"
(file-name-sans-extension "~/foo.~3~")
     ⇒ "~/foo.~3~"

最後の2つの例の‘.~3~’は、拡張子ではなくバックアップ番号であることに注意。

Function: file-name-base &optional filename

この関数は、file-name-sans-extensionfile-name-nondirectoryを組み合わせたものである。たとえば、

(file-name-base "/my/home/foo.c")
    ⇒ "foo"

filename引数のデフォルトは、buffer-file-nameである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.2 Absolute and Relative File Names

ファイルシステム内のすべてのディレクトリーは、ルートディレクトリーから開始されるツリーを形成します。このツリーのルートから開始されるすべてのディレクトリー名により、ファイル名を指定でき、それを絶対(absolute)ファイル名と呼びます。デフォルトディレクトリーからの相対的なツリー中の位置でファイルを指定するこでき、それは相対(relative)ファイル名と呼ばれます。UnixおよびGNU/Linuxでは、絶対ファイル名は‘/’または‘~’で始まり、相対ファイル名は違います(abbreviate-file-nameを参照)。MS-DOSおよびMS-Windowsでは、絶対ファイル名はスラッシュ、バックスラッシュ、またはドライブ指定‘x:/’で始まります。ここでxドライブ文字(drive letter)です。

Function: file-name-absolute-p filename

この関数は、filenameが絶対ファイル名の場合はt、それ以外はnilをリターンする。

(file-name-absolute-p "~rms/foo")
     ⇒ t
(file-name-absolute-p "rms/foo")
     ⇒ nil
(file-name-absolute-p "/user/rms/foo")
     ⇒ t

相対ファイル名が与えられた場合は、expand-file-nameを使用して、それを絶対ファイル名に変換できます(Functions that Expand Filenamesを参照)。この関数は、絶対ファイル名を相対ファイル名に変換します:

Function: file-relative-name filename &optional directory

この関数は、directory(絶対ディレクトリー名またはディレクトリーファイル名)から相対的な結果となると仮定して、filenameと等価な相対ファイル名のリターンを試みる。directoryが省略、またはnilの場合、カレントバッファーのデフォルトディレクトリーがデフォルトとなる。

絶対ファイル名がデバイス名で始まるオペレーティングシステムが、いくつか存在する。そのようなシステムでは、2つの異なるデバイス名から開始されるfilenameは、directoryにもとづく等価な相対ファイル名をもたない。この場合、file-relative-nameは絶対形式でfilenameをリターンする。

(file-relative-name "/foo/bar" "/foo/")
     ⇒ "bar"
(file-relative-name "/foo/bar" "/hack/")
     ⇒ "../foo/bar"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.3 Directory Names

ディレクトリー名(directory name)とは、ディレクトリーの名前のことです。ディレクトリーは実際にはファイルの一種なので、ファイル名をもちます。これはディレクトリー名と関連がありますが、同一ではありません(これは、Unixの通常の用語とは異なる)。同じ実体にたいするこれら2つの異なる名前は、構文的な変換により関連付けられます。GNUおよびUnixシステムでは、ことは単純です。ディレクトリー名はスラッシュで終わり、ファイルとしてのディレクトリーの名前には、そのスラッシュがありません。MS-DOSでは、この関連付けはより複雑です。

ディレクトリー名と、ファイルとしてのディレクトリーの名前の違いは、些細ですが重要です。Emacsの変数、または関数の引数を記述する際、それがディレクトリー名であるとしており、ディレクトリーのファイル名は許されません。file-name-directoryが文字列をリターンするときは、常にディレクトリー名です。

以下の2つの関数は、ディレクトリー名とファイル名の間で変換を行います。これらの関数は、‘$HOME’のような環境変数や、‘~’、‘.’、‘..’などの構文にたいして、特別なことは何も行いません。

Function: file-name-as-directory filename

この関数は、オペレーティングシステムがディレクトリーの名前と解釈する形式で、filenameを表す文字列をリターンする。ほとんどのシステムでは、(もし終端にそれがなければ)これは文字列にスラッシュを追加することを意味する。

(file-name-as-directory "~rms/lewis")
     ⇒ "~rms/lewis/"
Function: directory-file-name dirname

この関数は、オペレーティングシステムがファイルの名前と解釈する形式で、dirnameを表す文字列をリターンする。ほとんどのシステムでは、これは文字列から最後のスラッシュ(またはバックスラッシュ)を削除することを意味する。

(directory-file-name "~lewis/")
     ⇒ "~lewis"

ディレクトリーにたいしては、concatを使用して相対ファイルと組み合わせることができます:

(concat dirname relfile)

これを行う前に、ファイル名が相対的であるか確認してください。絶対ファイル名を使用した場合、結果は構文的に不正になるか、間違ったファイルを参照する可能性があります。

ディレクトリーファイル名作成にこのような組み合わせを使用したい場合は、最初にfile-name-as-directoryを使用して、それをディレクトリー名に変換しなければなりません:

(concat (file-name-as-directory dirfile) relfile)

以下のような、手動によるスラッシュの結合を試みてはなりません

;;; 間違い!
(concat dirfile "/" relfile)

なぜなら、これには可搬性がないからです。常にfile-name-as-directoryを使用してください。

ディレクトリー名をディレクトリーの省略名に変換するには、以下の関数を使用します:

Function: abbreviate-file-name filename

この関数は、filenameの省略された形式をリターンする。これはdirectory-abbrev-alist(see File Aliases in The GNU Emacs Manual)で指定される省略形を適用した後、引数のファイル名がユーザーのホームディレクトリー、またはそのサブディレクトリーにある場合は、それを‘~’に置き換える。ホームディレクトリーがルートディレクトリーの場合、多くのシステムでは結果が短縮されないので、‘~’で置き換えない。

これは名前の一部であるような省略形さえも認識するので、ディレクトリー名とファイル名にも使用できる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.4 Functions that Expand Filenames

ファイル名の展開(expanding)とは、相対ファイル名を絶対ファイル名に変換することを意味します。これはデフォルトディレクトリーから相対的に行われるため、展開されるファイル名と同様、デフォルトディレクトリーも指定しなければなりません。これは~/のような省略形 (abbreviate-file-nameを参照)、 の展開、および./name/../のような冗長さの排除も行います。 も展開します。

Function: expand-file-name filename &optional directory

この関数は、filenameを絶対ファイル名に変換する。directoryが与えられた場合、filenameが相対的なら、それは開始点となるデフォルトディレクトリーになる(directoryの値は、それ自体が絶対ディレクトリー名、またはディレクトリーファイル名であるべきで、それは‘~’で始まるかもしれない)。それ以外では、カレントバッファーのdefault-directoryの値が使用される。たとえば:

(expand-file-name "foo")
     ⇒ "/xcssun/users/rms/lewis/foo"
(expand-file-name "../foo")
     ⇒ "/xcssun/users/rms/foo"
(expand-file-name "foo" "/usr/spool/")
     ⇒ "/usr/spool/foo"

結合されたファイル名の最初のスラッシュの前が‘~’の場合は、環境変数HOME(通常はユーザーのホームディレクトリー)の値に展開される。最初のスラッシュの前が‘~user’で、かつuserが有効なログイン名の場合は、userのホームディレクトリーに展開される。

.’または‘..’を含むファイル名は、正規化形式に簡略化される:

(expand-file-name "bar/../foo")
     ⇒ "/xcssun/users/rms/lewis/foo"

出力に‘..’コンポーネントが残り得る場合もある:

(expand-file-name "../home" "/")
     ⇒ "/../home"

これは、ルートディレクトリー/の上位の“スーパールート(superroot)”という概念をもつファイルシステムのためのものである。その他のファイルシステムでは、/..//とまったく同じに解釈される。

expand-file-nameは環境変数を展開しないことに注意。substitute-in-file-nameだけが、それを行う。

(expand-file-name "$HOME/foo")
     ⇒ "/xcssun/users/rms/lewis/$HOME/foo"

expand-file-nameは、あらゆる階層においてシンボリックリンクをフォローしないことにも注意。これは‘..’の扱いがfile-truenameexpand-file-nameで異なることに起因する。‘/tmp/bar’がディレクトリー‘/tmp/foo/bar’にたいするシンボリックリンクであると仮定すると:

(file-truename "/tmp/bar/../myfile")
     ⇒ "/tmp/foo/myfile"
(expand-file-name "/tmp/bar/../myfile")
     ⇒ "/tmp/myfile"

直接間接を問わず、事前にexpand-file-nameを呼び出さずに‘..’に先行するシンボリックリンクをフォローする必要があるかもしれない場合は、それを呼び出さずに確実にfile-truenameを呼び出すべきである。Truenamesを参照のこと。

Variable: default-directory

このバッファーローカル変数の値は、カレントバッファーにたいするデフォルトディレクトリーである。これは絶対ディレクトリー名であること。これは‘~’で始まるかもしれない。この変数は、すべてのバッファーにおいてバッファーローカルである。

2つ目の引数がnilの場合、expand-file-nameはデフォルトディレクトリーを使用する。

値は常にスラッシュで終わる文字列である。

default-directory
     ⇒ "/user/lewis/manual/"
Function: substitute-in-file-name filename

この関数は、filename内で参照される環境変数を、環境変数の値に置き換える。標準的なUnixシェル構文にしたがい、 ‘$’は環境変数値置き換えのプレフィックスである。入力に‘$$’が含まれる場合、それ‘$’に置き換えられる。これにより、ユーザーが‘$’を“クォート”する手段が与えられる。

環境変数名は‘$’の後に続く一連の英数字(アンダースコアを含む)である。‘$’の後続文字が、‘{’の場合はマッチする‘}’までのすべてが変数名である。

substitute-in-file-nameにより生成された出力でsubstitute-in-file-nameを呼び出すと、不正な結果となる傾向がある。たとえば、単一の‘$’をクォートするための‘$$’の使用は正しく機能しないだろうし、環境変数値の中の‘$’は再帰的な置換を導くだろう。したがって、この関数を呼び出して、出力をこの関数に渡すプログラムは、その後の不正な結果を防ぐために、すべての‘$’文字を二重化する必要がある。

以下では、ユーザーのホームディレクトリー名を保持する環境変数HOMEは、値‘/xcssun/users/rms’をもつとする。

(substitute-in-file-name "$HOME/foo")
     ⇒ "/xcssun/users/rms/foo"

置き換え後は、‘/’の直後に‘~’や別の‘/’が出現した場合、この関数は、‘/’の前にあるすべてを無視する。

(substitute-in-file-name "bar/~/foo")
     ⇒ "~/foo"
(substitute-in-file-name "/usr/local/$HOME/foo")
     ⇒ "/xcssun/users/rms/foo"
     ;; /usr/local/は破棄された

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.5 Generating Unique File Names

一時ファイルに書き込む必要があるプログラムが、いくつかあります。以下は、そのようなファイルを構築する、便利な方法です:

(make-temp-file name-of-application)

make-temp-fileの役目は、2人の異なるユーザー、またはジョブが、完全に一致する名前のファイルの使用を防ぐことです。

Function: make-temp-file prefix &optional dir-flag suffix

この関数は、一時ファイルを作成して、その名前をリターンする。Emacsは、Emacsの各ジョブごとに異なるランダムないくつかの文字をprefixに追加することにより、一時ファイルの名前を作成する。結果として新たに空のファイルが作成されることが保障される。MS-DOSでは、8+3のファイル名制限に適合するよう、文字列stringは切り詰められる可能性がある。prefixが相対ファイル名の場合、それはtemporary-file-directoryにたいして展開される。

(make-temp-file "foo")
     ⇒ "/tmp/foo232J6v"

make-temp-fileがリターンした際、一時ファイルは空で作成される。この時点で、そのファイルに意図するコンテンツを書き込むべきである。

dir-flagnilの場合、make-temp-fileは空のファイルのかわりに、空のディレクトリーを作成する。これはディレクトリー名ではなく、ディレクトリーのファイル名をリターンする。Directory Namesを参照のこと。

suffixが非nilの場合、make-temp-fileはそれをファイル名の最後に追加する。

同じEmacs内で実行される異なるライブラリー間での競合を防ぐために、make-temp-fileを使用する各Lispプログラムがプログラム自身のprefixを使用するべきである。prefixの最後に追加される数字は、異なるEmacsジョブ内で実行される、同じアプリケーションを区別する。追加される文字により、同一のEmacsジョブ内でも、多数の名前を区別することが可能になる。

一時ファイル用のデフォルトディレクトリーは、変数temporary-file-directoryにより制御されます。この変数により、すべての一時ファイルにたいして、ユーザーがディレクトリーを指定する、一貫した方法が与えられます。small-temporary-file-directoryが非nilの場合は、かわりにそれを使うプログラムもいくつかあります。これを使う場合は、make-temp-fileを呼び出す前に、正しいディレクトリーにたいしてプレフィックスを展開するべきです。

User Option: temporary-file-directory

この変数は、一時ファイル作成用のディレクトリー名を指定する。値はディレクトリー名であるべきだが、もし値がディレクトリーのファイル名(Directory Namesを参照)ならば、Lispプログラムがかわりに対処すればよい。expand-file-nameの2つ目の引数としてその値を使用するのは、それを達成するよい方法である。

デフォルト値は、オペレーティングシステムにたいして適切な方法により決定される。これは環境変数TMPDIRTMPTEMPにもとづき、これらの変数が定義されていなければ、システム依存の名前にフォールバックする。

一時ファイルの作成にmake-temp-fileを使用しない場合でも、一時ファイルを置くディレクトリーを判断するために、依然としてこの変数を使用するべきである。しかし、一時ファイルが小さくなることを求める場合は、small-temporary-file-directoryが非nilならば、それを使用するべきである。

User Option: small-temporary-file-directory

この変数は、小さいかもしれない特定の一時ファイル作成用のディレクトリー名を指定する。

小さくなるかもしれない一時ファイルに書き込みたい場合は、以下のようにディレクトリーを計算するべきである:

(make-temp-file
  (expand-file-name prefix
                    (or small-temporary-file-directory
                        temporary-file-directory)))
Function: make-temp-name base-name

この関数は、一意なファイル名として使用できる文字列を生成する。この名前はbase-nameで始まり、それに各Emacsジョブごとに異なる、複数のランダムな文字を追加したものである。これはmake-temp-fileと似ているが、(i)名前だけを作成し、ファイルは作成しない、(ii)base-nameは絶対ファイル名であること、という点が異なる(MS-DOSシステムでは、8+3ファイル名制限に適合するよう、base-nameが切り詰められる)。

警告: この関数を使用するべきではない。かわりにmake-temp-fileを使用すること! この関数は、競合状態の影響を受けやすい。make-temp-name呼び出しと一時ファイル作成のタイムラグは、セキュリティーホールとなる場合があるかもしれない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.6 File Name Completion

このセクションでは、ファイル名を補完するための、低レベルサブルーチンについて説明します。より高レベルの関数については、Reading File Namesを参照してください。

Function: file-name-all-completions partial-filename directory

この関数は、ディレクトリーdirectory内で、partial-filenameで始まる名前のファイルにたいして、すべての補完可能なリストをリターンする。補完の順番はそのディレクトリー内でのファイル順序であり、これは予測不能で何の情報ももたない。

引数partial-filenameは非ディレクトリーパートを含むファイル名でなければならず、スラッシュ(いくつかのシステムではバックスラッシュ)が含まれていてはならない。directoryが絶対ディレクトリーでない場合は、directoryの前にカレントバッファーのデフォルトディレクトリーが追加される。

以下の例では、~rms/lewisがカレントデフォルトディレクトリーで、名前が‘f’で始まる5つのファイルfoofile~file.cfile.c.~1~file.c.~2~があるものとする:

(file-name-all-completions "f" "")
     ⇒ ("foo" "file~" "file.c.~2~"
                "file.c.~1~" "file.c")

(file-name-all-completions "fo" "")
     ⇒ ("foo")
Function: file-name-completion filename directory &optional predicate

この関数は、ディレクトリーdirectory内で、ファイル名filenameを補完する。これはディレクトリーdirectory内で、filenameで始まるすべてのファイル名にたいして、最長の共通プレフィックスをリターンする。predicateが非nilの場合は、この関数を1引数で呼び出して絶対ファイル名に展開後、predicateを満足しない補完候補を無視する。

マッチが1つだけ存在し、かつfilenameが正確にそれにマッチする場合、関数はtをリターンする。関数は、ディレクトリーdirectoryfilenameで始まる名前のファイルを含まない場合は、nilをリターンする。

以下の例では、~rms/lewisがカレントデフォルトディレクトリーで、名前が‘f’で始まる5つのファイルfoofile~file.cfile.c.~1~file.c.~2~があるものとする:

(file-name-completion "fi" "")
     ⇒ "file"

(file-name-completion "file.c.~1" "")
     ⇒ "file.c.~1~"

(file-name-completion "file.c.~1~" "")
     ⇒ t

(file-name-completion "file.c.~3" "")
     ⇒ nil
User Option: completion-ignored-extensions

file-name-completionは通常、このリスト内の任意の文字列で終わるファイル名を無視する。すべての可能な補完がこれらのサフィックスのいずれか1つで終わるときは、それらを無視しない。この変数は、file-name-all-completionsに影響しない。

典型的な値は、以下のようになる:

completion-ignored-extensions
     ⇒ (".o" ".elc" "~" ".dvi")

completion-ignored-extensionsのある要素がスラッシュ‘/’で終わる場合、それはディレクトリーを示す。スラッシュで終わらない要素がディレクトリーにマッチすることは決してない。したがって、上記の値はfoo.elcという名前のディレクトリーを除外しないだろう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.8.7 Standard File Names

Emacs Lispプログラムが特定の用途のために標準的なファイル名を指定する必要がある場合があります。典型的には、カレントユーザーにより指定された設定データを保持する場合がそうです。そのようなファイルは通常、user-emacs-directoryにより指定されるディレクトリーに置かれ、デフォルトでは~/.emacs.dです(The Init Fileを参照)。たとえば、abbrev(abbreviation: 省略形)の定義は、デフォルトでは~/.emacs.d/abbrev_defsに格納されます。このようなファイル名を指定するには、関数locate-user-emacs-fileを使用するのが、もっとも簡単な方法です。

Function: locate-user-emacs-file base-name &optional old-name

この関数は、Emacs特有の設定ファイル、またはデータファイルにたいする絶対ファイル名をリターンする。引数base-nameは、ソファイル名であること。リターン値は、user-emacs-directoryで指定されるディレクトリー内の絶対ファイル名である。このディレクトリーが存在しない場合、この関数はディレクトリーを作成する。

オプション引数old-nameが非nilの場合、それはユーザーのホームディレクトリー内のファイル~/old-nameを指定する。そのようなファイルが存在する場合、リターン値はbase-nameで指定されるファイルではなく、そのファイルの絶対ファイル名となる。これは、Emacsパッケージが後方互換を提供するために使用されることを意図した引数である。たとえば、user-emacs-directory導入前、abbrevファイルは~/.abbrev_defsに置かれていた。以下は、abbrev-file-nameの定義である:

(defcustom abbrev-file-name
  (locate-user-emacs-file "abbrev_defs" ".abbrev_defs")
  "Default name of file from which to read abbrevs."
  …
  :type 'file)

ファイル名の標準化のための低レベル関数はconvert-standard-filenameで、これはサブルーチンとしてlocate-user-emacs-fileにより使用される。

Function: convert-standard-filename filename

この関数は、filenameにもとづき、カレントオペレーティングシステムの慣習に適合するファイル名をリターンする。

GNUおよびUnixシステムでは、これは単にfilenameをリターンする。その他のオペレーティングシステムでは、システム固有のファイル名規約にしたがうだろう。たとえばMS-DOSでは、この関数はMS-DOSファイル名制限にしたがうよう、先頭の‘.’を‘_’に変換したり、‘.’の後続の文字を3文字に切り詰める等、さまざまな変更を行う。

この関数でGNUおよびUnixシステムの慣習に適合する名前を指定して、それをconvert-standard-filenameに渡すのが推奨される使用方法である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.9 Contents of Directories

ディレクトリーとはファイルの一種で、さまざまな名前のファイルを含んでいます。ディレクトリーは、ファイルシステムの機能です。

Emacsはディレクトリー内のファイル名をLispのリストとして一覧したり、シェルコマンドlsを使用してバッファー内にファイル名を表示することができます。後者の場合、Emacsはオプションで各ファイルに関する情報も表示でき、それはlsコマンドに渡すオプションに依存します。

Function: directory-files directory &optional full-name match-regexp nosort

この関数は、ディレクトリーdirectory内のファイルの名前のリストをリターンする。デフォルトでは、このリストはアルファベット順である。

full-nameが非nilの場合、この関数はファイルの絶対ファイル名をリターンし、それ以外は指定されたディレクトリーにたいする相対ファイル名をリターンする。

match-regexpが非nilの場合、この関数はその正規表現にたいするマッチを含むファイル名だけをリターンし、それ以外のファイル名はリストから除外される。大文字小文字を区別するファイルシステムでは、大文字小文字を区別する正規表現マッチングが行われる。

nosortが非nilの場合、directory-filesはリストをソートしないので、取得するファイル名に特定の順序はない。最大限の可能なスピードを得る必要があり、ファイル処理順を気にしない場合は、この関数を使用する。ユーザーから処理順が可視の場合は、名前をソートすれば、おそらくユーザーはより幸せになるだろう。

(directory-files "~lewis")
     ⇒ ("#foo#" "#foo.el#" "." ".."
         "dired-mods.el" "files.texi"
         "files.texi.~1~")

directoryが読み取り可能なディレクトリー名でない場合は、エラーがシグナルされる。

Function: directory-files-and-attributes directory &optional full-name match-regexp nosort id-format

これは、どのファイルを報告するか、およびファイル名を報告する方法において、directory-filesと似ている。しかし、この関数はファイル名のリストをリターンするかわりに、各ファイルごとにリスト(filename . attributes)をリターンする。ここでattributesは、そのファイルにたいしてfile-attributesがリターンするであろう値である。オプション引数id-formatは、file-attributesの対応する引数と同じ意味をもつ(Definition of file-attributesを参照)。

Function: file-expand-wildcards pattern &optional full

この関数は、ワイルドカードパッケージpatternを展開して、それにマッチするファイル名のリストをリターンする。

絶対ファイル名としてpatternが記述された場合は、値も絶対ファイル名になる。

patternが相対ファイル名で記述されている場合、それはカレントデフォルトディレクトリーにたいして相対的に解釈される。リターンされるファイル名も、通常はカレントデフォルトディレクトリーにたいする相対ファイル名になる。しかしfullが非nilの場合は、絶対ファイル名がリターンされる。

Function: insert-directory file switches &optional wildcard full-directory-p

この関数は、lsswitchesに対応するフォーマットで、(カレントバッファー内に)ディレクトリーfileのディレクトリーリストを挿入する。これは、挿入したテキストの後にポイントを残す。switchesにはオプション文字列、または個別のオプションを表す文字列リストを指定できる。

引数fileにはディレクトリー名、またはワイルドカード文字を含むファイル名を指定できる。wildcardが非nilの場合、fileはワイルドカードを伴うファイル指定として扱われることを意味する。

full-directory-pが非nilの場合、ディレクトリーリストにたいしてディレクトリーの完全なコンテンツ表示を要求することを意味する。fileがディレクトリーで、スイッチに‘-d’が含まれないときは、tを指定するべきである(lsへのオプション‘-d’は、ディレクトリーのコンテンツではなく、ファイルとしてディレクトリーを表示するよう指定する)。

ほとんどのシステムでは、この関数は変数insert-directory-programの名前のディレクトリーリスト用プログラムを実行することにより機能する。wildcardが非nilの場合は、ワイルドカード展開するために、shell-file-nameで指定されるシェルの実行も行う。

MS-DOSおよびMS-Windowsシステムは、標準的なUnixプログラムlsを欠くので、この関数はLispコードでlsをエミュレートする。

技術的な詳細としては、switchesにロングオプション‘--dired’が含まれる際にinsert-directoryは、diredのためにこれを特別に扱う。しかし他のオプションと同様、通常は等価なショートオプション‘-D’が単にinsert-directory-programに渡されるだけである。

Variable: insert-directory-program

この変数の値は、関数insert-directory用にディレクトリーリストを生成するプログラムである。この値は、Lispコードでリストを生成するシステムでは無視される。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.10 Creating, Copying and Deleting Directories

Emacs Lispのファイル操作関数のほとんどは、ディレクトリーであるようなファイルに使用されたときはエラーとなります。たとえば、delete-fileでディレクトリーの削除はできません。以下のスペシャルカは、ディレクトリーの作成と削除を行うために存在します。

Command: make-directory dirname &optional parents

このコマンドは、dirnameという名前のディレクトリーを作成する。parentsが非nilの場合(インタラクティブな呼び出しでは、常に非nilとなる)、その親ディレクトリーがまだ存在しなければ、最初にそれを作成することを意味する。

mkdirは、これにたいするエイリアスである。

Command: copy-directory dirname newname &optional keep-time parents copy-contents

このコマンドは、dirnameという名前のディレクトリーを、newnameにコピーする。newnameが既存のディレクトリーの場合、dirnameはそれのサブディレクトリーにコピーされるだろう。

これは、常にコピーされるファイルのファイルモードを、対応する元のファイルモードに一致させる。

3つ目の引数keep-timeが非nilの場合は、コピーされるファイルの修正時刻を保持することを意味する。プレフィックス引数を与えると、keep-timeが非nilになる。

4つ目の引数parentsは、親ディレクトリーが存在しない場合に作成するかどうかを指定する。インタラクティブな場合、これはデフォルトで発生する。

5つ目の引数copy-contentsが非nilの場合、それはnewnameが既存のディレクトリーならば、そのサブディレクトリーとしてdirnameをコピーするかわりに、dirnameのコンテンツをnewnameにコピーする。

Command: delete-directory dirname &optional recursive trash

このコマンドは、dirnameという名前のディレクトリーを削除する。関数delete-fileはディレクトリーであるようなファイルにたいしては機能しない。それらにたいしては、delete-directoryを使用しなければならない。recursivenilで、ディレクトリー内にファイルが存在する場合、delete-directoryはエラーをシグナルする。

delete-directoryは、親ディレクトリーの階層のシンボリックリンクだけをフォローする。

オプション引数trashが非nil、かつ変数delete-by-moving-to-trashが非nilの場合、このコマンドはファイルを削除するかわりに、システムのTrash(ゴミ箱)にファイルを移動する。Miscellaneous File Operations in The GNU Emacs Manualを参照のこと。インタラクティブに呼び出された際は、プレフィックス引数がない場合trasht、それ以外はnilである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.11 Making Certain File Names “Magic”

特定のファイル名にたいして、特別な処理を実装できます。これは、それらの名前のmagic化と呼ばれます。この機能は主に、リモートファイルにたいするアクセスの実装に使用されます(Remote Files in The GNU Emacs Manualを参照)。

magicファイル名を定義するには、名前クラスを定義するための正規表現、およびそれにマッチするファイル名にたいするEmacsファイル操作プリミティブすべてを実装するハンドラーを定義しなければなりません。

変数file-name-handler-alistは各ハンドラーに適用するときを決定する正規表現とともに、ハンドラーのリストを保持します。各要素は、以下の形式をもちます:

(regexp . handler)

ファイルアクセス、およびファイル名変換にたいするすべてのEmacsプリミティブは、file-name-handler-alistにたいして与えられたファイル名をチェックします。そのファイル名がregexpにマッチした場合、そのプリミティブがhandlerを呼び出してファイルを処理します。

handlerの1つ目の引数には、プリミティブの名前をシンボルとして与えます。残りの引数は、そのプリミティブに引数として渡されます(これらの引数の1つ目は、ほとんどの場合はファイル名自体である)。たとえば以下を行い:

(file-exists-p filename)

filenameがハンドラーhandlerをもつ場合、handlerは以下のように呼び出されます:

(funcall handler 'file-exists-p filename)

関数が2つ以上の引数をとる場合、それらはファイル名でなければならず、関数はそれらのファイル名それぞれにたいしてハンドラーをチェックします。たとえば、

(expand-file-name filename dirname)

以下を行った場合は、filenameにたいするハンドラーをチェックした後、dirnameにたいするハンドラーをチェックします。どちらの場合も、handlerは以下のように呼び出されます:

(funcall handler 'expand-file-name filename dirname)

その後、handlerfilenamedirnameのどちらを処理するか解決する必要があります。

指定されたファイル名が2つ以上のハンドラーにマッチする場合は、ファイル名内で最後に開始するマッチが優先されます。リモートファイルアクセスのようなジョブにたいするハンドラーに先立ち、解凍のようなジョブにたいするハンドラーが最初に処理されるように、このルールが選択されました。

以下は、magicファイル名ハンドラーが処理する操作です:

access-fileadd-name-to-filebyte-compiler-base-file-name
copy-directorycopy-filedelete-directorydelete-filediff-latest-backup-filedirectory-file-namedirectory-filesdirectory-files-and-attributesdired-compress-filedired-uncache
expand-file-namefile-accessible-directory-pfile-aclfile-attributesfile-directory-pfile-equal-pfile-executable-pfile-exists-pfile-in-directory-pfile-local-copyfile-modesfile-name-all-completionsfile-name-as-directoryfile-name-completionfile-name-directoryfile-name-nondirectoryfile-name-sans-versionsfile-newer-than-file-pfile-notify-add-watchfile-notify-rm-watchfile-ownership-preserved-pfile-readable-pfile-regular-pfile-remote-pfile-selinux-contextfile-symlink-pfile-truenamefile-writable-pfind-backup-file-nameget-file-bufferinsert-directoryinsert-file-contents
loadmake-auto-save-file-namemake-directorymake-directory-internalmake-symbolic-link
process-filerename-fileset-file-aclset-file-modesset-file-selinux-contextset-file-timesset-visited-file-modtimeshell-commandstart-file-processsubstitute-in-file-name
unhandled-file-name-directoryvc-registeredverify-visited-file-modtime
write-region

insert-file-contentsにたいするハンドラーは通常、visit引数が非nilの場合は、(set-buffer-modified-p nil)によりそのバッファーの変更フラグをクリアーする必要があります。これには、もしそのバッファーがロックされていたら、ロックを解除する効果もあります。

ハンドラー関数は上記すべての操作を処理しなければならず、他の操作が将来追加される可能性もあります。これらの操作自体すべてを実装する必要はありません — 特定の操作にたいして特別なことを行う必要がないときは、その操作を“通常の方法”で処理するよう、そのプリミティブを再呼び出しできます。認識できない操作にたいしては、常にそのプリミティブを再呼び出しするべきです。以下は、これを行う方法の1つです:

(defun my-file-handler (operation &rest args)
  ;; 特別に処理する必要がある、
  ;; 特別な操作を最初にチェックする
  (cond ((eq operation 'insert-file-contents) …)
        ((eq operation 'write-region) …)
        …
        ;; 関知しないその他の操作を処理する
        (t (let ((inhibit-file-name-handlers
                  (cons 'my-file-handler
                        (and (eq inhibit-file-name-operation operation)
                             inhibit-file-name-handlers)))
                 (inhibit-file-name-operation operation))
             (apply operation args)))))

ハンドラー関数が通常のEmacsプリミティブを呼び出す決定をした際は、無限再起を引き起こすような、同一ハンドラーからのプリミティブの再呼び出しを防ぐ必要があります。上記の例では、変数inhibit-file-name-handlersinhibit-file-name-operationにより、これを行う方法を示しています。上記の例のように、これらを正確に使用するよう、注意してください。複数ハンドラーの正しい振る舞い、およびそれぞれがハンドラーをもつかもしれない2つのファイル名にたいする操作にたいする詳細は、非常に重要です。

ファイルへの実アクセスにたいして実際には特別なことを行わないハンドラー(たとえばリモートファイル名にたいしてホスト名の補完を実装するハンドラーなど)は、safe-magicプロパティに非nilをもつべきです。たとえば、Emacsは通常はPATH内で見い出されるようなディレクトリーが、プレフィックス‘/:’によりmagicファイル名に見えるような場合に、magicファイル名にならないよう“保護”します。しかし、safe-magicプロパティに非nilをもつハンドラーがそれらにたいして使用された場合、‘/:’は追加されません。

ファイル名ハンドラーは、普通とは異なる方法でそれを処理(handle)するのが、どの操作(operation)なのかを宣言するために、operationsプロパティをもつことができます。このプロパティが非nil値をもつ場合、それは操作のリストであるべきです。その場合は、それらの操作だけがハンドラーを呼び出すでしょう。これは無駄を省きますが、主な目的はオートロードされるハンドラー関数が実際に処理を行うとき以外はロードされないようにすることです。

通常のプリミティブにたいして、単にすべての操作を延期するのは、機能しません。たとえば、ファイル名ハンドラーがfile-exists-pにたいして適用された場合は、通常のloadコードは正しく機能しないでしょうから、ハンドラー自身でloadを処理しなければなりません。しかし、ハンドラーがfile-exists-pプロパティを使用して、file-exists-pを処理しないことを宣言した場合は、普通とは異なる方法でloadを処理する必要はなくなります。

Variable: inhibit-file-name-handlers

この変数は、特定の操作にたいして現在のところ使用を抑制されているハンドラーのリストを保持する。

Variable: inhibit-file-name-operation

特定のハンドラーにたいして、現在のところ抑制されている操作。

Function: find-file-name-handler file operation

この関数は、fileというファイル名にたいするハンドラー関数、それが存在しなければnilをリターンする。引数operationは、そのファイルを処理する操作であること。これは、ハンドラー呼び出し時に1つ目の引数として渡すことになる値である。operationinhibit-file-name-operationと等しい、またはそのハンドラーのoperations内に存在しない場合、この関数はnilをリターンする。

Function: file-local-copy filename

この関数は、ファイルfilenameがまだローカルマシン上にない場合は、それをローカルマシン上の通常の非magicファイルにコピーする。magicファイル名は、それらが他のマシン上のファイルを参照する場合は、file-local-copy操作を処理するべきである。リモートファイルアクセス以外の目的にたいして使用されるmagicファイル名は、file-local-copyを処理するべきではない。その場合、この関数はそのファイルをローカルファイルとして扱うだろう。

filenameがローカルの場合、それがmagicか否かにかかわらず、この関数は何も行わずに、nilをリターンする。それ以外では、ローカルコピーファイルのファイル名をリターンする。

Function: file-remote-p filename &optional identification connected

この関数は、filenameがリモートファイルかどうかをテストする。filenameがローカル(リモートではない)の場合、リターン値はnilである。filenameが正にリモートの場合、リターン値はそのリモートシステムを識別する文字列である。

この識別子文字列は、ホスト名とユーザー名、およびリモートシステムへのアクセスに使用されるメソッドを表す文字列も同様に含めることができる。たとえば、ファイル名/sudo::/some/fileにたいするリモート識別子文字列は、/sudo:root@localhost:となる。

2つの異なるファイルにたいしてfile-remote-pが同じ識別子をリターンした場合は、それらが同じファイルシステム上に格納されていて、互いに配慮しつつアクセス可能であることを意味する。これはたとえば、同時に両方のファイルにアクセスするリモートプロセスを開始することが可能なことを意味する。ファイルハンドラーの実装者は、この方式を保証する必要がある。

identificationは、文字列としてリターンされるべき識別子の一部を指定する。identificationにはmethoduserhostのシンボルを指定できる。他の値はすべてnilのように扱われ、それは完全な識別子文字列をリターンすることを意味する。上記の例では、リモートのuser識別子文字列は、rootになるだろう。

connectedが非nilの場合、たとえfilenameがリモートであっても、Emacsがそのホストにたいする接続をもたない場合、この関数はnilをリターンする。これは、接続が存在しない際の接続の遅延を回避したいときに有用である。

Function: unhandled-file-name-directory filename

この関数は、magicではないディレクトリーの名前をリターンする。これは、filenameがmagicでなければ、それのディレクトリーパートを使用する。magicファイル名にたいしては、何の値をリターンするかを決定するために、ファイル名ハンドラーを呼び出す。filenameがローカルプロセスからアクセス不能な場合、ファイル名ハンドラーはnilをリターンすることにより、それを示すべきである。

これは、サブプロセスの実行に有用である。すべてのサブプロセスは、自身が属すカレントディレクトリーとして非magicディレクトリーをもたなければならず、この関数はそれを導出するよい手段である。

User Option: remote-file-name-inhibit-cache

リモートファイルの属性は、よりよいパフォーマンスのためにキャッシュすることができる。キャッシュがEmacsの制御外で変更された場合、そのキャッシュ値は無効になり、再読込しなければならない。

この変数がnilにセットされていると、キャッシュ値は決して失効しない。このセッティングは、Emacs以外にリモートファイルを変更するものがないことが確実な場合のみ、慎重に使用すること。これがtにセットされていると、キャッシュ値は決して使用されない。これはもっとも安全な値であるが、パフォーマンスは低下するかもしれない。

折衷的な値としては、これを正の数字にセットする。これは、キャッシュされてからその数字の秒数の間は、キャッシュ値を使用することを意味する。リモートファイルが定期的にチェックされる場合には、この変数を定期的なチェックの間隔より小さい値にletバインドするのは、よい考えかもしれない。たとえば:

(defun display-time-file-nonempty-p (file)
  (let ((remote-file-name-inhibit-cache
         (- display-time-interval 5)))
    (and (file-exists-p file)
         (< 0 (nth 7 (file-attributes
                       (file-chase-links file)))))))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.12 File Format Conversion

Emacsは、バッファー内のデータ(テキスト、テキストプロパティ、あるいはその他の情報)と、ファイル名に格納するのに適した表現との間で双方向の変換をするために、複数のステップを処理します。このセクションでは、このフォーマット変換(format conversion)を行う基本的な関数、すなわちファイルをバッファーに読み込むinsert-file-contentsと、バッファーをファイルに書き込むwrite-regionを説明します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.12.1 Overview

関数insert-file-contents:

関数write-region:

これは、もっとも低レベルでの操作を対照的に示したもので、対象の読み取りと書き込みの処理が逆順で対応しています。このセクションの残りでは、上記で名前のでた3つの変数を取り囲む2つの機能と、いくつかの関連する関数を説明します。文字のエンコードとデコードについての詳細は、Coding Systemsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.12.2 Round-Trip Specification

読み取りと書き込みのもっとも一般的な機能は、変数format-alistで制御されます。これはファイルフォーマット(file format)仕様のリストで、Emacsバッファー内のデータにたいして、ファイル内で使用されるテキスト表現を記述します。読み取りと書き込みの仕様記述はペアーになっており、わたしたちがそれを“ラウンドトリップ(round-trip)”仕様と呼ぶのは、これが理由です(非ペアー仕様については、see section Piecemeal Specificationを参照)。

Variable: format-alist

このリストには、定義されるファイルフォーマットごとに、1つのフォーマット定義が含まれる。フォーマット定義はそれぞれ、以下の形式のリストである:

(name doc-string regexp from-fn to-fn modify mode-fn preserve)

以下は、フォーマット定義内で要素がもつ意味である:

name

フォーマットの名前。

doc-string

フォーマットのドキュメント文字列。

regexp

このフォーマットで表現されるファイルの認識に使用される正規表現。nilの場合、フォーマットが自動的に適用されることは決してない。

from-fn

このフォーマットのデータをデコードする、(ファイルデータを通常のEmacsデータ表現に変換するための)シェルコマンド、または関数。

シェルコマンドは文字列として表され、Emacsはそのコマンドを、変換処理のためのフィルターとして実行する。

from-fnが関数の場合、それは変換するべきバッファー部分を指定する2つの引数、beginendで呼び出される。これは、インプレースでテキストを編集することにより変換を行うべきである。これはテキスト長を変更する可能性があるので、from-fnは変更されたend位置をリターンすること。

ファイルの先頭が、この変換によりregexpにマッチしないようにするのは、from-fnの役目の1つである。そうでないと、おそらく再度変換が呼び出される。

to-fn

このフォーマットのデータをエンコード、すなわち通常のEmacsデータ表現をこのフォーマットに変換するためのシェルコマンド、または関数。

to-fnが文字列の場合、それはシェルコマンドである。Emacsは変換処理のためのフィルターとして、このコマンドを実行する。

to-fnが関数の場合、それは3つの引数で呼び出される。beginendは変換されるべきバッファー部分、bufferでそれがどのバッファーかを指定する。変換を行うには、2つの方法がある:

modify

フラグ。エンコード関数がバッファーを変更する場合はt、注釈リストをリターンすることにより機能する場合はnil

mode-fn

このフォーマットから変換されたファイルをvisit後に呼び出される、マイナーモード関数。この関数は1つの引数で呼び出され、それが整数1の場合、マイナーモード関数はそのモードを有効にする。

preserve

フラグ。format-write-filebuffer-file-formatからこのフォーマットを取り除くべきでない場合はt

関数insert-file-contentsは、指定されたファイルを読み込む際にファイルフォーマットを自動的に認識します。これは、フォーマット定義の正規表現にたいしてファイルの先頭テキストをチェックして、マッチが見つかった場合は、そのフォーマットにたいするデコード関数を呼び出します。その後は再度、既知のフォーマットすべてをチェックします。適用できるフォーマットがない間は、チェックを続行します。

find-file-noselect、またはそれを使用するコマンドでファイルをvisitすることにより、同じように変換が行われます(内部でinsert-file-contentsを呼び出すため)。さらに、それをデコードする各フォーマットのモード関数も呼び出します。これは、バッファーローカル変数buffer-file-format内に、フォーマット名のリストを格納します。

Variable: buffer-file-format

この変数は、visitしているファイルのフォーマットを表す。より正確には、これはカレントバッファーのファイルをvisitに起因するデコードのファイルフォーマット名のリストである。これは、すべてのバッファーにたいして、常にローカルである。

write-regionがデータをファイルに書き込む際には、まずbuffer-file-formatにリストされたフォーマットにたいするエンコード関数を、リスト内での出現順に呼び出します。

Command: format-write-file file format &optional confirm

このコマンドは、カレントバッファーのコンテンツを、フォーマット名のリストformatにもとづいたフォーマットで、ファイルfileに書き込む。これはformatを起点に、buffer-file-formatの値からpreserveフラグ(上記参照)が非nilの要素にたいして、それがまだformat内に存在しない場合は、任意の個数それらを追加する。その後、将来の保存においてデフォルトとなるよう、このフォーマットでbuffer-file-formatを更新する。format引数を除き、このコマンドはwrite-fileと似ている。特に、confirmwrite-fileでの対応する引数と、意味およびinteractiveでの扱いが同じである。Definition of write-fileを参照のこと。

Command: format-find-file file format

このコマンドは、ファイルfileを探して、それをフォーマットformatにしたがって変換する。これは、後でそのバッファーを保存する場合に、formatをデフォルトにすることも行う。

引数formatは、フォーマット名のリストである。formatnilの場合、何の変換も行われない。interactiveに呼び出した場合は、formatにたいして単にRETをタイプすると、nilが指定される。

Command: format-insert-file file format &optional beg end

このコマンドは、ファイルfileのコンテンツを、フォーマットformatにしたがって変換して挿入する。begendが非nilの場合、それはinsert-file-contentsと同様、ファイルのどの部分を読み込むかを指定する(Reading from Filesを参照)。

リターン値は、絶対ファイル名のリスト、および挿入されたデータの長さ(変換後)であり、これはinsert-file-contentsがリターンするものと同様である。

引数formatは、フォーマット名のリストである。formatnilの場合、何の変換も行われない。interactiveに呼び出した場合は、formatにたいして単にRETをタイプすると、nilが指定される。

Variable: buffer-auto-save-file-format

この変数は、自動保存(auto-saving)にたいして使用するフォーマットを指定する。値はbuffer-file-formatと同様、ファイル名のリストであるが、これはauto-saveファイルへの書き込みで、buffer-file-formatのかわりに使用される。値がt(デフォルト)の場合、自動保存は当バッファーの通常の保存時と同じフォーマットを使用する。この変数は、すべてのバッファーにおいて、常にバッファーローカルである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

24.12.3 Piecemeal Specification

前のサブセクション(Round-Trip Specificationを参照)で説明したラウンドトリップ指定とは対照的に、変数after-insert-file-functionswrite-region-annotate-functionsを使用して、読み取りと書き込みの変換を個別に制御できます。

変換は、ある表現を起点として、他の表現を生成します。これを行う変換が1つだけのときは、何を起点とするかに関して競合は存在しません。しかし、複数の変換呼び出しが存在する場合、同じデータを起点にする必要がある2つの変換の間に、競合が発生するかもしれません。

この状況を理解するには、write-region中のテキストプロパティの変換コンテキストが最善です。たとえば、あるバッファーの位置42の文字が‘X’で、それのテキストプロパティがfooだとします。fooにたいする変換が、たとえばそのバッファーに‘FOO:’を挿入することにより行われる場合、それは位置42の文字‘X’を‘F’に変更します。そして次の変換は、間違ったデータを起点に開始されるでしょう。

競合を避けるためには、協調的な変換がバッファーを変更せずに、position昇順でソートされた、(position . string)という形式の要素をもつリストを、注釈(annotations)に指定します。

2つ以上の変換が存在する場合、write-regionはそれらの注釈を、1つのソート済みリストに破壊的にマージします。後でそのバッファーのテキストを実際にファイルに書き込む際に、対応する位置にある指定された注釈を混合します。これはすべて、バッファーを変更せずに行われます。

これとは対照的に、読み取り時にはそのテキストの混合された注釈は、即座に処理されます。insert-file-contentsは、変更される何らかのテキストの先頭にポイントをセットしてから、そのテキストの長さで変換関数を呼び出します。これらの関数は常に、挿入されるテキストの先頭のポイントをリターンするべきです。最初の変換により注釈が削除されても、その後の変換が誤って処理することはないので、このアプローチは読み取りに際しては正しく機能します。すべての変換関数は、それが認識する注釈のスキャン、その注釈の削除、バッファーテキストの変更(たとえばテキストプロパティのセット等)、およびそれらの変更に由来する更新されたテキスト長のリターンを行うべきです。1つの関数によりリターンされた値は、次の関数への引数になります。

Variable: write-region-annotate-functions

write-regionにたいして呼び出す、関数のリスト。リスト内の各関数は、書き込まれるリージョンの開始と終了の、2つの引数で呼び出される。これらの関数は、そのバッファーのコンテンツを変更するべきではない。かわりに注釈をリターンすること。

特別なケースとして、関数がカレントと異なるバッファーをリターンするかもしれない。Emacsはこれを、カレントバッファーが出力される変更されたテキストを含むものとして理解する。つまり、Emacsはwrite-region呼び出しの引数startendを、新たなバッファーのpoint-minpoint-maxに変更して与える。さらに、以前のすべての注釈はこの関数により処理されるので、Emacsはそれらの破棄も行う。

Variable: write-region-post-annotation-function

この変数の値が非nilの場合、それは関数であること。この関数は、write-region完了後に引数なしで呼び出される。

write-region-annotate-functions内のある関数がカレントと異なるバッファーをリターンした場合、Emacsはwrite-region-post-annotation-functionを複数回呼び出す。Emacsは最後にカレントだったバッファーでそれを呼び出し、その前にカレントだったバッファーで再度これを呼び出す、...のようにして元のバッファーに戻る。

したがって、write-region-annotate-functions内の関数は、バッファーを作成して、kill-bufferのそのバッファーでのローカル値にこの変数を与え、変更されたテキストでそのバッファーをセットアップして、そのバッファーをカレントにすることができる。そのバッファーは、write-region完了後にkillされるだろう。

Variable: after-insert-file-functions

このリスト内の各関数は、挿入されるテキストの先頭にポイントがある状態で、挿入される文字数を1つの引数として、insert-file-contentsにより呼び出される。すべての関数はポイントを未変更のまま、その関数によって変更された、挿入後テキストの新たな文字数をリターンするべきである。

わたしたちは、ユーザーがファイル内にテキストプロパティを格納したりそれらを取得するために、そしてさまざまなデータフォーマットを体験することにより、適切なフォーマットを見つけるために、これらのフックを使用してLispプログラムを記述することを推奨します。最終的には、わたしたちがEmacs内にインストールできる、良質で汎用性のある拡張をユーザーが開発することを望みます。

わたしたちは、テキストプロパティの名前や値として、任意のLispオブジェクトの処理を試みることは推奨しません — なぜなら汎用的なプログラムはおそらく記述が困難で、かつ低速だからです。かわりに、十分な柔軟性をもち、エンコードが難しすぎない、想定されるデータ型のセットを選択してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25 Backups and Auto-Saving

バックアップファイルおよびauto-save(自動保存)ファイルは、Emacsがクラッシュ、またはユーザー自身のエラーからユーザーの保護を試みるための、2つの手段です。自動保存(auto-saving)は、カレントの編集セッション開始以降のテキストを保存します。一方バックアップファイルは、カレントセッションの前のファイルコンテンツを保存します。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1 Backup Files

バックアップファイル(backup file)とは、編集中ファイルの古いコンテンツのコピーです。Emacsは、visitされているファイルにバッファーを最初に保存するとき、バックアップファイルを作成します。したがって、バックアップファイルには通常、カレント編集セッションの前にあったような、ファイルのコンテンツが含まれています。バックアップファイルのコンテンツには、通常は一度存在したバックアップファイルが変更されずに残ります。

バックアップは通常、visitされているファイルを新たな名前にリネームすることにより作成されます。オプションで、バックアップファイルがvisitされているファイルをコピーすることにより作成されるように指定できます。この選択により、複数の名前をもつファイルのときに、違いが生じます。また、編集中のファイルの所有者が元のオーナーのままか、それとも編集ユーザーになるかにも、影響し得ます。

デフォルトでは、Emacsは編集中のファイルごとに、単一のバックアップファイルを作成します。かわりに、番号付きバックアップ(numbered backup)を要求することもできます。その場合は、新たなバックアップファイルそれぞれが、新たな名前を得ます。必要なくなったときは古い番号付きバックアップを削除したり、Emacsがそれらを自動的に削除することもできます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1.1 Making Backup Files

Function: backup-buffer

この関数は、もしそれが適切であれば、カレントバッファーにvisitされているファイルのバックアップを作成する。これは、最初のバッファー保存を行う前に、save-bufferにより呼び出される。

リネームによりバックアップが作成された場合、リターン値は(modes extra-alist backupname)という形式のコンスセルである。ここでmodesは、file-modes(Testing Accessibilityを参照)でリターンされるような元ファイルのモードビット、extra-alistfile-extended-attributes(Extended File Attributesを参照)によりリターンされるような元ファイルの拡張属性を示すalist、そしてbackupnameはバックアップの名前である。

他のすべての場合(コピーによりバックアップが作成された、またはバックアップが作成されなかった)、この関数はnilをリターンする。

Variable: buffer-backed-up

このバッファーローカル変数は、そのバッファーのファイルがバッファーによりバックアップされたかどうかを明示する。非nilの場合、バックアップファイルは書き込み済みであり、それ以外では、(バックアップが有効なら)次回保存時にファイルはバックアップされる。この変数は永続的にローカルであり、kill-all-local-variablesはそれを変更しない。

User Option: make-backup-files

この変数は、バックアップファイルを作成するかどうかを決定する。非nilの場合、Emacsは初回保存時にすべてのファイルのバックアップを作成する — ただしbackup-inhibitednilの場合(以下参照)。

以下の例は、Rmailバッファーだけで変数make-backup-filesを変更して、それ以外では変更しない方法を示す。この変数をnilにセットすると、Emacsはそれらのファイルのバックアップ作成をストップし、それはディスク容量の消費を節約するだろう(あなたは、このコードをinitファイルに配置したいと思うかもしれない)。

(add-hook 'rmail-mode-hook
          (lambda () (setq-local make-backup-files nil)))
Variable: backup-enable-predicate

この変数の値は、あるファイルがバックアップファイルをもつべきかどうかを決定する、特定の機会に呼び出される関数である。関数は、判断すべき絶対ファイル名という、1つの引数を受け取る。この関数がnilをリターンした場合、そのファイルにたいするバックアップは無効になる。それ以外では、このセクション内の他の変数がバックアップ作成の是非と方法を指定する。

デフォルト値はnormal-backup-enable-predicateで、これはtemporary-file-directorysmall-temporary-file-directory内のファイルをチェックする。

Variable: backup-inhibited

この変数が非nilの場合、バックアップは抑止される。これは、visitされているファイル名にたいするbackup-enable-predicateのテスト結果を記録する。さらに、visitされているファイルにたいするバックアップ抑止にもとづくその他機構によっても、使用され得る。たとえば、VCはバージョンコントロールシステムに管理されるファイルのバックアップを防ぐために、この変数を非nilにセットする。

これは永続的にローカルなので、メジャーモード変更により値は失われない。メジャーモードはこの変数ではなく、かわりにmake-backup-filesをセットするべきである。

User Option: backup-directory-alist

この変数の値は、ファイル名パターンとバックアップディレクトリー名のalistである。各要素は以下の形式をもつ

(regexp . directory)

名前がregexpにマッチするファイルのバックアップが、directory内に作成されるだろう。directoryには相対ディレクトリー、または絶対ディレクトリーを指定できる。絶対ディレクトリーの場合は、マッチするすべてのファイルが同じディレクトリー内にバックアップされる。このディレクトリー内でのファイル名は、クラッシュを避けるために、バックアップされるファイルの完全名のすべてのディレクトリー区切りは、‘!’に変更される。結果の名前を切り詰めるファイルシステムでは、これは正しく機能しないだろう。

すべてのバックアップが単一のディレクトリーで行われる一般的なケースでは、alistは‘"."’と適切なディレクトリーからなるペアーの、単一の要素を含むべきである。

この変数がnil(デフォルト)、またはファイル名のマッチに失敗した場合、バックアップは元のファイルのディレクトリーに作成される。

長いファイル名のないMS-DOSファイルシステムでは、この変数は常に無視される。

User Option: make-backup-file-name-function

この変数の値は、バックアップファイル名を作成する関数である。関数make-backup-file-nameは、これを呼び出す。Naming Backup Filesを参照のこと。

特定のファイルにたいして特別なことを行うために、これをバッファーローカルにすることもできる。変更する場合は、backup-file-name-pfile-name-sans-versionsも変更する必要があるかもしれない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1.2 Backup by Renaming or by Copying?

Emacsがバックアップファイルを作成できる、2つの方法があります:

デフォルトは、1つ目の方法のリネームです。

変数backup-by-copyingが非nilの場合、それは2つ目の方法、つまり元のファイルをコピーして、新たなバッファー内容で上書きすることを意味します。変数file-precious-flagが非nilの場合にも、(メイン機能の副作用として)この効果があります。Saving Buffersを参照してください。

User Option: backup-by-copying

この変数が非nilの場合、Emacsは常にコピーによりバックアップファイルを作成する。デフォルトはnil

以下の3つの変数が非nilの際は、ある特定のケースに2つ目の方法が使用されます。その特定のケースに該当しないファイルの処理に影響はありません。

User Option: backup-by-copying-when-linked

この変数が非nilの場合、Emacsは複数名(ハードリンク)をもつファイルにたいして、コピーによりバックアップを作成する。デフォルトはnil

backup-by-copyingが非nilの場合は常にコピーによりバックアップが作成されるので、この変数はbackup-by-copyingnilのときだけ意味がある。

User Option: backup-by-copying-when-mismatch

この変数が非nil(デフォルト)の場合、リネームによりファイルの所有者、またはグループが変更されるケースでは、Emacsはコピーによりバックアップを作成する。

リネームによりファイルの所有者、またはグループが変更されない場合、値は効果をもたない。つまり、そのディレクトリーで新たに作成されるファイルにたいするデフォルトのグループに属するユーザーにより所有されるファイルが該当する。

backup-by-copyingが非nilの場合は常にコピーによりバックアップが作成されるので、この変数はbackup-by-copyingnilのときだけ意味がある。

User Option: backup-by-copying-when-privileged-mismatch

この変数が非nilの場合、特定のユーザーID値(具体的には、特定の値以下のID数値)にたいしてのみ、backup-by-copying-when-mismatchと同じように振る舞うことを指定する。変数には、その数値をセットする。

したがって、ファイル所有者の変更を防ぐ必要がある際は、backup-by-copying-when-privileged-mismatchを0にセットすれば、スーパーユーザーだけがコピーによるバックアップを行うことができる。

デフォルトは200。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1.3 Making and Deleting Numbered Backup Files

ファイルの名前がfooの場合、番号付きバックアップのバージョン名はfoo.~v~となります。vfoo.~1~foo.~2~foo.~3~、…、foo.~259~のように、さまざまな整数です。

User Option: version-control

この変数は、単一の非番号付きバックアップファイルを作成するか、それとも複数の番号付きバックアップを作成するかを制御する。

nil

visitされたファイルが番号付きバックアップの場合は番号付きバックアップを作成し、それ以外は作成しない。これがデフォルトである。

never

番号付きバックアップを作成しない。

anything else

番号付きバックアップを作成する。

番号付きバックアップを使用することにより、バックアップのバージョン番号は最終的には非常に大きな番号になるので、それらを削除しなければなりません。Emacsはこれを自動で行うことができ、ユーザーに削除するか確認することもできます。

User Option: kept-new-versions

この変数の値は、新たな番号付きバックアップが作成された際に保持すべき、もっとも新しいバージョンの個数である。新たに作成されたバックアップもカウントされる。デフォルトは2。

User Option: kept-old-versions

この変数の値は、新たな番号付きバックアップが作成された際に保持すべき、もっとも古いバージョンの個数である。デフォルトは2。

番号が1、2、3、5、7のバックアップがあり、かつこれらの変数が値2をもつ場合は、番号が1と2のバックアップは古いバージョンとして保持され、番号が5と7のバックアップは新しいバージョンとして保持される。そして、番号が3のバックアップは、余分なバックアップとなる。関数find-backup-file-name(Naming Backup Filesを参照)は、どのバージョンのバックアップを削除するかを決定する役目を負うが、この関数自身がバックアップを削除する訳ではない。

User Option: delete-old-versions

この変数がtの場合は、ファイルの保存により、余分なバージョンのバックアップは、暗黙里に削除される。nilの場合は、余分なバックアップの削除前に確認を求めることを意味し、それ以外では、余分なバックアップは削除されない。

User Option: dired-kept-versions

この変数は、Dired内のコマンド.(ピリオド。dired-clean-directory)で、もっとも新しいバージョンのバックアップをいくつ保持するかを指定する。これは、新たにバックアップファイルを作成する際に、kept-new-versionsを指定するのと同等である。デフォルトは2。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.1.4 Naming Backup Files

このセクションでは、主にバックアップファイルの命名規則を再定義してカスタマイズできる関数を記載します。これらの1つを変更した場合は、おそらく残りも変更する必要があります。

Function: backup-file-name-p filename

この関数は、filenameがバックアップファイルとして利用可能ならば、非nil値をリターンする。これは名前のチェックだけを行い、filenameという名前のファイルが存在するかどうかはチェックしない。

(backup-file-name-p "foo")
     ⇒ nil
(backup-file-name-p "foo~")
     ⇒ 3

この関数の標準的な定義は、以下のようになる:

(defun backup-file-name-p (file)
  "FILEがバックアップファイルなら\
(番号付きか否かに関わらず)非nilをリターンする"
  (string-match "~\\'" file))

このように、ファイル名が‘~’で終わる場合、この関数は非nil値をリターンする(ドキュメント文字列を分割するために、1行目でバックスラッシュを使用しているが、これはドキュメント文字列内で単一行を生成する)。

この単純な式は、カスタマイズのための再定義を簡便にするために、個々の関数内に配されている。

Function: make-backup-file-name filename

この関数は、ファイルfilenameの非番号付きバックアップファイル名として使用される文字列をリターンする。Unixでは、これは単にfilenameにチルダを追加する。

ほとんどのオペレーティングシステムでは、この関数の標準的な定義は以下のようになる:

(defun make-backup-file-name (file)
  "FILEにたいして非番号付きバックアップファイル名を作成する"
  (concat file "~"))

この関数を再定義することにより、バックアップファイルの命名規則を変更できる。以下は、チルダの追加に加えて、先頭に‘.’を追加するよう、make-backup-file-nameを再定義する例である:

(defun make-backup-file-name (filename)
  (expand-file-name
    (concat "." (file-name-nondirectory filename) "~")
    (file-name-directory filename)))

(make-backup-file-name "backups.texi")
     ⇒ ".backups.texi~"

Diredコマンドのいくつかを含むEmacsの一部では、バックアップファイル名が‘~’で終わると仮定している。この規則にしたがわない場合、深刻な問題とはならないだろうが、それらのコマンドが若干好ましくない結果をもたらすかもしれない。

Function: find-backup-file-name filename

この関数は、filenameの新たなバックアップファイル用のファイル名を計算する。これは、特定の既存バックアップファイルにたいする削除の提案も行うかもしれない。find-backup-file-nameは、CARが新たなバックアップファイル名で、CDRが削除を提案するバックアップファイルのリストであるようなリストをリターンする。値にはnilも指定でき、これはバックアップが作成されないことを意味する。

kept-old-versionsおよびkept-new-versionsの2つの変数は、どのバージョンのバックアップを保持するべきかを決定する。この関数は、値のCDRから該当するバージョンを除外することにより、それらを保持する。Making and Deleting Numbered Backup Filesを参照のこと。

以下の例の値は、新しいバックアップファイルに使用する名前が~rms/foo.~5~で、~rms/foo.~3~は呼び出し側が今削除を検討するべき“余分”なバージョンであることを示している。

(find-backup-file-name "~rms/foo")
     ⇒ ("~rms/foo.~5~" "~rms/foo.~3~")
Function: file-newest-backup filename

この関数は、filenameにたいするもっとも最近のバックアップファイル名、バックアップファイルがない場合はnilをリターンする。

ファイル比較関数のいくつかは、自動的にもっとも最近のバックアップを比較できるように、この関数を使用している。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.2 Auto-Saving

Emacsは、visitしているすべてのファイルを定期的に保存します。これは自動保存(auto-saving)と呼ばれます。自動保存は、システムがクラッシュした場合に失われる作業量を、ある作業量以下にします。デフォルトでは、自動保存は300キーストロークごと、またはidle時の30秒後に発生します。自動保存に関するユーザー向けの情報については、Auto-Saving: Protection Against Disasters in The GNU Emacs Manualを参照してください。ここでは、自動保存の実施に使用される関数と、それらを制御する変数について説明します。

Variable: buffer-auto-save-file-name

このバッファーローカル変数は、カレントバッファーの自動保存に使用されるファイル名である。そのバッファーが自動保存されるべきでない場合は、nil

buffer-auto-save-file-name
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
Command: auto-save-mode arg

これはバッファーローカルなマイナーモードであるAuto Saveモードにたいする、モードコマンドである。Auto Saveモードが有効なときは、そのバッファーで自動保存が有効である。呼び出し方は、他のマイナーモードと同様(Conventions for Writing Minor Modesを参照)。

ほとんどのマイナーモードとは異なり、auto-save-mode変数は存在しない。buffer-auto-save-file-nameが非nil、かつbuffer-saved-size(以下参照)が非0ならば、Auto Saveモードは有効である。

Function: auto-save-file-name-p filename

この関数は、filenameがauto-saveファイルのような文字列の場合は、非nilをリターンする。先頭と末尾がハッシュマーク(‘#’)の名前はauto-saveファイルの可能性があるという、auto-saveファイルにたいする通常の命名規則を想定する。引数filenameは、ディレクトリーパートを含むべきではない。

(make-auto-save-file-name)
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"
(auto-save-file-name-p "#backups.texi#")
     ⇒ 0
(auto-save-file-name-p "backups.texi")
     ⇒ nil

この関数の標準的な定義は、以下のようになる:

(defun auto-save-file-name-p (filename)
  "FILENAMEが以下を満たすなら非nilをリターンする"
  (string-match "^#.*#$" filename))

auto-saveファイルの命名規則規則を変更したいときにカスタマイズできるようにするために、この関数は存在する。これを再定義した場合は、それに対応して関数make-auto-save-file-nameも忘れずに再定義すること。

Function: make-auto-save-file-name

この関数は、カレントバッファーの自動保存に使用されるファイル名をリターンする。これは、ファイル名の先頭と末尾にハッシュマーク(‘#’)を単に追加する。この関数は、変数auto-save-visited-file-name(以下参照)を調べない。呼び出し側は、まずその変数をチェックするべきである。

(make-auto-save-file-name)
     ⇒ "/xcssun/users/rms/lewis/#backups.texi#"

以下は、この関数の標準的な定義の簡略版である:

(defun make-auto-save-file-name ()
  "カレントバッファーの自動保存に使用される\
ファイル名をリターンする"
  (if buffer-file-name
      (concat
       (file-name-directory buffer-file-name)
       "#"
       (file-name-nondirectory buffer-file-name)
       "#")
    (expand-file-name
     (concat "#%" (buffer-name) "#"))))

auto-saveファイルの命名規則をカスタマイズするために再定義できるように、これは独立した関数として存在している。ただし、これに対応した方法でauto-save-file-name-pも忘れずに変更すること。

User Option: auto-save-visited-file-name

この変数が非nilの場合、Emacsはvisit中のファイルにバッファーを自動保存する。つまり、自動保存は編集中ファイルと同じファイルにたいして行われる。通常この変数はnilなので、auto-saveファイルはmake-auto-save-file-nameで作成された別の名前をもつ。

この変数の値を変更した際は、バッファー内でauto-saveモードが再度有効になるまで、既存バッファーにたいして新たな値は効果をもたない。すでにauto-saveモードが有効な場合は、再度auto-save-modeが呼び出されるまで、同じファイルに自動保存が行われる。

Function: recent-auto-save-p

この関数は、カレントバッファーが最後に読み込み、または保存されて以降、自動保存されていればtをリターンする。

Function: set-buffer-auto-saved

この関数は、カレントバッファーを自動保存済みとマークする。そのバッファーは、バッファーテキストが再度変更されるまで、自動保存されないだろう。この関数はnilをリターンする。

User Option: auto-save-interval

この変数の値は、自動保存の頻度を入力イベント数で指定する。この分の入力イベント読み取りごとに、Emacsは自動保存が有効なすべてのバッファーにたいして、自動保存を行う。これを0にすると、タイプした文字数にもとづく自動保存は無効になる。

User Option: auto-save-timeout

この変数の値は、自動保存が発生すべきidle時間の秒数である。この秒数分ユーザーが休止するたびに、Emacsは自動保存が有効なすべてのバッファーにたいして、自動保存を行う(カレントバッファーが非常に大きい場合、指定されたタイムアウトはサイズ増加とともに増加される因子で乗ぜられる。1MBのバッファーにたいして、この因子はおよそ4である)。

値が0、またはnilの場合、idle時間にもとづく自動保存は行われず、auto-save-intervalで指定される入力イベント数の後のみ自動保存が行われる。

Variable: auto-save-hook

このノーマルフックは、自動保存が行われようとするたびに毎回実行される。

User Option: auto-save-default

この変数が非nilの場合は、ファイルをvisitするバッファーの自動保存がデフォルトで有効になり、それ以外では有効にならない。

Command: do-auto-save &optional no-message current-only

この関数は、自動保存される必要があるすべてのバッファーを自動保存する。これは自動保存が有効、かつ前回の自動保存以降に変更されたすべてのバッファーを保存する。

いずれかのバッファーが自動保存される場合、通常do-auto-saveは自動保存が行われる間、それを示すメッセージ‘Auto-saving...’をエコーエリアに表示する。しかし、no-messageが非nilの場合、このメッセージは抑制される。

current-onlyが非nilの場合は、カレントバッファーだけが自動保存される。

Function: delete-auto-save-file-if-necessary &optional force

この関数は、delete-auto-save-filesが非nilなら、カレントバッファーのauto-saveファイルを削除する。これは、バッファー保存時に毎回呼び出される。

forcenilの場合、この関数は最後に本当の保存が行われて以降、カレントEmacsセッションにより書き込まれたファイルだけを削除する。

User Option: delete-auto-save-files

この変数は、関数delete-auto-save-file-if-necessaryにより使用される。これが非nilの場合、Emacsは(visitされているファイルに)本当に保存が行われたとき、auto-saveファイルを削除する。これはデスク容量を節約し、ディレクトリーを整理する。

Function: rename-auto-save-file

この関数は、visitされているファイルの名前が変更されていれば、カレントバッファーのauto-saveファイルの名前を調整する。これは、カレントEmacsセッションでauto-saveファイルが作成されていれば、既存のauto-saveファイルもリネームする。visitされているファイルの名前が変更されていない場合、この関数は何も行わない。

Variable: buffer-saved-size

このバッファーローカル変数の値は、カレントバッファーが最後に読み取り、保存、または自動保存されたときのバッファーの長さである。これは、サイズの大幅な減少の検知に使用され、それに応じて自動保存がオフに切り替えられる。

-1の場合、それはサイズの大幅な減少により、そのバッファーの自動保存が一時的に停止されていることを意味する。明示的な保存により、この変数に正の値が格納され、自動保存が再び有効になる。自動保存をオフやオンに切り替えることでも、またはこの変数を更新されるので、サイズの大幅な減少は忘れられてしまう。

-2の場合は、そのバッファーがバッファーサイズの変更を無視すべきことを意味する。特に、バッファーサイズの変更により、一時的に自動保存を停止するべきではない。

Variable: auto-save-list-file-name

この変数は、(非nilの場合は)すべてのauto-saveファイルの名前を記録するファイルを指定する。Emacsが自動保存を行うたびに、そのEmacsは自動保存が有効な各バッファーごとに2行ずつ書き込みを行う。1行目はvisitされているファイルの名前(ファイルをvisitしないバッファーの場合は空)、2行目はauto-saveファイルの名前を示す。

Emacsを正常にexitしたときは、このファイルは削除される。Emacsがクラッシュした場合は、このファイルを調べることにより、失われるはずだった作業を含む、すべてのauto-saveファイルを探すことができる。recover-sessionコマンドは、それらを見つけるために、このファイルを使用する。

このファイルにたいするデフォルト名は、ユーザーのホームディレクトリーの、‘.saves-’で始まるファイルを指定する。この名前には、EmacsのプロセスIDと、ホスト名も含まれる。

User Option: auto-save-list-file-prefix

initファイルを読み込んだ後、(nilにセット済みでなければ)Emacsはこのプレフィックスにもとづきホスト名とプロセスIDを追加して、auto-save-list-file-nameを初期化する。initファイル内でこれをnilにセットした場合、Emacsはauto-save-list-file-nameを初期化しない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

25.3 Reverting

あるファイルにたいして大きな変更を行った後、気が変わって元に戻したくなった場合は、revert-bufferコマンドでそのファイルの以前のバージョンを読み込むことにより、それらの変更を取り消すことができます。詳細は、Reverting a Buffer in The GNU Emacs Manualを参照してください。

Command: revert-buffer &optional ignore-auto noconfirm preserve-modes

このコマンドは、バージョンのテキストを、ディスク上のvisitされているファイルのテキストで置き換える。これにより、ファイルがvisit、または保存された以降に行ったすべての変更は、アンドゥ(undo: 取り消し)される。

デフォルトでは、もっとも最近のauto-saveファイルのほうがvisitされているファイルより新しく、かつ引数ignore-autonilの場合、revert-bufferはユーザーにたいしてかわりにauto-saveファイルを使用するかどうか確認を求める。このコマンドをinteractiveに呼び出したとき、プレフィックス数引数が指定されていなければ、ignore-autotとなる。つまり、interactive呼び出しは、デフォルトではauto-saveファイルのチェックを行わない。

revert-bufferは通常、バッファーを変更する前に確認を求める。しかし、引数noconfirmが非nilの場合、revert-bufferは確認を求めない。

このコマンドは通常、normal-modeを使用することにより、そのバッファーのメジャーモードとマイナーモードを再初期化する。しかし、preserve-modesが非nilの場合、モードは変更されずに残る。

リバート(revert: 戻す、復元する)は、insert-file-contentsの置き換え機能を使用することにより、バッファー内のマーカー位置の保持を試みる。バッファーのコンテンツとファイルのコンテンツがリバート操作を行う前に等しい場合、リバートはすべてのマーカーを保持する。等しくない場合、リバートによりバッファーは変更される。この場合は、(もしあれば)バッファーの最初と最後にある未変更のテキスト内にあるマーカーは保持される。他のマーカーを保持しても、それらは正しくないだろう。

Variable: revert-buffer-in-progress-p

revert-bufferは処理を行っている間、この変数を非nil値にバインドする。

このセクションの残りの部分で説明する変数をセットすることにより、revert-bufferが処理を行う方法をカスタマイズできます。

User Option: revert-without-query

この変数は、問い合わせなしでリバートされるべきファイルのリストを保持する。値は、正規表現のリスト。visitされているファイルの名前がこれらの正規表現のいずれかにマッチし、かつバッファーが未変更だがディスク上のファイルは変更されている場合、revert-bufferはユーザーに確認を求めることなく、ファイルをリバートする。

メジャーモードのいくつかは、以下の変数をローカルにバインドすることにより、revert-bufferをカスタマイズします:

Variable: revert-buffer-function

この変数の値は、そのバッファーをリバートするために使用する関数である。これはリバート処理を行うための、2つのオプション引数をとる関数であること。2つのオプション引数ignore-autonoconfirmは、revert-bufferが受け取る引数である。

Diredモードのような、編集されるテキストにファイルのコンテンツは含まれず、他の方式により再生成され得るモードは、この変数のバッファーローカル値に、コンテンツを再生成する特別な関数を与えることができる。

Variable: revert-buffer-insert-file-contents-function

この変数の値は、そのバッファーをリバートする際に、更新されたコンテンツの挿入に使用される関数を指定する。その関数は、2つの引数をとる。1つ目は使用するファイル名で、2つ目がtならユーザーはauto-saveファイルの読み込みにたいして確認を求められる。

revert-buffer-functionのかわりにこの変数をモードが変更する理由は、revert-bufferが行残りの処理(ユーザーへの確認、アンドゥリストのクリアー、適切なメジャーモードの決定、以下のフックの実行)にたいする重複や置き換えを避けるためである。

Variable: before-revert-hook

このノーマルフックは、変更されたコンテンツを挿入する前に、デフォルトのrevert-buffer-functionにより実行される。カスタマイズしたrevert-buffer-functionは、このフックを実行するかどうか判らない。

Variable: after-revert-hook

このノーマルフックは、変更されたコンテンツを挿入した後に、デフォルトのrevert-buffer-functionにより実行される。カスタマイズしたrevert-buffer-functionは、このフックを実行するかどうか判らない。

Variable: buffer-stale-function

この変数の値は、バッファーがリバートを要するかどうかをチェックするために呼び出される関数を指定する。デフォルト値は、修正時刻をチェックすることにより、ファイルをvisitするバッファーだけを処理する。ファイルをvisitしないバッファーには、カスタム関数が必要になる ((emacs)Supporting additional buffersを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26 Buffers

バッファー(buffer)とは、編集されるテキストを含むLispオブジェクトのことです。バッファーは、visitされるファイルのコンテンツを保持するために使用されます。しかし、ファイルをvisitしないバッファーも存在するかもしれません。一度に複数のバッファーが存在するかもしれませんが、カレントバッファー(current buffer)に指定できるのは、常に1つのバッファーだけです。ほとんどの編集コマンドは、カレントバッファーのコンテンツにたいして作用します。カレントバッファーを含むすべてのバッファーは、任意のウィンドウ内に表示されるときも、表示されない場合もあります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.1 Buffer Basics

バッファー(buffer)とは、編集されるテキストを含むLispオブジェクトのことです。バッファーは、visitされるファイルのコンテンツを保持するために使用されます。しかし、ファイルをvisitしないバッファーも存在します。一度に複数のバッファーが存在するかもしれませんが、カレントバッファー(current buffer)に指定できるのは、常に1つのバッファーだけです。ほとんどの編集コマンドは、カレントバッファーのコンテンツにたいして作用します。カレントバッファーを含むすべてのバッファーは、任意のウィンドウ内に表示されるときも、表示されない場合もあります。

Emacs編集におけるバッファーは、個別に名前をもち、編集可能なテキストを保持するオブジェクトです。Lispプログラムにたいして、バッファーはスペシャルデータ型として表されます。バッファーのコンテンツを、拡張可能な文字列と考えることができます。挿入と削除は、バッファー内の任意の箇所で発生し得ます。Textを参照してください。

Lispのバッファーオブジェクトは、多くの情報要素を含んでいます。これらの情報のいくつかは変数を通じてプログラマーが直接アクセスできるのにたいして、その他の情報は特殊な目的のための関数を通じてのみアクセスすることができます。たとえば、visitされているファイルの名前は変数を通じて直接アクセスできますが、ポイント値はプリミティブ関数からのみアクセスできます。

直接アクセス可能な、バッファー固有の情報は、バッファーローカル(buffer-local)な変数バインディング内に格納されます。これは、特定のバッファー内だけで効力のある変数値のことです。この機能により、それぞれのバッファーは、特定の変数の値をオーバーライドすることができます。ほとんどのメジャーモードは、この方法でfill-columncomment-columnのような変数をオーバーライドしています。バッファーローカルな変数、およびそれらに関連する関数についての詳細は、Buffer-Local Variablesを参照してください。

バッファーからファイルをvisitする関数および変数については、Visiting Files、およびSaving Buffersを参照してください。ウィンドウ内へのバッファー表示に関連する関数および変数については、Buffers and Windowsを参照してください。

Function: bufferp object

この関数は、objectがバッファーならt、それ以外はnilをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.2 The Current Buffer

一般的に、1つのEmacsセッション内には、多くのバッファーが存在します。常に、それらのうちの1つがカレントバッファー(current buffer)に指定され、ます。カレントバッファーとは、ほとんどの編集が行われるバッファーのことです。テキストを調べたり変更するプリミティブのほとんどは、暗黙的にカレントバッファーにたいして処理を行います(Textを参照)。

通常は、選択されたウィンドウ内に表示されるバッファーがカレントバッファーですが、常にそうではありません。Lispプログラムは、バッファーのコンテンツを処理するために、スクリーン上に表示されているものを変更することなく、任意のバッファーを一時的にカレントに指定できます。カレントバッファーの指定にたいしてもっとも基本的な関数は、set-bufferです。

Function: current-buffer

この関数は、カレントバッファーをリターンする関数。

(current-buffer)
     ⇒ #<buffer buffers.texi>
Function: set-buffer buffer-or-name

この関数は、buffer-or-nameをカレントバッファーにする。buffer-or-nameは既存のバッファー、または既存のバッファーの名前でなければならない。リターン値は、カレントになったバッファーである。

この関数は、そのバッファーをどのウィンドウにも表示しないので、必然的にユーザーはそのバッファーを見ることはできない。しかし、Lispプログラムはその後、そのバッファーにたいして処理を行うことになるだろう。

編集コマンドがエディターコマンドループにリターンする際、Emacsは選択されたウィンドウ内に表示されているバッファーにたいして、自動的にset-bufferを呼び出します。これは混乱を防ぐためで、これにより、Emacsがコマンドを読み取るときに、カーソルのあるバッファーが、コマンドを適用されるバッファーになるのが保証されます(Command Loopを参照)。したがって、異なるバッファーを指示して切り替える場合に、set-bufferを使用するべきではありません。これを行うためには、Switching to a Buffer in a Windowで説明されているカを使用してください。

Lisp関数を記述する際は、処理後にカレントバッファーをリストアするために、コマンドループのこの振る舞いに依存しないでください。編集コマンドは、コマンドループだけではなく、他のプログラムからLisp関数としても呼び出されます。呼び出し側にとっては、そのサブルーチンがカレントだったバッファーを変更しないほうが便利です(もちろん、それがサブルーチンの目的でない場合ですが)。

他のバッファーにたいして一時的に処理を行うには、save-current-bufferフォーム内にset-bufferを置きます。以下の例は、コマンドappend-to-bufferの簡略版です:

(defun append-to-buffer (buffer start end)
  "リージョンのテキストをBUFFERに追加する"
  (interactive "BAppend to buffer: \nr")
  (let ((oldbuf (current-buffer)))
    (save-current-buffer
      (set-buffer (get-buffer-create buffer))
      (insert-buffer-substring oldbuf start end))))

ここでは、カレントバッファーを記録するためにローカル変数にバインドしてから、後でsave-current-bufferがそれを再びカレントにするよう、取り計らっています。次に、set-bufferが指定されたバッファーをカレントにして、insert-buffer-substringが元のバッファーの文字列を、指定された(今はカレントの)バッファーにコピーします。

かわりに、with-current-bufferマクロを使用することもできます:

(defun append-to-buffer (buffer start end)
  "BUFFERにリージョンのテキストを追加する"
  (interactive "BAppend to buffer: \nr")
  (let ((oldbuf (current-buffer)))
    (with-current-buffer (get-buffer-create buffer)
      (insert-buffer-substring oldbuf start end))))

どちらの場合でも、追加されるバッファーが偶然他のウィンドウに表示されていた場合には、次回の再表示でそのテキストがどのように変更されたか表示されるでしょう。どのウィンドウにも表示されていない場合には、スクリーン上で即座に変更を目にすることはありません。コマンドはバッファーを一時的にカレントにしますが、そのことがバッファーの表示を誘因する訳ではありません。

バッファーローカルバインディングをもつ変数にたいして、(letや関数引数などで)ローカルバインディングを作成する場合は、そのローカルバインディングのスコープの最初と最後で、同じバッファーがカレントとなることを確認してください。そうしないと、あるバッファーではバインドして、他のバッファーではバインドされないことになるかもしれません!

set-bufferの使用において、カレントバッファーが戻ることに依存しないでください。なぜなら、間違ったバッファーがカレントのときにquitが発生した場合、その処理は行われないでしょう。たとえば上記の例に倣うと、以下は間違ったやり方です:

  (let ((oldbuf (current-buffer)))
    (set-buffer (get-buffer-create buffer))
    (insert-buffer-substring oldbuf start end)
    (set-buffer oldbuf))

例で示したようにsave-current-buffer、またはwith-current-bufferを使用すれば、quitやthrowを、通常の評価と同様に処理できます。

Special Form: save-current-buffer body…

スペシャルフォームsave-current-bufferは、カレントバッファーの識別を保存して、bodyフォームを評価し、最後にそのバッファーをカレントにリストアする。リターン値は、body内の最後のフォームの値である。throwやエラーを通じた異常exitの場合でも、カレントバッファーはリストアされる(Nonlocal Exitsを参照)。

カレントとして使用されていたバッファーが、save-current-bufferによるexit時にkillされていた場合は、それが再びカレントとなることは当然ない。かわりに、exit直前にカレントバッファーが何であれ、それがカレントになる。

Macro: with-current-buffer buffer-or-name body…

with-current-bufferマクロは、カレントバッファーの識別を保存して、buffer-or-nameをカレントにし、bodyフォームを評価して、最後にカレントバッファーをリストアする。buffer-or-nameには既存のバッファー、または既存のバッファー名を指定しなければならない。

リターン値は、body内の最後のフォームの値である。throwやエラーを通じた異常exitの場合でも、カレントバッファーはリストアされる(Nonlocal Exitsを参照)。

Macro: with-temp-buffer body…

with-temp-bufferマクロは、一時的なバッファーをカレントバッファーとして、bodyフォームを評価する。これはカレントバッファーの識別を保存して、一時的なバッファーを作成、それをカレントとして、bodyフォームを評価し、一時バッファーをkillする間に、以前のカレントバッファーをリストアする。 デフォルトでは、このマクロにより作成されたバッファー内のアンドゥ情報(Undoを参照)は記録されない(が、必要ならbodyでそれを有効にできる)。

リターン値は、body内の最後のフォームの値である。最後のフォームとして(buffer-string)を使用することにより、一時バッファーのコンテンツをリターンできる。

throwやエラーを通じた異常exitの場合でも、カレントバッファーはリストアされる(Nonlocal Exitsを参照)。

Writing to Fileswith-temp-fileも参照されたい。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.3 Buffer Names

それぞれのバッファーは、文字列で表される一意な名前をもちます。バッファーにたいして機能する関数の多くは、引数としてバッファーとバッファー名の両方を受け入れます。buffer-or-nameという名前の引数がこのタイプで、それが文字列でもバッファーでもない場合は、エラーがシグナルされます。bufferという名前の引数は、名前ではなく実際のバッファーオブジェクトでなければなりません。

短命でユーザーが関心をもたないようなバッファーは名前がスペースで始まり、それらについてはlist-buffersおよびbuffer-menuコマンドは無視します(が、ファイルをvisitしているようなバッファーは無視されない)。スペースで始まる名前は、初期状態ではアンドゥ情報の記録も無効になっています。Undoを参照してください。

Function: buffer-name &optional buffer

この関数は、bufferの名前を文字列としてリターンする。bufferのデフォルトは、カレントバッファーである。

buffer-namenilをリターンした場合、それはbufferがkillされていることを意味する。Killing Buffersを参照のこと。

(buffer-name)
     ⇒ "buffers.texi"

(setq foo (get-buffer "temp"))
     ⇒ #<buffer temp>
(kill-buffer foo)
     ⇒ nil
(buffer-name foo)
     ⇒ nil
foo
     ⇒ #<killed buffer>
Command: rename-buffer newname &optional unique

この関数は、カレントバッファーをnewnameにリネームする。newnameが文字列でない場合は、エラーをシグナルする。

newnameがすでに使用済みの場合、rename-bufferは通常はエラーをシグナルする。しかし、uniqueが非nilの場合は、未使用の名前となるようにnewnameを変更する。interactiveに呼び出した場合は、プレフィックス数引数によりuniqueに非nilを指定できる(この方法により、コマンドrename-uniquelyは実装される)。

この関数は、実際にバッファーに与えられた名前をリターンする。

Function: get-buffer buffer-or-name

この関数は、buffer-or-nameで指定されたバッファーをリターンする。buffer-or-nameが文字列で、かつそのような名前のバッファーが存在しない場合、値はnilになる。buffer-or-nameがバッファーの場合は、与えられたバッファーをリターンする。これは有用とは言い難く、引数は通常は名前である。たとえば:

(setq b (get-buffer "lewis"))
     ⇒ #<buffer lewis>
(get-buffer b)
     ⇒ #<buffer lewis>
(get-buffer "Frazzle-nots")
     ⇒ nil

Creating Buffersの関数get-buffer-createも参照のこと。

Function: generate-new-buffer-name starting-name &optional ignore

この関数は、新たなバッファーにたいして一意となるような名前をリターンする — が、バッファーは作成しない。この名前はstarting-nameで始まり、内部が数字であるような‘<…>’を追加することにより、すべてのバッファーでカレントで使用されていない名前を生成する。この数字は2で始まり、既存バッファーの名前でない名前になる数字まで増加される。

オプション引数ignoreが非nilの場合、それは潜在的にバッファー名であるような文字列であること。これは、たとえそれが(通常は拒絶されるであろう)既存バッファーの名前であっても、試みられた場合は、潜在的に受容可能なバッファーとして考慮することを意味する。つまり‘foo’、‘foo<2>’、‘foo<3>’、‘foo<4>’という名前のバッファーが存在する場合、

(generate-new-buffer-name "foo")
     ⇒ "foo<5>"
(generate-new-buffer-name "foo" "foo<3>")
     ⇒ "foo<3>"
(generate-new-buffer-name "foo" "foo<6>")
     ⇒ "foo<5>"

Creating Buffersの関連する関数generate-new-bufferも参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.4 Buffer File Name

バッファーファイル名(buffer file name)とは、そのバッファーにvisitされているファイルの名前です。バッファーがファイルをvisiblyしていなければ、バッファーファイル名はnilです。大抵、バッファー名はバッファーファイル名の非ディレクトリーパートと同じですが、バッファーファイル名とバッファー名は別物であり、個別にセットすることができます。Visiting Filesを参照してください。

Function: buffer-file-name &optional buffer

この関数は、bufferがvisitしているファイルの、絶対ファイル名をリターンする。bufferがファイルをvisitしていない場合、buffer-file-namenilをリターンする。bufferが与えられない場合のデフォルトは、カレントバッファーになる。

(buffer-file-name (other-buffer))
     ⇒ "/usr/user/lewis/manual/files.texi"
Variable: buffer-file-name

このバッファーローカル変数は、カレントバッファーにvisitされているファイルの名前、ファイルをvisitしていなければnilが含まれる。これは永続的なローカル変数であり、kill-all-local-variablesの影響を受けない。

buffer-file-name
     ⇒ "/usr/user/lewis/manual/buffers.texi"

他のさまざまな事項を変更せずに、この変数を変更するのは危険である。通常は、set-visited-file-nameを使用するほうがよい(以下参照)。バッファー名の変更などのような、そこで行われることのいくつかは、絶対必要という訳ではないが、その他の事項はEmacsが混乱するのを防ぐために必要不可欠である。

Variable: buffer-file-truename

このバッファーローカル変数は、カレントバッファーにvisitされているファイルの省略された形式の実名(truename)、ファイルをvisitしていない場合はnilを保持する。これは永続的にローカルであり、kill-all-local-variablesの影響を受けない。See section Truenames、およびabbreviate-file-nameを参照のこと。

Variable: buffer-file-number

このバッファーローカル変数は、カレントバッファーにvisitされているファイルのファイル番号(file number)とデバイス番号(device number)、ファイルをvisitしていない場合はnilを保持する。これは永続的にローカルであり、kill-all-local-variablesの影響を受けない。

値は通常、(filenum devnum)のような形式のリストである。この番号ペアーは、システム上でアクセス可能なすべてのファイルの中から、ファイルを一意に識別する。より詳細な情報は、File Attributesfile-attributesを参照のこと。

buffer-file-nameがシンボリックリンク名の場合は、どちらの番号も再帰的なターゲットを参照する。

Function: get-file-buffer filename

この関数は、ファイルfilenameをvisitしているバッファーをリターンする。そのようなバッファーが存在しない場合は、nilをリターンする。引数filenameは文字列でなければならず、展開(Functions that Expand Filenamesを参照)された後、killされていないすべてのバッファーがvisitしているファイル名と比較される。バッファーのbuffer-file-nameは、filenameの展開形と正確にマッチしなければならないことに注意。この関数は、同じファイルにたいする他の名前は、認識しないだろう。

(get-file-buffer "buffers.texi")
    ⇒ #<buffer buffers.texi>

特殊な状況下では、複数のバッファーが同じファイル名をvisitすることがあり得る。そのような場合、この関数はバッファーリスト内の最初に該当するバッファーをリターンする。

Function: find-buffer-visiting filename &optional predicate

これはget-file-bufferと似ているが、そのファイルを違う名前でvisitしているかもしれないすべてのバッファーをリターンする。つまり、バッファーのbuffer-file-namefilenameの展開形式と正確にマッチする必要はなく、同じファイルを参照することだけが要求される。predicateが非nilの場合、それはfilenameをvisitしているバッファーを1つの引数とする関数であること。そのバッファーにたいして、predicateが非nilをリターンした場合のみ、適切なリターン値と判断される。リターンすべき適切なバッファーが見つからない場合、find-buffer-visitingnilをリターンする。

Command: set-visited-file-name filename &optional no-query along-with-file

filenameが非空文字列の場合、この関数はカレントバッファーにvisitされているファイルの名前を、filenameに変更する(バッファーがファイルをvisitしていない場合は、visitするファイルとしてfilenameを与える)。そのバッファーにたいする次回の保存では、新たに指定されたファイルに保存されるだろう。

このコマンドは、たとえそのバッファーのコンテンツがその前にvisitされていたファイルとマッチしていても、(Emacsが関知するかぎり)filenameのコンテンツとはマッチしないので、バッファーが変更されている(modified)とマークする。これは、その名前がすでに使用されていなければ、新たなファイル名に対応してバッファーをリネームする。

filenamenil、または空文字列の場合、それは“visitされているファイルがない”ことを意味する。この場合、set-visited-file-nameはバッファーの変更フラグを変更することなく、そのバッファーがファイルをvisitしていないとマークする。

この関数はfilenameをvisitしているバッファーがすでに存在する場合は、通常はユーザーに確認を求める。しかし、no-queryが非nilの場合は、この質問を行わない。filenameをvisitしているバッファーがすでに存在し、かつユーザーが承認、またはno-queryが非nilの場合、この関数は中に数字が入った‘<…>’をfilenameに追加して、新たなバッファーの名前を一意にする。

along-with-fileが非nilの場合、それは前にvisitされていたファイルがfilenameにリネームされたと想定することを意味する。この場合、コマンドはバッファーの修正フラグを変更せず、そのバッファーの記録されている最終ファイル変更時刻をvisited-file-modtimeが報告する時刻(Buffer Modification Timeを参照)で変更もしない。along-with-filenilの場合、この関数はvisited-file-modtimeが0をリターンした後に、記録済みの最終ファイル変更時刻をクリアーする。

関数set-visited-file-nameがinteractiveに呼び出されたときは、ミニバッファー内でfilenameの入力を求める。

Variable: list-buffers-directory

このバッファーローカル変数は、visitしているファイル名をもたないバッファーにたいして、バッファーリスト中のvisitしているファイル名を表示する場所に表示する文字列を指定する。Diredバッファーは、この変数を使用する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.5 Buffer Modification

Emacsは、各バッファーにたいして、バッファーのテキストを変更したかどうかを記録するために、変更フラグ(modified flag)と呼ばれるフラグを管理しています。このフラグは、バッファーのコンテンツを変更すると常にtにセットされ、バッファーを保存したときnilにクリアーされます。したがって、このフラグは保存されていない変更があるかどうかを表します。フラグの値は通常、モードライン内(Variables Used in the Mode Lineを参照)に表示され、保存(Saving Buffersを参照)と自動保存(Auto-Savingを参照)を制御します。

いくつかのLispプログラムは、このフラグを明示的にセットします。たとえば、関数set-visited-file-nameは、このフラグをtにセットします。なぜなら、たとえその前にvisitしていたファイルが変更されていなくても、テキストは新たにvisitされたファイルとマッチしないからです。

バッファーのコンテンツを変更する関数については、Textで説明されています。

Function: buffer-modified-p &optional buffer

この関数は、バッファーbufferが最後にファイルから読み込まれた、あるいは保存されてから変更されていればt、それ以外ではnilをリターンする。bufferが与えられない場合は、カレントバッファーがテストされる。

Function: set-buffer-modified-p flag

この関数は、flagが非nilならカレントバッファーを変更済みとしてマークし、nilなら未変更としてマークする。

この関数を呼び出すことによる別の効果は、それがカレントバッファーのモードラインの無条件な再表示を引き起こすことである。実際のところ、関数force-mode-line-updateは、以下を行うことにより機能する:

(set-buffer-modified-p (buffer-modified-p))
Function: restore-buffer-modified-p flag

set-buffer-modified-pと同様だが、モードラインにたいする強制的な再表示を行わない。

Command: not-modified &optional arg

このコマンドは、カレントバッファーが変更されておらず、保存する必要がないとマークする。argが非nilの場合、これは変更されているとマークするので、次回の適切なタイミングでバッファーは保存されるだろう。interactiveに呼び出された場合、argはプレフィックス引数である。

この関数は、エコーエリア内にメッセージをプリントするので、プログラム内で使用してはならない。かわりに、set-buffer-modified-p(上記)を使用すること。

Function: buffer-modified-tick &optional buffer

この関数は、bufferの変更カウント(modification-count)をリターンする。これは、バッファーが変更されるたびに増加されるカウンターである。buffernil(または省略)の場合は、カレントバッファーが使用される。このカウンターは、時折0にクリアーされ得る。

Function: buffer-chars-modified-tick &optional buffer

この関数は、bufferの文字変更に関わる変更カウントをリターンする。テキストプロパティを変更しても、このカウンターは変化しない。しかし、そのバッファーにテキストが挿入、または削除されるたびに、このカウンターはbuffer-modified-tickによりリターンされるであろう値にリセットされる。buffer-chars-modified-tickを2回呼び出してリターンされる値を比較することにより、その呼び出しの間にバッファー内で文字変更があったかどうかを知ることができる。buffernil(または省略)の場合は、カレントバッファーが使用される。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.6 Buffer Modification Time

あるファイルをvisitして、そのバッファー内で変更を行って、その一方ではディスク上でファイル自身が変更されたとします。この時点でバッファーを保存すると、ファイル内の変更は上書きされるでしょう。これが正に望んでいる動作のときもありますが、通常は有用な情報が失われてしまいます。したがって、Emacsはファイルを保存する前に、以下で説明する関数を使用して、ファイルの変更時刻をチェックします(ファイルの変更時刻を調べる方法は、File Attributesを参照)。

Function: verify-visited-file-modtime &optional buffer

この関数は、buffer(デフォルトはカレントバッファー)にvisitされているファイルにたいして記録されている変更時刻と、オペレーティングシステムにより記録された実際の変更時刻を比較する。これら2つの時刻は、Emacsがそのファイルをvisit、もしくは保存して以降、他のプロセスにより書き込みがされていなければ、等しくなるはずである。

この関数は、実際の最終変更時刻と、Emacsが記録した変更時刻が同じならt、それ以外はnilをリターンする。そのバッファーが記録済みの最終変更時刻をもたない、すなわちvisited-file-modtimeが0をリターンするような場合も、tをリターンする。

これは、たとえvisited-file-modtimeが非0の値をリターンしたとしても、ファイルをvisitしていないバッファーにたいしては、常にtをリターンする。たとえば、diredバッファーにたいして、この関数は常にtをリターンする。また、存在せず、 以前に存在したこともなかったファイルをvisitするバッファーにたいしてtをリターンするが、visitしているファイルが削除されたバッファーにたいしてはnilをリターンする。

Function: clear-visited-file-modtime

この関数は、カレントバッファーによりvisitされているファイルの最終変更時刻の記録をクリアーする。結果として、このバッファーにを次回の保存では、ファイルの変更時刻の食い違いは報告されなくなる。

この関数はset-visited-file-name、および変更済みファイルの上書きを防ぐための通常テストを行わない例外的な箇所で呼び出される。

Function: visited-file-modtime

この関数は、カレントバッファーの記録された最終ファイル変更時刻を、(high low microsec picosec)のような形式のリストでリターンする(これは、file-attributesが時刻値をリターンするために使用するフォーマットと同じである。File Attributesを参照されたい)。

バッファーが最終変更時刻の記録をもたない場合、この関数は0をリターンする。これが発生するのは、たとえばバッファーがファイルをvisitしていなかったり、clear-visited-file-modtimeで最終変更時刻が明示的にクリアーされた場合である。しかしvisited-file-modtimeは、いくつかの非ファイルバッファーにたいするリストをリターンすることに注意。たとえば、ディレクトリーをリストするDiredバッファーでは、Diredが記録するそのディレクトリーの最終変更時刻がリターンされる。

バッファーがファイルをvisitしていない場合、この関数は-1をリターンする。

Function: set-visited-file-modtime &optional time

この関数は、バッファーがvisitしているファイルの最終変更時刻の記録を、timeが非nil、それ以外はvisitしているファイルの最終変更時刻により更新する。

timenilや0でない場合、それはcurrent-timeで使用される形式(high low microsec picosec)というフォーマットであること(Time of Dayを参照)。

この関数は、バッファーが通常のようにファイルから読み取られたものでない場合や、ファイル自身が害のない既知の理由により変更されている場合に有用である。

Function: ask-user-about-supersession-threat filename

これは、visitしているファイルfilenameがバッファーのテキストより新しいときにバッファーの変更を試みた後、ユーザーに処理方法を尋ねるために使用する関数である。Emacsはディスク上のファイルの変更時刻が、バッファーを最後に保存した時刻より新しいかどうかで、これを検知する。これはおそらく、他のプログラムがそのファイルを変更したことを意味する。

この関数が正常にリターンするかどうかは、ユーザーの答えに依存する。関数はバッファーの変更が処理された場合は正常にリターンし、バッファーの変更が許可されなかった場合は、データ(filename)とともにエラーfile-supersessionをシグナルする。

この関数は、適切なタイミングでEmacsにより自動的に呼び出される。これは、再定義することによりEmacsをカスタマイズ可能にするために存在する。標準的な定義は、ファイルuserlock.elを参照されたい。

File Locksのファイルロックのメカニズムも参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.7 Read-Only Buffers

あるバッファーが読み取り専用(read-only)の場合は、たとえスクロールやナローイングによってファイルのコンテンツのビューを変更しても、そのコンテンツを変更することはできません。

読み取り専用バッファーは、2つのタイプの状況において使用されます:

Variable: buffer-read-only

このバッファーローカル変数は、そのバッファーが読み取り専用かどうかを指定する。この変数が非nilなら、そのバッファーは読み取り専用である。

Variable: inhibit-read-only

この変数が非nilの場合、読み取り専用バッファー、およびその実際の値に依存して、一部もしくはすべての読み取り専用文字が変更されている。バッファー内の読み取り専用文字とは、テキストプロパティread-onlyが非nilの文字である。テキストプロパティについての詳細は、Properties with Special Meaningsを参照のこと。

inhibit-read-onlytの場合、すべてのread-only文字プロパティは効果がなくなる。inhibit-read-onlyがリストの場合、read-only文字プロパティがリストのメンバーなら効果がなくなる(比較はeqで行われる)。

Command: read-only-mode &optional arg

これは、バッファーローカルなマイナーモードである、Read Onlyモードにたいするモードコマンドである。このモードが有効なときは、そのバッファーのbuffer-read-onlyは非nilである。無効なときは、そのバッファーのbuffer-read-onlynilである。呼び出す際の慣習は、他のマイナーモードコマンドの慣習と同じである(Conventions for Writing Minor Modesを参照)。

このマイナーモードは他のマイナーモードとは異なり、主にbuffer-read-onlyにたいするラッパーの役目を果たし、別個にread-only-mode変数は存在しない。Read Onlyモードが無効なときでも、read-onlyテキストプロパティが非nilの文字は読み取り専用のままである。一時的にすべての読み取り専用ステータスを無視するには、上述のinhibit-read-onlyをバインドすること。

Read Onlyモードを有効にする際、このモードコマンドはオプションview-read-onlyが非nilなら、Viewモードも有効にする。Miscellaneous Buffer Operations in The GNU Emacs Manualを参照のこと。Read Onlyモードを無効にする際に、もしもViewモードが有効なら、Viewモードも無効にする。

Function: barf-if-buffer-read-only

この関数は、カレントバッファーが読み取り専用の場合は、buffer-read-onlyエラーをシグナルする。カレントバッファーが読み取り専用の場合にエラーをシグナルする他の方法については、Using interactiveを参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.8 The Buffer List

バッファーリスト(buffer list)とは、すべての生きた(killされていない)バッファーのリストです。このリスト内のバッファーの順序は主に、それぞれのバッファーがウィンドウに表示されたのがどれほど最近なのかにもとづきます。いくつかの関数、特にother-bufferはこの順序を使用します。ユーザーに表示されるバッファーリストも、この順序にしたがいます。

バッファーを作成すると、それはバッファーリストの最後に追加され バッファーをkillすることにより、そのリストから削除されます。ウィンドウに表示するためにバッファーが選択されたとき(Switching to a Buffer in a Windowを参照)、あるいはバッファーを表示するウィンドウが選択されたとき(Selecting Windowsを参照)、そのバッファーは常にこのリストの先頭に移動します。バッファーがバリー(以下のbury-bufferを参照)されたときは、このリストの最後に移動します。バッファーリストを直接操作するために利用できる、Lispプログラマー向けの関数は存在しません。

説明した基本バッファーリスト(fundamental buffer list)に加えて、Emacsはそれぞれのフレームにたいしてローカルバッファーリスト(local buffer list)を保守します。ローカルバッファーリストでは、そのフレーム内で表示されていた(または選択されたウィンドウの)バッファーが先頭になります(この順序は、そのフレームのフレームパラメーターbuffer-listに記録される。Buffer Parametersを参照されたい)。そのフレームでは表示されていないフレームは後になるよう、並び順は基本バッファーリストに準じます。

Function: buffer-list &optional frame

この関数は、すべてのバッファーを含むバッファーリストをリターンする(名前がスペースで始まるバッファーも含む)。リストの要素はバッファーの名前ではなく、実際のバッファーである。

frameがフレームの場合は、frameのローカルバッファーリストをリターンする。framenil、または省略された場合は、基本バッファーリストが使用される。その場合、そのバッファーを表示するフレームがどれかとは無関係に、もっとも最近に表示、または選択されたバッファーの順になる。

(buffer-list)
     ⇒ (#<buffer buffers.texi>
         #<buffer  *Minibuf-1*> #<buffer buffer.c>
         #<buffer *Help*> #<buffer TAGS>)

;; ミニバッファーの名前が
;;   スペースで始まることに注意!
(mapcar (function buffer-name) (buffer-list))
    ⇒ ("buffers.texi" " *Minibuf-1*"
        "buffer.c" "*Help*" "TAGS")

buffer-listからリターンされるリストは、それ専用に構築されたリストであり、Emacsの内部的なデータ構造ではないし、それを変更してもバッファーの並び順に影響はありません。基本バッファーリスト内のバッファーの並び順を変更したい場合に簡単なのは、以下の方法です:

(defun reorder-buffer-list (new-list)
  (while new-list
    (bury-buffer (car new-list))
    (setq new-list (cdr new-list))))

この方法により、バッファーを失ったり、有効な生きたバッファー以外の何かを追加する危険を犯さずに、リストに任意の並び順を指定できます。

特定のフレームのバッファーリストの並び順や値を変更するには、modify-frame-parametersでそのフレームのbuffer-listパラメーターをセットしてください(Access to Frame Parametersを参照)。

Function: other-buffer &optional buffer visible-ok frame

この関数は、バッファーリスト中でbuffer以外の最初のバッファーをリターンする。これは通常選択されたウィンドウ(フレームframe、または選択されたフレーム。Input Focusを参照)に、もっとも最近表示された、buffer以外のバッファーである。名前がスペースで始まるバッファーは、考慮されない。

bufferが与えられない(または生きたバッファーでない)場合、other-bufferは選択されたフレームのローカルバッファーリスト内の、最初のバッファーをリターンする(frameが非nilの場合は、frameのローカルバッファーリスト内の最初のバッファーをリターンする)。

frameが非nilbuffer-predicateパラメーターをもつ場合は、どのバッファーを考慮すべきかを決定するために、other-bufferはその述語を使用する。これはそれぞれのバッファーごとにその述語を一度呼び出して、値がnilならそのバッファーは無視される。Buffer Parametersを参照のこと。

visible-oknilならば、other-bufferはやむを得ない場合を除き、任意の可視のフレーム上のウィンドウ内で可視のバッファーをリターンすることを避ける。visible-okが非nilの場合は、バッファーがどこかで表示されているかどうかは問題にしない。

適切なバッファーが存在しない場合は、バッファー*scratch*を(必要なら作成して)リターンする。

Function: last-buffer &optional buffer visible-ok frame

この関数は、frameのバッファーリスト内から、buffer以外の最後のバッファーをリターンする。frameが省略、またはnilの場合は、選択されたフレームのバッファーリストを使用する。

引数visible-okは、上述したother-bufferと同様に扱われる。適切なバッファーを見つけられない場合は、バッファー*scratch*がリターンされる。

Command: bury-buffer &optional buffer-or-name

このコマンドは、バッファーリスト内の他のバッファーの並び順を変更することなく、buffer-or-nameをバッファーリストの最後に置く。つまり、このバッファーはother-bufferがリターンする候補で、もっとも期待度が低くなる。引数はバッファー自身か、バッファーの名前を指定できる。

この関数は、基本バッファーリストと同様に、それぞれのフレームのbuffer-listパラメーターを操作する。したがってバリー(bury: 埋める、隠す)したバッファーは、(buffer-list frame)および(buffer-list)の値の最後に置かれるだろう。さらに、そのバッファーが選択されたウィンドウに表示されていれば、そのウィンドウのバッファーリストの最後にバッファーを置くことも行う(Window Historyを参照)。

buffer-or-namenil、または省略された場合は、カレントバッファーをバリーすることを意味する。加えて、カレントバッファーが選択されたウィンドウに表示されている場合は、そのウィンドウを削除するか、他のバッファーを表示する。より正確には、選択されたウィンドウが専用(dedicated)のウィンドウ(see section Dedicated Windows)であり、かつそのフレーム上に他のウィンドウが存在する場合、専用ウィンドウは削除される。それがフレーム上で唯一のウィンドウであり、かつそのフレームが端末上で唯一のフレームでない場合、そのフレームはframe-auto-hide-functionで指定される関数を呼び出すことにより、“開放”される(Quitting Windowsを参照)。それ以外の場合は、他のバッファーをそのウィンドウ内に表示するために、switch-to-prev-bufferを呼び出す(Window Historyを参照)。buffer-or-nameが他のウィンドウで表示されていた場合は、そのまま表示され続ける。

あるバッファーにたいして、それを表示するすべてのウィンドウでバッファーを置き換えるには、replace-buffer-in-windowsを使用する。Buffers and Windowsを参照のこと。

Command: unbury-buffer

このコマンドは、選択されたフレームのローカルバッファーリストの最後のバッファーに切り替える。より正確には、選択されたウィンドウ内で、last-buffer(上記参照)がリターンするバッファーを表示するために、関数switch-to-bufferを呼び出す(Switching to a Buffer in a Windowを参照)。

Variable: buffer-list-update-hook

これは、バッファーリストが変更されたときは、常に実行されるノーマルフックである。(暗黙的に)このフックを実行する関数はget-buffer-create(Creating Buffersを参照)、rename-buffer(Buffer Namesを参照)、kill-buffer(Killing Buffersを参照)、bury-buffer(上記参照)、select-window(Selecting Windowsを参照)である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.9 Creating Buffers

このセクションでは、バッファーを作成する2つのプリミティブについて説明します。get-buffer-createは、指定された名前の既存バッファーが見つからない場合は作成します。generate-new-bufferは、常に新たにバッファーを作成して、それに一意な名前を与えます。

バッファーを作成するために使用できる他の関数には、with-output-to-temp-buffer(Temporary Displaysを参照)、およびcreate-file-buffer(Visiting Filesを参照)が含まれます。サブプロセスの開始によっても、バッファーを作成することができます(Processesを参照)。

Function: get-buffer-create buffer-or-name

この関数は、buffer-or-nameという名前のバッファーをリターンする。リターンされたバッファーはカレントにならない — この関数はカレントがどのバッファーであるかを変更しない。

buffer-or-nameは文字列、または既存バッファーのいずれかでなければならない。これが文字列で、かつ既存の生きたバッファーの名前の場合、get-buffer-createはそのバッファーをリターンする。そのようなバッファーが存在しなければ、新たにバッファーを作成する。buffer-or-nameが文字列ではなくバッファーの場合、たとえそのバッファーが生きていなくても、与えられたバッファーをリターンする。

(get-buffer-create "foo")
     ⇒ #<buffer foo>

新たに作成されたバッファーにたいするメジャーモードは、Fundamentalモードにセットされる(変数major-modeのデフォルト値は、より高いレベルで処理される。How Emacs Chooses a Major Modeを参照されたい)。名前がスペースで始まる場合、そのバッファーのアンドゥ情報の記録は、初期状態では無効である(Undoを参照)。

Function: generate-new-buffer name

この関数は、新たに空のバッファーを作成してリターンするが、それをカレントにはしない。バッファーの名前は、関数generate-new-buffer-namenameを渡すことにより生成される(Buffer Namesを参照)。つまり、nameという名前のバッファーが存在しなければ、それが新たなバッファーの名前になり、その名前が使用されていた場合は、‘<n>’という形式のサフィックスがnameに追加される。ここでnは整数である。

nameが文字列でない場合は、エラーがシグナルされる。

(generate-new-buffer "bar")
     ⇒ #<buffer bar>
(generate-new-buffer "bar")
     ⇒ #<buffer bar<2>>
(generate-new-buffer "bar")
     ⇒ #<buffer bar<3>>

新たなバッファーにたいするメジャーモードは、Fundamentalモードにセットされる。変数major-modeのデフォルト値は、より高いレベルで処理される。How Emacs Chooses a Major Modeを参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.10 Killing Buffers

バッファーのkillにより、 そのバッファーの名前はEmacsにとって未知の名前となり、そのバッファーが占めていたメモリースペースは、他の用途に使用できるようになります。

バッファーに対応するバッファーオブジェクトは、それを参照するものがあればkillされても存在し続けますが、それをカレントにしたり表示することができないよう、特別にマークされます。とはいえ、killされたバッファーの同一性は保たれるので、2つの識別可能なバッファーをkillした場合、たとえ両方死んだバッファーであっても、eqによる同一性は残ります。

あるウィンドウ内においてカレント、あるいは表示されているバッファーをkillした場合、Emacsはかわりに他の何らかのバッファーを自動的に選択、または表示します。これは、バッファーのkillにより、カレントバッファーが変更されることを意味します。したがって、バッファーをkillする際は、(killされるバッファーがカレントを偶然知っていた場合を除き)カレントバッファーの変更に関しても、事前に注意を払うべきです。The Current Bufferを参照してください。

1つ以上のインダイレクト バッファー(Indirect Buffersを参照) のベースとなるバッファーをkillした場合は、インダイレクトバッファーも同様に自動的にkillされます。

バッファーのbuffer-namenilの場合のみ、バッファーはkillされる。killされていないバッファーは生きた(live)バッファーと呼ばれる。あるバッファーにたいして、そのバッファーが生きているか、またはkillされているかを確認するには、buffer-live-pを使用する(下記参照)。

Command: kill-buffer &optional buffer-or-name

この関数は、バッファーbuffer-or-nameをkillして、そのバッファーのメモリーを他の用途のために開放、またはオペレーティングシステムに返却する。buffer-or-namenil、または省略された場合は、カレントバッファーをkillする。

そのバッファーをprocess-bufferとして所有するすべてのプロセスには、通常はプロセスを終了させるシグナルSIGHUP(“hangup”)が送信される。Sending Signals to Processesを参照のこと。

バッファーがファイルをvisitしていて、かつ保存されていない変更が含まれる場合、kill-bufferはバッファーをkillする前に、ユーザーにたいして確認を求める。これは、kill-bufferがinteractiveに呼び出されていなくても、行われる。この確認要求を抑制するには、kill-bufferの呼び出し前に、変更フラグ(modified flag)をクリアーすればよい。Buffer Modificationを参照のこと。

killされるバッファーをカレントで表示しているすべてのバッファーをクリーンアップするために、この関数はreplace-buffer-in-windowsを呼び出す。

すでに死んでいるバッファーをkillしても、効果はない。

この関数は、実際にバッファーをkillした場合は、tをリターンする。ユーザーが確認で拒否を選択、またはbuffer-or-nameがすでに死んでいる場合は、nilをリターンする。

(kill-buffer "foo.unchanged")
     ⇒ t
(kill-buffer "foo.changed")

---------- Buffer: Minibuffer ----------
Buffer foo.changed modified; kill anyway? (yes or no) yes
---------- Buffer: Minibuffer ----------

     ⇒ t
Variable: kill-buffer-query-functions

保存されていない変更について確認を求める前に、kill-bufferはリストkill-buffer-query-functions内の関数を、出現順に引数なしで呼び出す。 Before confirming unsaved changes, calls the functions in the list , in order of appearance, with no arguments. それらが呼び出される際には、killされるバッファーがカレントになる。この機能は、これらの関数がユーザーに確認を求めるというアイデアが元となっている。これらの関数のいずれかがnilをリターンした場合、kill-bufferはそのバッファーの命を奪わない。

Variable: kill-buffer-hook

これは、尋ねることになっている質問をすべて終えた後、実際にバッファーをkillする直前に、kill-bufferにより実行されるノーマルフックである。この変数は永続的にローカルであり、メジャーモードの変更により、そのローカルバインディングはクリアーされない。

User Option: buffer-offer-save

特定のバッファーにおいてこの変数が非nilの場合、save-buffers-kill-emacsおよびsave-some-buffers(この関数の2つ目のオプション引数がtの場合)は、ファイルをvisitしているバッファーと同じように、そのバッファーの保存を提案する。Definition of save-some-buffersを参照のこと。何らかの理由により変数buffer-offer-saveをセットする際は、自動的にバッファーローカルになる。Buffer-Local Variablesを参照のこと。

Variable: buffer-save-without-query

特定のバッファーにおいてこの変数が非nilの場合、save-buffers-kill-emacsおよびsave-some-buffersは、(バッファーが変更されていれば)ユーザーに確認を求めることなく、そのバッファーを保存する。何らかの理由によりこの変数をセットする際は、自動的にバッファーローカルになる。

Function: buffer-live-p object

この関数は、objectが生きたバッファー(killされていないバッファー)ならt、それ以外はnilをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.11 Indirect Buffers

インダイレクトバッファー(indirect buffer: 間接バッファー)とは、ベースバッファー(base buffer)と呼ばれる他のバッファーとテキストを共有します。いくつかの点において、インダイレクトバッファーはファイル間でのシンボリックリンクに類似しています。ベースバッファー自身は、インダイレクトバッファーでない可能性があります。

インダイレクトバッファーのテキストは、常にベースバッファーのテキストと同一です。編集により一方が変更されると、それは即座に他方のバッファーから可視になります。これには文字自体に加えて、テキストプロパティも同様に含まれます。

他のすべての観点において、インダイレクトバッファーとそのベースバッファーは、完全に別物です。それらは別の名前、独自のポイント値、ナローイング、マーカー、オーバーレイ、メジャーモード、バッファーローカルな変数バインディングをもちます(ただし、どちらかのバッファーでのテキストの挿入や削除を行うと、両方のバッファーでマーカーとオーバーレイの再配置が行われる)。

インダイレクトバッファーはファイルをvisitできませんが、ベースバッファーは可能です。インダイレクトバッファーの保存を試みた場合、実際にはベースバッファーが保存されます。

インダイレクトバッファーをkillしても、ベースバッファーに影響はありません。ベースバッファーをkillすると、インダイレクトバッファーはkillされて、再びカレントバッファーになることはできません。

Command: make-indirect-buffer base-buffer name &optional clone

これは、ベースバッファーがbase-bufferであるような、nameという名前のインダイレクトバッファーを作成してリターンする。引数base-bufferは生きたバッファー、または既存バッファーの名前(文字列)を指定できる。nameが既存バッファーの名前の場合は、エラーがシグナルされる。

cloneが非nilの場合、インダイレクトバッファーは最初はbase-bufferのメジャーモード、マイナーモード、バッファーローカル変数等の“状態”を共有する。cloneが省略、またはnilの場合、インダイレクトバッファーの情報は、新たなバッファーにたいするデフォルト状態にセットされる。

base-bufferがインダイレクトバッファーの場合は、新たなバッファーのベースとして、それのベースバッファーが使用される。さらに、cloneが非nilならば、初期状態はbase-bufferではなく、実際のベースバッファーからコピーされる。

Command: clone-indirect-buffer newname display-flag &optional norecord

この関数は、カレントバッファーのベースバッファーを共有するインダイレクトバッファーを新たに作成し、カレントバッファーの残りの属性をコピーしてリターンする(カレントバッファーがインダイレクトバッファーでない場合は、それがベースバッファーとして使用される)。

display-flagが非nilの場合、それはpop-to-bufferを呼び出すことにより新しいバッファーを表示することを意味する。norecordが非nilの場合、それは新しいバッファーをバッファーリストの先頭に置かないことを意味する。

Function: buffer-base-buffer &optional buffer

この関数は、buffer(デフォルトはカレントバッファー)のベースバッファーをリターンする。bufferがインダイレクトバッファーでない場合、値はnilになり、それ以外では値は他のバッファーとなり、このバッファーがインダイレクトバッファーではあり得ない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.12 Swapping Text Between Two Buffers

特別なモードでは、ユーザーが同一のバッファーから複数の非常に異なったテキストにアクセスできるようにしなければならない場合があります。たとえば、バッファーのテキストのサマリーを表示して、ユーザーがそのテキストにアクセスできるようにする場合です。

これは、(ユーザーがテキストを編集した際には同期を保つ)複数バッファーや、ナローイング(Narrowingを参照)により実装することができるかもしれません。しかし、これらの候補案はときに退屈になりがちであり、特にそれぞれのテキストタイプが正しい表示と編集コマンドを提供するために高価なバッファーグローバル操作を要求する場合には、飛び抜けて高価になる場合があります。

Emacsは、そのようなモードにたいする、別の機能を提供します。buffer-swap-textを使用すれば、2つのバッファー間でバッファーテキストを素早く交換することができます。この関数は、テキストの移動は行わず、異なるテキスト塊(text chunk)をポイントするように、バッファーオブジェクトの内部的なデータ構造だけを変更するので、非常に高速です。これを使用することにより、2つ以上のバッファーグループから、個々のバッファーのコンテンツすべてを併せもつような、単一の仮想バッファー(virtual buffer)が実在するように、見せかけることができます。

Function: buffer-swap-text buffer

この関数は、カレントバッファーのテキストと、引数bufferのテキストを交換する。2つのバッファーのいずれか一方がインダイレクトバッファー(Indirect Buffersを参照)、またはインダイレクトバッファーのベースバッファーの場合は、エラーをシグナルする。

バッファーテキストに関連するすべてのバッファープロパティ、つまりポイントとマークの位置、すべてのマーカーとオーバーレイ、テキストプロパティ、アンドゥリスト、enable-multibyte-charactersフラグの値(enable-multibyte-charactersを参照)等も、同じように交換される。

ファイルをvisitしているバッファーにbuffer-swap-textを使用した場合は、交換されたテキストではなく、そのバッファーの元のテキストを保存するようにフックをセットアップするべきです。write-region-annotate-functionsは、正にこの目的のために機能します。そのバッファーのbuffer-saved-sizeを、おそらく交換されたテキストにたいする変更が自動保存に干渉しないであろう、-2にセットするべきでしょう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

26.13 The Buffer Gap

Emacsのバッファーは、挿入と削除を高速にするために、不可視のギャップ(gap)を使用して実装されています。挿入はギャップ部分を充填し、削除はギャップを追加することにより機能します。もちろん、これは最初にギャップを挿入もしくは削除の部位(locus)に移動しなければならないことを意味します。Emacsは、ユーザーが挿入、または削除を試みたときだけ、ギャップを移動します。大きなバッファー内の遠く離れた位置で編集した後、他の箇所での最初の編集コマンドに無視できない遅延が発生する場合があるのは、これが理由です。

このメカニズムは暗に機能するものであり、Lispコードはギャップのカレント位置に影響されるべきでは決してありませんが、以下の関数はギャップ状態に関する情報の取得に利用できます。

Function: gap-position

この関数は、カレントバッファー内のギャップのカレント位置をリターンする。

Function: gap-size

この関数は、カレントバッファー内のギャップのサイズをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27 Windows

このチャプターでは、Emacsのウィンドウに関連する関数と変数について説明します。Emacsが利用可能なスクリーン領域にウィンドウが割り当てられる方法については、Framesを参照してください。ウィンドウ内にテキストが表示される方法についての情報は、Emacs Displayを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.1 Basic Concepts of Emacs Windows

ウィンドウ(window)とは、任意のバッファーを表示するために使用される、スクリーンの領域です。Emacs Lispでは、ウィンドウはスペシャルLispオブジェクトとして表現されます。

ウィンドウは、フレームへとグループ化されます(Framesを参照)。それぞれのフレームは、最低でも1つのウィンドウを含みます。ユーザーは、複数のバッファーを1度に閲覧するために、それを複数のオーバーラップしないウィンドウに分割することができます。Lispプログラムは、さまざまな目的にたいして、複数のウィンドウを使用できます。たとえばRmailでは、1つのウィンドウでメッセージタイトル、もう一方のウィンドウで選択したメッセージのコンテンツを閲覧できます。

Emacsは、グラフィカルなデスクトップ環境や、X Window Systemのようなウィンドウシステムとは異なる意味で、“ウィンドウ(window)”という単語を使用します。EmacsがX上で実行されているときは、XのグラフィカルなXウィンドウは、Emacsでの(1つ以上のEmacsウィンドウを含んだ)フレームになります。Emacsがテキスト端末上で実行されているときは、フレームが端末スクリーン全体を占有します。

Xのウィンドウとは異なり、Emacsのウィンドウはタイル表示(tiled)され、フレームの領域内でオーバーラップされることは決してありません。あるウィンドウが作成、リサイズ、削除されるとき、変更されたウィンドウスペースの変更は各ウィンドウの調整により取得・譲与されるので、そのフレームの総領域に変化はありません。

Function: windowp object

この関数は、objectがウィンドウ(バッファーの表示有無に関わらず)ならt、それ以外はnilをリターンする。

生きたウィンドウ(live window)とは、あるフレーム内で実際にバッファーを表示しているウィンドウのことです。

Function: window-live-p object

この関数は、objectが生きたウィンドウならt、それ以外はnilをリターンする。生きたウィンドウとは、バッファーを表示するウィンドウのこと。

各フレーム内のウィンドウは、ウィンドウツリー(window tree)内へと組織化されます。Windows and Framesを参照してください。それぞれのウィンドウツリーのリーフノード(leaf nodes)は、実際にバッファーを表示している生きたウィンドウです。ウィンドウツリーの内部ノード(internal node)は内部ウィンドウ(internal windows)と呼ばれ、これらは生きたウィンドウではありません。

有効なウィンドウ(valid window)とは、生きたウィンドウか、内部ウィンドウのいずれかです。有効なウィンドウにたいしては、それを削除(delete)、すなわちそのウィンドウのフレームから削除することができます(Deleting Windowsを参照)。その場合、それは有効なウィンドウではなくなりますが、それを表すLispオブジェクトは依然として他のLispオブジェクトから参照されたままかもしれません。削除されたウィンドウは、保存されたウィンドウ設定(window configuration)をリストアすることにより、再び有効になるかもしれません(Window Configurationsを参照)。

window-valid-pにより、削除されたウィンドウから有効なウィンドウを区別できます。

Function: window-valid-p object

この関数は、objectが生きたウィンドウ、またはウィンドウツリー内の内部ウィンドウの場合は、tをリターンする。それ以外(objectが削除されたウィンドウの場合も含む)は、nilをリターンする。

それぞれのフレーム内において、常にただ1つのEmacsウィンドウがそのフレームで選択されている(selected within the frame)もとして指定されます。選択されたフレームにたいしては、そのウィンドウは選択されたウィンドウ(selected window)と呼ばれます。選択されたウィンドウは、編集のほとんどが行われるウィンドウであり、選択されたウィンドウに表示されるカーソルがあるウィンドウです(Cursor Parametersを参照)。選択されたウィンドウのバッファーは通常は、set-bufferが使用された場合を除き、カレントバッファーでもあります(The Current Bufferを参照)。選択されていないフレームでは、そのフレームが選択されたときは、そのフレームで選択されていたウィンドウが選択されたウィンドウになります。Selecting Windowsを参照してください。

Function: selected-window

この関数は、選択されたウィンドウをリターンする(これは常に生きたウィンドウである)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.2 Windows and Frames

ウィンドウはそれぞれ、正確に1つのフレームに属します(Framesを参照)。

Function: window-frame &optional window

この関数は、ウィンドウwindowが属するフレームをリターンする。windownilの場合のデフォルトは、選択されたウィンドウである。

Function: window-list &optional frame minibuffer window

この関数は、フレームframeに属する、生きたウィンドウのリストをリターンする。frameが省略、またはnilの場合のデフォルトは、選択されたフレームである。

オプション引数minibufferは、リターンされるリストにミニバッファーウィンドウを含めるべきかどうかを指定する。minibuffertの場合は、ミニバッファーウィンドウが含まれる。minibuffernil、または省略された場合は、ミニバッファーウィンドウがアクティブのときだけ含まれる。minibuffernilt以外の場合、ミニバッファーウィンドウは含まれない。

オプション引数windowが非nilの場合、それは指定されたフレーム上の生きたウィンドウであること。その場合は、windowがリターンされるリストの最初の要素になる。windowが省略、またはnilの場合は、そのフレームの選択されたウィンドウが最初の要素になる。

同一フレーム内のウィンドウは、リーフノード(leaf nodes)が生きたウィンドウであるような、ウィンドウツリー(window tree)内に組織化されます。ウィンドウツリーの内部ノード(internal nodes)は生きたウィンドウではありません。これらのウィンドウは、生きたウィンドウ間の関係を組織化するという目的のために存在します。ウィンドウツリーのルートノード(root node)は、ルートウィンドウ(root window)と呼ばれます。ルートノードは生きたウィンドウ(そのフレームにウィンドウが1つだけの場合)、または内部ウィンドウのいずれかです。

ミニバッファーウィンドウ(Minibuffer Windowsを参照)は、そのフレームがミニバッファーだけのフレームでない限り、そのフレームのウィンドウツリーの一部にはなりません。にもかかわらず、このセクションのほとんどの関数は、引数としてミニバッファーウィンドウを受け付けます。さらにこのセクションの最後に説明する関数window-treeは、実際のウィンドウツリーと並列してミニバッファーウィンドウをリストします。

Function: frame-root-window &optional frame-or-window

この関数は、frame-or-windowにたいするルートウィンドウをリターンする。引数frame-or-windowは、ウィンドウかフレームのいずれかであること。これが省略、またはnilの場合のデフォルトは、選択されたフレームである。frame-or-windowがウィンドウの場合、リターン値はそのウィンドウのフレームのルートウィンドウである。

ウィンドウが分割(split)されているときは、以前は1つだった2つの生きたウィンドウが存在します。これらのうちの一方は、元のウィンドウと同じLispウィンドウオブジェクトとして表され、もう一方は新たに作成されたLispウィンドウオブジェクトとして表されます。これらの生きたウィンドウは両方とも、単一の内部ウィンドウの子ウィンドウ(child windows)として、ウィンドウツリーのリーフノードになります。もし必要なら、Emacsはこの内部ウィンドウを自動的に作成します。この内部ウィンドウは親ウィンドウ(parent window)とも呼ばれ、ウィンドウツリー内の適切な位置に配置されます。同じ親を共有するウィンドウセットは、兄弟(sibling)と呼ばれます。

Function: window-parent &optional window

この関数は、windowの親ウィンドウ(parent window)をリターンする。windowが省略、またはnilの場合のデフォルトは、選択されたウィンドウである。windowが親をもたない(ミニバッファーウィンドウやそのフレームのルートウィンドウ)場合、リターン値はnilである。

内部ウィンドウはそれぞれ、常に最低でも2つの子ウィンドウをもちます。ウィンドウ削除によりこの数値が1になった場合、Emacsは自動的に内部ウィンドウを削除して、その残った単一の子ウィンドウがウィンドウツリー内のその位置に配置されます。

子ウィンドウはそれぞれ生きたウィンドウ、または(次に自身の子ウィンドウをもつであろう)内部ウィンドウのいずれかです。したがって、各内部ウィンドウは、最終的にはその内部ウィンドウの子孫であるような生きたウィンドウにより占有される領域を結合した、特定の矩形スクリーン領域(screen area)を占有すると考えることができます。

内部ウィンドウそれぞれにたいして、近接する子たちのスクリーン領域は、垂直(vertically)または水平(horizontally)のいずれかにより整列されます(両方で整列されることはない)。子ウィンドウが他の子ウィンドウと上下に整列される場合、それらは垂直コンビネーション(vertical combination)、左右に整列される場合は水平コンビネーション(horizontal combination)を形成すると表現されます。以下の例で考えてみましょう:

     ______________________________________
    | ______  ____________________________ |
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W4____________|||
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W5____________|||
    ||__W2__||_____________W3_____________ |
    |__________________W1__________________|

このフレームのルートウィンドウは、内部ウィンドウW1です。これの子ウィンドウは、生きたウィンドウW2と内部ウィンドウW3からなる水平コンビネーションを形成します。W3の子ウィンドウは、生きたウィンドウW4W5からなる垂直コンビネーションを形成します。したがって、このウィンドウツリー内の生きたウィンドウはW2W4、およびW5です。

以下の関数は、内部ウィンドウの子ウィンドウ、および子ウィンドウの兄弟を取得するのに使用できます。

Function: window-top-child &optional window

この関数は、内部ウィンドウwindowの子ウィンドウが垂直コンビネーションを形成する場合は、windowの一番上の子ウィンドウをリターンする。他のタイプのウィンドウにたいするリターン値はnilである。

Function: window-left-child &optional window

この関数は、内部ウィンドウwindowの子ウィンドウが水平コンビネーションを形成する場合は、windowの一番左の子ウィンドウをリターンする。他のタイプのウィンドウにたいするリターン値はnilである。

Function: window-child window

この関数は、内部ウィンドウwindowの最初の子ウィンドウをリターンする。これは、垂直コンビネーションにたいしては一番上、水平コンビネーションにたいしては一番左の子ウィンドウである。windowが生きたウィンドウの場合、リターン値はnilである。

Function: window-combined-p &optional window horizontal

この関数は、windowが垂直コンビネーションの一部である場合のみ、非nilをリターンする。windowが省略、またはnilの場合のデフォルトは、選択されたウィンドウである。

オプション引数horizontalが非nilならば、windowが水平コンビネーションの一部である場合のみ非nilをリターンすることを意味する。

Function: window-next-sibling &optional window

この関数は、ウィンドウwindowの次の兄弟をリターンする。省略またはnilの場合、windowのデフォルトは選択されたウィンドウになる。windowが、その親の最後の子の場合、リターン値はnilである。

Function: window-prev-sibling &optional window

この関数は、ウィンドウwindowの前の兄弟をリターンする。省略またはnilの場合、windowのデフォルトは選択されたウィンドウになる。windowが、その親の最初の子の場合、リターン値はnilである。

関数window-next-siblingおよびwindow-prev-siblingを、ウィンドウのサイクル順(Cyclic Ordering of Windowsを参照)において次、または前のウィンドウをリターンする関数next-windowおよびprevious-windowと混同しないでください。

任意のフレーム上の最初の生きたウィンドウや、与えられたウィンドウにもっとも近いウィンドウを探すために、以下の関数を使用できます。

Function: frame-first-window &optional frame-or-window

この関数は、frame-or-windowにより指定されたフレームの、左上隅の生きたウィンドウをリターンする。引数frame-or-windowでは、ウィンドウか生きたフレームを示さなければならず、デフォルトは選択されたフレームである。frame-or-windowがウィンドウを指定する場合、この関数はそのウィンドウのフレームの最初のウィンドウをリターンする。前の例のフレームが(frame-first-window)に指定されたとするならば、W2がリターンされる。

Function: window-in-direction direction &optional window ignore sign wrap mini

この関数は、ウィンドウwindow内の位置window-pointから、方向directionにあるもっとも近い生きたウィンドウをリターンする。引数directionabovebelowleftrightのいずれかでなければならない。オプション引数windowは生きたウィンドウを示さなければならず、デフォルトは選択されたウィンドウである。

この関数は、パラメーターno-other-windowが非nilのウィンドウをリターンしない(Window Parametersを参照)。もっとも近いウィンドウのno-other-windowパラメーターが非nilの場合、この関数は指定された方向でno-other-windowパラメーターがnilの、他のウィンドウを探す。オプション引数ignoreが非nilの場合は、たとえno-other-windowパラメーターが非nilのウィンドウでも、リターンされ得る。

オプション引数signが負の数値の場合、それは参照位置としてwindow-pointのかわりに、windowの右端、または下端を使用することを意味する。signが正の数値の場合、それは参照位置としてwindowの左端、または上端を使用することを意味する。

オプション引数wrapが非nilの場合、それはフレームのボーダー(borders: 枠線)をdirectionがラップアラウンド(wrap around: 最後に達したら最初に戻る)することを意味する。たとえば、windowはフレームの最上にあり、directionaboveの場合、フレームにミニバッファーがあればミニバッファーウィンドウ、それ以外はフレーム最下のウィンドウウィンドウリターンする。

オプション引数mininilの場合、それはミニバッファーがカレントでアクティブな場合のみ、ミニバッファーウィンドウをリターンすることを意味する。miniが非nilならば、たとえ非アクティブなときでもミニバッファーウィンドウをリターンする。しかし、wrapが非nilの場合は、常にmininilであるかのように動作する。

適切なウィンドウが見つからない場合、この関数はnilをリターンする。

以下の関数により、任意のフレームのウィンドウツリー全体を取得できます:

Function: window-tree &optional frame

この関数は、フレームframeにたいするウィンドウツリーを表すリストをリターンする。frameが省略、またはnilの場合のデフォルトは、選択されたフレームである。

リターン値は、(root mini)という形式のリストである。ここでrootはそのフレームのウィンドウツリーのルートウィンドウ、miniはそのフレームのミニバッファーウィンドウを表す。

ルートウィンドウが生きている場合、rootはそのウィンドウ自身である。それ以外では、rootはリスト(dir edges w1 w2 ...)である。ここでdirは水平コンビネーションならnil、垂直コンビネーションならtとなり、edgesはそのコンビネーションのサイズと位置を与え、残りの要素は子ウィンドウである。子ウィンドウはそれぞれ、同じようにウィンドウオブジェクト(生きたウィンドウにたいして)、または上記フォーマットと同じ形式のリスト(内部ウィンドウにたいして)かもしれない。edges要素はwindow-edgesがリターンする値のような、リスト(left top right bottom)である(Coordinates and Windowsを参照)。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.3 Window Sizes

以下の図は、生きたウィンドウの構造を示しています:

        ____________________________________________
       |______________ Header Line ______________|RD| ^
     ^ |LS|LF|LM|                       |RM|RF|RS|  | |
     | |  |  |  |                       |  |  |  |  | |
Window |  |  |  |       Text Area       |  |  |  |  | Window
Body | |  |  |  |     (Window Body)     |  |  |  |  | Total
Height |  |  |  |                       |  |  |  |  | Height
     | |  |  |  |<- Window Body Width ->|  |  |  |  | |
     v |__|__|__|_______________________|__|__|__|  | |
       |_______________ Mode Line _______________|__| |
       |_____________ Bottom Divider _______________| v
        <---------- Window Total Width ------------>

ウィンドウの中央はテキストエリア(text area: テキスト領域)、またはボディー(body: 本体、本文)と呼ばれる、バッファーテキストが表示される場所です。テキストエリアは、一連のオプションエリアで囲まれている可能性があります。左右には、内側から外側に向かって、図中にLMとRMで示される左右のマージン(Displaying in the Marginsを参照)、LFとRFで示される左右のフリンジ(Fringesを参照)、そしてLSとRSはスクロールバー(Scroll Barsを参照)で、常に表示されるのはいずれか一方だけです。そしてRDはディバイダー(Window Dividersを参照)を示しています。ウィンドウの上端はヘッダーライン(Window Header Linesを参照)、下端にはモードライン(Mode Line Formatを参照)と、その下に下端ディバイダー(Window Dividersを参照)があります。

Emacsは、ウィンドウの高さと幅を求めるために、さまざまな関数を提供します。これらの関数がリターンする値の多くは、ピクセル単位か、行単位と列単位のいずれかにより指定できます。グラフィカルなディスプレイでは、後者は実際にはframe-char-heightおよびframe-char-widthによりリターンされる、そのフレームのデフォルトフォントが指定する、“デフォルト文字”の高さと幅に対応します。したがって、あるウィンドウが異なるフォントやサイズでテキストを表示していると、そのウィンドウにたいして報告される行高さと列幅は、実際にウィンドウ内で表示されるテキスト行数と列数とは、異なるかもしれません。

ウィンドウのトータル高さ(total height)とは、そのウィンドウのボディー、ヘッダーライン、モードライン、(もしあれば)下端ディバイダーを構成する行数のことです。フレームにはエコーエリア、メニューバー、ツールバーが含まれるかもしれないので、フレームの高さはそのフレームのルートウィンドウ(Windows and Framesを参照)の高さとは異なることに注意してください(Frame Size And Positionを参照)。

Function: window-total-height &optional window round

この関数は、ウィンドウwindowのトータル高さを、行でリターンする。windowが省略、またはnilの場合のデフォルトは、選択されたウィンドウである。windowが内部ウィンドウの場合、リターン値はそのウィンドウの子孫となるウィンドウにより占有されるトータル高さになる。

ウィンドウのピクセル高さが、そのウィンドウがあるフレームのデフォルト文字高さの整数倍でない場合は、そのウィンドウが占有する行数が内部で丸められる。これは、そのウィンドウが親ウィンドウの場合は、すべての子ウィンドウのトータル高さの合計が、親ウィンドウのトータル高さと内部的に等しくなるような方法により行われる。これは、たとえ2つのウィンドウのピクセル高さが等しくでも、内部的なトータル高さは1行分異なるかもしれないことを意味する。さらにこれは、そのウィンドウが垂直コンビネーションされていて、かつ右の兄弟をもつ場合、その兄弟の上端行は、このウィンドウの上端行とトータル高さから計算されるかもしれないことも意味する(Coordinates and Windowsを参照)。

オプション引数roundceilingの場合、この関数はwindowのピクセル高さを、そのフレームの文字高さで除した数より大であるような最小の整数、floorの場合は除した数より小であるような最大の整数、それ以外のroundにたいしては、windowsのトータル高さの内部値をリターンする。

トータル幅(total width)とは、そのウィンドウのボディーを構成する列数、マージン、フリンジ、スクロールバー、(もしあれば)右ディバイダーです。

Function: window-total-width &optional window round

この関数は、ウィンドウwindowのトータル幅を列でリターンする。windowが省略、またはnilの場合のデフォルトは、選択されたウィンドウである。windowが内部ウィンドウの場合、リターン値はその子孫のウィンドウが占有するトータル幅になる。

ウィンドウのピクセル幅が、そのウィンドウがあるフレームのデフォルト文字幅の整数倍でない場合は、そのウィンドウが占有する列数が内部で丸められる。これは、そのウィンドウが親ウィンドウの場合は、すべての子ウィンドウのトータル幅の合計が、親ウィンドウのトータル幅と内部的に等しくなるような方法により行われる。これは、たとえ2つのウィンドウのピクセル幅が等しくでも、内部的なトータル幅は1列分異なるかもしれないことを意味する。さらにこれは、そのウィンドウが水平コンビネーションされていて、かつ右の兄弟をもつ場合、その兄弟の左端行は、このウィンドウの左端行とトータル幅から計算されるかもしれないことも意味する(Coordinates and Windowsを参照)。オプション引数roundは、window-total-heightの場合と同様に振る舞う。

Function: window-total-size &optional window horizontal round

この関数は、ウィンドウwindowのトータル高さを行で、またはトータル幅を列でリターンする。horizontalが省略、またはnilの場合はwindowにたいしてwindow-total-heightを呼び出すのと等価であり、それ以外ではwindowにたいしてwindow-total-widthを呼び出すのと等価である。オプション引数roundは、window-total-heightの場合と同様に振る舞う。

以下の2つの関数は、ウィンドウのトータルサイズをピクセル単位でリターンさせるために使用できます。

Function: window-pixel-height &optional window

この関数は、ウィンドウwindowのトータル高さを、ピクセルでリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウである。

リターン値には、(もしあれば)モードライン、ヘッダーライン、下端ディバイダーが含まれる。windowが内部ウィンドウの場合、そのピクセル高さは子ウィンドウたちによりスパンされるスクリーン領域のピクセル高さになる。

Function: window-pixel-width &optional Lisp_Object &optional window

この関数は、ウィンドウwindowの幅をピクセルでリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウである。

リターン値には、フリンジ、windowのマージン、同様にwindowに属する垂直ディバイダーとスクロールバーが含まれる。windowが内部ウィンドウの場合、そのピクセル幅は子ウィンドウたちによりスパンされるスクリーン領域の幅になる。

以下の関数は、与えられたウィンドウに隣接するウィンドウがあるかどうかを判断するために使用できます。

Function: window-full-height-p &optional window

この関数は、フレーム内でwindowの上下に他のウィンドウがなければ非nilをリターンする(トータル高さがそのフレーム上のルートウィンドウと等しい)。windowが省略、またはnilの場合のデフォルトは、選択されたウィンドウである。

Function: window-full-width-p &optional window

この関数は、フレーム内でwindowの左右に他のウィンドウがなければ非nilをリターンする(トータル幅がそのフレーム上のルートウィンドウと等しい)。windowが省略、またはnilの場合のデフォルトは、選択されたウィンドウである。

ウィンドウのボディー高さ(body height)とは、モードライン、ヘッダーライン、下端ディバイダーを含まないテキスト領域の高さです。

Function: window-body-height &optional window pixelwise

この関数は、ウィンドウwindowのボディーの高さを、行でリターンする。windowが省略、またはnilの場合のデフォルトは選択されたウィンドウで、それ以外では生きたウィンドウでなければならない。

オプション引数pixelwiseが非nilの場合、この関数はピクセルで計算windowのボディー高さをリターンする。

pixelwisenilの場合は、必要ならリターン値はもっとも近い整数に切り下げられる。これは、テキスト領域の下端行が部分的に可視の場合、その行は計数されないこと、さらに任意のウィンドウのボディー高さは、window-total-heightによりリターンされるそのウィンドウのトータル高さ決して超過し得ないことをも意味する。

ウィンドウのボディー幅(body width)とは、スクロールバー、フリンジ、マージン、右ディバイダーを含まないテキスト領域の幅です。

Function: window-body-width &optional window pixelwise

この関数は、ウィンドウwindowのボディーの幅を、列でリターンする。windowが省略、またはnilの場合のデフォルトは選択されたウィンドウであり、それ以外では生きたウィンドウでなければならない

オプション引数pixelwiseが非nilの場合、この関数はwindowのボディーの幅をピクセル単位でリターンする。

pixelwisenilの場合、リターン値は必要ならもっとも近い整数に切り下げられる。これはテキスト領域の右端の列が部分的に可視な場合は、その列は計数されないことを意味する。さらにこれは、ウィンドウのボディーの幅が、window-total-widthによりリターンされるウィンドウのトータル幅を決して超過し得ないことをも意味する。

Function: window-body-size &optional window horizontal pixelwise

この関数は、windowのボディーの高さ、または幅をリターンする。horizontalが省略、またはnilの場合は、windowにたいしてwindow-body-height、それ以外の場合は、window-body-widthを呼び出すのと同じである。いずれの場合も、オプション引数pixelwiseは、呼び出された関数に渡される。

以前のバージョンのEmacsとの互換性のため、window-heightwindow-total-heightwindow-widthwindow-body-widthにたいするエイリアスです。これらのエイリアス時代遅れと考えられております、将来的には削除されるでしょう。

ウィンドウのモードラインとヘッダーラインのピクセル高さは、以下の関数により取得できる。それらのリターン値は、そのウィンドウが以前に表示されていない場合を除き、通常は加算される。その場合、リターン値はそのウィンドウのフレームにたいして使用を予想されるフォントが元になる。

Function: window-mode-line-height &optional window

この関数は、windowモードラインの高さをピクセルでリターンする。windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。windowにモードラインがない場合、リターン値は0である。

Function: window-header-line-height &optional window

この関数は、windowのヘッダーラインの高さをピクセルでリターンする。windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。windowにヘッダーラインがない場合のリターン値は0である。

ウィンドウディバイダー(Window Dividersを参照)、フリンジ(Fringesを参照)、スクロールバー(Scroll Barsを参照)、ディスプレイマージン(Displaying in the Marginsを参照)を取得する関数については、対応するセクションで説明されています。

ウィンドウのサイズを変更(Resizing Windowsを参照)したり、ウィンドウを分割(split)するコマンド(Splitting Windowsを参照)は、指定できるウィンドウの最小の高さと幅を指定する変数window-min-heightおよびwindow-min-widthにしたがう。これらのコマンドは、ウィンドウのサイズがfixed(固定)になる変数window-size-fixedにもしたがう。

User Option: window-min-height

このオプションは、任意のウィンドウの最小のトータル高さを行で指定する。この値は最低でも1つのテキスト行、同様にモードライン、ヘッダーライン、(もしあれば)下端ディバイダーに対応する必要がある。

User Option: window-min-width

このオプションは、すべてのウィンドウの最小のトータル幅を列で指定する。この値は、2つのテキスト列、同様に(もしあれば)マージン、フリンジ、スクロールバー、右ディバイダーに対応する必要がある。

Variable: window-size-fixed

このバッファーローカル変数が非nilの場合、そのバッファーを表示するすべてのウィンドウのサイズが、通常は変更できなくなる。ウィンドウ削除やそのフレームのサイズ変更により、それ以外に方法がなければ、依然としてウィンドウのサイズは変更されるかもしれない。

値がheightの場合は、そのウィンドウの高さだけが固定される。値がwidthの場合は、そのウィンドウの幅だけが固定される。その他の非nil値では、幅と高さの両方が固定される。

この変数がnil場合でも、そのバッファーを表示している任意のウィンドウを任意の方向にリサイズできるとはいえない。これを決定するには、関数window-resizableを使用する。Resizing Windowsを参照のこと。

以降の関数は、ある特定の大きさのウィンドウにたいして、それのwindow-min-heightwindow-min-widthwindow-size-fixedの値と、領域のサイズを示す。

Function: window-min-size &optional window horizontal ignore pixelwise

この関数は、windowの最小のサイズをリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウ。オプション引数horizontalが非nilの場合は、windowの最小の列数、それ以外はwindowの最小の行数をリターンすることを意味する。

このリターン値により、windowのサイズが実際にその値にセットされた場合に、windowのすべてのコンポーネントが完全に可視にとどまることが保証される。horizontalnilの場合は、モードライン、ヘッダーライン、および下端ディバイダーが含まれる。horizontalが非nilの場合は、もしあればフリンジ、スクロールバー、右ディバイダーが含まれる。しかしこれには、マージン用に予約済みのスペースは含まれない。

オプション引数ignoreが非nilの場合は、window-min-heightまたはwindow-min-widthによりセットされる固定サイズのウィンドウに強いられる制限を無視することを意味する。ignoresafeの場合は、生きたウィンドウは可能な限り小さなwindow-safe-min-heightの行と、window-safe-min-widthの列を得る。ignoreにウィンドウが指定された場合は、そのウィンドウにたいする制限だけを無視する。その他の非nil値では、すべてのウィンドウにたいする上記制限のすべてが無視されることを意味する。

オプション引数pixelwiseが非nilの場合は、windowの最小サイズがピクセルで計数されてリターンされることを意味する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.4 Resizing Windows

このセクションでは、フレームのサイズを変更せずにウィンドウのサイズを変更する関数について説明します。生きたウィンドウはオーバーラップしないので、これらの関数は2つ以上のウィンドウを含む関数上でのみ意味があります(ウィンドウのリサイズにより隣接するウィンドウのサイズも変更される)。フレーム上に単一のウィンドウしか存在しない場合には、フレームの変更以外によりウィンドウのサイズ変更はできません(Frame Size And Positionを参照)。

注記した場合を除き、これらの関数は引数として内部ウィンドウも受け付けます。内部ウィンドウのリサイズにより、同じスペースにフィットするよう、子ウィンドウもリサイズされます。

Function: window-resizable window delta &optional horizontal ignore pixelwise

この関数は、windowのサイズがdelta行により垂直に変更され得る場合は、deltaをリターンする。オプション引数horizontalが非nilの場合は、windowdelta列単位に水平方向にリサイズ可能ならば、かわりにdeltaをリターンする。これは、実際にはウィンドウのサイズを変更しない。

windownilの場合のデフォルトは選択されたウィンドウ。

deltaが正の値の場合は、そのウィンドウが行または列の単位で拡張可能かどうかをチェックすることを意味し、deltaが負の値の場合は、そのウィンドウが行または列の単位で縮小可能かどうかをチェックすることを意味する。deltaが非0の場合のリターン値0は、そのウィンドウがリサイズ可能であることを意味する。

通常、変数window-min-heightwindow-min-widthは許容される最小のウィンドウサイズを指定する(Window Sizesを参照)。しかし、オプション引数ignoreが非nilの場合、この関数はwindow-size-fixedと同様にwindow-min-heightwindow-min-widthを無視する。そのかわりに、ヘッダーライン、モードライン、(もしあれば)下端ディバイダーに加えて1行分の高さのテキストエリアから構成されるウィンドウを、最小高さのウィンドウとし、フリンジ、マージン、スクロールバー、(もしあれば)右ディバイダーに加えて1列分の幅のテキストエリアから構成されるウィンドウを、最小幅のウィンドウと判断する。

オプション引数pixelwiseが非nilの場合、deltaはピクセル単位として解釈される。

Function: window-resize window delta &optional horizontal ignore pixelwise

この関数は、windowdelta増加することによりリサイズする。horizontalnilの場合は高さをdelta行、それ以外は幅をdelta行変更する。正のdeltaはウィンドウの拡大、負のdeltaは縮小を意味する。

windownilの場合のデフォルトは、選択されたウィンドウである。要求されたようにウィンドウをリサイズできない場合は、エラーをシグナルする。

オプション引数ignoreは、上述の関数window-resizableの場合と同じ意味をもつ。

オプション引数pixelwiseが非nilの場合、deltaはピクセル単位として解釈される。

この関数はどのウィンドウのエッジを変更するかの選択は、オプションwindow-combination-resizeの値と、関連するウィンドウのコンビネーションリミット(combination limits: 組み合わせ制限)に依存し、両方のエッジを変更するような場合もいくつかある。Recombining Windowsを参照のこと。ウィンドウの下端または右端のエッジを移動することだけでリサイズするには、関数adjust-window-trailing-edgeを使用すること。

Function: adjust-window-trailing-edge window delta &optional horizontal pixelwise

この関数は、windowの下端エッジをdelta行分移動する。オプション引数horizontalが非nilの場合は、かわりに右端エッジをdelta列分移動する。windownilの場合のデフォルトは、選択されたウィンドウである。

オプション引数pixelwiseが非nilの場合、deltaはピクセル単位として解釈される。

正のdeltaはエッジを下方もしくは右方へ移動し、負のdeltaはエッジを上方もしくは左方へ移動する。deltaで指定された範囲までエッジを移動できない場合、この関数はエラーをシグナルすることなく、可能な限りエッジを移動する。

この関数は、移動されたエッジに隣接するウィンドウのリサイズを試みる。何らかの理由(隣接するウィンドウが固定サイズの場合等)により、それが不可能な場合は、他のウィンドウをリサイズするかもしれない。

User Option: window-resize-pixelwise

このオプションの値が非nilの場合、Emacsはウィンドウをピクセル単位でリサイズする。現在のところ、これはsplit-window(Splitting Windowsを参照)、maximize-windowminimize-windowfit-window-to-buffershrink-window-if-larger-than-buffer(すべて以下に記述)、およびfit-frame-to-buffer(Frame Size And Positionを参照)のような関数に影響を与える。

あるフレームのピクセルサイズがそのフレームの文字サイズの整数倍でないときは、たとえこのオプションがnilであっても、少なくとも1つのウィンドウがピクセル単位でリサイズされるであろうことに注意されたい。デフォルト値はnilである。

以下のコマンドは、より具体的な方法でウィンドウをリサイズします。これらがインタラクティブに呼び出されたときは、選択されたウィンドウにたいして作用します。

Command: fit-window-to-buffer &optional window max-height min-height max-width min-width

このコマンドは、windowの高さまたは幅を、ウィンドウ内のテキストにフィットするように調整する。windowがリサイズできた場合は非nil、それ以外はnilをリターンする。windowが省略またはnilの場合のデフォルトは選択されたウィンドウ、それ以外の場合は生きたウィンドウであること。

windowが垂直コンビネーションの一部の場合、この関数はwindowの高さを調整する。新たな高さは、そのウィンドウのバッファーのアクセス可能な範囲の実際の高さから計算される。オプション引数max-heightが非nilの場合、それはこの関数がwindowに与えることができる、最大のトータル高さを指定する。オプション引数min-heightが非nilの場合、それは与えることができる最小のトータル高さを指定し、それは変数window-min-heightをオーバーライドする。max-heightmin-heightはどちらも、(もしあれば)モードライン、ヘッダーライン、下端ディバイダーを含む行数で指定する。

windowが水平コンビネーションの一部で、かつオプションfit-window-to-buffer-horizontally(以下参照)の値が非nilの場合、この関数はwindowの幅を調整する。新たな幅は、windowのカレントのスタート位置以降の、バッファーの最長の行から計算される。オプション引数max-widthは最大幅を指定し、デフォルトはwindowのフレーム幅である。オプション引数min-widthは最小幅を指定し、デフォルトはwindow-min-widthである。max-widthmin-widthはどちらも、(もしあれば)フリンジ、マージン、スクロールバーを含む列数で指定する。

オプションfit-frame-to-buffer(以下参照)が非nilの場合、この関数はfit-frame-to-buffer(see section Frame Size And Position)を呼び出すことにより、windowのコンテンツにフィットするように、windowのフレームのリサイズを試みるだろう。

User Option: fit-window-to-buffer-horizontally

これが非nilの場合、fit-window-to-bufferはウィンドウを水平方向にリサイズできる。これがnil(デフォルト)の場合、fit-window-to-bufferはウィンドウウィンドウ決して水平方向にリサイズしない。これがonlyの場合は、ウィンドウを水平方向だけにリサイズできる。その他の値では、fit-window-to-bufferがウィンドウをどちらの方向にもリサイズできることを意味する。

User Option: fit-frame-to-buffer

このオプションが非nilの場合、fit-window-to-bufferはフレームをフレームのコンテンツにフィットさせることができる。フレームは、フレームのルートウィンドウが生きたウィンドウで、かつこのオプションが非nilの場合のみ、フィットされる。これがhorizontallyの場合、フレームは水平方向にのみフィットされる。これがverticallyの場合、フレームは垂直方向にのみフィットされる。その他の非nil値は、フレームがどちらの方向にもフィットできることを意味する。

Command: shrink-window-if-larger-than-buffer &optional window

このコマンドは、windowにたいしてそのバッファーを完全に表示できるが、window-min-height以上の行を表示できるまで、可能な限りwindowの高さを縮小する。リターン値は、そのウィンドウがリサイズされれば非nil、それ以外は非nilwindowが省略またはnilの場合のデフォルトは、選択されたウィンドウである。それ以外では、生きたウィンドウであること。

このコマンドは、そのウィンドウがバッファーのすべてを表示するにはすでに高さが低すぎる場合、バッファーのどこかがスクリーンからスクロールオフされている場合、またはそのウィンドウがフレーム内で唯一の生きたウィンドウの場合は何も行わない。

このコマンドは、自身の処理を行うために、fit-window-to-buffer(上記参照)を呼び出す。

Command: balance-windows &optional window-or-frame

この関数は、各ウィンドウにたいして完全な幅、および/または完全な高さを与えるような方法により、各ウィンドウのバランスをとる。window-or-frameにフレームを指定した場合は、そのフレーム上のすべてのウィンドウのバランスをとる。window-or-frameにウィンドウを指定した場合は、そのウィンドウとウィンドウのsiblings(兄弟)にたいしてのみのバランスをとる(Windows and Framesを参照)。

Command: balance-windows-area

この関数は、選択されたフレーム上のすべてのウィンドウにたいして、おおよそ同じスクリーンエリアを与えようと試みる。完全な幅、または高さをもつウィンドウにたいしては、他のウィンドウと比較して、より多くのスペースは与えられない。

Command: maximize-window &optional window

この関数は、windowにたいして、そのフレームをリサイズしたり、他のウィンドウを削除することなく、水平垂直の両方向において、可能な限り大きくなるように試みる。windowが省略またはnilの場合のデフォルトは、選択されたウィンドウである。

Command: minimize-window &optional window

この関数は、windowにたいして、そのフレームをリサイズしたり、そのウィンドウを削除することなく、水平垂直の両方向において、可能な限り小さくなるように試みる。windowが省略またはnilの場合のデフォルトは、選択されたウィンドウである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.5 Splitting Windows

このセクションでは、既存のウィンドウを分割(split: スプリットすることにより、新たにウィンドウを作成する関数について説明します。

Function: split-window &optional window size side pixelwise

この関数は、ウィンドウwindowの隣に、新たに生きたウィンドウを作成する。windowが省略またはnilの場合のデフォルトは、選択されたウィンドウである。そのウィンドウは“分割(split)”されて、サイズは縮小される。そのスペースは、リターンされる新たなウィンドウにより吸収される。

オプションの第2引数sizeは、windowおよび/または新たなウィンドウのサイズを決定する。これが省略またはnilの場合は、両方のウィンドウに同じサイズが割り当てられる。行数が奇数の場合、余りの1行は新たなウィンドウに割り当てられる。sizeが正の数値の場合、windowsizeの行数(sideの値によっては列数)が与えられる。sizeが負の数値の場合、新たなウィンドウに-sizeの行数(または列数)が与えられる。

sizenilの場合、この関数は変数window-min-heightwindow-min-widthにしたがう(Window Sizesを参照)。つまり、分割によりこれらの変数の指定より小さいウィンドウが作成されるようなときは、エラーをシグナルする。しかし、sizeにたいして非nil値を指定すれば、これらの変数は無視される。その場合、許容される最小のウィンドウは、テキストエリアの高さが1行、および/または幅が2列のウィンドウであるとされる。

したがって、sizeが指定された場合、生成されるウィンドウがモードラインやスクロールバー等すべてのエリアを含むのに十分な大きさがあるかどうかチェックするのは、呼び出し側の責任である。これに関して、必要最小限のwindowを決定するために、関数window-min-size(Window Sizesを参照)を使用できる。新たなウィンドウは通常、モードラインやスクロールバー等のエリアをwindowから“継承”するので、この関数は新たなウィンドウの最小サイズも良好に推定する。呼び出し側は、次回の再表示前にこれに応じて継承されたエリアを削除する場合のみ、より小さなサイズを指定すること。

オプションの第3引数sideは、新たなウィンドウの位置をwindowから相対的に指定する。nilまたはbelowの場合、新たなウィンドウはwindowの下に、aboveの場合はwindowの上に配される。どちらの場合も、sizeはウィンドウのトータル高さを行数で指定する。

sidetまたはrightの場合、新たなウィンドウはwindowの右に、sideleftの場合はwindowの左に配される。どちらの場合も、sizeはウィンドウのトータル幅を列数で指定する。

オプションの第4引数pixelwiseが非nilの場合は、sizeを行や列ではなくピクセル単位で解釈することを意味する。

windowが生きたウィンドウの場合、新たなウィンドウはマージンやスクロールバーを含む、さまざまなプロパティを継承する。windowが内部ウィンドウ(internal window)の場合、新たなウィンドウはwindowのフレームのプロパティを継承する。

変数ignore-window-parametersnilの場合に限り、この関数の挙動はwindowなパラメーターにより変更されるかもしれない。ウィンドウパラメーターsplit-windowの値がtの場合、この関数はその他すべてのウィンドウパラメーターを無視する。それ以外では、ウィンドウパラメーターsplit-windowの値が関数の場合は、split-windowの通常アクションのかわりに、引数windowsizesideでその関数が呼び出される。値が関数以外の場合、この関数は(もしあれば)ウィンドウパラメーターwindow-atomまたはwindow-sideにしたがう。Window Parametersを参照のこと。

例として、Windows and Framesで議論したウィンドウ構成(window configuration)を得るための、一連のsplit-window呼び出しを以下に挙げます。この例では、生きたウィンドウの分割と、内部ウィンドウの分割も示します。最初はW4で表される、単一のウィンドウ(生きたルートウィンドウ)を含むフレームから開始します。(split-window W4)を呼び出すことにより、以下のウィンドウ構成が得られます。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W5_________________||
    |__________________W3__________________|

split-window呼び出しにより、W5で示す生きたウィンドウが新たに作成されました。W3で示される内部ウィンドウも新たに作成され、これはルートウィンドウかつW4W5の親ウィンドウになります。

次は、引数として内部ウィンドウW3を渡して、(split-window W3 nil 'left)を呼び出します。

     ______________________________________
    | ______  ____________________________ |
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W4____________|||
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W5____________|||
    ||__W2__||_____________W3_____________ |
    |__________________W1__________________|

内部ウィンドウW3の左に、生きたウィンドウW2が新たに作成されました。そして、内部ウィンドウW1が新たに作成され、これが新たにルートウィンドウになります。

インタラクティブな使用にたいして、Emacsは選択されたウィンドウを常に分割するコマンドを2つ提供します。これらは内部でsplit-windowを呼び出します。

Command: split-window-right &optional size

この関数は、選択されたウィンドウが左となるような、横並びの2つのウィンドウに分割する。sizeが正ならば左のウィンドウがsize列、負ならば右のウィンドウが-size列を与えられる。

Command: split-window-below &optional size

この関数は、選択されたウィンドウが上となるような、縦並びの2つのウィンドウに分割する。sizeが正ならば上のウィンドウがsize行、負ならば下のウィンドウが-size行を与えられる。

User Option: split-window-keep-point

この変数の値が非nil(デフォルト)なら、 split-window-belowは上述のように振る舞う。

nilの場合、split-window-belowは再表示が最小となるように、2つのウィンドウの各ポイントを調節する(これは低速な端末で有用である)。これは何であれ、以前ポイントがあったスクリーン行(screen line)を含むウィンドウを選択する。これは低レベルsplit-window関数ではなく、split-window-belowだけに影響することに注意。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.6 Deleting Windows

ウィンドウを削除(delete)することにより、フレームのウィンドウツリーからウィンドウが取り除かれます。それが生きたウィンドウの場合は、スクリーンに表示されなくなります。内部ウィンドウの場合は、その子ウィンドウも削除されます。

ウィンドウを削除した後でも、それへの参照が残っている限り、Lispオブジェクトとして存在し続けます。ウィンドウ構成(window configuration)をリストアすることにより、ウィンドウの削除は取り消すことができます(Window Configurationsを参照)。

Command: delete-window &optional window

この関数は、表示からwindowを削除して、nilをリターンする。windowが省略またはnilの場合のデフォルトは、選択されたウィンドウである。そのウィンドウを削除するとウィンドウツリーにウィンドウが存在しなくなるような場合(それがフレーム内で唯一の生きたウィンドウである場合等)は、エラーをシグナルする。

デフォルトでは、windowが占めていたスペースは、(もしあれば)隣接する兄弟ウィンドウのうちの1つに与えられる。しかし、変数window-combination-resizeが非nilの場合、そのスペースはウィンドウコンビネーション内の残りのすべてのウィンドウに比例的に分配される。See section Recombining Windowsを参照のこと。

変数ignore-window-parametersnilの場合に限り、この関数の振る舞いはwindowのウィンドウパラメーターにより変更される可能性がある。ウィンドウパラメーターdelete-windowの値がtの場合、この関数はその他すべてのウィンドウパラメーターを無視する。ウィンドウパラメーターdelete-windowが関数の場合は、通常のdelete-windowのかわりに、引数windowでその関数が呼び出される。それ以外では、この関数は(もしあれば)ウィンドウパラメーターwindow-atomまたはwindow-sideにしたがう。Window Parametersを参照のこと。

Command: delete-other-windows &optional window

この関数は、必要に応じて他のウィンドウを削除することにより、windowでフレームを充填する。windowが省略またはnilの場合のデフォルトは、選択されたウィンドウである。リターン値はnil

変数ignore-window-parametersnilの場合に限り、この関数の振る舞いは変更される可能性がある。ウィンドウパラメーターdelete-other-windowsの値がtの場合、この関数は他のすべてのウィンドウパラメーターを無視する。ウィンドウパラメーターdelete-other-windowsの値が関数の場合は、delete-other-windowsの通常の動作のかわりに、引数windowでその関数が呼び出される。それ以外では、この関数は(もしあれば)ウィンドウパラメーターwindow-atomまたはwindow-sideにしたがう。Window Parametersを参照のこと。

Command: delete-windows-on &optional buffer-or-name frame

この関数は、buffer-or-nameを表示しているすべてのウィンドウにたいしてdelete-windowを呼び出すことにより、それらを削除する。buffer-or-nameはバッファー、またはバッファー名であること。省略またはnilの場合のデフォルトはカレントバッファーである。指定されたバッファーを表示するウィンドウが存在しない場合、この関数は何も行わない。ミニバッファーが指定された場合は、エラーをシグナルする。

そのバッファーの表示に専用(dedicated)のウィンドウがあり、フレーム上でそれが唯一のウィンドウの場合、それが端末上で唯一のフレームでなければ、この関数はそのフレームも削除する。

オプション引数frameは、操作を行うフレームがどれかを指定する:

この引数の意味は、すべての生きたウィンドウを走査する他の関数(Cyclic Ordering of Windowsを参照)における場合とは異なることに注意。特に、ここでのtnilのもつ意味は、これら他の関数の場合とは逆である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.7 Recombining Windows

ウィンドウWの最後の兄弟を削除したときは、ウィンドウツリー内の親ウィンドウをWを置き換えることにより、その親ウィンドウも削除されます。これは、新たなウィンドウコンビネーションを形成するために、Wがその親の兄弟たちと再結合されなければならないことを意味します。生きたウィンドウを削除することにより、必然的に2つの内部ウィンドウが削除されるかもしれない場合もあります。

     ______________________________________
    | ______  ____________________________ |
    ||      || __________________________ ||
    ||      ||| ___________  ___________ |||
    ||      ||||           ||           ||||
    ||      ||||____W6_____||_____W7____||||
    ||      |||____________W4____________|||
    ||      || __________________________ ||
    ||      |||                          |||
    ||      |||                          |||
    ||      |||____________W5____________|||
    ||__W2__||_____________W3_____________ |
    |__________________W1__________________|

この構成におけるW5の削除は、通常はW3W4の削除を引き起こします。残りの生きたウィンドウW2W6W7は親をW7とする水平コンビネーションを形成するために再結合されます。

しかし、ときにはW4のような親ウィンドウを削除しないほうが合理的な場合もあります。特に、親ウィンドウが同じタイプのコンビネーション内に埋め込まれるコンビネーションを保護するために使用されるときは、それを削除するべきではありません。そのような埋め込みは、あるウィンドウを分割した後に続けて新たなウィンドウを削除する際、Emacsが関連するフレームで分割前にあったレイアウトを確実に再確立するために意味があります。

親がW1であるような2つの生きたウィンドウW2W3を開始点とするシナリオを考えてみましょう。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

W2を分割すると、以下のようにウィンドウW4が新たに作成されます。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

ここでウィンドウを垂直方向に拡大すると、Emacsはもしそのようなウィンドウがあれば、下位の兄弟ウィンドウから対応するスペースを得ようと試みます。このシナリオでふぁW4の拡大により、W3からスペースが奪われます。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    | ____________________________________ |
    ||_________________W3_________________||
    |__________________W1__________________|

W4を削除すると、前にW3から奪ったスペースを含む、スペース全体がW2に与えられるでしょう。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||_________________W3_________________||
    |__________________W1__________________|

これは特にW4が一時的にバッファーを表示するために使用されていて(Temporary Displaysを参照)、かつ初期のレイアウトで作業を継続したい場合は直感に反するかもしれません。

この振る舞いは、W2を分割する際に、新たな親ウィンドウを作成することにより解決できます。

User Option: window-combination-limit

この変数は、ウィンドウ分割により新たに親ウィンドウを作成させるかどうかを制御する。以下の値が認識される:

nil

これは、既存のウィンドウコンビネーションと同じ方向で分割が発生した場合(これ以外の場合は、いずれにせよ内部ウィンドウが新たに作成される)は、既存の親ウィンドウが存在するならば、新たな生きたウィンドウがそれを共有できることを意味する。

window-size

この場合、display-bufferalist引数内のエントリーwindow-heightまたはwindow-widthに親ウィンドウが渡されるなら、新たに親ウィンドウを作成する(Action Functions for display-bufferを参照)。

temp-buffer

この値は、一時的なバッファーを表示するウィンドウの分割に際し、新たに親ウィンドウを作成する。

display-buffer

これは、display-buffer(Choosing a Window for Displayを参照)がウィンドウを分割する際に、常に親ウィンドウを新たに作成することを意味する。

t

この場合は、ウィンドウを分割する際、常に親ウィンドウが新たに作成される。したがって、この変数の値が常にtの場合は、すべてのウィンドウツリーm常に2分木(ルートウィンドウ以外のすべてのウィンドウが正確に1つの兄弟をもつようなツリー)になる。

デフォルトはnilで、これら以外の値は将来のために予約済みである。

この返信のセッティングの結果としてsplit-windowが新たに親ウィンドウを作成した場合は、新たに作成された内部ウィンドウにたいしてset-window-combination-limit(以下参照)も呼び出す。これは、子ウィンドウが削除された際の、ウィンドウツリーの再配置に影響する(以下参照)。

window-combination-limittの場合、このシナリオの初期構成では以下のようになるでしょう:

     ______________________________________
    | ____________________________________ |
    || __________________________________ ||
    |||                                  |||
    |||________________W2________________|||
    || __________________________________ ||
    |||                                  |||
    |||________________W4________________|||
    ||_________________W5_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

子としてW2および新たな生きたウィンドウをもつ内部ウィンドウW5が新たに作成されます。ここでW2W4の唯一の兄弟なので、W4を拡大するとW3は変更せずに、W2を縮小しようと試みるでしょう。W5は垂直コンビネーションW1に埋め込まれた、2つのウィンドウからなる垂直コンビネーションを表すことに注意してください。

Function: set-window-combination-limit window limit

この関数は、ウィンドウwindowコンビネーションリミット(combination limit: 結合限界limitにセットする。この値は、関数window-combination-limitを通じて取得できる。効果については以下を参照のこと。これは内部ウィンドウにたいしてのみ意味をもつことに注意されたい。split-windowは、呼び出された際に変数window-combination-limittならば、tlimitとして、この関数を呼び出す。

Function: window-combination-limit window

この関数は、windowにたいするコンビネーションリミットをリターンする。

コンビネーションリミットは、内部ウィンドウにたいしてのみ意味をもつ。これがnilの場合は、Emacsはウィンドウ削除に応じて、兄弟同士で新たなウィンドウコンビネーションを形成することにより、windowの子ウィンドウをグループ化するために、windowの自動的な削除を許す。コンビネーションリミットがtの場合、windowの子ウィンドウは、その兄弟と自動的に再結合されることは決してない。

このセクションの冒頭で示した構成の場合、W4(W6W7の親ウィンドウ)のコンビネーションリミットはtなので、tを削除しても暗黙でW4も削除されることはない。

かわりに、同じ構成内の中の1つのウィンドウが分割または削除されたときは常に構成内のすべてのウィンドウをリサイズすることにより、上記で示した問題を避けることができます。これは、そのような操作にたいして、この方法以外では小さすぎるようなウィンドウの分割も可能にします。

User Option: window-combination-resize

この変数がnilの場合、split-windowはウィンドウ(以下window)自身と新たなウィンドウの両方にたいして、windowのスクリーンエリアが十分大きい場合のみ、windowを分割できる。

この変数がtの場合、split-windowは新たなウィンドウに対応するため、windowと同じコンビネーション内の、すべてのウィンドウのリサイズを試みる。これは特に、windowが固定サイズウィンドウのときや、通常の分割には小さすぎるときも、split-windowをが成功することを許す。さらに、続けてwindowをリサイズ、または削除すると、そのコンビネーション内のその他すべてのウィンドウをリサイズする。

デフォルトはnilで、それ以外の値は、将来の使用のため予約済みである。この変数の値は、window-combination-limitが非nilの場合は無視される。

window-combination-resizeの効果を説明するために、以下のフレームレイアウトを考えてください。

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    |__________________W1__________________|

window-combination-resizenilの場合、ウィンドウW3を分割しても、W2のサイズは変更されません:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||_________________W3_________________||
    | ____________________________________ |
    ||                                    ||
    ||_________________W4_________________||
    |__________________W1__________________|

window-combination-resizetの場合は、W3を分割すると3つの生きたウィンドウすべてを、おおよそ同じ高さにします:

     ______________________________________
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W2_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W3_________________||
    | ____________________________________ |
    ||                                    ||
    ||                                    ||
    ||_________________W4_________________||
    |__________________W1__________________|

生きたウィンドウW2W3W4のいずれを削除しても、削除されたウィンドウのスペースは、残りの2つの生きたウィンドウに相対的に分配されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.8 Selecting Windows

Function: select-window window &optional norecord

この関数は、windowを選択されたウィンドウにして、そのフレーム内で選択されたウィンドウとし(Basic Concepts of Emacs Windowsを参照)、そのフレームを選択する。また、windowのバッファー(Buffers and Windowsを参照)をカレントにして、そのバッファーのpointの値(Windows and Pointを参照)を、windowwindow-pointの値にセットする。windowは生きたウィンドウでなければならない。リターン値はwindowである。

デフォルトでは、この関数はwindowのバッファーをバッファーリストの先頭(The Buffer Listを参照)に移動して、windowをもっとも最近選択されたウィンドウにする。しかし、オプション引数norecordが非nilの場合は、これらの追加処理は省略される。

この関数は、norecordnilならば、buffer-list-update-hook(The Buffer List)を実行する。コーディングを単純にするために、アプリケーションや内部ルーチンは、しばしばウィンドウを一時的に選択することがあることに注意。一般的には、そのような選択(以下のマクロsave-selected-windowwith-selected-windowによる選択も含む)は記録されないので、buffer-list-update-hookの汚染は避けられる。選択を“実際にカウント”するのは、windowのフレームの次回表示時に可視の変更が発生したときで、それらは常に記録されるべきである。これは、あるウィンドウが選択されるたびに関数を実行するためには、それをbuffer-list-update-hookに配するのが良い選択であることも意味している。

引数norecordに非nilを指定したselect-windowの連続呼び出しは、ウィンドウの並び順を選択時刻により決定します。関数get-lru-windowは、もっとも昔に選択された生きたウィンドウ(Cyclic Ordering of Windowsを参照)を取得するために使用できます。

Macro: save-selected-window forms…

このマクロは、選択されたフレーム、同様に各フレームの選択されたウィンドウを記録し、formsを順に実行してから、以前に選択されていたフレームとウィンドウをリストアする。これはカレントバッファーの保存とリストアも行う。リターン値はforms内の最後のフォームの値である。

このマクロは、ウィンドウのサイズ、コンテンツ、配置についての保存やリストアは何も行わない。したがって、formsがそれらを変更した場合、その変更は永続化される。あるフレームにおいて以前に選択されていたウィンドウがformsのexit時にもはや生きていない場合、そのフレームの選択されたウィンドウはそのまま放置される。以前に選択されていたウィンドウがもはや生きていない場合はformsの最後に選択されていたウィンドウが何であれ、それが選択されたままになる。カレントバッファーformsのexit時にそれが生きている場合のみリストアされる。

このマクロは、もっとも最近に選択されたウィンドウとバッファーリストの順番を、どちらも変更しない。

Macro: with-selected-window window forms…

このマクロはwindowを選択して、formsを順に実行してから、以前に選択されていたウィンドウとカレントバッファーをリストアする。たとえば、引数norecordnilselect-windowを呼び出す等、forms内で故意に変更しない限り、もっとも最近に選択されたウィンドウとバッファーリストの順番は変更されない。

このマクロは、もっとも最近に選択されたウィンドウとバッファーリストの順番を変更しない。

Function: frame-selected-window &optional frame

この関数は、フレームframe内で選択されているウィンドウをリターンする。frameは生きたフレームであること。省略またはnilの場合のデフォルトは、選択されたフレームである。

Function: set-frame-selected-window frame window &optional norecord

この関数は、windowをフレームframe内で選択されたウィンドウにする。frameは生きたフレームであること。省略またはnilの場合のデフォルトは、選択されたフレームである。windowは生きたウィンドウであること。省略またはnilの場合のデフォルトは選択されたウィンドウである。

frameが選択されたフレームの場合は、windowを選択されたウィンドウにする。

オプション引数norecordが非nilの場合、この関数はもっとも最近に選択されたウィンドウのリストとバッファーリストを、どちらも変更しない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.9 Cyclic Ordering of Windows

他のウィンドウを選択するためにコマンドC-x o(other-window)を使う際には、特定の順番で生きたウィンドウを巡回します。与えられた任意のウィンドウ構成にたいして、この順序は決して変更されません。これは、ウィンドウのサイクル順序(cyclic ordering of windows)と呼ばれます。

この順序は、そのフレームのリーフノードである生きたウィンドウを取得するために、ツリーを深さ優先で走査することにより決定されます(Windows and Framesを参照)。ミニバッファーがアクティブな場合は、ミニバッファーウィンドウも含まれます。この順序は巡回的(cyclic)なので、この順序の最後のウィンドウの次には最初のウィンドウが配されます。

Function: next-window &optional window minibuf all-frames

この関数は、ウィンドウのサイクル順でwindowの次の生きたウィンドウをリターンする。windowは生きたウィンドウであること。省略またはnilの場合のデフォルトは選択されたウィンドウである。

オプション引数minibufは、サイクル順にミニバッファーウィンドウを含めるべきかどうかを指定する。通常は、minibufnilのときは、ミニバッファーウィンドウがカレントで“アクティブ”な場合のみミニバッファーウィンドウが含まれる。これは、C-x oの振る舞うと合致する(ミニバッファーが使用されている限りミニバッファーウィンドウはアクティブであることに注意。Minibuffersを参照のこと)。

minibuftの場合、サイクル順にはすべてのミニバッファーウィンドウが含まれる。minibuftnilのいずれとも異なる場合は、たとえアクティブであってもミニバッファーウィンドウは含まれない。

オプション引数all-framesは、考慮に入れるフレームを指定する:

複数のフレームが考慮される場合は、すべての生きたフレームのリストの順にしたがってそれらのフレームを順に追加することにより、サイクル順を取得する(Finding All Framesを参照)。

Function: previous-window &optional window minibuf all-frames

この関数は、ウィンドウのサイクル順においてwindowの前に位置する、生きたウィンドウをリターンする。その他の引数は、next-windowの場合と同様に処理される。

Command: other-window count &optional all-frames

この関数は、ウィンドウのサイクル順において、選択されたウィンドウからcount番目に位置する、生きたウィンドウをリターンする。countが正の数ならcount個のウィンドウを前方にスキップし、負の数なら-count個のウィンドウを後方にスキップする。countが0の場合は、選択されたウィンドウを単に再選択する.インタラクティブに呼び出された場合、countはプレフィックス数引数である。

オプション引数all-framesは、next-windownilminibuf引数を指定したときのnext-windowの場合と同じ意味をもつ。

この関数は、非nilのウィンドウパラメーターno-other-windowをもつウィンドウを選択しない。

Function: walk-windows fun &optional minibuf all-frames

この関数は、生きたウィンドウそれぞれにたいして、ウィンドウを引数に関数funを呼び出す。

これはウィンドウのサイクル順にしたがう。オプション引数minibufall-framesは、含まれるウィンドウセットを指定する。これらは、next-windowの引数の場合と同じ意味をもつ。all-framesがフレームを指定する場合、最初に処理されるのはそのフレームの最初のウィンドウ(frame-first-windowがリターンするウィンドウ)であり、選択されたウィンドウである必要はない。

funがウィンドウの分割や削除によりウィンドウ構成を変更する場合でも、処理するウィンドウセットは初回のfun呼び出しに先立ち決定されるため、変更されない。

Function: one-window-p &optional no-mini all-frames

この関数は、選択されたウィンドウが唯一の生きたウィンドウの場合はt、それ以外はnilをリターンする。

ミニバッファーウィンドウがアクティブな場合、ミニバッファーウィンドウは通常は考慮される(そのため、この関数はnilをリターンする)。しかし、オプション引数no-miniが非nilの場合は、たとえアクティブであっても、ミニバッファーウィンドウは無視される。オプション引数all-framesは、next-windowの場合と同じ意味をもつ。

以下は、何らかの条件を満足するウィンドウを、それらを選択することなくリターンする関数です:

Function: get-lru-window &optional all-frames dedicated not-selected

この関数は、発見的には“もっとも最近に使用された”ウィンドウであるような、生きたウィンドウをリターンする。オプション引数all-framesは、next-windowの場合と同じ意味をもつ。

フル幅のウィンドウが存在する場合は、それらのウィンドウだけが考慮される。ミニバッファーが候補になることは、決してない。オプション引数dedicatednilの場合は、専用のバッファー(Dedicated Windowsを参照)が候補になることは、決してない。唯一の候補が選択されたウィンドウである場合以外は、決して選択されたウィンドウをリターンしない。しかし、オプション引数not-selectedが非nilならば、そのような場合でもこの関数はnilをリターンする。

Function: get-largest-window &optional all-frames dedicated not-selected

この関数は、もっとも大きいエリア(高さ掛ける幅)をもつウィンドウをリターンする。オプション引数all-framesは検索するウィンドウを指定し、意味はnext-windowの場合と同様。

ミニバッファーウィンドウは決して候補とならない。オプション引数dedicatednilの場合、専用ウィンドウ(Dedicated Windowsウィンドウを参照)は決して候補にならない。オプション引数not-selectedが非nilの場合、選択されたウィンドウは決して候補にならない。オプション引数not-selectedが非nil、かつ唯一の候補が選択されたウィンドウの場合、この関数はnilをリターンする。

同サイズの候補ウィンドウが2つある場合、この関数はウィンドウのサイクル順で、選択されたウィンドウから数えて最初にあるウィンドウを優先する。

Function: get-window-with-predicate predicate &optional minibuf all-frames default

この関数は、ウィンドウのサイクル順内の各ウィンドウにたいして、そのウィンドウを引数に、関数predicateを順に呼び出す。いずれかのウィンドウにたいしてpredicateが非nilをリターンした場合、この関数は処理を停止して、そのウィンドウをリターンする。そのようなうlが見つからなければ、リターン値はdefault(これのデフォルトはnil)となる。

オプション引数 minibufall-framesは検索するウィンドウを指定し、意味はnext-windowの場合と同様である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.10 Buffers and Windows

このセクションでは、ウィンドウのコンテンツを調べたりセットするための、低レベルな関数を説明します。ウィンドウ内に特定のバッファーを表示するための高レベルな関数については、Switching to a Buffer in a Windowを参照してください。

Function: window-buffer &optional window

この関数は、windowが表示しているバッファーをリターンする。windowが省略またはnilの場合のデフォルトは、選択されたウィンドウである。windowが内部ウィンドウの場合、この関数はnilをリターンする。

Function: set-window-buffer window buffer-or-name &optional keep-margins

この関数は、 windowbuffer-or-nameウィンドウ表示させる。windowは生きたウィンドウであること。nilの場合のデフォルトは、選択されたウィンドウである。buffer-or-nameは、バッファー、あるいは既存のバッファー名であること。この関数は、選択されていたウィンドウを変更せず、カレントバッファーも直接は変更しない(The Current Bufferを参照)。リターン値はnilである。

windowが、あるバッファーにたいして特に専用で、かつbuffer-or-nameがそのバッファーを指定しない場合、この関数はエラーをシグナルする。Dedicated Windowsを参照のこと。

デフォルトでは、この関数は指定されたバッファーのローカル変数にもとづいて、windowの位置、ディスプレイマージン、フリンジ幅、スクロールバーのセッティングをリセットする。しかし、オプション引数keep-marginsが非nilの場合は、ディスプレイマージンとフリンジ幅は未変更のままにする。

アプリケーションを記述する際は、直接set-window-bufferを呼び出すのではなく、通常はSwitching to a Buffer in a Windowで説明する高レベルの関数を使用するべきである。

これは、window-scroll-functionsの後にwindow-configuration-change-hookを実行する。Hooks for Window Scrolling and Changesを参照のこと。

Variable: buffer-display-count

このバッファーローカル変数は、ウィンドウ内にバッファーが表示された回数を記録する。。これは、そのバッファーにたいしてset-window-bufferが呼び出されるたびに増分される

Variable: buffer-display-time

このバッファーローカル変数は、バッファーがウィンドウに最後に表示された時刻を記録する。バッファーが表示されたことがない場合は、nilをリターンする。これは、そのバッファーにたいしてset-window-bufferが呼び出されるたびに、current-timeがリターンする値により更新される(Time of Dayを参照)。

Function: get-buffer-window &optional buffer-or-name all-frames

この関数は、ウィンドウのサイクル順内で、選択されたウィンドウを起点に、buffer-or-nameを表示する最初のウィンドウをリターンする.<(Cyclic Ordering of Windowsを参照)。そのようなウィンドウが存在しない場合、リターン値はnilとなる。

buffer-or-nameはバッファーか、バッファーの名前であること。省略またはnilの場合のデフォルトは、カレントバッファーである。オプション引数all-framesは、考慮するウィンドウを指定する。

これらの意味は、next-windowall-frames引数の場合とは若干異なることに注意されたい(Cyclic Ordering of Windowsを参照)。この不一致の解消のために、EEmacsの将来のバージョンにおいて、この関数は変更されるかもしれない。

Function: get-buffer-window-list &optional buffer-or-name minibuf all-frames

この関数は、その時点でbuffer-or-nameを表示する、すべてのウィンドウのリストをリターンする。buffer-or-nameはバッファー、または既存バッファーの名前であること。省略またはnilの場合のデフォルトは、カレントバッファーである。

引数minibufall-framesは、関数next-windowの場合と同じ意味をもつ(Cyclic Ordering of Windowsを参照)。all-frames引数は、get-buffer-windowの場合と正確に同じようには振る舞わないことに注意すること。

Command: replace-buffer-in-windows &optional buffer-or-name

このコマンドは、buffer-or-nameを表示しているすべてのウィンドウで、それを他の何らかのバッファーに置き換える。buffer-or-nameはバッファー、または既存のバッファーの名前であること。省略またはnilの場合のデフォルトは、カレントバッファーである。

各ウィンドウで置き換えられるバッファーは、switch-to-prev-bufferを通じて選択される(Window Historyを参照)。buffer-or-nameを表示している専用ウィンドウはすべて、可能なら削除される(Dedicated Windowsを参照)。そのようなウィンドウがそのフレームで唯一のウィンドウで、かつ同一端末上に他のフレームが存在する場合は、そのフレームも同様に削除される。その端末上の唯一のフレームの唯一のウィンドウの場合は、いずれにせよそのバッファーは置き換えられる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.11 Switching to a Buffer in a Window

このセクションでは、あるウィンドウ内で特定のバッファーにスイッチするための、高レベルな関数について説明します。“バッファーをスイッチする”とは一般的に、(1)そのバッファーをあるウィンドウに表示して、(2)そのウィンドウを選択されたウィンドウとし(かつそのフレームを選択されたフレームとし、(3)そのバッファーウィンドウカレントバッファーにすることを意味します。

Lispプログラムがアクセスや変更できるように、バッファーを一時的にカレントにするのにこれらの関数を使用しないでください。これらはウィンドウヒストリー(Window Historyを参照)の変更のような副作用をもつので、そのような方法での使用はユーザーを驚かせることになるでしょう。バッファーをLispで変更するためにカレントにしたい場合はwith-current-buffersave-current-bufferset-bufferを使用します。The Current Bufferを参照してください。

Command: switch-to-buffer buffer-or-name &optional norecord force-same-window

このコマンドは、選択されたウィンドウ内でbuffer-or-nameを表示して、それをカレントバッファーにしようと試みる。これはよくインタラクティブ(C-x bのバインディングで)に使用され、同様にLispプログラムでも使用される。リターン値はスイッチしたバッファーである。

buffer-or-namenilの場合のデフォルトは、other-bufferによりリターンされるバッファーになる(The Buffer Listを参照)。buffer-or-nameが既存のバッファーの名前でない文字列の場合、この関数はその名前で新たにバッファーを作成する。新たなバッファーのメジャーモードは、変数major-modeにより決定される(Major Modesを参照)。

通常は、指定されたバッファーはバッファーリスト — グローバルバッファーリストと選択されたフレームのバッファーリストの両方の先頭に置かれる(The Buffer Listを参照)。しかし、オプション引数norecordが非nilなら、これは行われない。

switch-to-bufferが、選択されたウィンドウ内にバッファーを表示するのが不可能なことが時折ある。これは、選択されたウィンドウがミニバッファーウィンドウの場合や、選択されたウィンドウがそのバッファーにたいして特に専用(strongly dedicated)な場合に発生する(Dedicated Windowsを参照)。この場合、このコマンドはpop-to-buffer(以下参照)を呼び出すことにより、通常は何か他のウィンドウにそのバッファーの表示を試みる。しかし、オプション引数が非nilなら、かわりにエラーをシグナルする。

デフォルトでは、switch-to-bufferはバッファーのpoint位置でバッファーを表示します。この振る舞いは、以下のオプションを使用して調整できます。

User Option: switch-to-buffer-preserve-window-point

この変数がnilの場合、switch-to-bufferbuffer-or-nameにより指定されたバッファーを、そのバッファーのpoint位置で表示する。この変数がalready-displayedなら、そのバッファーが任意の可視またはアイコン化されたフレーム上の他のウィンドウで表示されている場合は、選択されたウィンドウ内の以前の位置でのバッファーの表示を試みる。この変数がtなら、switch-to-bufferは選択されたウィンドウ内の以前の位置でそのバッファーを表示しようと試みる。

この変数は、バッファーがすでに選択されたウィンドウに表示されているか、これまで表示されたことがない、またはバッファーを表示するためにswitch-to-bufferpop-to-bufferを呼び出した場合は無視される。

以下の2つのコマンドは、説明している機能以外はswitch-to-bufferと類似しています。

Command: switch-to-buffer-other-window buffer-or-name &optional norecord

この関数は、buffer-or-nameで指定されたバッファーを、選択されたウィンドウ以外の、別のウィンドウに表示する。これは関数pop-to-buffer(以下参照)を内部で使用する。

選択されたウィンドウが指定されたバッファーをすでに表示している場合は表示を続けるが、見つかった他のウィンドウも同様にそのバッファーを表示する。

引数buffer-or-namenorecordは、switch-to-bufferの場合と同じ意味をもつ。

Command: switch-to-buffer-other-frame buffer-or-name &optional norecord

この関数は、buffer-or-nameで指定されたバッファーを、新たなフレームに表示する。これは関数pop-to-buffer(以下参照)を内部で使用する。

指定されたバッファーがすでにカレント端末上の任意のフレームの他のウィンドウに表示されている場合、これはフレームを新たに作成せずにそのウィンドウに切り替える。しかし、これを行うために選択されたウィンドウを使用することは決してない。

引数buffer-or-namenorecordは、switch-to-bufferの場合と同じ意味をもつ。

上述したコマンドは、任意のウィンドウにバッファーを柔軟に表示して、編集用にそのウィンドウを選択する関数pop-to-bufferを使用しています。次に、pop-to-bufferはバッファーの表示にdisplay-bufferを使用します。したがって、display-bufferに影響する変数も、同様に影響します。display-bufferのドキュメントについては、Choosing a Window for Displayを参照してください。

Command: pop-to-buffer buffer-or-name &optional action norecord

この関数は、buffer-or-nameをカレントバッファーにして、なるべく前に選択されていたウィンドウではないウィンドウにそれを表示する。そしてその後に、表示しているウィンドウを選択する。そのウィンドウが別のグラフィカルなフレーム上にある場合は、可能ならそのフレームが入力フォーカスを与えられる(Input Focusを参照)。リターン値は、切り替えたバッファーである。

buffer-or-namenilの場合のデフォルトは、other-bufferによりリターンされるバッファーになる(The Buffer Listを参照)。buffer-or-nameが既存のバッファーの名前でない文字列の場合、この関数はその名前で新たにバッファーを作成する。新たなバッファーのメジャーモードは、変数major-modeにより決定される(Major Modesを参照)。

actionが非nilの場合、それはdisplay-bufferに渡すディスプレイアクション(display action)であること(Choosing a Window for Displayを参照)。非nil、非リスト値の場合は、たとえそのバッファーがすでに選択されたウィンドウに表示されていたとしても、選択されたウィンドウではなく、ウィンドウをポップ(pop)することを意味する。

switch-to-bufferと同様、norecordnilなら、この関数はバッファーリストを更新する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.12 Choosing a Window for Display

コマンドdisplay-bufferは、表示のために柔軟にウィンドウを選択して、そのウィンドウ内に指定されたバッファーを表示します。これは、キーバインディングC-x 4 C-oを通じて、インタラクティブに呼び出すことができます。また、switch-to-bufferpop-to-bufferを含む、多くの関数およびコマンドにより、サブルーチンとしても使用されます(Switching to a Buffer in a Windowを参照)。

このコマンドは、ウィンドウ内に表示するウィンドウを探すために、いくつかの複雑なステップを実行します。これらのステップはディスプレイアクション(display actions)を用いて記述されます。ディスプレイアクションは、(function . alist)という形式をもちます。ここで、functionは関数、または関数リストで、わたしたちはこれをアクション関数(action functions)として参照します。alistは連想リスト(association list)で、わたしたちはこれをアクションalist(action alists)として参照します。

アクション関数は、表示するバッファーと、アクションalistという、2つの引数を受け取ります。これは、自身の条件にしたがってウィンドウウィンドウ選択、または作成して、バッファーをウィンドウ内に表示します。成功した場合はそのウィンドウ、それ以外はnilをリターンします。事前定義されたアクション関数については、Action Functions for display-bufferを参照してください。

display-bufferは、複数ソースからのディスプレイアクションを組み合わせて、アクション関数のいずれか1つがバッファーの表示を管理して非nil値をリターンするまで、アクション関数を順に呼び出します。

Command: display-buffer buffer-or-name &optional action frame

このコマンドは、ウィンドウウィンドウ選択したり、そのバッファーをカレントにすることなく、buffer-or-nameをウィンドウに表示させる。引数buffer-or-nameはバッファー、または既存のバッファーの名前でなければならない。リターン値は、そのバッファーを表示するために選ばれたウィンドウである。

オプション引数actionが非nilの場合、それは通常はディスプレイアクション(上述)であること。display-bufferは、以下のソース(記載順)からディスプレイアクションを集約して、アクション関数リストとアクションalistを構築する:

各アクション関数は、いずれかが非nilをリターンするまで、第1引数にバッファー、第2引数に組み合わせられたアクションalistで、順番に呼び出される。呼び出し側は、ウィンドウ内にバッファーを表示しない場合を処理する用意があることを示すために、アクションalistの要素として(allow-no-window . t)を渡すことができる。

引数actionには非nilの非list値も指定できる。これは、たとえ選択されたウィンドウがすでにそのバッファーを表示していても、選択されたウィンドウではない別のウィンドウにバッファーが表示されるべきだという、特別な意味をもつ。プレフィックス引数とともにインタラクティブに呼び出された場合、actiontである。

オプション引数frameが非nilの場合は、そのバッファーがすでに表示されているか判断する際、どのフレームをチェックするかを指定する。これはactionのアクションalistに、要素(reusable-frames . frame)を追加するのと等価である。Action Functions for display-bufferを参照のこと。

Variable: display-buffer-overriding-action

この変数の値は、display-bufferにより最高の優先順で扱われるディスプレイアクションであること。デフォルト値は空(つまり(nil . nil))である。

User Option: display-buffer-alist

このオプションの値は、ディスプレイアクションにコンディション(condition: 状態)をマップするalistである。コンディションはそれぞれ、バッファー名にマッチする正規表現か、2つの引数をとる関数で、引数はバッファー名とdisplay-bufferに渡すaction引数である。display-bufferに渡されたバッファー名がこのalist内の正規表現にマッチするか、コンディションで指定された関数が非nilをリターンした場合、display-bufferはバッファーを表示すために、対応するディスプレイアクションを使用する。

User Option: display-buffer-base-action

このオプションの値は、ディスプレイアクションであること。このオプションは、display-buffer呼び出しにたいする、“標準”のディスプレイアクションを定義するために使用できる。

Constant: display-buffer-fallback-action

このディスプレイアクションは、display-bufferにたいして、他のディスプレイアクションが与えられなかった場合の代替え処理を指定する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.13 Action Functions for display-buffer

以下の基本的なアクション関数がEmacs内で定義されています。これらの関数はそれぞれ表示するバッファーbufferと、アクションalistという、2つの引数をとります。それぞれのアクション関数は、成功した場合はウィンドウ、失敗したらnilをリターンします。

Function: display-buffer-same-window buffer alist

この関数は、選択されたウィンドウ内に、bufferの表示を試みる。選択されたウィンドウがミニバッファーウィンドウや、他のバッファー専用(Dedicated Windowsを参照)の場合は失敗する。alistに非nilinhibit-same-windowエントリーがある場合も失敗する。

Function: display-buffer-reuse-window buffer alist

この関数は、すでにbufferを表示しているウィンドウを探すことにより、バッファーの“表示”を試みる。

alistに非nilinhibit-same-windowエントリーがある場合、選択されたウィンドウは再利用に適さない。alistreusable-framesエントリーが含まれる場合、その値により再利用可能なウィンドウをどのフレームで検索するか決定される:

これらは、next-windowにたいするall-frames引数の場合とは若干異なることに注意(Cyclic Ordering of Windowsを参照)。

alistreusable-framesエントリーが含まれない場合、通常この関数は選択されたフレームだけを検索する。しかし、変数pop-up-framesが非nilなら、カレント端末上のすべてのフレームを検索する。Additional Options for Displaying Buffersを参照。

この関数が他のフレーム上のウィンドウを選択した場合は、そのフレームを可視にするとともに、alistinhibit-switch-frameエントリー(Additional Options for Displaying Buffersを参照)を含んでいなければ、必要ならそのフレームを最前面に移動(raise)する。

Function: display-buffer-pop-up-frame buffer alist

この関数は、新たにフレームを作成して、そのフレームのウィンドウ内にバッファーを表示する。これは実際には、pop-up-frame-function(Additional Options for Displaying Buffersを参照)内で指定された関数を呼び出すことにより、フレーム作成を行う。alistpop-up-frame-parametersエントリーを含む場合は、その連想値(associated value)が新たに作成されたフレームのパラメーターに追加される。

Function: display-buffer-pop-up-window buffer alist

この関数は、最大もしくはもっとも長い間参照されていない(LRU: least recently-used)ウィンドウを分割することにより、bufferの表示を試みる。これは実際には、split-window-preferred-function(Additional Options for Displaying Buffersを参照)内で指定された関数を呼び出すことにより分割を行う。

新たなウィンドウのサイズは、alistにエントリーwindow-heightwindow-widthを与えることにより調整できる。ウィンドウの高さを調整するには、CARwindow-heightCDRが以下のいずれかであるようなエントリーを使用する:

ウィンドウの幅を調整するには、CARwindow-widthCDRが以下のいずれかであるようなエントリーを使用する:

この関数は、何らかの理由により分割を行えるウィンドウが存在しない場合は、失敗する可能性がある(選択されたフレームがフレームパラメーターunsplittableをもつ場合等。Buffer Parametersを参照のこと)。

Function: display-buffer-below-selected buffer alist

この関数は、選択されたウィンドウの下のウィンドウ内にbufferの表示を試みる。これは選択されたウィンドウの分割、または選択されたウィンドウの下のウィンドウの使用を意味する。新たにウィンドウを作成した場合は、alistに適切なwindow-heightまたはwindow-widthエントリーが含まれていれば、サイズの調整も行うだろう。上記を参照のこと。

Function: display-buffer-in-previous-window buffer alist

この関数は、以前にbufferを表示していたウィンドウ内に、そのバッファーの表示を試みる。alistに非nilinhibit-same-windowエントリーがある場合、選択されたウィンドウは再利用に適さない。alistreusable-framesエントリーが含まれる場合、その値はdisplay-buffer-reuse-windowと同様、適正なウィンドウをどのフレームから検索するかを決定する。

alistprevious-windowエントリーがある場合は、そのエントリーにより指定されたウィンドウは、たとえそのウィンドウが以前にbufferを表示したことが一度もなくても、上記メソッドが見つけた他のすべてのウィンドウをオーバーライドするだろう。

Function: display-buffer-at-bottom buffer alist

この関数は、選択されたフレームの最下にあるウィンドウ内にbufferの表示を試みる。

これは、フレーム最下のウィンドウまたはフレームのルートウィンドウを分割するか、選択されたフレーム最下の既存ウィンドウを再利用する。

Function: display-buffer-use-some-window buffer alist

この関数は、既存のウィンドウを選択して、そのウィンドウ内にbufferを表示することにより、バッファーの表示を試みる。すべてのウィンドウが他のバッファー専用の場合、この関数は失敗する可能性がある(Dedicated Windowsを参照)。

Function: display-buffer-no-window buffer alist

alistに非nilallow-no-windowエントリーがある場合、この関数はbufferを表示しない。これにより、デフォルトの動作をオーバーライドして、バッファーの表示を避けることができる。これは、呼び出し側がallow-no-windowに非nil値を指定して、display-bufferからリターンされたnil値を処理できるようなケースを想定している。

アクション関数を説明するために、以下の例を考えてみましょう。

(display-buffer
 (get-buffer-create "*foo*")
 '((display-buffer-reuse-window
    display-buffer-pop-up-window
    display-buffer-pop-up-frame)
   (reusable-frames . 0)
   (window-height . 10) (window-width . 40)))

上記のフォームを評価することにより、以下のようにdisplay-bufferが実行されます: (1)*foo*と呼ばれるバッファーが、すでに可視またはアイコン化されたフレームに表示されている場合は、そのウィンドウを再利用する。 (2)それ以外の場合は、新たなウィンドウをポップアップするか、それが不可能なら新たなフレームでバッファーを表示する。(3) すべてのステップが失敗した場合は、それが何であれdisplay-buffer-base-actionおよびdisplay-buffer-fallback-actionが指示するものを使用して処理を行う。

さらにdisplay-bufferは、(display-bufferにより*foo*が前からそこに配置されていた場合は)再使用されるウィンドウ、およびポップアップされたウィンドウにたいして調整を試みます。そのウィンドウが垂直コンビネーションの一部なら、高さはその行数にセットされるでしょう。数字“10”のかわりに関数fit-window-to-bufferを指定した場合、display-bufferは空のバッファーにフィットするようにウィンドウを1行にセットするでしょう。ウィンドウが水平コンビネーションの一部なら、列数を40にセットします。新たなウィンドウが垂直または水平に組み合わせられるかは、ウィンドウの分割方向とsplit-window-preferred-functionsplit-height-thresholdsplit-width-thresholdの値に依存します(Additional Options for Displaying Buffersを参照)。

ここで、事前に以下のような‘display-buffer-alist’にたいするセットアップが存在していて、この呼び出しを組み合わせたとしましょう。

(let ((display-buffer-alist
       (cons
        '("\\*foo\\*"
          (display-buffer-reuse-window display-buffer-below-selected)
          (reusable-frames)
          (window-height . 5))
        display-buffer-alist)))
  (display-buffer
   (get-buffer-create "*foo*")
   '((display-buffer-reuse-window
      display-buffer-pop-up-window
      display-buffer-pop-up-frame)
     (reusable-frames . 0)
     (window-height . 10) (window-width . 40))))

このフォームは、まず選択されたフレーム上で*foo*を表示しているウィンドウを再利用するよう、display-bufferに試みさせます。そのようなウィンドウが存在しなければ、選択されたウィンドウの分割を試み、またはそれが不可能なら選択されたウィンドウの下のウィンドウを使用します。

選択されたウィンドウの下にウィンドウがない、あるいは下のウィンドウがそれのバッファーに専用の場合、display-bufferは前の例で説明したように処理を行うでしょう。しかし、再利用されたウィンドウやポップアップされたウィンドウの高さ調整を試みる場合は、display-bufferaction引数内の行数に対応する指定をオーバーライドする、行数“5”へのセットを試みることに注意してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.14 Additional Options for Displaying Buffers

display-bufferの標準のディスプレイアクション(see section Choosing a Window for Display)は、さまざまなユーザーオプションにより変更が可能です。

User Option: pop-up-windows

この変数の値が非nilの場合、display-bufferは表示のために既存のバッファーを分割して新たなウィンドウの作成を許される。

この変数は、主に後方互換のために提供される。値がnilのときは、アクション関数display-buffer-pop-up-window(Action Functions for display-bufferを参照)を呼び出すだけのdisplay-buffer-fallback-action内の特別なメカニズムを経由して、display-bufferにしたがう。この変数は、display-buffer-alist等により直接指定できる、display-buffer-pop-up-window自体からは参照されない。

User Option: split-window-preferred-function

この変数は、バッファーを表示する新たなウィンドウを作成するための、ウィンドウを分割する関数を指定する。これは、実際にウィンドウを分割するために、アクション関数display-buffer-pop-up-windowにより使用される(Action Functions for display-bufferを参照)。

デフォルト値はsplit-window-sensiblyで、これは以下で記述する。値は、ウィンドウを引数とする関数でなければならず、(要求されたバッファーを表示するために使用されるであろう)新たなウィンドウ、またはnil(分割の失敗を意味する)をリターンしなければならない。

Function: split-window-sensibly window

この関数は、windowを分割して、新たに作成したウィンドウをリターンする。windowを分割できなければ、nilをリターンする。

この関数は、ウィンドウが分割できるかどうか判断する際の、通常のルールにしたがう(Splitting Windowsを参照)。最初にまず、split-height-threshold(以下参照)、およびその他が課す制約の元、新たなウィンドウが下になるように分割を試みる。これが失敗したら、split-width-threshold(以下参照)が課す制約の元、新たなウィンドウが右になるように分割を試みる。これが失敗して、かつそのウィンドウがそのフレームの唯一のウィンドウの場合、この関数はsplit-height-thresholdを無視して、新たなウィンドウが下になるよう、再度分割を試みる。これも同様に失敗したら、この関数は諦めてnilをリターンする。

User Option: split-height-threshold

これはsplit-window-sensiblyにより使用される変数であり、ウィンドウを分割して新たなウィンドウを下に配置するかどうかを指定する。整数の場合は、元のウィンドウが最低でもその行数なければ分割しないことを意味する。nilの場合は、この方法では分割しないことを意味する。

User Option: split-width-threshold

これはsplit-window-sensiblyにより使用される変数であり、ウィンドウを分割して新たなウィンドウを右に配置するかどうかを指定する。整数の場合は、元のウィンドウが最低でもその列数なければ分割しないことを意味する。nilの場合は、この方法では分割しないことを意味する。

User Option: pop-up-frames

この変数の値が非nilの場合、新たにフレームを作成することによりdisplay-bufferがバッファーを表示できることを意味する。デフォルトはnil

nil値は、display-bufferがすでにbuffer-or-nameを表示しているウィンドウを探す際に、選択されたフレームだけでなく、可視およびアイコン化されたフレームを検索できることも意味する。

この変数は主に、後方互換のために提供されている。値が非nilのときは、アクション関数display-buffer-pop-up-frame(Action Functions for display-bufferを参照)を呼び出すだけのdisplay-buffer-fallback-action内の特別なメカニズムを経由して、display-bufferにしたがう。この変数は、display-buffer-alist等により直接指定できる、display-buffer-pop-up-window自体からは参照されない(これはウィンドウの分割前に行われる)。この変数は、display-buffer-alist等により直接指定できる、display-buffer-pop-up-frame自体からは参照されない。

User Option: pop-up-frame-function

この変数は、バッファーを表示する新たなウィンドウを作成するための、フレームを作成する関数を指定する。これは、アクション関数display-buffer-pop-up-frameにより使用される(Action Functions for display-bufferを参照)。

値は、フレームまたはフレームを作成できなかった場合はnilをリターンする、引数をとらない関数であること。デフォルト値は、pop-up-frame-alist(以下参照)により指定されるパラメーターを使用してフレームを作成する関数である。

User Option: pop-up-frame-alist

この変数は、フレームを新たに作成するためのpop-up-frame-functionのデフォルト関数により使用される、フレームパラメーター(Frame Parametersを参照)のalistを保持する。デフォルトはnil

User Option: same-window-buffer-names

選択されたウィンドウ内に表示されるべきバッファー名のリスト。このリスト内にバッファーの名前がある場合、display-bufferは選択されたウィンドウ内にそのバッファーを表示することにより、そのバッファーを処理する。

User Option: same-window-regexps

選択されたウィンドウ内に表示されるバッファーを指定する、正規表現のリスト。バッファー名がこのリスト内の正規表現のいずれかにマッチする場合、display-bufferは選択されたウィンドウ内にそのバッファーを表示することにより、そのバッファーを処理する。

Function: same-window-p buffer-name

この関数は、buffer-nameという名前のバッファーをdisplay-bufferで表示する場合、それが選択されたウィンドウ内に表示されるバッファーならtをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.15 Window History

ウィンドウはそれぞれ、リスト内に以前表示されていたバッファーと、それらのバッファーがウィンドウから削除された順序を記憶しています。このヒストリーが、たとえばreplace-buffer-in-windows(Buffers and Windowsを参照)により使用されます。このリストはEmacsにより自動的に保守されますが、これを明示的に調べたり変更するために、以下の関数を使用できます:

Function: window-prev-buffers &optional window

この関数は、windowの前のコンテンツを指定するリストをリターンする。オプション引数windowには生きたウィンドウを指定すべきであり、デフォルトは選択されたウィンドウである。

リスト要素はそれぞれ、(buffer window-start window-pos)という形式をもつ。ここでbufferは、そのウィンドウで前に表示されていたウィンドウ、window-startはそのバッファーが最後に表示されていたときのウィンドウのスタート位置(The Window Start and End Positionsを参照)、window-poswindow内にそのバッファーが最後に表示されていたときのポイント位置(Windows and Pointを参照)である。

このリストは順序付きで、より前の要素がより最近に表示されたバッファーに対応しており、通常は最初の要素がそのウィンドウからもっとも最近削除されたバッファーに対応する。

Function: set-window-prev-buffers window prev-buffers

この関数は、windowの前のバッファーを、prev-buffersの値にセットする。引数windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。引数prev-buffersは、window-prev-buffersによりリターンされるリストと同じ形式であること。

これらに加えて、それぞれのバッファーは次バッファー(next buffers)のリストを保守します。これはswitch-to-prev-buffer(以下参照)により再表示されたバッファーのリストです。このリストは主に、切り替えるバッファーを選択するために、switch-to-prev-bufferswitch-to-next-bufferにより使用されます。

Function: window-next-buffers &optional window

この関数は、switch-to-prev-bufferを通じてwindow内に最近表示されたバッファーのリストをリターンする。window引数は、生きたウィンドウかnil(選択されたウィンドウの意)でなければならない。

Function: set-window-next-buffers window next-buffers

この関数は、windowの次バッファーリストを、next-buffersにセットする。window引数は、生きたウィンドウかnil(選択されたウィンドウの意)であること。引数next-buffersは、バッファーのリストであること。

以下のコマンドは、bury-bufferunbury-bufferのように、グローバルバッファーリストを巡回するために使用できます。ただし、これらはグローバルバッファーリストではなく、指定されたウィンドウのヒストリーリストのしたがって巡回します。それに加えて、これらはウィンドウ固有なウィンドウのスタート位置とポイント位置をリストアし、すでに他のウィンドウに表示されているバッファーをも表示できます。特にswitch-to-prev-bufferコマンドは、ウィンドウにたいする置き換えバッファーを探すためにreplace-buffer-in-windowsbury-bufferquit-windowにより使用されます。

Command: switch-to-prev-buffer &optional window bury-or-kill

このコマンドは、window内に前のバッファーを表示する。引数windowは生きたウィンドウ、またはnil(選択されたウィンドウの意)であること。オプション引数bury-or-killが非nil、それはwindow内にカレントで表示されているバッファーは今まさにバリーもしくはkillされるバッファーであり、したがって将来におけるこのコマンドの呼び出しで、このバッファーに切り替えるべきではないことを意味する。

前のバッファーは通常、window内にカレントで表示されているバッファーの前に表示されていたバッファーである。しかし、バリーまたはkillされたバッファー、または直近のswitch-to-prev-buffer呼び出しですでに表示されたバッファーは、前のバッファーとして適格とはならない。

このコマンドを繰り返して呼び出すことにより、window内で前に表示されたすべてのバッファーが表示されてしまった場合、将来の呼び出しにおいては、windowが表示されているフレームのバッファーリスト(The Buffer Listを参照)から、そのフレームの他のウィンドウで表示済みのバッファーをスキップするようにして、バッファーを表示するだろう。

Command: switch-to-next-buffer &optional window

このコマンドは、window内の次バッファーに切り替える。つまり、window内での最後のswitch-to-prev-bufferコマンドの効果をアンドゥする。引数windowは生きたウィンドウであること。デフォルトは選択されたウィンドウである。

アンドゥ可能なswitch-to-prev-bufferの直近の呼び出しが存在しない場合、この関数はwindowが表示されているフレームのバッファーリスト(The Buffer Listを参照)からバッファーの表示を試みる。

デフォルトでは、switch-to-prev-bufferswitch-to-next-bufferは、同一フレーム上の他のウィンドウで表示済みのバッファーに切り替えることができます。以下のオプションは、この挙動をオーバーライドするために使用できます。

User Option: switch-to-visible-buffer

この変数が非nilの場合、switch-to-prev-bufferおよびswitch-to-next-bufferは、そのバッファーが当該ウィンドウで過去に表示されていれば、同一フレーム上ですでに可視のバッファーに切り替えることができる。nilの場合、switch-to-prev-bufferおよびswitch-to-next-bufferは、同一フレーム上ですでに可視なバッファーへの切り替えを常に避けるよう試みる。デフォルトはt


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.16 Dedicated Windows

バッファーを表示する関数は、特定のウィンドウが、そのウィンドウのバッファーにたいして専用(dedicated)であるとマークすることにより、使用しないよう告げることができます。display-buffer(Choosing a Window for Displayを参照)は、他のバッファーの表示に、専用バッファーを決して使用しません。 and get-largest-window(see section Cyclic Ordering of Windows)は、dedicated引数が非nilのときは、専用ウィンドウを候補とみなしません。専用ウィンドウにたいする配慮に関して、set-window-buffer(Buffers and Windowsを参照)の挙動は若干異なります。以下を参照してください。

ウィンドウからバッファー、およびフレームからウィンドウを削除することを意図した関数は、処理するウィンドウが専用ウィンドウのときは特別な挙動を示す可能性があります。ここでは3つの基本ケース、すなわち(1)そのウィンドウがフレーム上で唯一のウィンドウの場合、(2)ウィンドウはフレーム上で唯一のウィンドウだが同一端末上に別のフレームがある場合、(3)そのウィンドウが同一端末上で唯一のフレームの唯一のウィンドウの場合、を明確に区別することにします。

特に、delete-windows-on(Deleting Windowsを参照)は関連するフレームを削除する際にケース(2)を、フレーム上で唯一のウィンドウに他のバッファーを表示する際にケース(3)を処理します。バッファーがkillされる際に呼び出される関数replace-buffer-in-windows(see section Buffers and Windows)は、ケース(1)ではウィンドウを削除して、それ以外ではdelete-windows-onのように振る舞います。

bury-buffer(The Buffer Listを参照)が選択されたウィンドウを操作する際は、選択されたフレームを処理するために、frame-auto-hide-function(Quitting Windowsを参照)を呼び出すことにより、ケース(2)を取り扱います。他の2つのケースは、replace-buffer-in-windowsと同様に処理されます。

Function: window-dedicated-p &optional window

この関数は、windowがそのバッファーにたいして専用なら非nil、それ以外はnilをリターンする。より正確には、最後のset-window-dedicated-p呼び出しで割り当てられた値、またはset-window-dedicated-pwindowを引数として呼び出されたことがない場合はnilがリターン値となる。windowのデフォルトは、選択されたウィンドウである。

Function: set-window-dedicated-p window flag

この関数は、flagが非nilならwindowがそのバッファーに専用とマークし、それ以外は非専用とマークする。

特別なケースとして、flagtの場合、windowはそのバッファーにたいして特に専用(strongly dedicated)となる。set-window-bufferは、処理対象のウィンドウが特に専用のウィンドウで、かつ表示を要求されたバッファーが表示済みでない場合は、エラーをシグナルする。その他の関数は、tを他の非nil値と区別して扱わない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.17 Quitting Windows

バッファーを表示するために使用しているウィンドウを削除したいときは、フレームからそのウィンドウを削除するために、delete-windowdelete-windows-onを呼び出すことができます(Deleting Windowsを参照)。その、が別フレームで表示されているときは、かわりにdelete-frameを呼び出したいと思うかもしれません(Deleting Framesを参照)。一方で、そのバッファーを表示するためにウィンドウが再利用されている場合は、関数switch-to-prev-bufferを呼び出して、前に表示されていたバッファーを表示したいと思うかもしれません(Window Historyを参照)。最終的には、そのウィンドウのバッファーをバリー(The Buffer Listを参照)、またはkill(Killing Buffersを参照)したいと思うかもしれません。

以下のコマンドは、ウィンドウがバッファーを表示する方法を最初に入手する情報を使用して、上述した説明の自動化を試みます。

Command: quit-window &optional kill window

このコマンドは、windowをquitして、そのバッファーをバリーする。引数windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。プレフィックス引数killが非nilなら、バッファーをバリーするかわりにkillする。これは、ウィンドウとそのバッファーを処理するために、次に説明する関数quit-restore-windowを呼び出す。

Function: quit-restore-window &optional window bury-or-kill

この関数は、windowにたいして、そのバッファーが表示される前に存在した状態へのリストアを試みる。オプション引数windowは生きたウィンドウでなければならず、デフォルトは選択されたウィンドウである。

windowがそのバッファーを表示するために特別に作成されたバッファーの場合、この関数はそのフレームに他に少なくとも1つの生きたウィンドウがなければ、windowを削除しない。windowがそのフレームで唯一のウィンドウであり、かつそのフレームの端末上に他のフレームが存在する場合、オプション引数bury-or-killがそのウィンドウをどうするかを決定する。If equals killの場合は、無条件でフレームは削除される。それ以外では、フレームの運命はそのフレームを単一の引数とするframe-auto-hide-function(以下参照)呼び出しにより決定される。

特別に作成されたウィンドウでない場合、この関数はwindow内で前に表示されていたバッファーの再表示を試みる。これは、前に表示されていたバッファーのウィンドウのスタート位置(The Window Start and End Positionsを参照)とポイント位置(Windows and Pointを参照)のリストアも試みる。加えて、windowのバッファーが過去に一時的にリサイズされていた場合、この関数はwindowの元の高さのリストアも試みる。

これまで説明したケースでは、window内で表示されているバッファーは、依然としてそのウィンドウにたいする最後のバッファー表示関数で表示されたバッファーである。その時点で他のバッファーが表示されている、または前に表示されていたバッファーがもはや存在しない場合、この関数はかわりに何か他のバッファーを表示するために、switch-to-prev-buffer(Window Historyを参照)を呼び出す。

オプション引数bury-or-killは、windowを処理する方法を指定し、以下の値を処理する。

nil

これは、バッファーを特別な方法で処理しないことを意味する。結果、windowが削除されない場合は、switch-to-prev-bufferの呼び出しにより、通常はそのバッファーが再び表示されるだろう。

append

これは、windowが削除されない場合、そのバッファーをwindowの前のバッファーリストの最後に移動するので、将来のswitch-to-prev-buffer呼び出しでこのバッファーには切り替わることは少なくなる。これは、そのバッファーをフレームのバッファーリストの最後への移動も行う。

bury

これは、windowが削除されない場合、そのバッファーをwindowの前のバッファーリストから削除する。これは、そのバッファーをフレームのバッファーリストの最後への移動も行う。この値は、バッファーをkillすることなくswitch-to-prev-bufferがこのバッファーに再び切り替えさせないようにする、もっとも信頼できる解決手段を提供する。

kill

これは、windowのバッファーをkillすることを意味する。

quit-restore-windowは、windowquit-restoreウィンドウパラメーター(Window Parametersを参照)の情報にもとづき判定を行い、処理後にそれをnilにリセットしている。

以下のオプションは、quitすべきウィンドウ、あるいはバリーすべきバッファーをもつウィンドウを1つだけ含むフレームを処理する方法を指定します。

User Option: frame-auto-hide-function

このオプションで指定された関数は、自動的にフレームを隠すために呼び出される。この関数は、フレームを唯一の引数として呼び出される。

ここで指定される関数は、選択されたウィンドウが専用(dedicated)で、かつバリーされるバッファーを表示しているときに、bury-buffer(The Buffer Listを参照)から呼び出される。また、quitされるウィンドウのフレームが、そのウィンドウのバッファーを表示するために特別に作成されたフレームで、かつそのバッファーがkillされないときにも、quit-restore-window(上記)から呼び出される。

デフォルトでは、iconify-frame(Visibility of Framesを参照)を呼び出す。かわりに、フレームをディスプレイから削除するdelete-frame(Deleting Framesを参照)、フレームを変更せずに残すignore、またはフレームを唯一の引数とする任意の関数のいずれかを指定できる。

このオプションで指定された関数は、指定されたフレームが生きたウィンドウただ1つを含み、かつ同一端末上に少なくとも1つ他のフレームが存在する場合のみ呼び出されることに注意。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.18 Windows and Point

それぞれのウィンドウは独自のポイント値(Pointを参照)をもっており、同じバッファーを表示する他のウィンドウの間でも、それぞれのポイント値は独立しています。これは、1つのバッファーを複数ウィンドウで表示するのに有用です。

ユーザーが関与し続ける限りポイントはカーソル位置にあり、ユーザーが他のバッファーに切り替えた際には、カーソルはそのバッファーのポイント位置にジャンプします。

Function: window-point &optional window

この関数は、window内のカレントのポイント位置をリターンする。選択されていないウィンドウにたいしては、そのウィンドウが選択された場合の、(そのウィンドウのバッファーの)ポイント値である。windowにたいするデフォルトは、選択されたウィンドウである。

windowが選択されたウィンドウのときのリターン値は、そのウィンドウのバッファーのポイント値である。厳密には、すべてのsave-excursionフォームの外側の“トップレベル”のポイント値のほうが、より正確であろう。しかし、この値は見つかるのが困難である。

Function: set-window-point window position

この関数は、window内のポイントを、windowのバッファー内の位置positionに配置する。リターン値はpositionである。

windowが選択されている場合は、単にwindow内でgoto-charを行う。

Variable: window-point-insertion-type

この変数は、window-pointのマーカー挿入型(Marker Insertion Typesを参照)を指定する。デフォルトはnilで、window-pointは挿入されたテキストの後に留まるだろう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.19 The Window Start and End Positions

ウィンドウはそれぞれ、バッファー位置を追跡するために、バッファー内で表示を開始すべき位置を指定するマーカーを保守しています。この位置は、そのウィンドウのdisplay-start(表示開始)、または単にstart(開始)と呼ばれます。この位置の後の文字が、ウィンドウの左上隅に表示される文字となります。これは通常はテキスト行の先頭になりますが、必須ではありません。

ウィンドウやバッファーを切り替えた後、およびいくつかのケースにおいては、ウィンドウが行の途中で開始される場合は、Emacsがィンドウの開始を行の開始に調整します。これは、行中で無意味な位置のウィンドウ開始のまま、特定の操作が行われるのを防ぐためです。この機能は、Lispモードのコマンドを使用して実行することによりある種のLispコードをテストする場合は、それらのコマンドがこの再調整を誘発するために邪魔になるかもしれません。そのようなコードをテストするためには、それをコマンド内に記述して、何らかのキーにバインドしてください。

Function: window-start &optional window

この関数は、ウィンドウwindowの表示開始位置をリターンする。windownilなら、選択されたウィンドウが使用される。

ウィンドウを作成したり、他のバッファーをウィンドウ内に表示する際、display-start位置は同じバッファーにたいしてもっとも最近に使用されたdisplay-start位置か、そのバッファーがそれをもたなければpoint-minにセットされる。

ポイントがスクリーン上に確実に現れるように、再表示はwindow-start位置を更新する(前の再表示以降にwindow-start位置を明示的に指定していない場合)。再表示以外に、window-start位置を自動的に変更するものはない。ポイントを移動した場合は、次の再表示後までポイントの移動に応じてwindow-startが変更されるのを期待してはならない。

Function: window-end &optional window update

この関数は、windowのバッファーの最後を表示する位置をリターンする。windowにたいするデフォルトは、選択されたウィンドウである。

バッファーテキストの単なる変更やポイントの移動では、window-endがリターンする値は更新されない。この値は、Emacsが再表示を行い、それが妨害されることなく再表示が完了したときのみ更新される。

windowの最後の再表示が妨害されて完了しなかった場合、Emacsはそのウィンドウ内の表示のend位置を知らない。この場合、関数はnilをリターンする。

updateが非nilの場合、window-endwindow-startのカレント値にもとづき、どこが表示のendかにたいして最新の値をリターンする。以前に保存された位置の値がまだ有効なら、window-endはその値をリターンする。それ以外は、バッファーのテキストをスキャンして、正しい値を計算する。

たとえupdateが非nilでも、window-endはポイントが画面外に移動していても、実際の再表示が行うような表示のスクロールを試みない。これは、window-startの値を変更しない。これは実際には、スクロールが要求されない場合の表示されたテキストのendがどこかを報告する。

Function: set-window-start window position &optional noforce

この関数は、windowのdisplay-start位置を、windowのバッファーのpositionにセットする。リターン値は、positionである。

表示ルーチンは、バッファーが表示されたときに、ポイント位置が可視になることを強要する。通常これらは、ポイントを可視にするために必要なときは常に、display-start位置を変更(つまりウィンドウをスクロール)する。しかし、この関数でnoforcenilを使用してstart位置を指定した場合は、たとえポイントを画面外になるような場所に配したとしても、positionでの表示開始を望んでいることを意味する。これによりポイントが画面外に配された場合、表示ルーチンはポイントをウィンドウ内の中央行の左マージンに移動する。

たとえば、ポイントが1のときにウィンドウのstartを次行の開始37にセットした場合、ポイントはウィンドウの最上端の“上”になるだろう。表示ルーチンは、再表示が発生したときにポイントが1のままなら、ポイントを動かすことになる。以下に例を示す:

;; 以下は式set-window-start実行前
;;   fooの様子である

---------- Buffer: foo ----------
∗This is the contents of buffer foo.
2
3
4
5
6
---------- Buffer: foo ----------

(set-window-start
 (selected-window)
 (save-excursion
   (goto-char 1)
   (forward-line 1)
   (point)))
⇒ 37

;; 以下は式set-window-start実行後の
;;   foo’の様子である
---------- Buffer: foo ----------
2
3
∗4
5
6
---------- Buffer: foo ----------

noforceが非nilで、かつ次回の再表示でポイントが画面外に配される場合、再表示はポイントと協調して機能する位置となるような新たなwindow-startを計算するので、positionは使用されない。

Function: pos-visible-in-window-p &optional position window partially

この関数は、window内のpositionが画面上カレントで可視のテキスト範囲内にある場合は、非nilをリターンし、positionが表示範囲のスクロール外にある場合は、nilをリターンする。partiallynilなら、部分的に不明瞭な位置は可視とは判断されない。引数positionのデフォルトは、window内のポイントのカレント位置で、windowのデフォルトは選択されたウィンドウである。positiontなら、それはwindowの最後に可視だった位置をチェックすることを意味する。

この関数は、垂直スクロールだけを考慮する。 This function considers only vertical scrolling. windowが水平にスクロールされたことだけの理由でpositionが表示範囲外の場合は、いずれにせよpos-visible-in-window-pは非nilをリターンする。Horizontal Scrollingを参照のこと。

positionが可視でpartiallynilなら、pos-visible-in-window-ptをリターンする。partiallyが非nilposition以降の文字が完全に可視の場合は、(x y)という形式のリストをリターンする。ここでxyは、ウィンドウの左上隅からの相対的なピクセル座標である。position以降の文字が完全に可視ではない場合は、拡張された形式のリスト(x y rtop rbot rowh vpos)をリターンする。ここでrtoprbotpositionでウィンドウ外となった上端と下端のピクセル数、rowhはその行の可視な部分の高さ、vposはその行の垂直位置(0基準の行番号)を指定する。

以下に例を示す:

;; ポイントが画面外ならrecenterする
(or (pos-visible-in-window-p
     (point) (selected-window))
    (recenter 0))
Function: window-line-height &optional line window

この関数は、window内のテキスト行lineの高さをリターンする。lineheader-linemode-linewindow-line-heightのいずれかの場合は、そのウィンドウの対応する行についての情報をリターンする。それ以外では、lineは0から始まるテキスト行番号である。負数の場合は、そのウィンドウのendから数える。lineにたいするデフォルトは、window内のカレント行、windowにたいするデフォルトは、選択されたウィンドウである。

表示が最新でなければ、window-line-heightnilをリターンする。その場合は、関連する情報を入手するために、pos-visible-in-window-pを使用できる。

指定されたlineに対応する行がなければ、window-line-heightnilをリターンする。それ以外では、リスト(height vpos ypos offbot)をリターンする。ここでheightはその行の可視部分のピクセル高さ、vposyposは最初のテキスト行上端からのその行への相対的な垂直位置の行数とピクセル数、offbotはそのテキスト行下端のウィンドウ外のピクセル数である。(最初の)テキスト行上端にウィンドウ外のピクセルがある場合、yposは負となる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.20 Textual Scrolling

テキスト的なスクロール(textual scrolling)とは、ウィンドウ内のテキストを上や下に移動することを意味します。これは、そのウィンドウのdisplay-startを変更することにより機能します。これは、ポイントを画面上に維持するために、window-pointの値も変更するかもしれません(Windows and Pointを参照)。

テキスト的なスクロールの基本的な関数は、(前方にスクロールする)scroll-upと、(後方にスクロールする)scroll-downです。これらの関数の名前における“up”と“down”は、バッファーテキストのそのウィンドウにたいする相対的な移動方向を示します。そのテキストが長いロール紙に記述されていて、スクロールコマンドはその上を上下に移動すると想像してみてください。つまり、バッファーの中央に注目している場合、繰り返してscroll-downを呼び出すと、最終的にはバッファーの先頭を目にすることになるでしょう。

残念なことに、これは時折混乱を招きます。なぜなら、ある人はこれを逆の慣習にもとづいて考える傾向があるからです。彼らは、テキストがその場所に留まりウィンドウが移動して、“down”コマンドによりバッファー終端に移動するだろうと想像します。この慣習は、そのようなコマンドが現代風のキーボード上のPageDownという名前のキーにバインドされているという事実と一致しています。

選択されたウィンドウ内で表示されているバッファーがカレントバッファーでない場合、(scroll-other-window以外の)テキスト的スクロール関数の結果は予測できません。The Current Bufferを参照してください。

(たとえば大きなイメージがある等で)ウィンドウにウィンドウの高さより高い行が含まれる場合、スクロール関数は部分的に可視な行をスクロールするために、そのウィンドウの垂直スクロール位置を調整します。Lisp呼び出し側は、変数auto-window-vscrollnilにバインドすることにより、この機能を無効にできます(Vertical Fractional Scrollingを参照)。

Command: scroll-up &optional count

この関数は、選択されたウィンドウ内でcount行前方にスクロールする。

count負の場合は、かわりに後方へスクロールする。countnil(または省略)の場合、スクロールされる距離は、そのウィンドウのテキストエリアの高さより小さいnext-screen-context-linesとなる。

選択されたウィンドウがそれ以上スクロールできない場合、この関数はエラーをシグナルし、それ以外はnilをリターンする。

Command: scroll-down &optional count

この関数は、選択されたウィンドウ内でcount行後方にスクロールする。

count負の場合は、かわりに後方へスクロールする。それ以外の点では、これはscroll-upが行うのと同様に振る舞う。

Command: scroll-up-command &optional count

これはscroll-upと同様に振る舞うが、選択されたウィンドウがそれ以上スクロールできず、かつ変数scroll-error-top-bottomの値がtの場合は、かわりにそのバッファーの終端への移動を試みる。ポイントがすでに終端にある場合は、エラーをシグナルする。

Command: scroll-down-command &optional count

これはscroll-downと同様に振る舞うが、選択されたウィンドウがそれ以上スクロールできず、かつ変数scroll-error-top-bottomの値がtの場合は、かわりにそのバッファーの先頭への移動を試みる。ポイントがすでに先頭にある場合は、エラーをシグナルする。

Command: scroll-other-window &optional count

この関数は、他のウィンドウ内のテキストを上方にcount行スクロールする。countが負、またはnilの場合は、scroll-upのように処理される。

変数other-window-scroll-bufferにバッファーをセットすることにより、どのバッファーをスクロールするかを指定できる。そのバッファーが表示されていない場合、scroll-other-windowはそれを何らかのウィンドウに表示する、

選択されたウィンドウがミニバッファーのとき、次ウィンドウは通常はそのウィンドウの直上最左のウィンドウである。変数minibuffer-scroll-windowをセットすることにより、スクロールする別のウィンドウを指定できる。この変数は、ミニバッファー以外のウィンドウが選択されているときは効果がない。これが非nilで、かつミニバッファーが選択されているとき、これはother-window-scroll-bufferより優先される。Definition of minibuffer-scroll-windowを参照のこと。

ミニバッファーがアクティブのとき、選択されたウィンドウが下端右角のウィンドウなら、ミニバッファーが次ウィンドウになる。この場合、scroll-other-windowはミニバッファーのスクロールを試みる。ミニバッファーに含まれるのが1行だけの場合はどこにもスクロールできないので、エコーエリアに瞬時メッセージ‘End of buffer’を表示後、その行を再表示する。

Variable: other-window-scroll-buffer

この変数が非nilなら、それはscroll-other-windowがどのバッファーのウィンドウをスクロールするかを指定する。

User Option: scroll-margin

このオプションは、スクロールマージン(ポイントとウィンドウの上端/下端との最小行数)のサイズを指定する。ポイントがウィンドウの上端/下端からその行数になったとき、再表示は(可能なら)ポイントをそのマージン外、ウィンドウの中央付近に移動するために、テキストを自動的にスクロールする。

User Option: scroll-conservatively

この変数は、ポイントがスクリーン外(またはスクロールマージン内)に移動したとき、スクロールを自動的に行う方法を指定する。値が正の整数nの場合、再表示はそれが正しい表示範囲内にポイントを戻すなら、いずれかの方向にn行以下のテキストをスクロールする。この振る舞いは、保守的なスクロール(conservative scrolling)と呼ばれる。それ以外の場合、スクロールはscroll-up-aggressivelyscroll-down-aggressivelyのような他の変数の制御の下、通常の方法で発生する。

デフォルトの値は0で、これは保守的スクロールが発生し得ないことを意味する。

User Option: scroll-down-aggressively

この変数の値は、nilか、0から1までの小数fであること。これが小数なら、スクリーン上でポイントが置かれたとき、下にスクロールする場所を指定する。より正確には、ポイントがウィンドウstartより上という理由によりウィンドウが下にスクロールされるとき、新たなstart位置はウィンドウ上端からウィンドウ高さのfの箇所にポイントが置かれるように選択される。より大きなfでは、よりaggressive(積極的)にスクロールする。

ポイントを中央に配すのがその効果なので、値nilは.5と等価である。どのような方法によりセットされたときでも、この変数は自動的にバッファーローカルになる。

User Option: scroll-up-aggressively

scroll-up-aggressivelyと同様。値fは、ポイントがウィンドウ下端からどれほどの位置に置かれるべきかを指定する。つまり、scroll-up-aggressivelyと同様、大きな値dwはよりaggressive(積極的)になる。

User Option: scroll-step

この変数は、scroll-conservativelyのより古い変種である。違いは、値がnならn以下の値ではなく、正確にnだけのスクロールを許容することである。この機能は、scroll-marginとは共に機能しない。デフォルトは0。

User Option: scroll-preserve-screen-position

このオプションがtなら、スクロールによりポイントがウィンドウ外に移動したとき、Emacsは常に、ポイントがポイントの上下端ではなくカーソルがそのウィンドウ内の元の垂直位置に保たれるようポイントの調整を試みる。

値が非nilかつ非tの場合、たとえスクロールコマンドによりポイントがウィンドウ外に移動していなくとも、Emacsはカーソルが同じ垂直位置に保たれるよう、ポイントを調整する。

このオプションはシンボルプロパティscroll-commandが非nilであるような、すべてのスクロールコマンドに影響する。

User Option: next-screen-context-lines

この変数の値は、全画面スクロールされたときに残される継続される行数を指定する。たとえば、引数がnilscroll-upは、ウィンドウ上端ではなく下端に残される行数でスクロールする。デフォルト値は2

User Option: scroll-error-top-bottom

このオプションがnil(デフォルト)の場合、それ以上のスクロールが不可能な際に、scroll-up-commandscroll-down-commandは単にエラーをシグナルする。

値がtなら、これらのコマンドはかわりにポイントをバッファーの先頭か終端(スクロール方向に依存する)に移動する。ポイントがすでにその位置にある場合のみ、エラーをシグナルする。

Command: recenter &optional count

この関数は、選択されたウィンドウ内の指定された垂直位置にポイントを表示するように、ウィンドウ内のテキストをスクロールする。これはテキストに応じた“ポイント移動”を行わない。

countが非負の数の場合は、そのウィンドウ上端からcount行下にポイントを含む行を配す。countが負なら、ウィンドウ下端から上に数えるので、-1はそのウィンドウ内で最後の利用可能な行となる。

countnil(または非nilのリスト)の場合、recenterはポイントを含む行をウィンドウの中央に配す。countnilなら、この関数はrecenter-redisplayの値に応じて、フレームを再描画するかもしれない。

recenterがインタラクティブに呼び出されたときは、rawプレフィックス引数がcountとなる。したがって、プレフィックスとしてC-uをタイプするとcountに非nilC-u 4ではcountに4がセットされ、後者ではカレント行を上端から4行目にセットする。

引数0では、recenterはカレント行をウィンドウ上端に配す。コマンドrecenter-top-bottomは、これを達成するためにより簡便な方法を提供する。

User Option: recenter-redisplay

この変数が非nilの場合は、引数nilrecenterを呼び出すことにより、フレームを再描画する。デフォルト値はttyで、これはフレームがttyフレームのときだけフレームを再描画することを意味する。

Command: recenter-top-bottom &optional count

デフォルトではC-lにバインドされているこのコマンドは、recenterと同様に動作するが、引数なしで呼び出されたときの動作が異なる。この場合、連続して呼び出すことにより、変数recenter-positionsで定義されるサイクル順に応じてポイントを配する。

User Option: recenter-positions

これは、recenter-top-bottomを引数なしで呼び出したときの挙動を制御する。デフォルト値は(middle top bottom)で、これは引数なしでrecenter-top-bottomを連続して呼び出すと、ポイントをウィンドウの中央、上端、下端と巡回して配すことを意味する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.21 Vertical Fractional Scrolling

垂直フラクショナルスクロール(vertical fractional scrolling)とは、指定された値を行に乗ずるることによりウィンドウ内のテキストを上下にシフトすることを意味します。ウィンドウはそれぞれ、決して0より小さくなることはない、垂直スクロール位置(vertical scroll position)という数値をもっています。これは、ウィンドウのコンテンツをどこから表示開始(raise)するかを指定します。ウィンドウのコンテンツの表示開始により、一般的には上端の何行かのすべて、または一部が表示されなくなり、他の何行かのすべて、または一部が下端に表示されるようになります。通常の値は0です。

垂直スクロール位置は、通常行の高さ(デフォルトフォントの高さ)の単位で数えられます。したがって、値が.5なら、それはウィンドウのコンテンツが、通常行の半分の高さで上にスクロールされていることを、3.3なら通常行の3倍を若干超える高さで上にスクロールされていることを意味します。

垂直スクロールが覆い隠す(cover)のがどれほどの行断片(fraction of a line)、あるいは行数かは、それらの行に何が含まれるかに依存します。3.3という値が高さが高い行やイメージの一部だけを画面外にスクロールできることもあれば、.5という値が非常に低い高さの行を画面外にスクロールできることもあります。

Function: window-vscroll &optional window pixels-p

この関数は、windowのカレントの垂直スクロール位置をリターンする。windowのデフォルトは、選択されたウィンドウである。pixels-pが非nilの場合、リターン値は通常行高さ単位ではなく、ピクセル単位で測定される。

(window-vscroll)
     ⇒ 0
Function: set-window-vscroll window lines &optional pixels-p

この関数は、windowの垂直スクロール位置をlinesにセットする。windownilなら、選択されたウィンドウが使用される。引数linesは0または正であること。それ以外は0として扱われる。

実際の垂直スクロール位置は、常にピクセルの整数に対応しなければならないため、指定した値はそれに応じて丸められる。

こも丸め結果がリターン値となる。

(set-window-vscroll (selected-window) 1.2)
     ⇒ 1.13

pixels-pが非nilの場合、linesはピクセル数を指定する。この場合、リターン値はlinesである。

Variable: auto-window-vscroll

この変数が非nilなら、関数line-movescroll-upscroll-downは、たとえば大きなイメージが存在する等でウィンドウ高さより高いディスプレイ行をスクロールするために、垂直スクロール位置を自動的に変更するだろう。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.22 Horizontal Scrolling

水平スクロール(horizontal scrolling)とは、指定された通常文字幅の倍数でウィンドウ内のイメージを左右にシフトすることを意味します。ウィンドウはそれぞれ、決して0より小さくなることはない、水平スクロール位置(horizontal scroll position)という数値をもっています。これは、コンテンツをどれほど左にシフトするかを指定します。ウィンドウのコンテンツを左にシフトすることにより、一般的には左にある文字のすべて、または一部が表示されなくなり、右にある文字のすべて、または一部が表示されることを意味します。通常の値は0です。

水平スクロール位置は、通常文字幅を単位として数えられます。したがって値が5なら、それはウィンドウのコンテンツは通常文字幅の5倍左にスクロールされることを意味します。左の何文字が表示されなくなるかは、それらの文字の文字幅とに依存しており、行ごとに異なります。

読み取りを行う際は、“inner loop”で横方向に、“outer loop”で上から下に読み取るため、水平スクロールの効果はテキスト的スクロールや垂直スクロールとは異なります。テキスト的スクロールは表示するためのテキスト範囲の選択を引き起こし、垂直スクロールはウィンドウコンテンツを連続して移動します。しかし、水平スクロールはすべての行の一部をスクリーン外へスクロールします。

通常は、水平スクロールは行われないので、ウィンドウ左端には最左列があります。この状態では、右スクロールにより左端に新たに表示されるデータは存在しないので、右へのスクロールはできません。左スクロールにより、テキストの1列目がウィンドウ端からウィンドウ外にスクロールされ、右端にはその前は切り詰められていた(truncated)列が新たに表示されるので、左へのスクロールはできます。ウィンドウが左へ非0の量を水平スクロールされていれば、右スクロールしてそれを戻すことができますが、正味の水平スクロールが0に減少するまでの間のみ、右スクロールができます。左へどれほどスクロールできるかに制限はありませんが、最終的にはすべてのテキストが左端の外に消えるでしょう。

auto-hscroll-modeがセットされている場合、再表示はポイントが常に可視となることを保証するために、必要に応じて水平スクロールを自動的に変更する。とはいえ、依然として水平スクロール位置を明示的に指定するのは可能である。指定した値は、自動スクロールの下限値としての役目を果たす(自動スクロールは指定された値より小さい列にウィンドウをスクロールしない)。

Command: scroll-left &optional count set-minimum

この関数は、選択されたウィンドウを左(countが負なら右)にcount列スクロールする。countのデフォルトはウィンドウ幅から2を減じた値である。

リターン値は、window-hscroll(以下参照)がリターンする値と同様、変更後に実際に左に水平スクロールされたトータル量である。

ウィンドウを可能な限り右にスクロールした後は、左スクロールの合計が0であるような通常の位置に戻り、右へのそれ以上のスクロールの試みは効果をもたない。

set-minimumが非nilの場合、新たなスクロール量は自動スクロールの下限値となる。つまり自動スクロールは、この関数がリターンする値より小さい列にウィンドウをスクロールしないだろう。インタラクティブに呼び出すと、set-minimumに非nilを渡す。

Command: scroll-right &optional count set-minimum

この関数は、選択されたウィンドウを右(countが負なら左)にcount列スクロールする。countのデフォルトはウィンドウ幅から2を減じた値である。スクロール方向を除けば、これはscroll-leftと同様に機能する。

Function: window-hscroll &optional window

この関数は、windowの左への水平スクロールのトータル(左マージンを超えて左にスクロールされたwindow内のテキスト列数)をリターンする。windowのデフォルトは、選択されたウィンドウである。

リターン値が負になることは決してない。windowで水平スクロールが行われていない場合(これが通常)、リターン値は0である。

(window-hscroll)
     ⇒ 0
(scroll-left 5)
     ⇒ 5
(window-hscroll)
     ⇒ 5
Function: set-window-hscroll window columns

この関数は、windowの水平スクロールをセットする。columnsの値は、スクロール量を左マージンからの列数で指定する。引数columnsは0または正の数であること。そうでない場合は、0とみなされる。小数値のcolumnsは、現在のところサポートされない。

シンプルにM-:を呼び出して評価する方法でテストした場合は、set-window-hscrollが機能していないように見えるかもしれないことに注意されたい。何が発生しているかというと、この関数は水平スクロール値をセットしてリターンするが、その後にポイントを可視にするために水平スクロールを調整するよう再表示が行なわれ、これが関数の行った処理をオーバーライドしている。この関数の効果は、左マージンからポイントまでのスクロール量が、ポイントが可視のまま留まるように関数を呼び出すことにより観察できる。

リターン値はcolumnsである。

(set-window-hscroll (selected-window) 10)
     ⇒ 10

以下は、与えられた位置positionが水平スクロールによりスクリーン外にあるかどうかを判断する例です:

(defun hscroll-on-screen (window position)
  (save-excursion
    (goto-char position)
    (and
     (>= (- (current-column) (window-hscroll window)) 0)
     (< (- (current-column) (window-hscroll window))
        (window-width window)))))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.23 Coordinates and Windows

このセクションでは、ウィンドウの位置を報告する関数を説明します。これらの関数のほとんどは、そのウィンドウのフレームから相対的な位置を報告します。この場合の座標原点‘(0,0)’は、そのフレームの左上隅付近になります。技術的な理由から、グラフィカルなディスプレイ上では、原点はスクリーン上のグラフィカルなウィンドウの左上隅に正確には配置されません。EmacsがGTK+とともにビルドされた場合、原点は(Emacsではなくウィンドウマネージャーおよび/またはGTK+により描画される)タイトルバー、GTK+メニューバー、ツールバーの下のEmacsウィンドウ表示に使用されるフレーム領域の左上隅になります。しかし、GTK+なしでEmacsがビルドされた場合の原点は、ツールバーの左上隅になります(この場合はEmacs自身がツールバーを描画する)。どちらの場合も、X座標とY座標は、右または下に行くにつれ増加します。

注記された箇所を除き、X座標とY座標は整数の文字単位(行数と列数)で報告されます。グラフィカルなディスプレイ上では、“行”と“列”はそれぞれ、そのフレームのデフォルトフォントにより指定される、デフォルト文字の高さと幅に対応します。

Function: window-edges &optional window

この関数は、window端の座標のリストをリターンする。If windowが省略またはnilの場合のデフォルトは、選択されたウィンドウである。

リターン値は、(left top right bottom)という形式をもつ。リストの要素は順に、そのウィンドウにより占有される最左列のX座標、最上行のY座標、最右列より1列右のX座標、最下行より1行下のY座標である。

これらは、ヘッダーライン、モードライン、スクロールバー、ウィンドウディバイダー、ディスプレイマージンを含む、ウィンドウの実際の外端であることに注意。テキスト端末では、そのウィンドウの右に隣接するウィンドウがある場合、ウィンドウの右端にはそのウィンドウと隣接するウィンドウの間のセパレーターラインが含まれる。

Function: window-inside-edges &optional window

この関数はwindow-edgesと似ているが、そのウィンドウのテキストエリア端の値をリターンする。これらからはヘッダーライン、モードライン、スクロールバー、フリンジ、ウィンドウディバイダー、ディスプレイマージン、垂直セパレーターは除外される。

Function: window-top-line &optional window

この関数は、windowの最上行のY座標をリターンする。これはwindow-edgesによりリターンされるリストのtopエントリーと等価である。

Function: window-left-column &optional window

この関数は、windowの最左列のX座標をリターンする。これはwindow-edgesによりリターンされるリストのleftエントリーと等価である。

以下の関数は、フレーム相対座標(frame-relative coordinates)のセットからウィンドウへの関連付けに使用できます:

Function: window-at x y &optional frame

この関数は、フレームframe上の、フレーム相対座標xyにある生きたウィンドウをリターンする。その位置にウィンドウがなければ、nilをリターンする。frameが省略またはnilの場合のデフォルトは、選択されたフレームである。

Function: coordinates-in-window-p coordinates window

この関数は、ウィンドウwindowがフレーム相対座標coordinatesを占有するかどうかをチェックし、もしそうならウィンドウのどの部分かをチェックする。windowは生きたウィンドウであること。coordinates(x . y)という形式であるべきで、xyはフレーム相対座標であること。

指定された位置にウィンドウが存在しない場合、リターン値はnilである。それ以外では、リターン値は以下のいずれかになる:

(relx . rely)

その座標はwindow内にある。数値relxrelyは、指定された位置にたいするウィンドウ左上隅を原点に0から数えたウィンドウ相対座標と等価である。

mode-line

その座標はwindowのモードライン内にある。

header-line

その座標はwindowのヘッダーライン内にある。

right-divider

その座標はwindowと右に隣接するウィンドウを分けるディバイダー内にある。

right-divider

その座標はwindowと下にあるウィンドウを分けるディバイダー内にある。

vertical-line

その座標はwindowと右に隣接するウィンドウを分ける垂直ライン内にある。この値は、ウィンドウにスクロールバーがないときのみ発生し得る。スクロールバー内の位置は、これらの目的にたいしてはウィンドウ外と判断される。

left-fringe
right-fringe

その座標はウィンドウの左か右のフリンジ内にある。

left-margin
right-margin

その座標はウィンドウの左か右のマージン内にある。

nil

その座標は、windowのいずれの部分でもない。

関数coordinates-in-window-pwindowのあるフレームを使用するので、引数としてフレームを要求しない。

以下の関数は、文字単位ではなくピクセル単位でウィンドウ位置をリターンします。主にグラフィカルなディスプレイで有用ですが、テキスト端末上でも呼び出すことができ、その場合は各文字の占めるスクリーン領域が“1ピクセル”となります。

Function: window-pixel-edges &optional window

この関数は、window端のピクセル座標のリストをリターンする。windowが省略またはnilの場合のデフォルトは、選択されたウィンドウである。

リターン値は(left top right bottom)という形式をもつ。リストの要素は順にウィンドウ左端のXピクセル座標、上端のYピクセル座標、右端のXピクセル座標+1、下端のYピクセル座標+1である。

Function: window-inside-pixel-edges &optional window

この関数はwindow-pixel-edgesと同様だが、ウィンドウ端のピクセル座標ではなく、ウィンドウのテキストエリア端のピクセル座標をリターンする。windowには生きたウィンドウを指定しなければならない。

以下の関数は、フレームではなく、ディスプレイ画面(display screen)に相対的なウィンドウ位置をピクセルでリターンする。

Function: window-absolute-pixel-edges &optional window

この関数はwindow-pixel-edgesと同様だが、ディスプレイ画面の左上隅からの相対ピクセル座標でウィンドウ端の座標をリターンする。

Function: window-inside-absolute-pixel-edges &optional window

この関数はwindow-inside-pixel-edgesと同様だが、ディスプレイ画面の左上隅からの相対ピクセル座標でウィンドウのテキストエリア端の座標をリターンする。windowには生きたウィンドウを指定しなければならない。

Function: window-pixel-left &optional window

この関数は、ウィンドウwindowの左端のピクセルをリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウである。

Function: window-pixel-top &optional window

この関数は、ウィンドウwindowの上端のピクセルをリターンする。windowは有効なウィンドウでなければならず、デフォルトは選択されたウィンドウである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.24 Window Configurations

ウィンドウ構成(window configuration)とは1つのフレーム上全体のレイアウト — すべてのウィンドウ、およびそれらのサイズ、どんなバッファーを含んでいるか、それらのバッファーがスクロールされる方法、ポイント値とマーク値を記録し、フリンジ、マージン、スクロールバーのセッティングも記録します。これにはminibuffer-scroll-windowの値も含まれます。特別な例外として、ウィンドウ構成には選択されたウィンドウのカレントバッファーのポイント値は記録されません。

以前に保存されたウィンドウ構成をリストアすることにより、フレーム全体のレイアウトを取り戻すことができます。1つだけではなくすべてのフレームのレイアウトを記録したい場合は、ウィンドウ構成のかわりに、フレーム構成(frame configuration)を使用します。Frame Configurationsを参照してください。

Function: current-window-configuration &optional frame

この関数は、frameのカレントのウィンドウ構成を表す新たなオブジェクトをリターンする。frameのデフォルトは選択されたフレームである。変数window-persistent-parametersは、この関数により保存されるウィンドウパラメーター(もしあれば)を指定する。Window Parametersを参照のこと。

Function: set-window-configuration configuration

この関数は、configurationが作成されたフレームにたいして、ウィンドウとバッファーの構成をconfigurationで指定された構成にリストアする。

引数configurationは、以前にcurrent-window-configurationがリターンした値でなければならない。この構成は、そのフレームが選択されているか否かに関わらず、configurationが作成時のフレームから、当該フレームにリストアされる。これは常にウィンドウのサイズ変更とみなされ、window-size-change-functions(Hooks for Window Scrolling and Changesを参照)の実行をトリガーする。なぜなら、set-window-configurationは、新たな構成が古い構成と実際に異なるかを示す方法を知らないからである。

configurationが保存されたフレームが死んでいる(生きていない)場合、この関数が行うのは3つの変数window-min-heightwindow-min-widthminibuffer-scroll-windowのリストアだけである。この場合、関数はnilをリターンし、それ以外はtをリターンする。

以下は、save-window-excursionと同様な効果を得るためにこの関数を使用する例である:

(let ((config (current-window-configuration)))
  (unwind-protect
      (progn (split-window-below nil)
             …)
    (set-window-configuration config)))
Macro: save-window-excursion forms…

このマクロは、選択されたフレームのウィンドウ構成を記録して、formsを順に実行してから、以前のウィンドウ構成をリストアする。リターン値は、forms内の最後のフォームの値である。

Lispコードのほとんどは、このマクロを使用すべきではない。大抵はsave-selected-windowで十分である。特に、このマクロはforms内で新たなウィンドウをオープンするコードを確実に防ぐことができず、新たなウィンドウは別のフレーム内でオープンされるかもしれないが(Choosing a Window for Displayを参照)、save-window-excursionが保存およびリストアするのは、カレントフレーム上のウィンドウ構成だけだからである。

このマクロをwindow-size-change-functions内で使用してはならない。このマクロをexitすることによりwindow-size-change-functionsの実行がトリガーされるが、これは無限ループを引き起こす。

Function: window-configuration-p object

この関数は、objectがウィンドウ構成ならtをリターンする。

Function: compare-window-configurations config1 config2

この関数は、ポイント値、マーク値、保存されたスクロール位置を無視して(これらの観点が異なってもtをリターンし得る)、ウィンドウ構造の観点から2つのウィンドウ構成を比較する。

関数equalも2つのウィンドウ構成を比較できる。これはすべての点から、たとえ1つでも異なるものがあれば等しい構成とはみなさず、たとえ保存されたポイント値やマーク値が異なるだけでも、等しくないとみなす。

Function: window-configuration-frame config

この関数は、ウィンドウ構成configが作成されたフレームをリターンする。

ウィンドウ構成の内部を調べる他のプリミティブも有用かもしれませんが、わたしたちはこれらを必要としないので実装されていません。ウィンドウ構成にたいしてより多くの操作を知りたい場合は、ファイルwinner.elを参照してください。

current-window-configurationがリターンするオブジェクトは、Emacsプロセスとともに終焉します。ウィンドウ構成をディスク上に格納して、それを別のEmacsセッションに読み戻すために、次に説明する関数を使用できます。これらの関数は、フレームの状態を任意の生きたウィンドウにクローンする場合も有用です(set-window-configurationはフレームのウィンドウを、そのフレームのルートウィンドウだけに効果的にクローンする)。

Function: window-state-get &optional window writable

この関数は、windowの状態をLispオブジェクトとしてリターンする。引数windowは有効なウィンドウでなければならず、デフォルトは選択されたフレームのルートウィンドウである。

オプション引数writableが非nilの場合、それはwindow-pointwindow-startのようなサンプリング位置にたいするマーカーを使用しないことを意味する。この状態をディスクに書き込んで別のセッションに読み戻す場合は、この引数は非nilであること。

引数writableと変数window-persistent-parametersの両方で、この関数によりどのウィンドウパラメーターが保存されるかを指定する。Window Parametersを参照のこと。

window-state-getによりリターンされる値は、同一セッション内の他のウィンドウ内にあるウィンドウのクローンを作成するために使用できます。これはディスクに書き込んで、別のセッションに読み戻すこともできます。どちらの場合でも、ウィンドウの状態をリストアするためには以下の関数を使用します。

Function: window-state-put state &optional window ignore

この関数は、ウィンドウ状態statewindow内にputする。引数stateは以前に呼び出したwindow-state-getがリターンしたウィンドウ状態であること。オプション引数windowには生きたウィンドウ、または内部ウィンドウ(Windows and Framesを参照)のいずれかを指定でき、デフォルトは選択されたウィンドウである。windowが生きていない場合は、stateをputする前に生きたウィンドウに置き換える。

オプション引数ignoreが非nilの場合、それは最小ウィンドウサイズと固定サイズの制限を無視することを意味する。ignoresafeなら、それは1行および/または2列まで、できる限り小さくできることを意味する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.25 Window Parameters

このセクションでは、ウィンドウに追加の情報を関連付けるためにウィンドウパラメーターを使用する方法を説明します。

Function: window-parameter window parameter

この関数は、windowparameterの値をリターンする。windowのデフォルトは、選択されたウィンドウである。windowparameterにたいするセッティングがない場合、この関数はnilをリターンする。

Function: window-parameters &optional window

この関数は、windowのすべてのパラメーターと、その値をリターンする。windowのデフォルトは、選択されたウィンドウである。リターン値はnil、または(parameter . value)という形式をもつ要素からなる連想リストである。

Function: set-window-parameter window parameter value

この関数は、windowparameterの値にvalueをセットして、valueをリターンする。windowのデフォルトは、選択されたウィンドウである。

デフォルトでは、ウィンドウ構成(window configuration)やウィンドウ状態(states of windows)の保存とリストアを行う関数は、ウィンドウパラメーターについては関知しません(Window Configurationsを参照)。これは、save-window-excursionのbody内でパラメーターの値を変更したときは、そのマクロのexit時に以前の値がリストアされないことを意味します。これはまた、以前にwindow-state-getで保存されたウィンドウ状態をwindow-state-putでリストアしたときは、クローンされたすべてのウィンドウのパラメーターがnilにリセットされることも意味します。以下の変数により、この標準の挙動をオーバーライドできます:

Variable: window-persistent-parameters

この変数は、current-window-configurationwindow-state-getにより保存され、set-window-configurationwindow-state-putによりリストアされるパラメーターを指定するalistである。Window Configurationsを参照のこと。

このalistの各エントリーのCARはパラメーターを指定するシンボルである。CDRは以下のいずれかであること:

nil

この値は、そのパラメーターがwindow-state-getcurrent-window-configurationのいずれによっても保存されていないことを意味する。

t

この値は、そのパラメーターがcurrent-window-configuration、および(writable引数がnilの場合は)window-state-getにより保存されたことを意味する。

writable

これは、そのパラメーターが無条件でcurrent-window-configurationwindow-state-getの両方により保存されたことを意味する。この値は、入力構文(read syntax)をもたないパラメーターに使用するべきではない。使用した場合、別のセッションでwindow-state-putを呼び出すと、invalid-read-syntaxエラーで失敗するだろう。

いくつかの関数(特にdelete-windowdelete-other-windowssplit-window)は、window引数にパラメーターセットをもつ場合は特別な挙動を示すかもしれません。以下の変数を非nil値にバインドすることにより、そのような特別な挙動をオーバーライドできます:

Variable: ignore-window-parameters

この変数が非nilの場合、いくつかの標準関数はウィンドウパラメーターを処理しない。現在のところ影響を受ける関数はsplit-windowdelete-windowdelete-other-windowsother-windowである。

アプリケーションは、これらの関数の呼び出し周辺で、この変数を非nilにバインドできる。これを行った場合、そのアプリケーションはその関数のexit時に、関連するすべてのウィンドウのパラメーターを正しく割り当てる責任をもつ。

以下のパラメーターは現在のところ、ウィンドウ管理コードにより使用されています:

delete-window

このパラメーターは、delete-windowの実行に影響する(Deleting Windowsを参照)。

delete-other-windows

このパラメーターは、delete-other-windowsの実行に影響する(Deleting Windowsを参照)。

split-window

このパラメーターは、split-windowの実行に影響する(Splitting Windowsを参照)。

other-window

このパラメーターは、other-windowの実行に影響する(Cyclic Ordering of Windowsを参照)。

no-other-window

このパラメーターは、そのウィンドウをother-windowにより選択不可とマークする(Cyclic Ordering of Windowsを参照)。

clone-of

このパラメーターは、そのウィンドウがクローンされたことを指定する。これはwindow-state-getによりインストールされる(Window Configurationsを参照)。

quit-restore

このパラメーターは、バッファー表示関数によりインストールされ、quit-restore-windowにより参照される(Quitting Windowsを参照)。これは4つの要素を含む:

1つ目の要素はwindow(ウィンドウはdisplay-bufferにより特別に作られた)、frame(別のフレームが作られた)、same(ウィンドウは前と同じバッファーを表示する)、other(ウィンドウは前と異なるバッファーを表示する)のシンボルのいずれかである。

2つ目の要素はシンボルwindowframe、または要素がそのウィンドウに前に表示されていたバッファー、そのときのウィンドウstart位置、ウィンドウポイント位置、ウィンドウの高さであるようなリストの、いずれかである。

3つ目の要素は、そのパラメーター作成時点に選択されていたウィンドウである。関数quit-restore-windowは、その引数としてこのウィンドウが渡された際は、そのウィンドウの再選択を試みる。

4つ目の要素は、その表示がこのパラメーターの生成を引き起こしたバッファーである。quit-restore-windowは、指定されたウィンドウがまだそのバッファーを表示している場合のみ、それを削除する。

追加のパラメーターとして、window-atomwindow-sideがあります。これらは予約されており、アプリケーションが使用するべきではありません。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

27.26 Hooks for Window Scrolling and Changes

このセクションでは、あるウィンドウがそのバッファーの違う部分を表示したり、別のバッファーを表示したとき常にLispプログラムを実行可能にする方法について説明します。これを変更できる3つのアクションがあります。それはウィンドウのスクロール、ウィンドウ内でのバッファーの切り替え、ウィンドウのサイズ変更です。最初の2つのアクションはwindow-scroll-functions、最後のアクションはwindow-size-change-functionsを実行します。

Variable: window-scroll-functions

この変数は、ウィンドウのスクロールによりEmacsが再表示前に呼び出すべき関数のリストを保持する。そのウィンドウ内に異なるバッファーを表示したときも、これらの関数が実行される。

この変数は、それぞれの関数が2つの引数、ウィンドウとウィンドウの新たなdisplay-start位置で呼び出されるので、ノーマルフックではない。

これらの関数は、window-end(The Window Start and End Positionsを参照)を使用する際には気をつけなければならない。最新の値が必要な場合は、それを確実に入力するためにupdate引数を使用しなければならない。

警告: ウィンドウのスクロール方法を変更するためにこの機能を使用してはならない。これは、そのような用途のためにデザインされておらず、そのような使用は機能しないだろう。

Variable: window-size-change-functions

この変数は、理由は何であれ、任意のウィンドウのサイズが変更された場合に呼び出される関数のリストを保持する。これらの関数は、再表示ごとに1回、サイズ変更が発生したフレーム上で1回呼び出される。

それぞれの関数は、フレームを唯一の引数として呼び出される。そのフレーム上のどのウィンドウのサイズが変更されたか、および変更された正確な方法を直接探す方法はない。とはいえ、各呼び出しにおいてsize-change関数が既存のウィンドウと、それらのサイズを記録すれば、現在のサイズと以前のサイズを比較することも可能である。

ウィンドウの作成と削除はサイズの変更とみなされるので、これらの関数の呼び出しを引き起こす。フレームのサイズ変更は、既存のウィンドウのサイズを変更するので、これも変更とみなされる。

これらの関数内で、save-selected-windowを使用できる(Selecting Windowsを参照)。しかし、save-window-excursion(Window Configurationsを参照)を使用してはならない。このマクロのexitはサイズ変更とみなされ、それはこれらの関数の際限ない呼び出しを引き起こすだろう。

Variable: window-configuration-change-hook

既存フレームのウィンドウ構成を変更するたびに毎回実行される、ノーマルフックである。これにはウィンドウの分割と削除、ウィンドウのサイズ変更、ウィンドウ内への異なるバッファーの表示が含まれる。

このフックのバッファーローカルな部分は、影響を受けるフレーム上の各ウィンドウにたいして、関係するウィンドウを選択、およびそのバッファーをカレントにして1回実行される。グローバルな部分は、変更されたフレームにたいして、そのフレームを選択して1回実行される。

加えて、Font Lockフォント表示関数(Font Lock fontification function)を登録するために、jit-lock-registerを使用できる。バッファーの一部が(再)フォント表示されたときは、ウィンドウがスクロール、またはサイズ変更されたという理由で、これが常に呼び出されるだろう。Other Font Lock Variablesを参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28 Frames

フレーム(frame)とは、1つ以上のEmacsウィンドウを含むスクリーンオブジェクトです(Windowsを参照)。これは、グラフィカル環境では“ウィンドウ”と呼ばれる類のオブジェクトです。しかし、Emacsはこの単語を異なる方法で使用しているので、ここではそれを“ウィンドウ”と呼ぶことはできません。Emacs Lispにおいてフレームオブジェクト(frame object)とは、スクリーン上のフレームを表すLispオブジェクトです。Frame Typeを参照してください。

フレームには最初、1つのメインウィンドウおよび/またはミニバッファーウィンドウが含まれます。メインウィンドウは、より小さいウィンドウに垂直、または水平に分割することができます。Splitting Windowsを参照してください。

端末(terminal)とは、1つ以上のEmacsフレームを表示する能力のあるデバイスのことです。Emacs Lispにおいて、端末オブジェクト(terminal object)とは端末を表すLispオブジェクトです。Terminal Typeを参照してください。

端末にはテキスト端末(text terminals)グラフィカル端末(graphical terminals)という、2つのクラスがあります。テキスト端末はグラフィック能力をもたないディスプレイで、xtermやその他の端末エミュレーターが含まれます。テキスト端末上では、それぞれのEmacsフレームは、その端末のスクリーン全体を占有します。たとえ追加のフレームを作成してそれらを切り替えることができたとしても、端末が表示するのは一度に1つのフレームだけです。一方でグラフィカル端末は、X Window Systemのようなグラフィカルディスプレイシステムにより管理されています。これにより、Emacsは同一ディスプレイ上に複数のフレームを同時に表示することができます。

GNUおよびUnix systemsシステムでは、単一のEmacsセッション内で、そのEmacsがテキスト端末とグラフィカル端末のいずれで開始されたかに関わらず、任意の利用可能な端末上で、追加のフレームを作成することができます。Emacsは、グラフィカル端末とテキスト端末の両方を、同時に表示することができます。 これはたとえば、リモート地から同じセッションに接続する際などに便利でしょう。Multiple Terminalsを参照してください。

Function: framep object

この述語(predicate)は、objectがフレームなら非nil、それ以外はnilをリターンする。フレームにたいしては、フレームが使用するディスプレイの種類の値となる:

t

そのフレームはテキスト端末上で表示されている。

x

そのフレームはXグラフィカル端末上で表示されている。

w32

そのフレームはMS-Windowsグラフィカル端末上で表示されている。

ns

そのフレームはGNUStepまたはMacintosh Cocoaグラフィカル端末上で表示されている。

pc

そのフレームはMS-DOS端末上で表示されている。

Function: frame-terminal &optional frame

この関数は、frameを表示する端末オブジェクトをリターンする。framenilまたは未指定の場合のデフォルトは、選択されたフレームである。

Function: terminal-live-p object

この述語は、objectが生きた(削除されていない)端末なら非nil、それ以外はnilをリターンする。生きた端末にたいしては、リターン値はその端末上で表示されているフレームの種類を示す。可能な値は、上述のframepと同様。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.1 Creating Frames

新たにフレームを作成するためには、関数make-frameを呼び出します。

Command: make-frame &optional alist

この関数は、カレントバッファーを表示するフレームを作成して、それをリターンする。

alist引数は、新たなフレームのフレームパラメーターを指定するalistである。Frame Parametersを参照のこと。alist内でterminalパラメーターを指定した場合、新たなフレームはその端末上で作成される。それ以外の場合、alist内でwindow-systemフレームパラメーターを指定した場合、それはフレームがテキスト端末とグラフィカル端末のどちらで表示されるべきかを決定する。Window Systemsを参照のこと。どちらも指定されない場合、新たなフレームは選択されたフレームと同じ端末上に作成される。

alistで指定されなかったパラメーターのデフォルトは、alist default-frame-alist内の値となる。そこでも指定されないパラメーターのデフォルトは、Xリソース、またはそのオペレーティングシステムで同等のものの値となる(X Resources in The GNU Emacs Manualを参照)。フレームが作成された後、Emacsは frame-inherited-parameters(以下参照)内にリストされたすべてのパラメーターを適用して、引数にないものはmake-frame呼び出し時に選択されていたフレームから値を取得する。

マルチモニターディスプレイ(Multiple Terminalsを参照)では、ウィンドウマネージャーがalist内の位置パラメーター(Position Parametersを参照)の指定とは異なる位置にフレームを配置するかもしれないことに注意。たとえば、ウィンドウの大きな部分、いわゆる支配モニター(dominating monitor)上のフレームを表示するポリシーをもつウィンドウマネージャーがいくつかあります。

この関数自体はーが、新たなフレームを選択されたフレームにする訳ではない。See section Input Focusを参照のこと。以前に選択されていたフレームは、選択されたままである。しかしグラフィカル端末上では、ウィンドウシステム自身の理由により、新たなフレームが選択されるかもしれない。

Variable: before-make-frame-hook

make-frameがフレームを作成する前に、それにより実行されるノーマルフック。

Variable: after-make-frame-functions

make-frameがフレームを作成した後に、それにより実行されるアブノーマルフック。after-make-frame-functions内の各関数は、作成された直後のフレームを単一の引数として受け取る。

Variable: frame-inherited-parameters

この変数は、カレントで選択されているフレームから継承して新たに作成されたフレームのフレームパラメーターのリストを指定する。リスト内の各要素はmake-frameの引数として与えられなかったパラメーター(シンボル)であり、make-frameは新たに作成されたフレームのそのパラメーターに、選択されたフレームの値をセットする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.2 Multiple Terminals

Emacsは、それぞれの端末を端末オブジェクト(terminal object)というデータ型で表します(Terminal Typeを参照)。GNUおよびUnixシステムでは、Emacsはそれぞれのセッション内で複数の端末を同時に実行できます。その他のシステムでは、単一の端末だけが使用できます。端末オブジェクトはそれぞれ、以下の属性をもちます:

端末オブジェクトを作成するプリミティブはありません。make-frame-on-display(以下参照)を呼び出したときなど、Emacsは必要に応じてそれらを作成します。

Function: terminal-name &optional terminal

この関数は、terminalにより使用されるデバイスのファイル名をリターンする。terminalが省略またはnilの場合のデフォルトは、選択されたフレームの端末である。terminalはフレームでもよく、その場合はそのフレームの端末となる。

Function: terminal-list

この関数は、すべての生きた端末オブジェクトのリストをリターンする。

Function: get-device-terminal device

この関数は、deviceにより与えられたデバイス名の端末をリターンする。deviceが文字列の場合は端末デバイス名、または‘host:server.screen’という形式のXディスプレイ名のいずれかを指定できる。deviceの場合、この関数はそのフレームの端末をリターンする。nilは選択されたフレームを意味する。最後に、もしdeviceが生きた端末を表す端末オブジェクトなら、その端末がリターンされる。引数がこれらのいずれとも異なる場合、この関数はエラーをシグナルする。

Function: delete-terminal &optional terminal force

この関数は、terminal上のすべてのフレームを削除して、それらが使用していたリソースを解放する。これらはアブノーマルフックdelete-terminal-functionsを実行し、各関数の引数としてterminalを渡す。

terminalが省略またはnilの場合のデフォルトは、選択されたフレームの端末である。terminalはフレームでもよく、その場合はそのフレームの端末を意味する。

この関数は通常、唯一アクティブな端末の削除を試みるとエラーをシグナルするが、forceが非nilなら、これを行うことができる。端末上で最後のフレームを削除した際、Emacsは自動的にこの関数を呼び出す(Deleting Framesを参照)。

Variable: delete-terminal-functions

delete-terminalにより実行されるアブノーマルフック。各関数は、delete-terminalに渡されたterminalを、唯一の引数として受け取る。技術的な詳細により、この関数は端末の削除の直前、または直後のいずれかに呼び出される。

数は多くありませんが、いくつかのLisp変数は端末ローカル(terminal-local)です。つまり、それらは端末それぞれにたいして、個別にバインディングをもちます。いかなるときも、実際に効果をもつバインディングは、カレントで選択されたフレームに属する端末にたいして1つだけです。これらの変数にはdefault-minibuffer-framedefining-kbd-macrolast-kbd-macrosystem-key-alistが含まれます。これらは常に端末ローカルであり、決してバッファーローカル(Buffer-Local Variablesを参照)にはできません。

GNUおよびUnixシステムでは、Xディスプレイはそれぞれ別のグラフィカル端末になります。Xウィンドウシステム内でEmacsが開始された際は環境変数DISPLAY、または‘--display’オプション(Initial Options in The GNU Emacs Manualを参照)により指定されたXディスプレイを使用します。Emacsはコマンドmake-frame-on-displayを通じて、別のXディスプレイに接続できます。それぞれのXディスプレイは各自、選択されたフレームとミニバッファーをもちます。しかしあらゆる瞬間(Input Focusを参照)において、それらのフレームのうちの1つだけが、“いわゆる選択されたフレーム”になります。emacsclientとの対話することにより、Emacsが別のテキスト端末と接続することさえ可能です。Emacs Server in The GNU Emacs Manualを参照してください。

1つのXサーバーが、1つ以上のディスプレイを処理できます。各Xディスプレイには、‘hostname:displaynumber.screennumber’という3つの部分からなる名前があります。1つ目の部分のhostnameは、その端末が物理的に接続されるマシン名です。2つ目の部分のdisplaynumberは、同じキーボードとポインティングデバイス(マウスやタブレット等)を共有するマシンに接続された、1つ以上のモニターを識別するための、0基準の番号です。3つ目の部分のscreennumberは、そのXサーバー上の単一のモニターコレクション(a single monitor collection)の一部である、0基準のスクリーン番号(個別のモニター)です。1つのサーバー配下にある2つ以上のスクリーンを使用する際、Emacsはそれらの名前の同一部分から、それらが単一のキーボードを共有することを知ることができるのです。

MS-WindowsのようにXウィンドウシステムを使用しないシステムは、Xディスプレイの概念をサポートせず、各ホスト上には1つのディスプレイだけがあります。これらのシステム上のディスプレイ名は、上述したような3つの部分からなる名前にしたがいません。たとえば、MS-Windowsシステム上のディスプレイ名は文字列定数‘w32’です。これは互換性のために存在するものであり、ディスプレイ名を期待する関数にこれを渡すことができます。

Command: make-frame-on-display display &optional parameters

この関数は、display上に新たにフレームを作成して、それをリターンする。その他のフレームパラメーターは、alist parametersから取得する。displayはXディスプレイの名前(文字列)であること。

この関数は、フレーム作成前にEmacsがグラフィックを表示するために“セットアップ”されることを保証する。たとえば、Emacsが(テキスト端末上で開始された等で)Xリソースを未処理なら、この時点で処理を行う。他のすべての点においては、この関数はmake-frame(Creating Framesを参照)と同様に振る舞う。

Function: x-display-list

この関数は、EmacsがどのXディスプレイに接続したかを識別するリストをリターンする。このリストの要素は文字列で、それぞれがディスプレイ名を表す。

Function: x-open-connection display &optional xrm-string must-succeed

この関数は、ディスプレイ上にフレームを作成することなく、Xディスプレイdisplayへの接続をオープンする。通常は、make-frame-on-displayが自動的に呼び出すので、Emacs Lispプログラムがこの関数を呼び出す必要はない。これを呼び出す唯一の理由は、与えられたXディスプレイにたいして通信を確立できるかどうかチェックするためである。

オプション引数xrm-stringが非nilなら、それは.Xresourcesファイル内で使用されるフォーマットと同一な、リソース名とリソース値である。X Resources in The GNU Emacs Manualを参照のこと。これらの値はそのXサーバー上で記録されたリソース値をオーバーライドして、このディスプレイ上で作成されるすべてのEmacsフレームにたいして適用される。以下は、この文字列がどのようなものかを示す例である:

"*BorderWidth: 3\n*InternalBorder: 2\n"

must-succeedが非nilなら、接続オープンの失敗によりEmacsが終了させられる。それ以外の場合は、通常のLispエラーとなる。

Function: x-close-connection display

この関数は、ディスプレイdisplayへの接続をクローズする。これを行う前にまず、そのディスプレイ上でオープンしたすべてのフレームを削除しなければならない(Deleting Framesを参照)。

“マルチモニター”のセットアップにおいて、単一のXディスプレイが複数の物理モニターに出力される場合があります。そのようなセットアップを取得するために、関数display-monitor-attributes-listframe-monitor-attributesを使用できます。

Function: display-monitor-attributes-list &optional display

この関数は、display上の物理モニターの属性のリストをリターンする。displayにはディスプレイ名(文字列)、端末、フレームを指定でき、省略またはnilの場合のデフォルトは、選択されたフレームのディスプレイである。このリストの各要素は、物理モニターの属性を表す連想リストである。1つ目の要素はプライマリーモニターである。以下は属性のキーと値である:

geometry

(x y width height)’のような、ピクセル単位でのそのモニターのスクリーンの左上隅の位置、そのサイズ。そのモニターがプライマリーモニターでない場合は、いくつかの座標が負になり得る。

workarea

(x y width height)’のような、ピクセル単位でのワークエリア(“使用可能”なスペース)の左上隅の位置と、そのサイズ。これはワークエリアから除外され得る、ウィンドウマネージャーのさまざまな機能(dock、taskbar等)が占めるスペースの分、‘geometry’とは異なるかもしれない。そのような機能が実際にワークエリアから差し引かれるかどうかは、そのプラットフォームと環境に依存する。繰り返しになるが、そのモニターがプライマリーモニターでない場合、いくつかの座標は負になり得る。

mm-size

(width height)’<のような、ミリメートル単位での幅と高さ。

frames

その物理モニターが支配(dominate)するフレームのリスト(以下参照)。

name

stringのような、その物理モニターの名前。

source

stringのような、マルチモニターの情報ソース(例: ‘XRandr’、‘Xinerama’等)。

xywidthheightは整数。‘name’と‘source’は欠落しているかもしれない。

あるモニター内にフレームの最大領域がある、または(フレームがどの物理モニターに跨がらないなら)そのモニターがフレームに最も近いとき、フレームは物理モニターにより支配(dominate)される。グラフィカルなディスプレイ内の(ツールチップではない)すべてのフレームは、たとえそのフレームが複数の物理モニターに跨がる(または物理モニター上にない)としても、(可視か否かによらず)正確に1つの物理モニターにより支配される。

以下は、2つのモニターディスプレイ上でこの関数により生成されたデータの例である:

  (display-monitor-attributes-list)
  ⇒
  (((geometry 0 0 1920 1080) ;; 左手側プライマリーモニター
    (workarea 0 0 1920 1050) ;; タスクバーが幾分かの高さを占有
    (mm-size 677 381)
    (name . "DISPLAY1")
    (frames #<frame emacs@host *Messages* 0x11578c0>
            #<frame emacs@host *scratch* 0x114b838>))
   ((geometry 1920 0 1680 1050) ;; 右手側モニター
    (workarea 1920 0 1680 1050) ;; スクリーン全体を使用可
    (mm-size 593 370)
    (name . "DISPLAY2")
    (frames)))
Function: frame-monitor-attributes &optional frame

この関数は、 frameを支配(上記参照)する物理モニターの属性をリターンする。 frameのデフォルトは選択されたフレームである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3 Frame Parameters

フレームはに、その外見と挙動を制御する、多くのパラメーターがあります。フレームがどのようなパラメーターをもつかは、そのフレームが使用するディスプレイのメカニズムに依存します。

フレームパラメーターは主に、グラフィカルディスプレイのために存在します。ほとんどのフレームパラメーターは、テキスト端末上のフレームに適用時は効果がありません。テキスト端末上のフレームでは、何か特別なことを行うパラメーターはheightwidthnametitlemenu-bar-linesbuffer-listbuffer-predicateだけです。その端末がカラーをサポートにはforeground-colorbackground-colorbackground-modedisplay-typeなどのパラメーターも意味をもちます。その端末が透過フレーム(frame transparency)をサポートする場合には、パラメーターalphaも意味をもちます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.1 Access to Frame Parameters

以下の関数により、フレームのパラメーター値の読み取りと変更ができます。

Function: frame-parameter frame parameter

この関数は、frameのパラメーターparameter(シンボル)の値をリターンする。framenilなら、選択されたフレームのパラメーターをリターンする。frameparameterにたいするセッティングをもたない場合、この関数はnilをリターンする。

Function: frame-parameters &optional frame

関数frame-parametersは、frameのすべてのパラメーターとその値をリストするalistをリターンする。frameが省略またはnilの場合は、選択されたフレームのパラメーターをリターンする。

Function: modify-frame-parameters frame alist

この関数は、alistの要素にもとづきフレームframeのパラメーターを変更する。alist内の要素はそれぞれ(parm . value)という形式をもち、ここでparmはパラメーターを名付けるシンボルである。 alist内に指定されないパラメーターの値は変更されない。framenilの場合のデフォルトは、選択されたフレームである。

Function: set-frame-parameter frame parm value

この関数は、フレームパラメーターparmに、指定されたvalueをセットする。framenilの場合のデフォルトは、選択されたフレームである。

Function: modify-all-frames-parameters alist

この関数は、 alistに応じて既存のフレームすべてのフレームパラメーターを変更してから、今後に作成されるフレームに同じパラメーター値を適用するために、default-frame-alist(と必要ならinitial-frame-alist)を変更する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.2 Initial Frame Parameters

initファイル(The Init Fileを参照)内でinitial-frame-alistをセットすることにより、フレームの初期スタートアップにパラメーターを指定できます。

User Option: initial-frame-alist

この変数の値は、初期フレーム作成時に使用されるパラメーター値のalistである。以降のフレームを変更することなく、初期フレームの外見を指定するために、この変数を使用できる。要素はそれぞれ以下の形式をもつ:

(parameter . value)

Emacsは、initファイル読み取り前に初期フレームを作成する。After reading that file, Emacs checks initial-frame-alistをチェックして、すでに作成済みの初期フレームに、変更する値に含まれるパラメーターのセッティングを適用する。

これらのセッティングがフレームのジオメトリーと外見に影響する場合には、間違った外見のフレームを見た後、指定した外見に変更されるのを目にするだろう。これが煩わしい場合は、Xリソースで同じジオメトリーと外見を指定できる。これらは、フレーム作成前に効果をもつ。X Resources in The GNU Emacs Manualを参照されたい。

Xリソースセッティングは通常、すべての!に適用される。初期フレームのために、あるXリソースを単独で指定して、それ以降のフレームには適用したくない場合は、次の方法によりこれを達成できる。それ以降のフレームにたいするXリソースをオーバーライドするために、default-frame-alist内でパラメーターを指定してから、それらが初期フレームに影響するのを防ぐために、initial-frame-alist内の同じパラメーターにたいして、Xリソースにマッチする値を指定すればよい。

これらのパラメーターに(minibuffer . nil)が含まれるなら、それは初期フレームがミニバッファーをもつべきではないことを示します。この場合、Emacsは同じようにミニバッファーオンリーフレーム(minibuffer-only frame)を別個作成します。

User Option: minibuffer-frame-alist

この変数の値は、初期ミニバッファーオンリーフレーム(initial-frame-alistがミニバッファーのないフレームを指定する場合にEmacsが作成するミニバッファーオンリーフレームのこと)を作成時に使用されるパラメーター値のalistである。

User Option: default-frame-alist

これは、すべてのEmacsフレーム(最初のフレームとそれ以降のフレーム)にたいして、フレームパラメーターのデフォルト値を指定するalistである。Xウィンドウシステム使用時には、大抵はXリソースで同じ結果を得られる。

この変数のセットは既存フレームに影響しない。さらに、別フレームにバッファーを表示する関数は、自身のパラメーターを提供することにより、デフォルトパラメーターをオーバーライドできる。

フレームの外見を指定するコマンドラインオプションとともにEmacsを呼び出した場合、これらのオプションはinitial-frame-alistまたはdefault-frame-alistのいずれかに要素を追加することにより、効果を発揮します。‘--geometry’や‘--maximized’のような、初期フレームだけに影響するオプションはinitial-frame-alist、その他のオプションはdefault-frame-alistに要素を追加します。Command Line Arguments for Emacs Invocation in The GNU Emacs Manualを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3 Window Frame Parameters

フレームがどんなパラメーターをもつかは、どのようなディスプレイのメカニズムがそれを使用するかに依存します。このセクションでは、一部、またはすべての端末種類において特別な意味をもつパラメーターを説明します。これらのうちnametitleheightwidthbuffer-listbuffer-predicateは端末フレームにおいて有意な情報を提供し、tty-color-modeはテキスト端末上のフレームにたいして意味があります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.1 Basic Parameters

以下のフレームパラメーターは、フレームに関してもっとも基本的な情報を提供します。titlenameは、すべての端末において意味をもちます。

display

このフレームをオープンするためのディスプレイ。これは環境変数DISPLAYのような、‘host:dpy.screen’という形式の文字列であること。ディスプレイ名についての詳細は、See section Multiple Terminalsを参照のこと。

display-type

このパラメーターは、このフレーム内で使用できる利用可能なカラーの範囲を記述する。値はcolorgrayscalemonoのいずれか。

title

フレームが非nilのtitleをもつ場合、それはフレーム上端にあるウィンドウシステムのタイトルバーに表示され、mode-line-frame-identificationに‘%F’(%-Constructs in the Mode Lineを参照)を使用していればそのフレーム内のウィンドウのモードラインにも表示される。これは通常、Emacsがウィンドウシステムを使用しておらず、かつ同時に1つのフレームのみ表示可能なケースが該当する。Frame Titlesを参照のこと。

name

そのフレームの名前。titleが未指定またはnilなら、フレーム名はフレームタイトルにたいしてデフォルトの役割りを果たす。nameを指定しない場合、Emacsは自動的にフレーム名をセットする(Frame Titlesを参照)。

フレーム作成時に明示的にフレーム名を指定した場合は、そのフレームにたいしてXリソースを照合する際にも、(Emacs実行可能形式名のかわりに)その名前が使用される。

explicit-name

フレーム作成時にフレーム名が明示的に指定された場合、このパラメーターはその名前になるだろう。明示的に名付けられなかった場合、このパラメーターはnilになる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.2 Position Parameters

位置パラメーターの値は通常はピクセル単位ですが、テキスト端末ではピクセル単位のかわりに文字数か行数で数えられます。

left

スクリーンの左(右)端からフレームの左(右)端までの、ピクセル単位での位置。値は:

整数

正の整数は、スクリーン左端をフレーム左端に、負の整数はフレーム右端をスクリーン右端に関連付ける。

(+ pos)

これは、スクリーン左端にたいしフレーム左端の相対的位置を指定する。整数posは正および負の値をとり得る。負の値はスクリーン外側、または(マルチモニターディスプレイにたいしては)プライマリーモニター以外のモニター上の位置を指定する。

(- pos)

これは、スクリーン右端にたいしフレーム右端の相対的位置を指定する。整数posは正および負の値をとり得る。負の値はスクリーン外側、または(マルチモニターディスプレイにたいしては)プライマリーモニター以外のモニター上の位置を指定する。

プログラム指定の位置を無視するウィンドウマネージャーがいくつかある。指定した位置が無視されない保証を望む場合は、パラメーターuser-positionにも同様に非nil値を指定すること。

top

スクリーン上(下)端にたいして、上(下)端のスクリーン位置をピクセル単位で指定する。方向が水平ではなく垂直である点を除き、これはleftと同様に機能する。

icon-left

スクリーン左端から数えた、フレームアイコン左端のピクセル単位のスクリーン位置。ウィンドウマネージャーがこの機能をサポートすれば、これはフレームをアイコン化したとき効果を発揮する。このパラメーターに値を指定する場合はicon-topにも値を指定しなければならず、その逆も真である。

icon-top

スクリーン上端から数えた、フレームアイコン上端のピクセル単位のスクリーン位置。ウィンドウマネージャーがこの機能をサポートすれば、これはフレームをアイコン化したとき効果を発揮する。

user-position

フレームを作成してパラメーターlefttopで位置を指定する際は、指定した位置がユーザー指定(人間であるユーザーにより明示的に要求された位置)なのか、それとも単なるプログラム指定(プログラムにより選択された位置)なのかを告げるために、このパラメーターを使用する。非nil値は、それがユーザー指定の位置であることを告げる。

ウィンドウマネージャーは一般的にユーザー指定位置に留意し、プログラム指定位置にも幾分か留意する。しかし、多くはプログラム指定位置を無視してウィンドウをウィンドウマネージャーのデフォルトの方法で配すか、ユーザーのマウスによる配置に任せる。twmを含むウィンドウマネージャーのいくつかは、プログラム指定位置にしたがうか無視するかをユーザーの指定に任せる。

make-frameを呼び出す際、パラメーターleftおよびtopの値がそのユーザーにより示される嗜好を表すなら、このパラメーターに非nil値を、それ以外はnilを指定するべきである。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.3 Size Parameters

フレームパラメーターはフレームのサイズを文字単位で指定します。グラフィカルなディスプレイ上では、defaultフェイスがこれら文字単位の実際のピクセルサイズを決定します(Face Attributesを参照)。

height

文字単位によるフレームコンテンツの高さ(ピクセル単位で高さを取得するにはframe-pixel-heightを呼び出す。Frame Size And Positionを参照のこと)。

width

文字単位によるフレームコンテンツの幅(ピクセル単位で幅を取得するにはframe-pixel-widthを呼び出す。Frame Size And Positionを参照のこと)。

user-size

これは、サイズパラメーターheightおよびwidthにたいして、user-position(user-positionを参照)がtopおよびleftが行うのと同じことを行う。

fullscreen

幅または高さ、もしくはその両方を最大化することを指定する。値fullwidthは、可能な限り幅を広く、値fullheightは高さを可能な限り高く、値fullbothは幅と高さをスクリーンサイズにセット、値maximizedはフレームを最大化することを指定する。maximizedfullbothの違いは、前者がマウスでそのウィンドウマネージャーによる装飾をドラッグしてサイズ変更が可能なのにたいし、後者は実際のスクリーン全体を覆うためマウスによるサイズ変更ができないことである。

いくつかのウィンドウマネージャーでは、フレームを“maximized”または“fullscreen”にするために、変数frame-resize-pixelwiseを非nil値にカスタマイズする必要があるかもしれない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.4 Layout Parameters

以下のフレームパラメーターにより、フレームのさまざまなパーツを有効または無効にしたり、サイズを制御できます。

border-width

ピクセル単位でのフレームのボーダー幅。

internal-border-width

テキスト(またはフリンジ)とフレームボーダーとのピクセル単位による距離。

vertical-scroll-bars

フレームが垂直スクロール用のスクロールバーをもつべきか否か、スクロールバーをフレームのどちら側に置くか。可能な値はleftright、スクロールバーなしはnil

scroll-bar-width

垂直スクロールバーのピクセル単位による幅。nilはデフォルト幅の使用を意味する。

left-fringe
right-fringe

そのフレーム内のウィンドウの左右フリンジのデフォルト幅(Fringesを参照)。いずれかが0なら、対応するフリンジを削除する効果がある。 If either of these is zero, that effectively removes the corresponding fringe.

これら2つのフレームパラメーターの値を問い合わせるためにframe-parameterを使用する際、リターン値は常に整数となる。nil値を渡してset-frame-parameterを使用する際は、実際のデフォルト値8ピクセルが課せられる。

合成済みフリンジ幅は列数の合計数まで加算されなければならないので、frame-parameterの応答値は指定値より大きくなるかもしれない。左右のフリンジ間には、余分な幅が均等に配分される。しかし、フリンジのいずれか幅に負の整数を指定することにより、フリンジに正確な幅を強制できる。どちらのフリンジ幅も負の場合は、左フリンジだけが指定された幅となる。

right-divider-width

フレーム上のすべてのウィンドウの右ディバイダー(Window Dividersを参照)用に予約される、ピクセル単位の幅(厚さ)。値0は右ディバイダーを描画しないことを意味する。

bottom-divider-width

フレーム上のすべてのウィンドウの下ディバイダー(Window Dividersを参照)用に予約される、ピクセル単位の幅(厚さ)。値0は下ディバイダーを描画しないことを意味する。

menu-bar-lines

メニューバー用にフレーム上端に割り当てる行数。Menu Barモードが有効の場合のデフォルトは1、それ以外は0である。Menu Bars in The GNU Emacs Manualを参照のこと。

tool-bar-lines

ツールバー用に使用する行数。Tool Barモードが有効の場合のデフォルトは1、それ以外は0である。See Tool Bars in The GNU Emacs Manualを参照のこと。

tool-bar-position

ツールバーの位置。現在のところGTKツールバーのみ。可能な値はtopbottomleftright。デフォルトはtop

line-spacing

各テキスト行配下に残す、ピクセル単位の追加スペース(正の整数)。詳細はLine Heightを参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.5 Buffer Parameters

以下は、フレーム内でどのバッファーが表示されているか、されるべきかを扱うためのフレームパラメーターで、すべての種類の端末上で意味があります。

minibuffer

そのフレームが自身のミニバッファーをもつか否か。もつ場合はt、もたない場合はnilonlyならそのフレームが正にミニバッファーであることを意味する。値が(別フレーム内の)ミニバッファーウィンドウの場合、そのフレームはそのミニバッファーを使用する。

このフレームパラメーターはフレーム作成時に効果があち、その後は変更できない。

buffer-predicate

このフレームにたいする、buffer-predicate関数。関数other-bufferは、どのバッファーを考慮すべきか決定するために、(選択されたフレームから)この述語がnilでなければ、これを使用する。これは各バッファーにたいして、そのバッファーを唯一の引数として、この述語を1回呼び出す。この述語が非nil値をリターンしたら、そのバッファーは考慮される。

buffer-list

そのフレーム内で選択されているバッファーの、もっとも最近選択されたバッファーが先頭になるような順のリスト。

unsplittable

nilなら、このフレームのウィンドウは決して自動的に分割されることはない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.6 Window Management Parameters

以下のフレームパラメーターは、ウィンドウマネージャーとフレームとの相互作用のさまざまな面を制御します。これらは、テキスト端末上では効果がありません。

visibility

フレームの可視性(visibility)の状態。可能な値は3つあり、nilは不可視、tは可視、iconはアイコン化されていることを意味する。Visibility of Framesを参照のこと。

auto-raise

nilなら、Emacsはそのフレーム選択時に自動的にそれを前面に移動(raise)する。これを許さないウィンドウマネージャーがいくつかある。

auto-lower

nilなら、Emacsはそのフレームの選択解除時に自動的にそれを背面に移動(lower)する。これを許さないウィンドウマネージャーがいくつかある。

icon-type

そのフレームに使用するアイコンのタイプ。値が文字列の場合、それは使用するビットマップを含むファイルを指定し、nilはアイコンなしを指定する(何を表示するかはウィンドウマネージャーが決定する)。その他の非nil値は、デフォルトのEmacsアイコンを指定する。

icon-name

このフレームにたいするアイコンで使用する名前。アイコンを表示する場合は、その際に表示される。これがnilなら、フレームのタイトルが使用される。

window-id

グラフィカルディスプレイがこのフレームにたいして使用するID番号。Emacsは、フレーム作成時にこのパラメーターを割り当てる。このパラメーターを変更しても、実際のID番号に効果はない。

outer-window-id

そのフレームが存在する最外殻のウィンドウシステムのウィンドウのID番号。window-idと同様、このパラメーターを変更しても実際の効果はない。

wait-for-wm

nilなら、ジオメトリー変更を確認するために、ウィンドウマネージャーを待機するようXtに指示する。Fvwm2およびKDEのバージョンを含むウィンドウマネージャーのいくつかは確認に失敗するので、Xtがハングする。これらウィンドウマネージャーのハングを防ぐために、これをnilにセットする。

sticky

nilなら、仮想デスクトップを伴うシステム上のすべての仮想デスクトップ上で、そのフレームが可視になる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.7 Cursor Parameters

このフレームパラメーター!、カーソルの外見を制御します。

cursor-type

カーソルの表示方法。適正な値は:

box

塗りつぶされた四角形(filled box)を表示する(デフォルト)。

hollow

中抜きの四角形(hollow box)を表示する。

nil

カーソルウィンドウ表示しない。

bar

文字間に垂直バー(vertical bar)を表示する。

(bar . width)

文字間に幅がwidthピクセルの垂直バー(vertical bar)を表示する。

hbar

文字間に水平バー(horizontal bar)を表示する。

(hbar . height)

文字間に高さがheightピクセルの水平バー(horizontal bar)を表示する。

フレームパラメーターcursor-typeは、変数cursor-typeおよびcursor-in-non-selected-windowsによりオーバーライドされるかもしれません。

Variable: cursor-type

このバッファーローカル変数は、選択されたウィンドウ内で表示されているそのバッファーのカーソルの外見を制御する。この値がtなら、それはフレームパラメーターcursor-typeで指定されたカーソルのーを使用することを意味する。それ以外では、値は上記リストのカーソルタイプのいずれかであるべきで、これはフレームパラメーターcursor-typeをオーバーライドする。

User Option: cursor-in-non-selected-windows

このバッファーローカル変数は、選択されていないウィンドウ内でのカーソルの外見を制御する。これは、フレームパラメーターcursor-typeと同じ値をサポートする。さらに、nilは選択されていないウィンドウ内にはカーソルを表示せず、tは通常のカーソルタイプの標準的な変更(塗りつぶされた四角形は中抜きの四角形に、バーはより細いバーにする)の使用を意味する。

User Option: blink-cursor-alist

この変数は、カーソルのブリンク(blink: 点滅)方法を指定する。各要素は(on-state . off-state)という形式をもつ。カーソルタイプがon-stateと等しい(equalを用いて比較)ときは常に、これに対応するoff-stateがブリンクが“off”の際のカーソルの外見を指定する。on-stateoff-stateはどちらもフレームパラメーターcursor-typeに適した値であること。

それぞれのカーソルタイプのブリンク方法にたいして、そのタイプがここでon-stateとして指定されていなければ、さまざまなデフォルトが存在する。フレームパラメーターcursor-typeで指定した際に限り、この変数内での変更は即座に効果を発揮しない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.3.8 Font and Color Parameters

以下のフレームパラメーターは、フォントとカラーの使用を制御します。

font-backend

フレーム内でフォントの描画に使用するためのフォントバックエンド(font backends)を指定する、優先順のシンボルのリスト。Xでは現在のところ、x(X core font driver)とxft(Xft font driver)の2つの利用可能なフォントバックエンドがある。MS-Windowsでは現在のところ、gdiuniscribeの2つの利用可能なフォントバックエンドがある(Windows Fonts in The GNU Emacs Manualを参照)。その他のシステムでは利用可能なフォントバックエンドは1つだけなので、このフレームパラメーターを変更しても意味がない。

background-mode

このパラメーターはdarklightのいずれかで、それぞれバックグラウンドを暗く(dark)するか、明るく(light)するかに対応する。

tty-color-mode

このパラメーターは端末上で使用するカラーモードを指定し、、そのシステムの端末機能データベース(terminal capabilities database、termcap)により与えられた端末のカラーサポートを、その値でオーバーライドする。値にはシンボルか数値を指定できる。数値の場合は、使用するカラー数(および間接的にはそれぞれのカラーを生成するためのコマンド)を指定する。たとえば(tty-color-mode . 8)は、標準的なテキストカラーにたいしてANSIエスケープシーケンスの使用を指定する。値-1はカラーサポートをオフに切り替える。

このパラメーターの値がシンボルの場合、それはtty-color-mode-alistの値を通じた数値を指定するもので、かわりにそのシンボルに割り当てられた数値が使用される。

screen-gamma

これが数値の場合、Emacsはすべてのカラーの輝度を調整する“ガンマ補正(gamma correction)”を行う。値はディスプレイのスクリーンのガンマであること。

通常のPCモニター/あスクリーンガンマが2.2なので、EmacsおよびXウィンドウのカラー値は一般的にそのガンマ値のモニター上で正しく表示するよう校正されている。screen-gammaにたいして2.2を指定した場合、それは補正が不必要であることを意味する。その他の値は、通常のモニター上でガンマ値2.2で表示されるであろう、補正されたカラーがスクリーン上に表示されるように意図された補正を要求する。

モニターが表示するカラーが明るすぎる場合は、screen-gammaに2.2より小さい値を指定するべきである。これは、カラーをより暗くする補正を要求する。スクリーンガンマの値1.5は、LCDカラーディスプレイにたいして、よい結果を与えるだろう。

alpha

このパラメーターは、可変透明度(variable opacity)をサポートするグラフィカルディスプレイ上での、そのフレームの透明度を指定する(訳注: opacityを訳すと逆の不透明度だが、このような場合は一般的に透明度と訳すようなので、それに倣う)。これは0から100の整数であるべきで、0は完全な透明、100hは完全な不透明を意味する。nil値をもつこともでき、これはEmacsにフレームのopacityをセットしない(ウィンドウマネージャーに委ねる)よう告げる。

フレームが完全に見えなくなるのを防ぐために、変数frame-alpha-lower-limitは透明度の最低限度を定義する。フレームパラメーターの値がこの変数の値より小さい場合、Emacsは後者を使用する。デフォルトのframe-alpha-lower-limitは20。

フレームパラメーターalphaにはコンスセル(‘active’ . ‘inactive’)も指定できる。ここで、‘active’は選択時のフレームの透明度、‘inactive’は未選択時の透明度である。

以下は、特定のフェイスの特定のフェイス属性と自動的に等しくなるので、凖時代遅れとなったフレームパラメーターです(Standard Faces in The Emacs Manualを参照)。

font

フレーム内でテキストを表示するためのフォントの名前。これはシステムで有効なフォント名、またはEmacsフォントセット名(Fontsetsを参照)のいずれかであるような文字列である。これは、defaultフェイスのfont属性と等価である。

foreground-color

文字のイメージに使用するカラー。これは、defaultフェイスの:foreground属性と等価である。

background-color

文字のバックグラウンドに使用するカラー。これは、defaultフェイスの:background属性と等価である。

mouse-color

マウスポインターのカラー。これはmouseフェイスの:background属性と等価である。

cursor-color

ポイントを表示するカーソルのカラー。これは、cursorフェイスの:background属性と等価である。

border-color

これは、フレームのボーダーのカラーと等価である。これは、borderフェイスの:background属性と等価である。

scroll-bar-foreground

nilの場合は、スクロールバーのフォアグラウンドカラー。これは、scroll-barフェイスの:foreground属性と等価である。

scroll-bar-background

nilの場合は、スクロールバーのバックグラウンドカラー。これは、scroll-barフェイスの:background属性と等価である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.4 Frame Size And Position

フレームパラメーターlefttopheightwidthを使用することにより、フレームのサイズと位置の読み取りや変更ができます。未指定のジオメトリーパラメーターは、それが何であれウィンドウマネージャーの通常の方法により選択されます。

以下はサイズやポジションの特別な機能にたいして動作します(正確には、これらの関数により使用される“選択されたフレーム”にたいして動作するという意味。Input Focusを参照のこと)。

Function: set-frame-position frame left top

この関数は、frameの左上隅をlefttopにセットする。これらの引数はピクセル単位で、通常はスクリーンの左上隅から測られる。

負のパラメーター値は、スクリーン下端から上方向にウィンドウ下端、またはスクリーン右端から左方向にウィンドウ右端の位置である。この値が常に左上隅から数えるようにして、負の引数ならフレームの一部をスクリーン左上隅の外側に配置するようにしたほうがよいのだろうが、今更これを変更するのは賢明と思えない。

Function: frame-height &optional frame
Function: frame-width &optional frame

これらの関数は、行または列で測ったframeの高さまたは幅をリターンする。frameを指定しないと選択されたフレームを使用する。

Function: frame-pixel-height &optional frame
Function: frame-pixel-width &optional frame

これらの関数は、ピクセルで測ったframeの主要表示領域の高さまたは幅をリターンする。frameを指定しないと選択されたフレームを使用する。テキスト端末では、結果はピクセルではなく文字単位となる。

これらの値には各ウィンドウの内枠ボーダー(internal borders)、スクロールバー、フリンジ(これらはフレーム自体ではなく個別のウィンドウに属す)が含まれる。高さの正確な値は、そのウィンドウシステムと使用するツールキットに依存する。GTK+では、高さにツールバーやメニューバーは含まれない。MotifとLucidのツールキットでは、ツールバーは含まれるが、メニューバーは含まれない。ツールキットなしのグラフィカルなバージョンでは、ツールバーとメニューバーの両方が含まれる。テキスト端末の場合は、結果にメニューバーが含まれる。

Function: frame-char-height &optional frame
Function: frame-char-width &optional frame

これらの関数は、ピクセルで測ったframeの高さまたは幅をリターンする。値は選択されたフォントに依存する。frameを指定しないと選択されたフレームを使用する。

User Option: frame-resize-pixelwise

このオプションがnilなら、フレームのサイズは、通常はそのフレームのframe-char-heightframe-char-widthのカレント値の倍数に丸められる。非nilの場合、丸めは行われずフレームのサイズはピクセル単位で増加/減少が可能になる。

これをセットすることにより、次回のリサイズ処理では、ウィンドウマネージャーにこれに相当するサイズのヒントを渡す。これは、ユーザーの初期ファイル内でのみこの変数をセットすべきで、アプリケーションが一時的にこれをバインドすべきではないことを意味する。

このオプションにたいしてnil値がもつ正確な意味は、使用されるツールキットに依存する。マウスによるフレームボーダーのドラッグは、通常は文字単位で行われる。文字サイズの整数倍ではないフレームサイズを引数としてset-frame-size(以下参照)を呼び出すと、もしかしたら丸められたり(GTK+)、あるいは受容される(Lucid、Motif、MS-Windows)かもしれない。

いくつかのウィンドウマネージャーでは、フレームを本当に“最大化”あるいは“全画面”で表示させるためには、これを非nilにセットする必要があるかもしれない。

Function: set-frame-size frame width height pixelwise

この関数は、文字単位でframeのサイズをセットする。widthは列数で新たな幅を指定し、heightは行数で新たな高さを指定する。

オプション引数pixelwiseが非nilの場合は、かわりにピクセル単位で新たな幅と高さを測ることを意味する。frame-resize-pixelwisenilの場合、それが文字の整数倍でフレームサイズを増加あるいは減少させないなら、この要求を完全には尊重せずに拒絶するツールキットがいくつかあることに注意されたい。

Function: set-frame-height frame height &optional pretend pixelwise

この関数は、frameを高さheight行にリサイズする。frame内の既存ウィンドウのサイズは、フレームにフィットするよう比例して変更される。

pretendが非nilの場合、Emacsはframe内でheight行の出力を表示するが、そのフレームの実際の高さにたいする値は変更しない。これはテキスト端末上でのみ有用である。端末が実際に実装するより小さい高さの使用は、より小さいスクリーン上での振る舞いの再現したり、スクリーン全体を使用時の端末の誤動作を観察するとき有用かもしれない。フレームの高さを“実際”のようにセットするのは、常に機能するとは限らない。なぜなら、テキスト端末上でのカーソルを正しく配置するために、正確な実サイズを知る必要があるかもしれないからである。

オプションの第4引数pixelwiseが非nilなら、それはframeの高さがheightピクセル高くなることを意味する。frame-resize-pixelwisenilの場合、それが文字の整数倍でフレームサイズを増加あるいは減少させないなら、この要求を完全には尊重せずに拒絶するツールキットがいくつかあることに注意されたい。

Function: set-frame-width frame width &optional pretend pixelwise

この関数は、文字単位でframeの幅をセットする。引数pretendは、set-frame-heightのときと同じ意味をもつ。

オプションの第4引数pixelwiseが非nilなら、それはframeの幅がheightピクセル広くなることを意味する。frame-resize-pixelwisenilの場合、それが文字の整数倍でフレームサイズを増加あるいは減少させないなら、この要求を完全には尊重せずに拒絶するツールキットがいくつかあることに注意されたい。

ウィンドウ1つだけを表示するフレームの場合は、コマンドfit-frame-to-bufferを使用してそのフレームをウィンドウのバッファーにフィットさせることができます。

Command: fit-frame-to-buffer &optional frame max-height min-height max-width min-width only

このコマンドは、frame内のバッファーのコンテンツを正確に表示するために、frameのサイズを調整する。frameには任意の生きたフレームを指定でき、デフォルトは選択されたフレームである。この調整は、frameのルートウィンドウが生きている場合のみ行われる。引数max-heightmin-heightmax-widthmin-widthframeのルートウィンドウの新たなトータルサイズの境界を指定する。min-heightmin-widthのデフォルトは、window-min-heightおよびwindow-min-widthである。

オプション引数onlyverticallyの場合、この関数はフレームを垂直方向にたいしてだけリサイズするだろう。onlyhorizontallyなら、水平方向だけにリサイズする。

fit-frame-to-bufferの挙動は、以下にリストに挙げた2つのオプションにより制御できます。

User Option: fit-frame-to-buffer-margins

このオプションは、fit-frame-to-bufferによりフィットされるフレーム周囲のマージンを指定する。このようなマージンは、たとえばフレームがタスクバーとオーバーラップするのを防ぐのに有用かもしれない。

これは、フィットされるフレームの上下左右にフリーのまま残すピクセル数を指定する。デフォルトはnilで、これは上下左右にマージンを使用しないことを意味する。ここで指定した値は、フレームのfit-frame-to-buffer-marginsパラメーターが与えられていれば、それにオーバーライドされるかもしれない。

User Option: fit-frame-to-buffer-sizes

このオプションは、fit-frame-to-bufferにたいしてサイズの境界を指定する。これは、自身のバッファーにフィットされるすべてのフレームのルートウィンドウの最小/最大の行数および最小/最大の列数のトータルを指定する。これらの値のいずれかが非nilなら、fit-frame-to-bufferの相当する引数をオーバーライドする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.3.5 Geometry

以下は、Xスタイルのウィンドウジオメトリー指定によるアクションのデータを調べる方法です:

Function: x-parse-geometry geom

関数x-parse-geometryは、標準的なXウィンドウのジオメトリー文字列を、make-frameの引数の一部として使用できるalistに変換する。

このalistはgeom内で指定されたパラメーターと、そのパラメーターに指定された値を記述する。各要素は(parameter . value)のような形式である。可能なparameterの値はlefttopwidthheightである。

サイズのパラメーターの値は整数でなければならない。位置のパラメーターleftおよびtopの名前に関しては、かわりに右端または下端の位置を示す値もいくつかあるので、完全に正確ではない。位置パラメーターにたいして可能なvalueは前述(Position Parametersを参照)したような整数、リスト(+ pos)、リスト(- pos)である。

以下は例である:

(x-parse-geometry "35x70+0-0")
     ⇒ ((height . 70) (width . 35)
         (top - 0) (left . 0))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.4 Terminal Parameters

端末はそれぞれ、関連するパラメーターのリストをもっています。これら端末パラメーター(terminal parameters)は主に、端末ローカル変数を格納するための便利な手段ですが、いくつかの端末パラメーターは特別な意味をもっています。

このセクションでは、端末のパラメーター値の読み取りや変更を行う関数を説明します。これらはすべて引数として端末かフレームいずれかを受け入れます。フレームの場合、それはそのフレームの端末の使用を意味します。引数nilは、選択されたフレームの端末という意味です。

Function: terminal-parameters &optional terminal

この関数は、terminalnのすべてのパラメーターとその値をリストするalistをリターンする。

Function: terminal-parameter terminal parameter

この関数は、terminalのパラメーターparameter(シンボル)の値をリターンする。terminalparameterにたいするセッティングをもたない場合、この関数はnilをリターンする。

Function: set-terminal-parameter terminal parameter value

この関数は、terminalのパラメーターparmに指定されたvalueをセットして、そのパラメーターの以前の値をリターンする。

以下は、特別な意味をもついくつかの端末パラメーターのリストです:

background-mode

端末のバックグラウンドカラーの区分で、lightdarkのいずれか。

normal-erase-is-backspace

値は1か0で、これはその端末上でnormal-erase-is-backspace-modeがオンまたはオフのいずれに切り替えられたかに依存する。DEL Does Not Delete in The Emacs Manualを参照のこと。

terminal-initted

端末の初期化後に、端末固有の初期化関数にセットされる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.5 Frame Titles

それぞれのフレームにはnameというパラメーターがあります。これは、ウィンドウシステムが通常フレーム上端に表示するフレームタイトルにたいする、デフォルトとしての役割をもちます。フレームプロパティnameをセットすることにより、明示的に名前を指定できます。

通常は名前を明示的に指定せず、Emacsが変数frame-title-formatに格納されたテンプレートにもとづき、自動的にフレーム名を計算します。Emacsはフレームが再表示されるたびに、毎回名前を再計算します。

Variable: frame-title-format

この変数は、フレーム名が明示的に指定されないときに、フレーム名を計算する方法を指定する。この変数の値は、実際にはmode-line-formatのようなモードライン構成(mode line construct)だが、‘%c’および‘%l’の構成は無視される。The Data Structure of the Mode Lineを参照のこと。

Variable: icon-title-format

この変数は、フレームタイトルを明示的に指定しないときの、アイコン化されたフレームの名前の計算方法を指定する。このタイトルはアイコン自体に表示される。

Variable: multiple-frames

この変数はEmacsにより自動的にセットされる。フレームが2つ以上(ミニバッファーのみのフレームと不可視のフレームは勘定に入らない)のとき、値はtとなる。frame-title-formatのデフォルト値は、フレームが複数存在する場合のみ、フレーム名にバッファー名を入れるために、multiple-framesを使用する。

この変数の値は、frame-title-formaticon-title-formatの処理中を除き、正確である保証はない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.6 Deleting Frames

生きたフレーム(live frame)とは、削除されていないフレームのことです。フレームが削除される際は、たとえそれへの参照元がなくなるまでLispオブジェクトとして存在し続けるとしても、端末ディスプレイからは削除されます。

Command: delete-frame &optional frame force

この関数は、フレームframeを削除する。frameがツールチップでなければ、まずフックdelete-frame-functionsを実行する(フックの各関数は唯一の引数としてframeを受け取る)。デフォルトでは、frameは選択されたフレームである。

ミニバッファーが別のフレームに使用されているフレームは削除できない。通常、他のフレームすべてが不可視の場合、フレームは削除できないが、forceが非nilなら、削除が可能になる。

Function: frame-live-p frame

関数frame-live-pは、フレームframeが削除されていなければ、非nilをリターンする。リターンされ得る非nilの値は、framepと同様である。Framesを参照のこと。

いくつかのウィンドウマネージャーは、ウィンドウを削除するコマンドを提供します。これらは、そのウィンドウを操作するプログラムに特別なメッセージを送ることにより機能します。Emacsがそれらメッセージのいずれかを受け取ったときは、delete-frameイベントを生成します。このイベントの通常の定義は、関数delete-frameを呼び出すコマンドです。Miscellaneous System Eventsを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.7 Finding All Frames

Function: frame-list

この関数は、すべての生きたフレーム(削除されていないフレーム)のリストをリターンする。これはバッファーにたいするbuffer-listに類似しており、すべての端末上のフレームが含まれる。リターンされるリストは新たに作成されたものであり、このリストを変更してもEmacs内部への影響はない。

Function: visible-frame-list

この関数はカレントで可視なフレームだけのリストをリターンする。See section Visibility of Framesを参照のこと。テキスト端末上のフレームは、実際に表示されるのが選択されたフレームだけだとしても、常に“可視”であるとみなされる。

Function: next-frame &optional frame minibuf

この関数は、カレントディスプレイ上そすべてのフレームを、任意のフレームを開始点としいぇ巡回するのに便利である。これは、そのその巡回サイクル上でframeの“次”に該当するフレームをリターンする。frameが省略またはnilの場合のデフォルトは、選択されたフレーム(Input Focusを参照)である。

2つ目の引数minibufは、どのフレームを考慮するかを示す:

nil

ミニバッファーのみのフレームを除外。

visible

すべての可視フレームを考慮する。

0

すべての可視およびアイコン化されたフレームを考慮する。

ウィンドウ

特定のウィンドウをミニバッファーとして使用するフレームだけを考慮する。

その他

すべてのフレームを考慮する。

Function: previous-frame &optional frame minibuf

next-frameと同様だが、すべてのフレームを逆方向に巡回する。

Cyclic Ordering of Windowsnext-windowprevious-windowも参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.8 Minibuffers and Frames

通常は、それぞれのフレームは下端に自身のミニバッファーウィンドウをもち、そのフレームが選択された際は常にそれを使用します。フレームにミニバッファーがある場合は、minibuffer-windowでそれを取得できます(Definition of minibuffer-windowを参照)。

しかし、ミニバッファーのないフレームの作成も可能です。そのようなフレームは、別のフレームのミニバッファーウィンドウを使用しなければなりません。フレーム作成時に、(別フレーム上にある)使用するミニバッファーを明示的に指定できます。これを行わない場合は、変数default-minibuffer-frameの値のフレーム内でミニバッファーを探します。この値は、ミニバッファーをもつフレームにしてください。

ミニバッファーのみのフレームを使用する場合は、ミニバッファーにエンター時にそのフレームを前面に移動(raise)したいと思うかもしれません。その場合は、変数minibuffer-auto-raisetをセットします。Raising and Lowering Framesを参照してください。

Variable: default-minibuffer-frame

この変数は、デフォルトでミニバッファーウィンドウとして使用するフレームを指定する。これは、既存のフレームには影響しない。これはカレント端末にたいして常にローカルで、バッファーローカルにはできない。Multiple Terminalsを参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.9 Input Focus

どんなときでも、Emacs内のただ1つのフレームが選択されたフレーム(selected frame)です。選択されたウィンドウは、常に選択されたフレーム上にあります。

Emacsがフレームを複数端末(Multiple Terminalsを参照)上に表示する際、各端末は自身の選択されたフレームをもちます。しかし、それらのうち1つだけが、“いわゆる選択されたフレーム”であり、それはもっとも最近に入力があった端末に属すフレームです。つまり、特定の端末からのコマンドをEmacsが実行する際は、その端末上の1つが選択されたフレームです。Emacsが実行するコマンドは常に1つだけなので、選択されたフレームは常に1つだけだと考える必要があります。このフレームこそ、このマニュアルで選択されたフレームと呼ぶフレームです。選択されたフレームを表示するディスプレイは、選択されたフレームのディスプレイ(selected frame’s display)です。

Function: selected-frame

この関数は選択されたフレームをリターンする。

いくつかのウィンドウシステムおよびウィンドウマネージャーは、マウスがあるウィンドウオブジェクトにキーボード入力をダイレクトします。それ以外は、さまざまなウィンドウオブジェクトにフォーカスをシフト(shift the focus)するために、明示的なクリックやコマンドを要求します。どちらの方法でも、Emacsはフォーカスをもつフレームを自動的に追跡します。Lisp関数から別フレームに明示的に切り替えるためには、select-frame-set-input-focusを呼び出します。

関数select-frameを呼び出すことにより、Lispプログラムが“一時的”にフレームを切り替えることもできます。これは、そのウィンドウシステムのフォーカス概念を変更はしません。変更ではなく、何らかの方法により制御が再確認(reasserted)されるまで、ウィンドウマネージャーの制御から抜け出す(escape)のです。

テキスト端末使用時は、その端末上で一度に表示できるフレームは1つだけなので、select-frame呼び出し後、次回の再表示で新たに選択されたフレームが実際に表示されます。このフレームは、次のselect-frame呼び出しまで、選択されたままです。テキスト端末上の各フレームは、バッファー名の前に表示される番号をもちます(Variables Used in the Mode Lineを参照)。

Function: select-frame-set-input-focus frame &optional norecord

この関数は、frameを選択、(他のフレームのせいで不明瞭な場合には)それを前面に移動(raise)して、Xサーバーのフォーカス授与を試みる。テキスト端末上では、次回再表示時に端末スクリーン全体に新たにフレームが表示される。オプション引数norecordは、select-frame(下記参照)のときと同じ意味をもつ。この関数のリターン値に意味はない。

Command: select-frame frame &optional norecord

この関数は、フレームframeを選択し、Xサーバーのフォーカスがあればそれを一時的に無視する。frameにたいする選択は、次回ユーザーが別フレームに何かを行うか、この関数の次回呼び出しまで継続する(ウィンドウシステムを使用する場合は、以前に選択されていたフレームに依然としてウィンドウシステムの入力フォーカスがあるかもしれないので、コマンドループからリターン後に、そのフレームが選択されたフレームとしてリストアされるかもしれない)。

指定されたframeは選択されたフレームとなり、その端末が選択された端末になる。その後、この関数はframe内で選択されていたウィンドウを第1引数、norecordを第2引数でサブルーチンとしてselect-windowを呼び出す(したがって、norecordが非nilなら、もっとも最近に選択されたウィンドウおよびバッファーリストの変更を避ける)。Selecting Windowsを参照のこと。

この関数はframe、またはframeが削除されていればnilをリターンする。

一般的には、実行後に端末を戻すよう切り替えることなく、別の端末に切り替えるのが可能な手段としてselect-frameを決して使用すべきではない。

Emacsは、サーバーおよびウィンドウマネージャーのリクエストとしてフレーム選択をアレンジすることにより、ウィンドウシステムと協調します。これは、適切なときにフォーカス(focus)と呼ばれる特殊な入力イベントを生成することにより行われます。コマンドループは、handle-switch-frameを呼び出してフォーカスイベントを処理します。Focus Eventsを参照してください。

Command: handle-switch-frame frame

この関数は、フレームframe選択によりフォーカスイベントを処理する。

フォーカスイベントは通常、このコマンドを呼び出すことにより、その処理を行う。他の理由でこれを呼び出しではならない。

Function: redirect-frame-focus frame &optional focus-frame

この関数は、frameからfocus-frameにフォーカスをリダイレクトする。これは、frameにかわってfocus-frameが以降のキーストロークとイベントを受け取るであろうことを意味する。そのようなイベント後は、last-event-frameの値はfocus-frameになるだろう。また、frameを指定したswitch-frameイベントも、かわりに focus-frameを選択するだろう。

focus-frameが省略またはnilの場合は、frameにたいするすべての既存のリダイレクションがキャンセルされ、したがってframeが自身のイベントを再度受け取ることになる。

フォーカスリダイレクトの用途の1つは、ミニバッファーをもたないフレームにたいしてである。これらのフレームは、別フレーム上のミニバッファーを使用する。別フレーム上のミニバッファーをアクティブにすることは、そのフレームにフォーカスをリダイレクトすることである。これは、たとえマウスがミニバッファーをアクティブにしたフレーム内に留まっていても、ミニバッファーが属すフレームにフォーカスを置く。

フレーム選択は、フォーカスリダイレクションの変更も可能にする。fooが選択されているときにフレームbarを選択することにより、fooを指すすべてのリダイレクションは、かわりにbarを指す。これは、ユーザーがselect-windowを使用してあるフレームから別のフレームに切り替えた際に、フォーカスのリダイレクトが正しく機能することを可能にする。

これは、フォーカスが自身にリダイレクトされたフレームが、フォーカスがリダイレクトされていないフレームとは異なう扱いを受けることを意味する。前者にたいしてselect-frameは影響するが、後者には影響がない。

このリダイレクションは、それを変更するためにredirect-frame-focusが呼び出されるまで継続する。

Variable: focus-in-hook

これは、Emacsフレームが入力フォーカスを得た際に実行されるノーマルフックである。

Variable: focus-out-hook

これは、Emacsフレームが入力フォーカスを失った際に実行されるノーマルフックである。

User Option: focus-follows-mouse

これは、ユーザーがマウスを移動した際に、ウィンドウマネージャーがフォーカスを転送するかどうかをEmacsに告げるためのオプションである。非nilなら、フォーカスは転送される。その場合、コマンドother-frameは新たに選択されたフレームと一貫性のある位置にマウスを移動する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.10 Visibility of Frames

グラフィカルなディスプレイ上のフレームは可視(visible)不可視(invisible)、またはアイコン化(iconified)されているかもしれません。可視なら、そのコンテンツは通常の方法により表示されます。アイコン化されている場合、そのコンテンツは表示されませんが、ビュー内にフレームを戻すための小さいアイコンがどこかにあります(いくつかのウィンドウマネージャーは、この状態をアイコン化ではなく最小化と呼ぶが、Emacsの見地ではこれらは同等である)。フレームが不可視なら、それはまったく表示されません。

テキスト端末では、いつでも実際に表示されるのはただ1つの選択されたフレームだけなので、可視性に意味はありません。

Function: frame-visible-p frame

この関数は、フレームframeの可視性の状態をリターンする。値は、frameが可視ならt、不可視ならnil、アイコン化されている場合はiconになる。

テキスト端末上では、たとえ1つのフレームだけが表示されているとしても、この関数の目的にたいしては、すべてのフレームが“可視”とみなされる。Raising and Lowering Framesを参照のこと。

Command: iconify-frame &optional frame

この関数は、フレームframeをアイコン化する。frameを省略した場合は、選択されたフレームをアイコン化する。

Command: make-frame-visible &optional frame

この関数は、フレームframeを可視にする。frameを省略した場合は、選択されたフレームを可視にする。これはフレームを前面に移動しないが、望むならraise-frameでそれを行うことができる(Raising and Lowering Framesを参照)。

Command: make-frame-invisible &optional frame force

この関数は、フレームframeを不可視にする。frameを省略した場合は、選択されたフレームを不可視にする。

forcenilなら、この関数は他のすべてのフレームが不可視の場合は、frameを不可視にするのを拒絶する。

フレームの可視性の状態は、フレームパラメーターとしても利用可能である。つまりフレームパラメーターとして読み取りと変更ができる。Window Management Parametersを参照のこと。ウィンドウマネージャーによりユーザーがフレームのアイコン化や非アイコン化を行うこともできる。これは、Emacsが何らかの制御を及ぼすのが可能なレベルより下のレベルにおいて発生するが、Emacsはそのような変化を追跡するために使用するイベントを提供する。Miscellaneous System Eventsを参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.11 Raising and Lowering Frames

ほとんどのウィンドウシステムは、デスクトップというメタファー(metaphor: 比喩的概念)を使用します。このメタファーの一部は、システムレベルのウィンドウ(Emacsではフレーム)が、スクリーン表面に向かって、概念的3次元の垂直方向に積まれていくというアイデアです。2つが重なる箇所では、より高い一方が、より低い一方を覆い隠します。関数raise-frameおよびlower-frameを使用して、フレームを前面に移動(raise: より高い位置へ上げる)したり背面に移動(lower: より低い位置へ移動)したりすることができます。

Command: raise-frame &optional frame

この関数は、フレームframe(デフォルトは選択されたフレーム)を前面に移動する。frameが不可視もしくはアイコン化されている場合は、それを可視にする。

Command: lower-frame &optional frame

この関数は、フレームframe(デフォルトは選択されたフレーム)を背面に移動する。

User Option: minibuffer-auto-raise

これが非nilなら、ミニバッファーをアクティブにすることにより、ミニバッファーウィンドウのあるフレームが前面に移動される。

ウィンドウシステム上では、フレームパラメーターを使用して、(フレーム選択時に)auto-raising、(フレーム選択解除時に)auto-loweringを有効にできます。Window Management Parametersを参照してください。

フレームを前面または背面に移動するという概念は、テキスト端末のフレームにも適用できます。各テキスト端末上で、一度に表示されるのは、常に最前面のフレームだけです。

Function: tty-top-frame terminal

この関数は、terminal上の最前面のフレームをリターンする。terminalは端末オブジェクト、フレーム(そのフレームの端末を意味する)、またはnil(選択されたフレームの端末を意味する)であること。これがテキスト端末を参照しなければ、リターン値はnilとなる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.12 Frame Configurations

フレーム構成(frame configuration)はフレームのカレント配置、すべてのプロパティ、および各ウィンドウのウィンドウ構成(Window Configurationsを参照)を記録します。

Function: current-frame-configuration

この関数は、フレームのカレント配置およびそのコンテンツを記述するフレーム構成のリストをリターンする。

Function: set-frame-configuration configuration &optional nodelete

この関数は、フレームの状態をconfigurationの記述にリストアする。しかし、この関数は削除されたフレームはリストアしない。

通常、この関数はconfiguration内にリストされない既存フレームすべてを削除する。しかしnodeleteが非nilなら、希望しないそれらフレームはかわりにアイコン化される。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.13 Mouse Tracking

マウスをトラック(track: 追跡)するのが有用なことが時折あります。マウスのトラックとは、マウスの位置を示す何かを表示して、マウス移動とともにそのインジケーターを移動する、という意味です。効果的にマウスをトラックするためには、マウスが実際に移動するまで待機する手段が必要になります。

マウスをトラックする便利なのは、マウスのモーション(motion: 移動)を表すイベントを問い合わせる方法です。その後は、そのイベントを待機することにより、モーションを待機できます。加えて、発生し得る他の類のイベントも、簡単に処理できます。ボタンのリリースのような何か他のイベントだけを待機してマウスを永久にトラックするは通常は望ましくないので、これは有用です。

Special Form: track-mouse body…

このスペシャルフォームは、マウスモーションイベントの生成を有効にして、bodyを実行する。通常、bodyはモーションイベントを読み取るためにread-eventを使用し、それに対応して表示を変更する。マウスモーションイベントのフォーマットについては、Motion Eventsを参照のこと。

track-mouseの値は、body内の最後のフォームの値である。ボタンのリリースを示すup-event、またはトラックを止めるべきタイミングを意味する類のイベントを確認した際にはリターンするよう、bodyをデザインするべきである。

マウスモーションをトラックする通常の目的は、それ以降に発生するボタンのプッシュやリリースをカレント位置に示すことです。

多くの場合は、テキストプロパティmouse-face(Properties with Special Meaningsを参照)を使用することにより、マウスをトラックする必要性を回避できます。これは、より低レベルで機能し、かつLispレベルのマウストラッキングよりスムーズに実行されます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.14 Mouse Position

関数mouse-positionおよびset-mouse-positionは、マウスのカレント位置にたいするアクセスを提供します。

Function: mouse-position

この関数は、マウス位置の記述をリターンする。値は(frame x . y)のような形式で、xyframe内部の左上隅から相対的な位置を文字単位で与える整数である。

Variable: mouse-position-function

nilなら、この変数の値はmouse-positionにたいして呼び出される関数である。mouse-positionはリターン直前には、自身の通常のリターン値を唯一の引数としてこの関数を呼び出し、それが何であれその関数がリターンしたものをリターンする。

このアブノーマルフックは、xt-mouse.elのようにLispレベルでマウス処理を行う必要があるパッケージのために存在する。

Function: set-mouse-position frame x y

この関数は、フレームframe内の位置xyマウスをワープさせる。引数xyは、frame内部の左上隅から相対的な位置を文字単位で与える整数である。frameが不可視なら、この関数は何も行わない。リターン値に意味はない。

Function: mouse-pixel-position

この関数はmouse-positionと似ているが、文字単位ではなくピクセル単位の座標をリターンする。

Function: set-mouse-pixel-position frame x y

この関数はset-mouse-positionのようにマウスをワープするが、xyが文字単位ではなくピクセル単位であることを除く。これらの座標が、そのフレーム内にあることは要求されない。

frameが不可視なら、この関数は何も行わない。リターン値に意味はない。

Function: frame-pointer-visible-p &optional frame

この述語関数は、frame上に表示されたマウスポインターが可視なら非nil、それ以外はnilをリターンする。frameが省略またはnilなら、それは選択されたフレームを意味する。これは、make-pointer-invisibletにセットされているとき有用である。これにより、ポインターが隠されていることを知ることができる。Mouse Avoidance in The Emacs Manualを参照のこと。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.15 Pop-Up Menus

Lispプログラムはポップアップメニューを表示できるので、ユーザーはマウスで候補を選択できます。テキスト端末上では、マウスが利用不可なら、キーボードのモーションキーC-nC-p、上矢印キー、下矢印キーで候補を選択できます。

Function: x-popup-menu position menu

この関数は、ポップアップメニューを表示して、ユーザーが何を選択したかの指標をリターンする。

引数positionは、メニュー左上隅をスクリーン上どこに置くか指定する。これはマウスボタンイベント(ユーザーがボタンを操作した位置にメニューを置くよう告げる)、または以下の形式のリストのいずれかである:

((xoffset yoffset) window)

ここで、xoffsetyoffsetwindow左上隅からピクセル単位で測られた座標である。windowはウィンドウ、またはフレームかもしれない。

positiontの場合、それはマウスのカレント位置の使用を意味する(テキスト端末上でマウスが利用不可ならフレーム左上隅)。positionnilなら、それは実際にメニューをポップアップせずに、menu内で指定されたキーマップと等価なキーバインディングを事前に計算することを意味する。

引数menuは、メニュー内で何を表示するかを告げる。これはキーマップまたはキーマップのリストを指定できる(Menu Keymapsを参照)。この場合、リターン値はユーザー選択に対応するイベントのリストである。選択がサブメニュー内で発生した場合、このリストには複数の要素がある(x-popup-menuはそのイベントシーケンスにバインドされたコマンドを実際には実行しないことに注意)。テキスト端末、およびメニュータイトルをサポートするツールキットでは、menuがキーマップならタイトルはmenuのプロンプト文字列、menuがキーマップのリストなら最初のキーマップのプロンプト文字列から取得される(Defining Menusを参照)。

かわりに、menuは以下の形式をもつこともできる:

(title pane1 pane2...)

ここで、それぞれのpaneは以下の形式のリストである

(title item1 item2...)

それぞれitemは、コンスセル(line . value)であること。ここでlineは文字列、valuelineが選択された場合にリターンされる値である。メニューキーマップと異なり、nilvalueは選択不可のメニューアイテムを作成しない。かわりに、それぞれのitemにコンスセルではなく文字列を指定できる。これは選択不可のメニューアイテムを作成する。

たとえば有効な選択からマウスを外してクリックしたり、C-gをタイプすることにより、有効な選択を行うことなくユーザーがメニューを取り除いた場合は、通常はquitしてx-popup-menuはリターンしない。しかし、positionがマウスボタンイベント(ユーザーがマウスでメニューを呼び出したことを示す)なら、quitは起こらずx-popup-menuはリターンする。

使用上の注意: メニューキーマップで定義したプレフィクスキー処理を行えるなら、メニューの表示にx-popup-menuを使用しないでください。メニューの実装にメニューキーマップを使用する場合は、C-h cおよびC-h aでメニュー内の個別アイテムの確認、およびそれらにたいするヘルプを提供できます。かわりにx-popup-menuを呼び出すコマンドを定義することによりメニューを実装した場合、ヘルプ機能はそのコマンド内部で何が起こっているか知ることができず、そのメニューアイテムのヘルプを何も与えられません。

マウス移動によりサブメニュー間を切り替えるメニューバーのメカニズムは、それがx-popup-menuを呼び出すか確認するために、コマンドの定義を見ることができません。したがって、x-popup-menuを使用してサブメニューの実装を試みた場合、それは統合された方式でメニューバーとともに機能しません。メニューバーのすべてのサブメニューは、親メニューのメニューキーマップにより実装され、決してx-popup-menuで実装されないのは、これが理由です。The Menu Barを参照してください。

メニューバーのサブメニューのコンテンツを変化させたい場合にも、その実装には依然としてメニューキーマップを使用するべきです。コンテンツを変化させるためには、必要に応じてメニューキーマップのコンテンツを更新するために、フック関数をmenu-bar-update-hookに追加してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.16 Dialog Boxes

ダイアログボックスとはポップアップメニューの一種です。外見は多少異なり、常にフレーム中央に表示され、階層を1つしかもたず1つ以上のボタンがあります。ユーザーが“yes”、“no”、および別の少数の候補で応答ができる質問を尋ねるのが、ダイアログボックスの主な用途です。単一のボタンでは、ユーザーに重要な情報の確認を強いることもできます。関数y-or-n-pおよびyes-or-no-pは、マウスのクリックにより呼び出されたコマンドから呼び出された際は、キーボードのかわりにダイアログボックスを使用します。

Function: x-popup-dialog position contents &optional header

この関数は、ポップアップダイアログボックスを表示して、ユーザーが何を選択したかの指標をリターンする。引数contentsは、提供するための候補を指定する。これは、以下のフォーマットをもつ:

(title (string . value)…)

これは、x-popup-menuにたいして単一paneを指定するリストのように見える。

リターン値は、選択された候補のvalueである。

x-popup-menuの場合と同様、このリストの要素はコンスセル(string . value)のかわりに、単なる文字列かもしれない。これは、選択不可のボックスを作成する。

このリスト内にnilがある場合、それは左手側と右手側のアイテムを分ける。つまり、nilより前のアイテムは左、nilより後のアイテムは右に表示される。リスト内にnilを含めない場合は、およそ半数づつが両サイドに表示される。

ダイアログボックスは、常にフレームの中央に表示される。引数positionは、どのフレームかを指定する。可能な値はx-popup-menuの場合と同様だが、正確な座標や個別のウィンドウは問題ではなく、フレームだけが問題となる。

headerが非nilならボックスのフレームタイトルは‘Information’、それ以外は‘Question’になる。前者はmessage-box(see message-boxを参照)にたいして使用される(テキスト端末上ではボックスタイトルは表示されない)。

いくつかの構成では、Emacsは本当のダイアログボックスを表示できないので、かわりにフレーム中央のポップアップメニュー内に同じアイテムを表示する。

たとえばウィンドウマネージャーを使用して、有効な選択を行うことなくユーザーがダイアログボックスを取り除いた場合は、通常はquitしてx-popup-dialogはリターンしない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.17 Pointer Shape

テキストプロパティpointerや、イメージならイメージプロパティ:pointerおよび:mapを使用して、特定のテキストやイメージにたいしてマウスポインターのスタイルを指定できます。これらのプロパティに使用できる値はtext(またはnil)、arrowhandvdraghdragmodelinehourglassです。textは、テキスト上で使用される、通常のマウスポインタースタイルを意味します。

ウィンドウの空部分(void parts: バッファーコンテンツのどの部分にも対応しない部分)の上では、マウスポインターは通常arrowスタイルを使用しますが、void-text-area-pointerをセットすることにより、異なるスタイルを指定できます。

User Option: void-text-area-pointer

この変数は、空テキストエリアにたいするマウスポインタースタイルを指定する。このエリアには、行末の後や、バッファー終端行の下が含まれる。デフォルトでは、arrow(non-text)ポインタースタイルを使用。

Xを使用する際は、変数x-pointer-shapeをセットすることにより、textの本当の外見を指定できます。

Variable: x-pointer-shape

この変数は、Emacsフレーム内でtextポインタースタイルに通常使用するポインターシェイプを指定する。

Variable: x-sensitive-text-pointer-shape

この変数は、マウスがマウスセンシティブテキスト上にあるときのポインターシェイプを指定する。

これらの変数は、新たに作成されるフレームに影響します。通常これらは既存のフレームに効果はありませんが、フレームのマウスカラーのインストール時には、これら2つ変数のカレント値もインストールされます。Font and Color Parametersを参照してください。

これらのポインターシェイプのいずれかを指定するために使用可能な値は、ファイルlisp/term/x-win.el内で定義されています。それらのリストを確認するには、M-x apropos RET x-pointer RETを使用してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.18 Window System Selections

Xウィンドウシステムでは、異なるアプリケーション間のデータ転送は、選択(selections)により行われます。Xは任意の数の選択タイプ(selection types)を定義し、それぞれが独自にデータを格納できます。しかし、一般的に使用されるのはクリップボード(clipboard)プライマリー選択(primary selection)セカンダリー選択(secondary selection)の3つだけです。これら3つの選択を使用するEmacsコマンドについては、Cut and Paste in The GNU Emacs Manualを参照してください。このセクションでは、X選択の読み取りとセットを行う、低レベル関数について説明します。

Command: x-set-selection type data

この関数は、X選択をセットする。これは、選択タイプtypeと、それに割り当てる値dataの、2つの引数をとる。

typeはシンボルであること。通常はPRIMARYSECONDARYCLIPBOARDのいずれかである。これらは、Xウィンドウシステムの慣例に対応する大文字のシンボル名である。typenilなら、それはPRIMARYを意味する。

datanilなら、それはその選択をクリアーすることを意味する。それ以外では、dataは文字列、シンボル、整数(2つの整数からなるコンスかリスト)、オーバーレイ、同じバッファーを指す2つのマーカーのコンスを指定できる。オーバーレイとマーカーのペアは、そのオーバーレイまたはマーカー間のテキストを意味する。引数dataには、非ベクターの選択の値のベクターも指定できる。

この関数はdataをリターンする。

Function: x-get-selection &optional type data-type

この関数は、Emacsおよび別のXクライアントによりセットアップされた選択にアクセスする。これはtypedata-typeの、2つの引数をとる。typeは選択のタイプで、デフォルトはPRIMARY

data-type引数は、別のXクライアントから取得したrawデータをLispデータに変換するための、データ変換に使用する形式を指定する。意味のある値にはTEXTSTRINGUTF8_STRINGTARGETSLENGTHDELETEFILE_NAMECHARACTER_POSITIONNAMELINE_NUMBERCOLUMN_NUMBEROWNER_OSHOST_NAMEUSERCLASSATOMINTEGERが含まれる(これらは、対応するX慣習の大文字シンボル名である)。data-typeのデフォルトはSTRING

User Option: selection-coding-system

この変数は、選択やクリップボードに読み書きする際のコーディングシステムを指定する。Coding Systemsを参照してください。デフォルトはcompound-text-with-extensionsで、これはX11が通常使用するテキスト表現に変換する。

EmacsがMS-Windows上で実行されている際は、一般的にX選択はサポートしませんが、クリップボードはサポートします。MS-Windowsでは、x-get-selectionおよびx-set-selectionは、テキストデータタイプだけをサポートします。クリップボードが他のタイプのデータを保持している場合、Emacsはクリップボードを空として扱います。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.19 Drag and Drop

ユーザーが別のアプリケーションからEmacsに何かをドラッグをした際、その別アプリケーションはEmacsがドラッグされたデータを処理可能か告げることを期待します。変数x-dnd-test-functionは、何を応答するか決定するために、Emacsにより使用されます。デフォルト値はx-dnd-default-test-functionで、これはドロップされたデータのタイプがx-dnd-known-types内にあれば、ドロップを受け入れます。何か別の条件にもとづいてEmacsにドロップを許容または拒絶させたい場合は、x-dnd-test-functionおよび/またはx-dnd-known-typesをカスタマイズできます。

Emacsが異なるタイプのドロップを処理する方法を変更したり、新たなタイプを追加したい場合は、x-dnd-types-alistをカスタマイズします。これには、他のアプリケーションがドラッグアンドドロップに使用するのが何のタイプなのか、詳細な知識が要求されます。

EmacsにURLがドロップされたとき、それはファイルかもしれませんが、他のURLタイプ(ftp、http、...)であるかもしれません。Emacsはまず、そのURLに何を行うべきか判断するために、dnd-protocol-alistをチェックします。それにマッチがなく、かつbrowse-url-browser-functionがalistなら、Emacsはそこでマッチを探します。それでもマッチが見つからなければ、そのURLにたいするテキストを挿入します。これらの変数をカスタマイズすれば、Emacsの挙動を変更できます。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.20 Color Names

カラー名(color name)とは、カラーを指定するテキスト(通常は文字列)です。‘black’、‘white’、‘red’等が指定できます。定義された名前のリストは、M-x list-colors-displayを使用して確認できます。‘#rgb’や‘RGB:r/g/b’のような、数値的な形式でカラーを指定することもできます。ここで、rは赤(red)、gは緑(green)、bは青(blue)のレベルを指定します。1桁、2桁、3桁、または4桁の16進数をrに使用できます。その後、gbには同じ桁数の16進数を同様に使用しなければなりません。これにより、総桁数が3、6、9、または12桁の16進数となります(カラーの数値的なRGB指定についての詳細は、Xウィンドウシステムのドキュメントを参照されたい)。

以下の関数は、有効なカラー名と、それらの外見を判断する手段を提供します。以下で説明するように、その値は選択されたフレーム(selected frame)に依存する場合があります。“選択されたフレーム”という用語の意味については、Input Focusを参照してください。

補完付きでカラー名のユーザー入力を読み取るには、read-colorを使用します(read-colorを参照)。

Function: color-defined-p color &optional frame

この関数は、カラー名が有意かどうかを報告する。もし有意ならt、それ以外はnilをリターンする。引数frameは、どのフレームのディスプレイにたいして問い合わせるかを指定する。frameが省略またはnilの場合は、選択されたフレームが使用される。

これは、使用しているディスプレイがそのカラーをサポートするかどうかは告げないことに注意。X使用時には、すべての種類のディスプレイ上のすべての定義されたカラーを問い合わせることができ、何らかの結果(通常は可能な限り近いカラー)を得ることができるでしょう。あるフレームが特定のカラーを実際に表示できるかどうか判断するためには、color-supported-p(以下参照)を使用してください。

この関数は、以前はx-color-defined-pと呼ばれており、その名前は今でもエイリアスとしてサポートされている。

Function: defined-colors &optional frame

この関数は、frame(デフォルトは選択されたフレーム)上で定義かつサポートされるカラー名のリストをリターンする。frameがカラーをサポートしなければ、値はnilとなる。

この関数は、以前はx-defined-colorsと呼ばれており、その名前は今でもエイリアスとしてサポートされている。

Function: color-supported-p color &optional frame background-p

これは、frameが実際にカラーcolor(または最低でもそれに近いカラー)を表示可能ならtをリターンする。frameが省略またはnilなら、この問いは選択されたフレームに適用される。

フォアグラウンドおよびバックグラウンドにたいして異なるカラーセットをサポートする端末がいくつかある。background-pが非nilの場合、それはcolorがバックグラウンドとして、それ以外はフォアグラウンドとして使用可能かどうかを問うことを意味する。

引数colorは、有効なカラー名でなければならない。

Function: color-gray-p color &optional frame

これは、colorframeのディスプレイ上の定義として、グレイスケールならtをリターンする。frameが省略またはnilなら、この問いは選択されたフレームに適用される。colorが有効なカラー名でなければ、この関数はnilをリターンする。

Function: color-values color &optional frame

この関数は、frame上で理想的にはcolorがどのように見えるべきかを記述する値をリターンする。colorが定義済みの場合、値は赤、緑、青の割合を与える3つの整数からなるリストである。それぞれの整数の範囲は原則として0から65535だが、この範囲全体を使用しないディスプレイもいくつか存在するだろう。この3要素のリストは、カラーのRGB値(rgb values)と呼ばれる。

colorが未定義なら、値はnilである。

(color-values "black")
     ⇒ (0 0 0)
(color-values "white")
     ⇒ (65280 65280 65280)
(color-values "red")
     ⇒ (65280 0 0)
(color-values "pink")
     ⇒ (65280 49152 51968)
(color-values "hungry")
     ⇒ nil

カラーの値は、frameのディスプレイにたいしてリターンされる。frameが省略またはnilの場合、この情報は選択されたフレームのディスプレイにたいしてリターンされる。このフレームがカラーを表示できない場合、値はnilとなる。

この関数は、以前はx-color-valuesと呼ばれており、その名前は今でもエイリアスとしてサポートされている。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.21 Text Terminal Colors

通常、テキスト端末は少しのカラーしかサポートせず、コンピューターはカラー選択に小さい整数を使用します。これは、選択したカラーがどのように見えるかコンピューターが信頼性をもって告げることができず、どのカラーがどのような小さい整数に対応するかという情報を、をアプリケーションに伝える必要があることを意味します。しかし、Emacsは標準的なカラーセットを知っており、それらの自動的な使用を試みるでしょう。

このセクションで説明する関数は、Emacsが端末カラーを使用する方法を制御します。

これらの関数のうちのいくつかは、Color Namesで説明したRGB値(rgb values)を使用またはリターンします。

これらの関数は、オプション引数としてディスプレイ(フレームまたは端末名のいずれか)を受け取ります。わたしたちは将来、異なる端末上で異なるカラーをEmacsにサポートさせたいと望んでいます。そうすれば、この引数はどの端末を処理するか(デフォルトは選択されたフレームの端末。Input Focusを参照のこと)を指定するようになるでしょう。しかし現在のところ、frame引数に効果はありません。

Function: tty-color-define name number &optional rgb frame

この関数は、カラー名nameを、その端末上のカラー値numberに関連付ける。

オプション引数rgbが指定された場合、それはそのカラーが実際にどのように見えるかを指定する、3つの数値のリストからなるRGB値である。rgbを指定しない場合、Emacsはそれがどのように見えるか知らないので、そのカラーを他のカラーに近似するためにtty-color-approximateで使用することができない。

Function: tty-color-clear &optional frame

この関数は、テキスト端末の定義済みカラーのテーブルをクリアーする。

Function: tty-color-alist &optional frame

この関数は、テキスト端末がサポートする既知のカラーを記録したalistをリターンする。

それぞれの要素は、(name number . rgb)または(name number)という形式をもつ。ここで、nameはカラー名、numberはその端末でカラー指定に使用される数値である。rgbが与えられた場合、それはそのカラーが実際にどのように見えるかを告げる3つのカラー値(赤、緑、青)のリストである。

Function: tty-color-approximate rgb &optional frame

この関数は、displayにたいしてサポートされた既知のカラーの中から、RGB値rgb(カラー値のリスト)で記述されたもっとも近いカラーを探す。リターン値は、tty-color-alistの要素である。

Function: tty-color-translate color &optional frame

この関数は、displayにたいしてサポートされた既知のカラーの中から、もっとも近いカラーのインデックス(整数)をリターンする。名前colorが未定義なら、値はnilとなる。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.22 X Resources

このセクションでは、Xリソース、または他のオペレーティングシステム上での等価物を問い合わせたり使用する関数および変数をいくつか説明します。Xリソースにたいする詳細な情報は、X Resources in The GNU Emacs Manualを参照してください。

Function: x-get-resource attribute class &optional component subclass

関数x-get-resourceは、Xウィンドウのデフォルトデータベースからリソース値を取得する。

リソースは、キー(key)クラス(class)の組み合わせによりインデックス付けされている。この関数は、‘instance.attribute’という形式をキー(instanceはEmacsが呼び出されたときの名前)、クラスとして‘Emacs.class’として使用することにより検索を行う。

オプション引数componentおよびsubclassは、それぞれキーおよびクラスを追加する。指定する場合は両方を指定するか、さもなくばどちらも指定してはならない。これらを指定した場合、キーは‘instance.component.attribute’、クラスは‘Emacs.class.subclass’となる。

Variable: x-resource-class

この変数は、x-get-resourceが照会すべきアプリケーション名を指定する。デフォルト値は"Emacs"x-get-resourceの呼び出し周辺で、この変数を“Emacs”以外の文字列にバインドすることにより、アプリケーション名にたいしてXリソースを調べることができる。

Variable: x-resource-name

この変数は、x-get-resourceが照会すべきインスタンス名を指定する。デフォルト値はEmacs呼び出し時の名前、またはスイッチ‘-name’または‘-rn’で指定された値である。

上述のいくつかを説明するために、Xリソースファイル(通常は~/.Xdefaults~/.Xresources)内に以下のような行があるとしましょう:

xterm.vt100.background: yellow

その場合は:

(let ((x-resource-class "XTerm") (x-resource-name "xterm"))
  (x-get-resource "vt100.background" "VT100.Background"))
     ⇒ "yellow"
(let ((x-resource-class "XTerm") (x-resource-name "xterm"))
  (x-get-resource "background" "VT100" "vt100" "Background"))
     ⇒ "yellow"
Variable: inhibit-x-resources

この変数が非nilなら、EmacsはXリソースを照会せず、新たなフレーム作成時にXリソースは何も効果をもたない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

28.23 Display Feature Testing

このセクションの関数は、特定のディスプレイの基本的な能力を説明します。Lispプログラムは、そのディスプレイが行えることに挙動を合わせるために、それらを使用できます。たとえば、ポップアップメニューがサポートされなければ、通常はポップアップメニューを使用するプログラムは、ミニバッファーを使用できます。

これらの関数のオプション引数displayは、問い合わせるディスプレイを指定します。これにはディスプレイ名、フレーム(フレームがあるディスプレイを指定)、またはnil(選択されたフレームのディスプレイを参照する。Input Focusを参照されたい)を指定できます。

ディスプレイに関する情報を取得するその他の関数については、Color Namesを参照してください。

Function: display-popup-menus-p &optional display

この関数は、display上でポップアップメニューがサポートされていればt、それ以外はnilをリターンする。Emacsディスプレイのある部分をマウスでクリックすることによりメニューがポップアップするので、ポップアップメニューのサポートにはマウスが利用可能であることが要求される。

Function: display-graphic-p &optional display

この関数は、displayが一度に複フレームおよび複数の異なるフォントを表示する能力を有すグラフィックディスプレイならtをリターンする。これは、Xのようなウィンドウシステムのディスプレイにたいしては真、テキスト端末にたいしては偽となる。

Function: display-mouse-p &optional display

この関数は、displayでマウスが利用可能ならt、それ以外はnilをリターンする。

Function: display-color-p &optional display

この関数は、そのスクリーンがカラースクリーンならtをリターンする。これは以前はx-display-color-pと呼ばれており、その名前はエイリアスとして今でもサポートされる。

Function: display-grayscale-p &optional display

この関数は、スクリーンがグレースケールを表示可能ならtをリターンする(カラーディスプレイはすべてこれを行うことができる)。

Function: display-supports-face-attributes-p attributes &optional display

この関数は、attributes内のすべてのフェイス属性がサポートされていれば非nilをリターンする(Face Attributesを参照)。

幾分発見的ではあるが、‘サポートされる’という言葉は、基本的にはあるフェイスがattributes内のすべての属性を含み、ディスプレイにたいしてデフォルトフェイスにマージ時に、

  1. デフォルトフェイスとは異なる外見で表示でき、かつ
  2. 指定した属性と正確に一致しない場合は、‘より近い(close in spirit)’

方法で表現可能なことを意味する。2つ目のポイントは、属性:weight blackは太字(bold)表示可能な、同様に属性:foreground "yellow"は黄色がかった何らかのカラーを表示可能なすべてのディスプレイで満たされるだろうが、属性:slant italicは斜体(italic)を自動的に‘淡色(dim)’に置き換えるttyの表示コードでは満たされないであろうことを暗に示している。

Function: display-selections-p &optional display

この関数は、displayが選択(selections)をサポートすればtをリターンする。ウィンドウ化されたディスプレイでは、通常は選択がサポートされるが、他の場合にもサポートされ得る。

Function: display-images-p &optional display

この関数は、displayがイメージを表示可能ならtをリターンする。ウィンドウ化されたディスプレイは原則イメージを処理するが、イメージにたいするサポートを欠くシステムもいくつかある。イメージをサポートしないディスプレイ上では、Emacsはツールバーを表示できない。

Function: display-screens &optional display

この関数は、そのディスプレイに割り当てられたスクリーンの数をリターンする。

Function: display-pixel-height &optional display

この関数は、スクリーンの高さをピクセルでリターンする。文字端末では、文字数で高さを与える。

“マルチモニター”にセットアップされているグラフィカル端末では、displayに割り当てられたすべての物理モニターのピクセル幅を参照することに注意。Multiple Terminalsを参照のこと。

Function: display-pixel-width &optional display

この関数は、スクリーンの幅をピクセルでリターンする。文字端末では、文字数で幅を与える。

“マルチモニター”にセットアップされているグラフィカル端末では、displayに割り当てられたすべての物理モニターのピクセル幅を参照することに注意。Multiple Terminalsを参照のこと。

Function: display-mm-height &optional display

この関数は、スクリーンの高さをミリメートルでリターンする。nilなら、Emacsがその情報を取得できなかったことを意味する。

“マルチモニター”にセットアップされているグラフィカル端末では、displayに割り当てられたすべての物理モニターのピクセル幅を参照することに注意。Multiple Terminalsを参照のこと。

Function: display-mm-width &optional display

この関数は、スクリーンの幅をミリメートルでリターンする。nilなら、Emacsがその情報を取得できなかったことを意味する。

“マルチモニター”にセットアップされているグラフィカル端末では、displayに割り当てられたすべての物理モニターのピクセル幅を参照することに注意。Multiple Terminalsを参照のこと。

User Option: display-mm-dimensions-alist

この変数は、システムの提供する値が不正な場合にdisplay-mm-heightおよびdisplay-mm-widthがリターンするグラフィカルなディスプレイのサイズを、ユーザーが指定できるようにする。

Function: display-backing-store &optional display

この関数は、そのディスプレイのバッキングストアー(backing store)の能力をリターンする。バッキングストアーとは、非露出ウィンドウ(およびウィンドウの一部)のピクセルを記録しておいて、露出時に素早く表示できるようにすることを意味する。

値にはシンボルalwayswhen-mappednot-usefulである。特定の種類のディスプレイにたいしてこの問いが適用外の際、この関数はnilをリターンすることもある。

Function: display-save-under &optional display

この関数は、そのディスプレイがSaveUnder機能をサポートすれば非nilをリターンする。この機能は、ポップアップウィンドウに隠されるピクセルを保存して、素早くポップダウンができるようにするために使用される。

Function: display-planes &optional display

この関数は、そのディスプレイがサポートする平面数(number of planes)をリターンする。これは通常、ピクセルごとのビット(bits per pixel: 色深度[bpp])数である。ttyディスプレイでは、サポートされるカラー数の2進対数(log to base two)である。

Function: display-visual-class &optional display

この関数は、そのスクリーンのビジュアルクラスをリターンする。値はシンボルstatic-gray(カラー数変更不可の限定されたグレイ)、gray-scale(フルレンジのグレイ)、static-color(カラー数変更不可の限定されたカラー)、pseudo-color(限定されたカラー数のカラー)、true-color(フルレンジのカラー)、およびdirect-color(フルレンジのカラー)のいずれかである。

Function: display-color-cells &optional display

この関数は、そのスクリーンがサポートするカラーのセル数をリターンする。

以下の関数は、Emacsが指定されたdisplayを表示する場所に使用されるウィンドウシステムの追加情報を取得します(関数名先頭のx-は歴史的理由による)。

Function: x-server-version &optional display

この関数は、GNUおよびUnixシステム上のXサーバーのような、display上で実行されているGUIウィンドウシステムのバージョン番号のリストをリターンする。値は3つの整数からなるリストで、1つ目と2つ目の整数はそのプロトコルのメジャーバージョン番号とマイナーバージョン番号、3つ目の整数はウィンドウシステムソフトウェア自体のディストリビューター固有のリリース番号である。GNUおよびUnixシステムでは、通常これらはXプロトコルのバージョン番号と、Xサーバーソフトウェアのディストリビューター固有のリリース番号である。MS-Windowsでは、WidowsのOSバージョン番号である。

Function: x-server-vendor &optional display

この関数は、ウィンドウシステムソフトウェアを提供する“ベンダー”をリターン(文字列)する。GNUおよびUnixシステムでは、それが誰であれそのXサーバーを配布するベンダーを意味する。MS-Windowsでは、Widows OSのベンダーID文字列(Microsoft)である。

X開発者がソフトウェア配布者を“vendors”とラベル付けしたことは、いかなるシステムも非商業的に開発および配布できないと彼らが誤って仮定したことを示している。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29 Positions

位置(position)とは、バッファーのテキストの文字のインデックスです。より正確には、位置とは2つの文字間(または最初の文字の前、または最後の文字の後)の箇所を識別し、与えられた位置の前あるいは後の文字のように表現することができます。しかし、“ある位置にある文字”のように表現することもあり、その場合はその位置の後の文字を意味します。

位置は通常、1から始まる整数として表されますが、マーカー(markers)として表現することもできます。関数は引数に位置(整数)を期待しますが、代替としてマーカーも受け入れ、通常はそのマーカーが指すのがどのバッファーなのかは無視します。これらの関数はマーカーを整数に変換して、たとえそのマーカーが“誤った”バッファーを指していたとしても、まるで引数としてその整数が渡されたかのように、その整数を使用します。整数に変換できない場所を指すマーカーを整数のかわりに使用すると、エラーとなります。Markersを参照してください。

多くのカーソルモーションコマンドにより使用される関数を提供する“フィールド(field)”機能(Defining and Using Fields)も参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.1 Point

ポイント(point)とは、多くの編集コマンドにより使用される、バッファーの特別な位置のことです。これらのコマンドには、自己挿入型のタイプ文字やテキスト挿入関数が含まれます。その他のコマンドは、別の箇所でテキストの編集や挿入ができるようにポイントを移動します。

他の位置と同様、ポイントは特定の文字ではなく、2つの文字の間(または最初の文字の前、または最後の文字の後)を指します。通常、端末ではポイント直後の文字の上にカーソルを表示します。つまり、ポイントは実際はカーソルのある文字の前にあります。

ポイントの値は1より小さくなることはなく、そのバッファーのサイズに1を加えた値より大きくなることはありません。ナローイング(Narrowingを参照)が効力をもつ場合、ポイントはそのバッファーのアクセス可能な範囲内(範囲の境界はバッファーの先頭か終端のいずれかの可能性がある)に閉じ込められます。

バッファーはそれぞれ自身のポイント値をもち、それは他のバッファーのポイント値とは無関係です。ウィンドウもそれぞれポイント値をもち、他のウィンドウ内の同じバッファー上のポイント値とは無関係です。同じバッファーを表示する種々のウィンドウが異なるポイント値をもてるのは、これが理由です。あるバッファーがただ1つのウィンドウに表示されているときは、そのバッファーのポイントとそのウィンドウのポイントは、通常は同じ値をもち、区別が重要になるのは稀です。詳細はWindows and Pointを参照してください。

Function: point

この関数は、カレントバッファー内のポイントの値を、整数でリターンする。

(point)
     ⇒ 175
Function: point-min

この関数は、カレントバッファー内のアクセス可能なポイントの最小値をリターンする。これは通常は1だが、ナローイングが効力をもつ場合は、ナローイングしたリージョンの開始位置となる(Narrowingを参照)。

Function: point-max

この関数は、カレントバッファー内のアクセス可能なポイントの最大値をリターンする。これはナローイングされていなければは(1+ (buffer-size))だが、ナローイングが効力をもつ場合は、ナローイングしたリージョンの終端位置となる(Narrowingを参照)。

Function: buffer-end flag

この関数は、flagが0より大なら(point-max)、それ以外は(point-min)をリターンする。引数flagは数値でなければならない。

Function: buffer-size &optional buffer

この関数は、カレントバッファー内の文字数のトータルをリターンする。ナローイング(Narrowingを参照)されていなければ、point-maxはこれに1を加えた値をリターンする。

bufferにバッファーを指定した場合、値はbufferのサイズになる。

(buffer-size)
     ⇒ 35
(point-max)
     ⇒ 36

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2 Motion

モーション関数は、ポイントのカレント値、バッファーの先頭または終端、または選択されたウィンドウ端のいずれかより、相対的にポイントの値を変更します。Pointを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.1 Motion by Characters

以下の関数は、文字数にもとづいてポイントを移動します。 goto-charは基本的なプリミティブで、その他の関数はこれを使用しています。

Command: goto-char position

この関数は、カレントバッファー内のポイントの値をpositionにセットする。

ナローイングが効力をもつ場合でも、positionは依然としてバッファー先頭から数えられるが、ポイントをアクセス可能な範囲外に移動することはできない。positionが範囲外の場合、goto-charはアクセス可能な範囲の先頭または終端にポイントを移動する。

この関数がインタラクティブに呼び出された際は、positionの値は数プレフィクス引数、プレフィクス引数が与えられなかった場合はミニバッファーから値を読み取る。

goto-charpositionをリターンする。

Command: forward-char &optional count

この関数は前方、すなわちバッファーの終端方向にポイントをcount文字移動する(countが負なら後方、すなわちバッファーの先頭方向にポイントを移動する)。countnilの場合のデフォルトは1。

バッファー(ナローイングが効力をもつ場合はアクセス可能な範囲の境界)の先頭または終端を超えて移動を試みた場合はエラーシンボルbeginning-of-bufferまたはend-of-bufferのエラーをシグナルする。

インタラクティブな呼び出しでは、数プレフィクス引数がcountとなる。

Command: backward-char &optional count

移動方向が逆であることを除き、これはforward-charと同様である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.2 Motion by Words

以下の関数は、与えられた文字が単語の一部なのかどうかを判断するための構文テーブルを使用して単語を解析します。Syntax Tablesを参照してください。

Command: forward-word &optional count

この関数は、countの単語数分ポイントを前方に移動する。(countが負なら後方に移動する)。countが省略またはnilの場合のデフォルトは1。

“単語1つ移動”とは、単語構成文字を横断して、単語区切り文字に遭遇するまでポイントを移動することを意味する。しかし、この関数はバッファーのアクセス可能範囲の境界およびフィールド境界(Defining and Using Fieldsを参照)を超えてポイントを移動できない。フィールド境界のもっとも一般的な例は、ミニバッファー内のプロンプト終端である。

バッファー境界またはフィールド境界により途中で停止することなく単語count個分の移動が可能なら、値はtとなる。それ以外ではリターン値はnilで、ポイントはバッファー境界またはフィールド境界で停止する。

inhibit-field-text-motionが非nilなら、この関数はフィールド境界を無視する。

インタラクティブに呼び出された場合、countは数プレフィクス引数により指定される。

Command: backward-word &optional count

この関数は、単語の前に遭遇するまで、前方ではなく後方に移動することを除き、forward-wordと同様である。

User Option: words-include-escapes

この変数は、forward-wordとそれを使用するすべての関数の挙動に影響する。これが非nilなら、構文クラス“エスケープ(escape)”および“クォート文字(character quote)”内の文字は、単語の一部とみなされる。それ以外では、単語の一部とはみなされない。

Variable: inhibit-field-text-motion

この変数が非nilならforward-wordforward-sentenceforward-paragraphを含む特定のモーション関数は、フィールド境界を無視する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.3 Motion to an End of the Buffer

バッファーの先頭にポイントを移動するには、以下のように記述します:

(goto-char (point-min))

同様に、バッファーの終端に移動するには、以下を使用します:

(goto-char (point-max))

以下の2つは、ユーザーがこれらを行うためのコマンドです。これらはマークをセットしてメッセージをエコーエリアに表示するため、Lispプログラム内で使用しないよう警告するために、ここに記述します。

Command: beginning-of-buffer &optional n

この関数は、バッファー(ナローイングが効力をもつ場合はアクセス可能範囲の境界)の先頭にポイントを移動して、以前の位置にマークをセットする(Transient Markモードの場合、マークがすでにアクティブならマークはセットしない)。

nが非nilなら、バッファーのアクセス可能範囲の先頭から10分のnの位置にポイントを置く。インタラクティブな呼び出しでは、nは数プレフィクス引数が与えられればその値、それ以外でのデフォルトはnilである。

警告: この関数をLispプログラム内で使用してはならない。

Command: end-of-buffer &optional n

この関数は、バッファー(ナローイングが効力をもつ場合はアクセス可能範囲の境界)の終端にポイントを移動して、以前の位置にマークをセットする(Transient Markモードの場合、マークがすでにアクティブならマークはセットしない)。nが非nilなら、バッファーのアクセス可能範囲の終端から10分のnの位置にポイントを置く。

インタラクティブな呼び出しでは、nは数プレフィクス引数が与えられればその値、それ以外でのデフォルトはnilである。<

警告: この関数をLispプログラム内で使用してはならない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.4 Motion by Text Lines

テキスト行とは、改行で区切られたバッファーの範囲です。改行は前の行の一部とみなされます。最初のテキスト行はバッファー先頭で始まり、最後のテキスト行は最後の文字が改行かどうかは関係なくバッファー終端で終わります。バッファーからテキスト行への分割は、そのウィンドウの幅、表示の行継続、タブおよびその他の制御文字の表示方法に影響されません。

Command: beginning-of-line &optional count

この関数は、カレント行の先頭にポイントを移動する。引数countが非nilまたは1以外なら、前方にcount-1行移動してから、その行の先頭に移動する。

この関数は、別の行に移動する場合を除き、フィールド境界(Defining and Using Fieldsを参照)を超えてポイントを移動しない。したがって、countnilまたは1で、かつポイントがフィールド境界で開始される場合は、ポイントを移動しない。フィールド境界を無視させるには、inhibit-field-text-motiontにバインドするか、かわりにforward-line関数を使用する。たとえば、フィールド境界を無視することを除けば、(forward-line 0)(beginning-of-line)と同じことを行う。

この関数がバッファー(ナローイングが効力をもつ場合はアクセス可能範囲)の終端に到達した場合は、ポイントをその位置に置く。エラーはシグナルされない。

Function: line-beginning-position &optional count

(beginning-of-line count)が移動するであろう位置をリターンする。

Command: end-of-line &optional count

この関数は、カレント行の終端にポイントを移動する。引数countが非nilまたは1以外なら、前方にcount-1行移動してから、その行の終端に移動する。

この関数は、別の行に移動する場合を除き、フィールド境界(Defining and Using Fieldsを参照)を超えてポイントを移動しない。したがって、countnilまたは1で、かつポイントがフィールド境界で開始される場合は、ポイントを移動しない。フィールド境界を無視させるには、inhibit-field-text-motiontにバインドする。

この関数がバッファー(ナローイングが効力をもつ場合はアクセス可能範囲)の終端に到達した場合は、ポイントをその位置に置く。エラーはシグナルされない。

Function: line-end-position &optional count

(end-of-line count)が移動するであろう位置をリターンする。

Command: forward-line &optional count

この関数は、前方にcount行移動して、その行の先頭にポイントを移動する。countが負なら、後方に-count行移動して、その行の先頭にポイントを移動する。countが0の場合は、カレント行の先頭にポイントを移動する。countnilなら、それは1を意味する。

forward-lineが指定された行数を移動する前にバッファー(またはアクセス可能範囲)の先頭か終端に遭遇した場合は、そこにポイントをセットする。エラーはシグナルされない。

forward-lineは、countと実際に移動した行数の差をリターンする。3行しかないバッファーの先頭から、5行したへの移動を試みた場合、ポイントは最終行の終端で停止し、値は2となるだろう。

インタラクティブな呼び出しでは、数プレフィクス引数がcountとなる。

Function: count-lines start end

この関数は、カレントバッファー内の位置startendの間の行数をリターンする。startendが等しければ、リターン値は0になる。それ以外は、たとえstartendが同一行にあっても、最小でも1をリターンする。これらの間にあるテキストは、それだけを孤立して考えたると、それが空でない限りは最小でも1行を含まなければならないからである。

Command: count-words start end

この関数は、カレントバッファー内の位置startendの間にある単語の数をリターンする。

この関数は、インタラクティブに呼び出すこともできる。その場合はバッファー、またはリージョンがアクティブならリージョン内の行数、単語数、文字数を報告するメッセージをプリントする。

Function: line-number-at-pos &optional pos

この関数は、カレントバッファー内のバッファー位置posに対応する行番号をリターンする。posnilまたは省略された場合は、カレントのバッファー位置が使用される。

Examining Text Near Pointの関数bolpeolpも参照してください。これらの関数はポイントを移動しませんが、ポイントがすでに行頭または行末にあるかどうかをテストします。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.5 Motion by Screen Lines

前のセクションの行関数は、改行文字で区切られたテキスト行だけを数えました。対照的に、以下の関数はスクリーン行を数えます。スクリーン行は、スクリーン上でテキストが表示される方法にしたがって定義されます。あるテキスト行1行が、選択されたウィンドウの幅にフィット可能な程に十分短ければ、それはスクリーン行で1行になりますが、それ以外は複数のスクリーン行になり得ます。

テキスト行が追加スクリーン行に継続されずに、そのスクリーンで切り詰められる(truncated)場合があります。そのような場合は、vertical-motionforward-lineのようにポイントを移動します。Truncationを参照してください。

文字列が与えられた場合、その幅は、文字の外見を制御するフラグに依存するため、与えられたテキスト断片にたいして、たとえそれが選択されたウィンドウ上でさえも(幅、切り詰め有無、ディスプレイテーブルはウィンドウごとに異なり得るので)、そのテキストがあるバッファーに応じて、vertical-motionの挙動は異なります。Usual Display Conventionsを参照してください。

以下の関数は、スクリーン行のブレーク位置を判断するためにテキストをスキャンするため、スキャンする長さに比例して時間を要します。

Function: vertical-motion count &optional window

この関数は、ポイントのあるスクリーン行からスクリーン行でcount行下に移動して、そのスクリーン行の先頭にポイントを移動する。countが負なら、かわりに上に移動する。

count引数には、整数のかわりにコンスセル(cols . lines)を指定できる。その場合、関数はスクリーン行でlines行移動して、そのスクリーン行の視覚的な行頭(visual start)からcols列目にポイントを置く。colsは、その行の視覚的(visual)な開始から数えられることに注意。そのウィンドウが水平スクロール(Horizontal Scrollingを参照)されている場合には、ポイントが置かれる列は、スクロールされたテキストの列数が加えられるだろう。

リターン値は、ポイントが移動したスクリーン行の行数である。バッファーの先頭か終端に到達していたら、この値は絶対値ではcountより小になるかもしれない。

ウィンドウwindow引数幅、水平スクロール、ディスプレイテーブルのようなパラメーターの取得に使用される。しかしvertical-motionは、たとえwindowがカレントで他のバッファーを表示していたとしても常に、カレントバッファーにたいして処理を行う。

Function: count-screen-lines &optional beg end count-final-newline window

この関数は、begからendのテキスト内のスクリーン行の行数をリターンする。スクリーン行数は行継続やディスプレイテーブル等により、実際の行数とは異なるかもしれない。begおよびendnil、または省略された場合のデフォルトは、そのバッファーのアクセス可能範囲の先頭と終端である。

そのリージョンが改行で終わる場合、オプションの第3引数count-final-newlinenilなら、それは無視される。

オプションの第4引数windowは、幅や水平スクロール等のパラメーターを取得するウィンドウを指定する。デフォルトは、選択されたウィンドウのパラメーターを使用する。

vertical-motionと同様、count-screen-lineswindow内にどのバッファーが表示されていようと、常にカレントバッファーを使用する。これにより、バッファーが何らかのウィンドウにカレントで表示されているか否かにかかわらず、任意にバッファーにたいしてcount-screen-linesの使用が可能になる。

Command: move-to-window-line count

この関数は、選択されたウィンドウ内にカレントで表示されているテキストに応じてポイントを移動する。これは、ウィンドウ上端からスクリーン行でcount行目の先頭にポイントを移動する。countが負なら、それはバッファー下端(バッファーが指定されたスクリーン位置の上で終わる場合はバッファーの最終行)から、-count行目の位置を指定する。

countnilの場合、ポイントはウィンドウ中央の行の先頭に移動する。countの絶対値がウィンドウサイズより大なら、ウィンドウが十分に高かったならそのスクリーン行は表示されていたであろう位置に、ポイントを移動する。これは、おそらく次回の再表示の際に、その箇所がスクリーン上になるようなスクロールを発生させるだろう。

インタラクティブな呼び出しでは、数プレフィクス引数がcountとなる。

リターン値は、ウィンドウ上端行を0とする、ポイントが移動した先の行番号である。

Function: compute-motion from frompos to topos width offsets window

この関数は、カレントバッファーをスキャンして、スクリーン位置を計算する。これは位置fromがスクリーン座標fromposにあると仮定して、そこから位置toまたは座標toposのいずれか先に到達したほうまで、バッファーを前方にスキャンする。これはスキャン終了のバッファー位置と、スクリーン座標をリターンする。

座標引数fromposおよびtoposは、(hpos . vpos)という形式のコンスセルである。

引数widthは、テキストを表示するために利用可能な列数である。これは、継続行の処理に影響する。nilは、そのウィンドウ内で使用可能な実際のテキスト列数で、(window-width window)がリターンする値と等しい。

引数offsetsnil、または(hscroll . tab-offset)という形式のコンスセルのいずれかである。ここでhscrollは、左マージンのために表示されない列数であり、呼び出し側のほとんどはwindow-hscrollを呼び出すことにより、これを取得する。一方tab-offsetは、スクリーン上の列数と、バッファー内の列数の間のオフセットである。これは継続行において、前のスクリーン行の幅がtab-widthの整数倍でないときは、非0になる可能性がある。非継続行では、これは常に0である。

ウィンドウwindowの役割は、使用するディスプレイテーブルの指定することだけである。compute-motionは、window内に表示されているのがどのバッファーであろうと、カレントバッファーを処理する。

リターン値は、5つの要素をもつリストである:

(pos hpos vpos prevhpos contin)

ここで、posはスキャンが停止したバッファー位置、vposは垂直スクリーン位置、hposは水平スクリーン位置である。

結果prevhposは、posから1文字戻った水平位置である。結果continは、最後の行が前の文字の後(または中)から継続されていれば、tとなる。

たとえば、あるウィンドウのスクリーン行lineの列colのバッファー位置を求めるには、そのウィンドウのdisplay-start(表示開始)位置をfrom、そのウィンドウの左上隅の座標をfromposとして渡す。スキャンをそのバッファーのアクセス可能範囲の終端に制限するために、バッファーの(point-max)toに、linecoltoposに渡す。以下は、これを行う関数である:

(defun coordinates-of-position (col line)
  (car (compute-motion (window-start)
                       '(0 . 0)
                       (point-max)
                       (cons col line)
                       (window-width)
                       (cons (window-hscroll) 0)
                       (selected-window))))

ミニバッファーにたいしてcompute-motionを使う際は、最初のスクリーン行の先頭の水平位置を取得するために、minibuffer-prompt-widthを使用する必要がある。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.6 Moving over Balanced Expressions

以下は、バランスの取れたカッコ式(balanced-parenthesis。これらの式を横断して移動することと関連して、Emacsではsexp(S式)とも呼ばれる)と関連する、いくつかの関数です。これらの関数がさまざまな文字を処理する方法は、構文テーブル(syntax table)が制御します。Syntax Tablesを参照してください。sexp、またはその一部にたいする低レベルのプリミティブについては、Parsing Expressionsを参照してください。ユーザーレベルのコマンドについては、Commands for Editing with Parentheses in The GNU Emacs Manualを参照してください。

Command: forward-list &optional arg

この関数は、バランスの取れたカッコのグループを、arg(デフォルトは1)グループ前方に移動する(単語やクォート文字のペアーでクォートされた文字列は無視される)。

Command: backward-list &optional arg

この関数は、バランスの取れたカッコのグループを、arg(デフォルトは1)グループ後方に移動する(単語やクォート文字のペアーでクォートされた文字列は無視される)。

Command: up-list &optional arg

この関数は、カッコをarg(デフォルトは1)レベル外側前方に移動する。負の引数では後方に移動するが、同様に浅いレベルに移動する。

Command: down-list &optional arg

この関数は、カッコをarg(デフォルトは1)レベル内側前方に移動する。負の引数では後方に移動するが、同様に深いレベル(-argレベル)に移動する。

Command: forward-sexp &optional arg

この関数は、バランスの取れた式(balanced expressions)を、arg(デフォルトは1)前方に移動する。バランスの取れた式にはカッコ等で区切られた式、および単語や文字列定数のようなものも含まれる。Parsing Expressionsを参照のこと。たとえば、

---------- Buffer: foo ----------
(concat∗ "foo " (car x) y z)
---------- Buffer: foo ----------

(forward-sexp 3)
     ⇒ nil

---------- Buffer: foo ----------
(concat "foo " (car x) y∗ z)
---------- Buffer: foo ----------
Command: backward-sexp &optional arg

この関数は、バランスの取れた式(balanced expressions)を、arg(デフォルトは1)後方に移動する。

Command: beginning-of-defun &optional arg

この関数は、後方にarg番目のdefunの先頭に移動する。argが負なら、実際には前方に移動するが、defunの終端ではなく先頭に移動することは変わらない。argのデフォルトは1。

Command: end-of-defun &optional arg

この関数は、前方にarg番目のdefunの終端に移動する。argが負なら、実際には後方に移動するが、defunの先頭ではなく終端に移動することは変わらない。argのデフォルトは1。

User Option: defun-prompt-regexp

nilなら、このバッファーローカル変数はdefunの始まりとなる開きカッコの前に出現し得るテキストを指定する正規表現を保持する。つまりd、この正規表現にたいするマッチで始まり、その後に開きカッコ構文(open-parenthesis syntax)が続くのがdefunである。

User Option: open-paren-in-column-0-is-defun-start

この変数の値が非nilなら、列0にある開きカッコはdefunの始まりとみなされる。nilの場合、列0の開きカッコは特別な意味をもたない。デフォルトはt

Variable: beginning-of-defun-function

nilなら、この変数はdefunの開始を見つける関数を保持する。関数beginning-of-defunは、通常の手法を使うかわりに、その関数に自身のオプション引数を渡して、その関数を呼び出す。その引数が非nilなら、その関数はその回数分の関数呼び出しにより、beginning-of-defunが行うように後方に移動すること。

Variable: end-of-defun-function

nilなら、この変数はdefunの終端を見つける関数を保持する。関数end-of-defunは、通常の手法を使うかわりに、その関数を呼び出す。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.2.7 Skipping Characters

以下の2つの関数は、指定された文字セットを超えてポイントを移動します。これらの関数は、たとえば空白文字をスキップするためによく使用されます。関連する関数については、Motion and Syntaxを参照してください。

これらの関数は検索関数(Searching and Matchingを参照)が行うように、そのバッファーがマルチバイト(multibyte)ならマルチバイトに、ユニバイト(unibyte)ならユニバイトに、そのセットト文字列を変換します。

Function: skip-chars-forward character-set &optional limit

この関数は、与えられた文字セットをスキップして、カレントバッファー内のポイント前方に移動する。これはポイントの後の文字を調べて、その文字がcharacter-setにマッチすればポイントを進める。そして、マッチしない文字に到達するまで、これを継続する。この関数は、超えて移動した文字数をリターンする。

引数character-setが、正規表現での‘[…]’内部と同様だが、‘]’で終端されず、‘\’が‘^’、‘-’、‘\’をクォートする点が異なる。つまり、"a-zA-Z"はすべての英字をスキップして最初の非英字の前で停止し、"^a-zA-Z"はすべての非英字をスキップして最初の英字の前で停止する。Regular Expressionsを参照のこと。"[:alnum:]"のような文字クラスも使用できる。see section Character Classesを参照されたい。

limit(数字かマーカー)が与えられた場合、それはポイントがスキップして到達できる、そのバッファー内の最大位置を指定する。ポイントはlimit、またはlimitの前でストップするだろう。

以下の例では、ポイントは最初‘T’の直前に置かれている。フォーム評価後、ポイントはその行の末尾(‘hat’の‘t’と改行の間)に置かれる。この関数は、すべての英字とスペースをスキップするが、改行はスキップしない。

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(skip-chars-forward "a-zA-Z ")
     ⇒ 18

---------- Buffer: foo ----------
I read "The cat in the hat∗
comes back" twice.
---------- Buffer: foo ----------
Function: skip-chars-backward character-set &optional limit

この関数は、limitに至るまでcharacter-setにマッチする文字をスキップして、ポイントを後方に移動する。これはskip-chars-forwardと同様だが、ポイントを移動する方向が異なる。

リターン値は、移動した距離を示す。これは、0以上の整数である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.3 Excursions

プログラム中の限定された部分で、ポイントを“一時的”に移動するのが便利なことが時折あります。これはエクスカーション(excursion: 遠足、小旅行)と呼ばれ、スペシャルフォームsave-excursionにより行います。この構成は、初期のカレントバッファー自体、ポイントおよびマークの値を記憶して、そのエクスカーション完了時にそれらをリストアします。これはプログラムのある部分において、プログラムの他の部分に影響を与えることなくポイントを移動する標準的な手段であり、EmacsのLispソース内では何度も使用されています。

カレントバッファー自体のみの保存およびリストアが必要な場合は、かわりにsave-current-bufferwith-current-bufferを使用してください(The Current Bufferを参照)。ウィンドウ構成の保存やリストアが必要なら、Window ConfigurationsおよびFrame Configurationsで説明されているフォームを参照してください。

Special Form: save-excursion body…

このスペシャルフォームは、カレントバッファー自体、およびポイント値とマーク値を保存してbodyを評価し、最後にバッファーおよび保存したポイントとマークの値をリストアする。throwまたはエラーを通じたアブノーマルexit(Nonlocal Exitsを参照)の場合でも、保存された3つすべての値はリストアされる。

save-excursionがリターンする値はbody内の最後のフォームの結果、またはbodyフォームが与えられなければnilをリターンする。

save-excursionは、エクスカーション開始時にカレントだったバッファーのポイントとマークだけを保存ため、そのエクスカーション中に変更された他のバッファーのポイントおよび/またはマークは、その後も効果が残るでしょう。これはしばしば予期せぬ結果を招くので、エクスカーション中にset-bufferを呼び出した場合、バイトコンパイラーは警告を発します:

Warning: Use `with-current-buffer' rather than
         save-excursion+set-buffer

このような問題を避けるには、以下の例のように望むカレントバッファーをセット後にのみsave-excursionを呼び出すべきです:

(defun append-string-to-buffer (string buffer)
  "BUFFER末尾にSTRINGを追加"
  (with-current-buffer buffer
    (save-excursion
      (goto-char (point-max))
      (insert string))))

同じように、save-excursionswitch-to-bufferのような関数が変更したウィンドウ/バッファーの対応をリストアしません。

警告: 保存されたポイント値に隣接する通常のテキスト挿入は、それがすべてのマーカーを再配置するのと同様、保存されたポイントカーを再配置します。より正確には、保存される値は挿入タイプnilのマーカーです。Marker Insertion Typesを参照してください。したがって、保存されたポイント値のリストア時は、通常は挿入されたテキストの直前になります。

たとえsave-excursionがマーク位置を保存しても、バッファーを変更する関数がdeactivate-markをセットするのを禁止しないため、そのコマンド完了後にマークの非アクティブ化が効力を発揮します。The Markを参照してください。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

29.4 Narrowing

ナローイング(narrowing)とは、Emacs編集コマンドがアドレス指定可能なテキストを、あるバッファー内の制限された文字範囲に限定することを意味します。アドレス可能なテキストは、そのバッファーのアクセス可能範囲(accessible portion)と呼ばれます。

ナローイングは2つのバッファー位置により指定され、それがアクセス可能範囲の開始と終了になります。ほとんどの編集コマンドおよびプリミティブにたいし、これらの位置はそれぞれそのバッファーの先頭と終端に置き換えられます。ナローイングが効果をもつ間、アクセス可能範囲外のテキストは表示されず、その外部にポイントを移動することはできません。ナローイングは実際のバッファー位置(Pointを参照)を変更しないことに注意してください。ほとんどの関数は、アクセス可能範囲外のテキストにたいする操作を受け付けません。

バッファーを保存するコマンドは、ナローイングの影響を受けません。どんなナローイングであろうと、それらはバッファー全体を保存します。

単一バッファー内に、タイプが大きく異なるテキストを複数表示する必要がある場合は、Swapping Text Between Two Buffersで説明する代替機能の使用を考慮してみてください。

Command: narrow-to-region start end

この関数は、アクセス可能範囲の開始と終了に、カレントバッファーのstartendをセットする。どちらの引数も、文字位置で指定すること。

インタラクティブな呼び出しでは、startendはカレントリージョン(ポイントとマークで、小さいほうが前者)にセットされる。

Command: narrow-to-page &optional move-count

この関数は、カレントページだけを含むように、カレントバッファーのアクセス可能範囲をセットする。1つ目のオプション引数move-countが非nilの場合は、move-countで前方または後方へ移動後に、1ページにナローすることを意味する。変数page-delimiterは、ページの開始と終了の位置を指定する(Standard Regular Expressions Used in Editingを参照)。

インタラクティブな呼び出しでは、move-countには数プレフィクス引数がセットされる。

Command: widen

この関数は、カレントバッファーにたいするすべてのナローイングをキャンセルする。これはワイドニング(widening)と呼ばれる。これは、以下の式と等価である:

(narrow-to-region 1 (1+ (buffer-size)))
Function: buffer-narrowed-p

この関数は、そのバッファーがナローされていれば非nil、それ以外はnilをリターンする。

Special Form: save-restriction body…

このスペシャルフォームは、アクセス可能範囲のカレントのバインドを保存してbodyを評価し、以前に有効だったナローイング(またはナローイングのない状態)と同じ状態になるよう最後に保存されたバインドをリストアする。ナローイングの状態は、throwまたはエラーを通じたアブノーマルexit(Nonlocal Exitsを参照)イベント内においても、リストアされる。したがって、この構成は一時的にバッファーをナローする明快な手段である。

save-restrictionがリターンする値は、body内の最後のフォームのリターン値、またはbodyフォームが与えられなければnilである。

注意: save-restriction使用時は間違いを起こしやすい。これを試みる前にここでの説明全体を通読すること。

bodyがカレントバッファーを変更する場合でも、save-restrictionは依然として元のバッファー(その制限が保存されたバッファー)上の制限をリストアするが、カレントバッファー自体はリストアしない。

save-restrictionは、ポイントとマークをリストアしない。これを行うにはsave-excursionを使用する。save-restrictionsave-excursionの両方を共に使用するなら、始め(外側)にsave-excursionを記述すること。それ以外では、一時的なナローイング影響下で古いポイント値がリストアされる。古いポイント値が一時的なナローイング境界外なら、それを実際にリストアするのは失敗するだろう。

以下は、save-restrictionの正しい使い方の簡単な例である:

---------- Buffer: foo ----------
This is the contents of foo
This is the contents of foo
This is the contents of foo∗
---------- Buffer: foo ----------

(save-excursion
  (save-restriction
    (goto-char 1)
    (forward-line 2)
    (narrow-to-region 1 (point))
    (goto-char (point-min))
    (replace-string "foo" "bar")))

---------- Buffer: foo ----------
This is the contents of bar
This is the contents of bar
This is the contents of foo∗
---------- Buffer: foo ----------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30 Markers

マーカー(marker)とは、あるバッファー内で取り囲んでいるテキストにたいして相対的な位置を指定するために使用されるオブジェクトです。テキストが挿入または削除されると常に、マーカーは自動的にそのバッファーの先頭からのオフセットを自動的に変更して、自身の左右にある文字の間に留まります。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.1 Overview of Markers

マーカーは、バッファーとそのバッファー内の位置を指定します。マーカーは、位置を要求する関数内において、位置を表すために整数と同じようにして使用することができます。その場合、そのマーカーのバッファーは、通常は無視されます。この方法で使用されるマーカーは通常、その関数が処理するバッファー内の位置を指しますが、それは完全にプログラマーの責任です。位置についての完全な説明は、Positionsを参照してください。

マーカーはマーカー位置(marker position)、マーカーバッファー(marker buffer)、挿入タイプ(insertion type)という3つの属性をもちます。マーカー位置は、そのバッファー内の位置としてのマーカーと、(その時点において)等しい整数です。しかし、マーカー位置はマーカー生存期間中に変化し得るものであり、頻繁に変化されます。バッファー内でのテキストの挿入や削除で、マーカーは再配置されます。マーカー前後の2文字以外の場所で挿入や削除がおこなわれても、マーカー位置はその2文字間に留まるというのが、このアイデアです。再配置により、マーカーと等価な整数は変更されます。

マーカー位置周辺のテキストを削除することにより、そのマーカーは削除されたテキストの直前および直後にある文字の間に残されます。マーカー位置へのテキスト挿入では、マーカーは通常は新たなテキストの前か後のいずれかに置かれます。その挿入がinsert-before-markers(Inserting Textを参照)で行われたものでなければ、どちらに置かれるかはマーカーの挿入タイプ(Marker Insertion Typesを参照)に依存します。

バッファーでの挿入と削除では、すべてのマーカーをチェックして、必要ならそれらを再配置しなければなりません。これは、多数のマーカーをもつバッファーでの処理を遅くします。それ以上マーカーが不必要なのが確信できる場合には、存在しない場所も指さないようにマーカーを設定することは、この理由によりよいアイデアといえるでしょう。それ以上アクセスされる可能性がないマーカーは、最終的には削除されます(Garbage Collectionを参照)。

マーカー位置にたいして算術演算を行うことは一般的なので、それらの演算子のほとんど(+-を含む)が、引数としてマーカーに渡すことができます。そのような場合には、マーカーはカレント位置を意味します。

以下ではマーカー渡す作成とセットを行い、ポイントをマーカーに移動しています:

;; 最初はどこも指さない新たなマーカーを作成:
(setq m1 (make-marker))
     ⇒ #<marker in no buffer>

;; カレントバッファーの99と100番目の
;;   文字間を指すようm1をセット:
(set-marker m1 100)
     ⇒ #<marker at 100 in markers.texi>

;; ここでバッファー先頭に1文字挿入:
(goto-char (point-min))
     ⇒ 1
(insert "Q")
     ⇒ nil

;; m1は適切に更新された
m1
     ⇒ #<marker at 101 in markers.texi>

;; 同じ位置を指す2つのマーカーは
;;   equalだがeqに非ず
(setq m2 (copy-marker m1))
     ⇒ #<marker at 101 in markers.texi>
(eq m1 m2)
     ⇒ nil
(equal m1 m2)
     ⇒ t

;; マーカー使用終了時、存在しない場所を指すようセット
(set-marker m1 nil)
     ⇒ #<marker in no buffer>

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.2 Predicates on Markers

あるオブジェクトがマーカーなのか、それとも整数かマーカーのいずれかであるか確認するために、テストを行うことができます。後者のテストは、マーカーと整数の両方にたいして機能する算術関数において有用です。

Function: markerp object

この関数は、objectがマーカーならnil、それ以外はtをリターンする。多くの関数はマーカーか整数のいずれかを受け入れるだろうが、整数はマーカーと異なることに注意。

Function: integer-or-marker-p object

この関数は、objectが整数またはマーカーならt、それ以外はnilをリターンする。

Function: number-or-marker-p object

この関数は、objectが数値(整数か浮動小数点数のいずれか)またはマーカーならt、それ以外はnilをリターンする。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.3 Functions that Create Markers

マーカーを新たに作成する際は、存在しない場所、ポイントの現在位置、バッファーのアクセス可能範囲の先頭や終端、または別の与えられたマーカーと同じ箇所を指すようにすることができます。

以下の4つの関数はすべて、挿入タイプnilのマーカーをリターンします。Marker Insertion Typesを参照してください。

Function: make-marker

この関数は、どこも指さないマーカーを新たに作成してリターンする。

(make-marker)
     ⇒ #<marker in no buffer>
Function: point-marker

この関数は、カレントバッファーのポイント現在位置を指すマーカーを新たに作成してリターンする。See section Pointを参照のこと。例は以下のcopy-markerを参照されたい。

Function: point-min-marker

この関数は、バッファーのアクセス可能範囲の先頭を指すマーカーを新たに作成してリターンする。ナローイングが効力をもたなければ、これはバッファーの先頭になるだろう。Narrowingを参照のこと。

Function: point-max-marker

この関数は、バッファーのアクセス可能範囲の終端を指すマーカーを新たに作成してリターンする。ナローイングが効力をもたなければ、これはバッファーの終端になるだろう。Narrowingを参照のこと。

以下に、このチャプターのテキストのソースファイルのバージョンを含むバッファーにたいして、この関数およびpoint-min-markerを使用した例を示す。

(point-min-marker)
     ⇒ #<marker at 1 in markers.texi>
(point-max-marker)
     ⇒ #<marker at 24080 in markers.texi>

(narrow-to-region 100 200)
     ⇒ nil
(point-min-marker)
     ⇒ #<marker at 100 in markers.texi>
(point-max-marker)
     ⇒ #<marker at 200 in markers.texi>
Function: copy-marker &optional marker-or-integer insertion-type

引数としてマーカーを渡されると、copy-markermarker-or-integerが行うようにして、同じバッファーの同じ位置を指すマーカーを新たに作成してリターンする。整数を渡された場合、copy-markerはカレントバッファーの位置marker-or-integerを指すマーカーを新たに作成してリターンする。

新たなマーカーの挿入タイプは、引数insertion-typeにより指定される。Marker Insertion Typesを参照のこと。

(copy-marker 0)
     ⇒ #<marker at 1 in markers.texi>

(copy-marker 90000)
     ⇒ #<marker at 24080 in markers.texi>

markerがマーカーと整数のいずれでもない場合は、エラーがシグナルされる。

2つのマーカーは、それらが同じバッファーの同じ位置、またはどちらも存在しない場所を指す場合は、(eqではないものの)equalとみなされます。

(setq p (point-marker))
     ⇒ #<marker at 2139 in markers.texi>

(setq q (copy-marker p))
     ⇒ #<marker at 2139 in markers.texi>

(eq p q)
     ⇒ nil

(equal p q)
     ⇒ t

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.4 Information from Markers

このセクションでは、マーカーオブジェクトの構成要素にアクセスする関数を説明します。

Function: marker-position marker

この関数は、markerが指す位置、または存在しない場所ならnilをリターンする。

Function: marker-buffer marker

この関数は、markerがその内部を指すバッファー、存在しない場所を指す場合はnilをリターンする。

(setq m (make-marker))
     ⇒ #<marker in no buffer>
(marker-position m)
     ⇒ nil
(marker-buffer m)
     ⇒ nil

(set-marker m 3770 (current-buffer))
     ⇒ #<marker at 3770 in markers.texi>
(marker-buffer m)
     ⇒ #<buffer markers.texi>
(marker-position m)
     ⇒ 3770

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.5 Marker Insertion Types

マーカーが指す位置に直接テキストを挿入する際、そのマーカーを再配置するために利用可能な手段が2つあります。そのマーカーはは挿入されたテキストの前、あるいは後を指すことができます。マーカーの挿入タイプ(insertion type)を指定することにより、マーカーがどちらを行うか指定できます。insert-before-markersを使用する場合は、マーカーの挿入タイプを無視して、常にマーカーが挿入されたテキストの後を指すよう再配置されることに注意してください。

Function: set-marker-insertion-type marker type

この関数は、マーカーmarkerの挿入タイプを、typeにセットする。typetの場合、テキスト挿入時にmarkerはその位置まで進められるだろう。typenilなら、テキスト挿入時にmarkerはそこまで進められない。

Function: marker-insertion-type marker

この関数は、markerのカレント挿入タイプを報告する。

挿入タイプを指定するための引数を受け取らない、マーカーを作成する関数のほとんどは、挿入タイプnilのマーカーを作成します。また、マークがもつデフォルトの挿入タイプもnilです。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.6 Moving Marker Positions

このセクションでは、既存マーカーの位置を変更する方法について説明します。これを行う際は、そのマーカーがあなたのプログラム外部に使用されているかどうか、もし使用されているならマーカーを移動した結果どのような影響が生じるかを確実に理解する必要があります。さもないと、Emacsの他の部分で、混乱した出来事が発生するかもしれません。

Function: set-marker marker position &optional buffer

この関数は、buffer内でmarkerpositionに移動する。bufferが与えられなかった場合のデフォルトは、カレントバッファーである。

positionnil、または存在しない場所を指すマーカーの場合、markerは存在しない場所を指すようにセットされる。

リターン値はmarkerである。

(setq m (point-marker))
     ⇒ #<marker at 4714 in markers.texi>
(set-marker m 55)
     ⇒ #<marker at 55 in markers.texi>
(setq b (get-buffer "foo"))
     ⇒ #<buffer foo>
(set-marker m 0 b)
     ⇒ #<marker at 1 in foo>
Function: move-marker marker position &optional buffer

これはset-markerの別名である。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.7 The Mark

バッファーはそれぞれ、マーク(mark)という、バッファー専用の特別なマーカーをもちますバッファーが新たに作成される際、すでにこのマーカーは存在していますが、どこも指していません。これは、そのバッファーにはまだマークが“存在しない”ことを意味します。それ以降のコマンドがマークをセットできます。

マークは、kill-regionindent-rigidlyのような多くのコマンドにたいして、テキスト範囲をバインドするための位置を指定します。通常これらのコマンドは、ポイントとマークの間の、リージョン(region)と呼ばれるテキストに作用します。リージョンを操作するコマンドを記述する場合は、マークを直接調べず、かわりに‘r’指定とともにinteractiveを使用してください。このようにすれば、インタラクティブな呼び出しではコマンドの引数としてポイントとマークの値が提供され、かつ他のLispプログラムは引数を明示的に指定できます。Code Characters for interactiveを参照してください。

いくつかのコマンドは、その副作用(side-effect)としてマークをセットします。コマンドは、ユーザーがそれを使用する可能性がある場合のみマークをセットするべきであり、決してコマンドの内部的な目的にたいして使用してはなりません。たとえばreplace-regexpコマンドは、何らかの置換を行う前にマークにポイントの値をセットしますが、その理由はこれによりユーザーが置換を終えた後、簡単にその位置に戻ることが可能になるからです。

一度バッファー内にマークが“存在”すれば、その存在は通常は決して消えることはありません。しかし、Transient Markモードが有効な場合、マークが非アクティブ(inactive)になることはあります。バッファーローカル変数mark-activeが非nilなら、それはマークがアクティブであることを意味します。コマンドはマークを直接非アクティブにするために関数deactivate-markを呼び出すことができ、変数deactivate-markを非nil値にセットすることにより、エディターコマンドループ(editor command loop)にリターン時にマークの非アクティブ化を要求できます。

Transient Markモードが有効な場合、通常ならポイント近傍に適用される特定の編集コマンドは、マークがアクティブなときはかわりにリージョンに適用されます。これがTransient Markモードを使用する主な動機です(他にも、マークアクティブ時にはリージョンのハイライトが有効になるという理由もある。Emacs Displayを参照されたい)。

マークに加えて、バッファーはそれぞれマークリング(mark ring)をもっています。これは、以前のマーク値を含むマーカーのリストです。編集コマンドがマークを変更する際、それらのコマンドは通常はマークの旧値をマークリングに保存するべきです。変数mark-ring-maxは、マークリング内のエントリー最大数を指定します。リストがこの長さに達すると、最後の要素を削除して、新たな要素が追加されます。

これとは別にグローバルマークリング(global mark ring)がありますが、それは少数の特定のユーザーレベルコマンドでのみ使用され、Lispプログラムとは関連しないので、ここでは説明しません。

Function: mark &optional force

この関数は、カレントバッファーのマーク位置を整数でリターンする。そのバッファー内でそれまでマークがセットされていなければnilをリターンする。

Transient Markモードが有効、かつmark-even-if-inactivenilの場合、マークが非アクティブならmarkはエラーをシグナルする。しかし、forceが非nilなら、markはマークの非アクティブ性を無視して、何にせよマーク位置(かnil)をリターンする。

Function: mark-marker

この関数は、カレントバッファーのマークを表すマーカーをリターンする。これはコピーではなく、内部的に使用されるマーカーである。したがって、このマーカー位置にたいする変更は、そのバッファーのマークに直接影響する。それが望む効果でなければ、これを行ってはならない。

(setq m (mark-marker))
     ⇒ #<marker at 3420 in markers.texi>
(set-marker m 100)
     ⇒ #<marker at 100 in markers.texi>
(mark-marker)
     ⇒ #<marker at 100 in markers.texi>

他のマーカー同様、このマーカーを任意のバッファー位置にセットできる。このマーカーに、これがマークする以外のバッファーを指すようにすると、完全に整合性があるものの、いささか奇妙な結果を得ることになるだろう。これを行わないことを、わたしたちは推奨する!

Function: set-mark position

この関数は、マークをpositionにセットして、そのマークをアクティブにする。マークの旧値はマークリングにpushされない

注意: マークが移動したことをユーザーに確認させ、かつ前のマーク位置が失われることを望む場合のみ、この関数を使用すること。通常は、マークセット時に古いマークはmark-ringにpushされるべきである。この理由により、ほとんどのアプリケーションはset-markではなく、push-markおよびpop-markを使用するべきである。

Emacs Lispの初心者プログラマーは、誤った用途にマークの使用を試みがちである。ユーザーの利便のために位置を保存するのがマークである。編集コマンドは、マーク変更がコマンドのユーザーレベル機能の一部でない限り、マークを変更するべきではない(そして、そのような場合にはその効果をドキュメントするべきである)。Lispプログラムの内部的な使用のために位置を記憶するためには、マークをLisp変数に格納すること。たとえば:

(let ((beg (point)))
  (forward-line 1)
  (delete-region beg (point)))
Function: push-mark &optional position nomsg activate

この関数は、カレントバッファーのマークをpositionにセットして、前のマークをmark-ringにpushする。positionnilの場合は、ポイントの値を使用する。

関数push-markは通常、マークをアクティブにしない。アクティブにする場合は、引数activatetを指定する。

nomsgnilなら、メッセージ‘Mark set’が表示される。

Function: pop-mark

この関数は、mark-ringのトップ要素をpopして、そのマークをバッファーの実際のマークにする。これはバッファー内のポイントを移動せず、mark-ringが空なら何も行わない。これはマークを非アクティブ化する。

User Option: transient-mark-mode

この変数が非nilなら、Transient Markモードを有効にする。Transient Markモードでは、すべてのバッファー変更プリミティブがdeactivate-markをセットする。結果として、バッファーを変更するほとんどのコマンドも、マークを非アクティブにする。

Transient Markモードが有効かつマークがアクティブの場合、通常はポイント近傍に適用されるコマンドの多くは、かわりにリージョンに適用される。そのようなコマンドは、リージョンを処理すべきかどうかをテストするために、関数use-region-pを使用するべきである。The Regionを参照のこと。

Lispプログラムは、一時的にTransient Markモードを有効にするために、transient-mark-modenilでもtでもない値にセットできる。値がlambdaなら、バッファー変更のような通常ならマークを非アクティブ化するような操作の後、Transient Markモードを自動的にオフに切り替える。値が(only . oldval)なら、後続のコマンドがポイントを移動かつシフト変換(shift-translationを参照)されていない場合、あるいは通常はマークを非アクティブにするその他の操作の場合は、transient-mark-modeに値oldvalをセットする。

User Option: mark-even-if-inactive

これが非nilなら、LispプログラムおよびEmacsユーザーは、たとえ非アクティブでもマークを使用できる。このオプションは、Transient Markモードの動作に影響を及ぼす。このオプションが非nilなら、マークの非アクティブ化によりリージョンのハイライトはオフに切り替えられるが、マークを使用するコマンドは、あたかもマークがアクティブであるかのように振る舞う。

Variable: deactivate-mark

エディターコマンドがこの変数を非nilにセットすると、エディターコマンドループはコマンドのリターン後に、(Transient Markモードが有効なら)マークを非アクティブにする。バッファーを変更するすべてのプリミティブは、コマンド終了時にマークを非アクティブにするために、deactivate-markをセットする。

コマンド終了時にマークを非アクティブにすることなくバッファーを変更するLispコードを記述するためには、変更を行うコードの周辺でdeactivate-marknilにバインドすること。たとえば:

(let (deactivate-mark)
  (insert " "))
Function: deactivate-mark &optional force

Transient Markモードが有効、またはforceが非nilの場合、この関数はマークを非アクティブにしてノーマルフックdeactivate-mark-hookを実行し、それ以外は何も行わない。

Variable: mark-active

この変数が非nilなら、マークはアクティブである。この変数は、それぞれのバッファーにたいして、常にローカルである。通常はポイント近傍を操作するコマンドが、かわりにリージョンを操作すべきかどうかを判断するために、この変数の値を使用してはならない。その目的にたいしては、関数use-region-pを使用すること(The Regionを参照)。

Variable: activate-mark-hook
Variable: deactivate-mark-hook

これらのノーマルフックは、マークがアクティブまたは非アクティブになった際に、順次実行される。マークがアクティブで、かつリージョンが変更された可能性があるなら、コマンドループの最後にフックactivate-mark-hookも実行される。

Function: handle-shift-selection

この関数は、ポイント移動コマンドの“シフト選択(shift-selection)”の動作を実装する。Shift Selection in The GNU Emacs Manualを参照のこと。これは、interactive指定に文字‘^’を含むコマンド呼び出し時は常に、そのコマンド自身を実行する前に、Emacsコマンドループにより自動的に呼び出される(^を参照)。

shift-select-modeが非nil、かつカレントコマンドがシフト変換(shift-translationを参照)を通じて呼び出された場合、この関数はマークをセットして一時的にリージョンをアクティブにする(すでにこの方法によりリージョンが一時的にアクティブにされている場合を除く)。それ以外では、リージョンが一時的にアクティブにされていれば、マークを非アクティブにして、変数transient-mark-modeに前の値をリストアする。

Variable: mark-ring

このバッファーローカル変数の値は、もっとも最近のものが先頭となった、カレントバッファーの以前に保存されたマークのリストである。

mark-ring
⇒ (#<marker at 11050 in markers.texi>
    #<marker at 10832 in markers.texi>
    …)
User Option: mark-ring-max

この変数の値は、mark-ringの最大サイズである。これより多くのマークがmark-ringにpushされると、新たなマーク追加時にpush-markは古いマークを破棄する。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

30.8 The Region

ポイントとマークの間のテキストは、リージョン(region)という名で知られています。さまざまな関数がポイントとマークで区切られたテキストを操作しますが、ここではリージョンそのものに特に関連する関数だけを説明します。

以下の2つの関数は、マークが何処も指していなければエラーをシグナルします。Transient Markモードが有効、かつmark-even-if-inactivenilなら、マークが非アクティブな場合のエラーをシグナルします。

Function: region-beginning

この関数は、リージョンの先頭位置を、(整数として)リターンする。これは、ポイントかマークのいずれか小さいほうの位置である。

Function: region-end

この関数は、リージョンの終端位置を、(整数として)リターンする。これは、ポイントかマークのいずれか大きいほうの位置である。

リージョンにたいして操作を行うようにデザインされたコマンドがリージョンの先頭と終端を探すには、region-beginningおよびregion-endを使用するかわりに、通常は‘r’指定とともにinteractiveを使用するべきです。これにより、他のLispプログラムが引数として明示的にリージョンの境界を指定できるようになります。Code Characters for interactiveを参照してください。。

Function: use-region-p

この関数は、Transient Markモードが有効でマークがアクティブであり、かつバッファー内に有効なリージョンがあればtをリターンする。この関数は、マークアクティブ時にはポイント近傍のテキストのかわりにリージョンを操作するコマンドにより使用されることを意図している。

リージョンは、それが非0のサイズをもつか、あるいはユーザーオプションuse-empty-active-regionが非nil(デフォルトはnil)なら有効である。関数region-active-puse-region-pと同様だが、すべてのリージョンを有効とみなす。リージョンが空ならポイントにたいして操作を行うほうが適切な場合が多いため、ほとんどの場合はregion-active-pを使用するべきではない。


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31 Text

This chapter describes the functions that deal with the text in a buffer. Most examine, insert, or delete text in the current buffer, often operating at point or on text adjacent to point. Many are interactive. All the functions that change the text provide for undoing the changes (see section Undo).

Many text-related functions operate on a region of text defined by two buffer positions passed in arguments named start and end. These arguments should be either markers (see section Markers) or numeric character positions (see section Positions). The order of these arguments does not matter; it is all right for start to be the end of the region and end the beginning. For example, (delete-region 1 10) and (delete-region 10 1) are equivalent. An args-out-of-range error is signaled if either start or end is outside the accessible portion of the buffer. In an interactive call, point and the mark are used for these arguments.

Throughout this chapter, “text” refers to the characters in the buffer, together with their properties (when relevant). Keep in mind that point is always between two characters, and the cursor appears on the character after point.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.1 Examining Text Near Point

Many functions are provided to look at the characters around point. Several simple functions are described here. See also looking-at in Regular Expression Searching.

In the following four functions, “beginning” or “end” of buffer refers to the beginning or end of the accessible portion.

Function: char-after &optional position

This function returns the character in the current buffer at (i.e., immediately after) position position. If position is out of range for this purpose, either before the beginning of the buffer, or at or beyond the end, then the value is nil. The default for position is point.

In the following example, assume that the first character in the buffer is ‘@’:

(string (char-after 1))
     ⇒ "@"
Function: char-before &optional position

This function returns the character in the current buffer immediately before position position. If position is out of range for this purpose, either at or before the beginning of the buffer, or beyond the end, then the value is nil. The default for position is point.

Function: following-char

This function returns the character following point in the current buffer. This is similar to (char-after (point)). However, if point is at the end of the buffer, then following-char returns 0.

Remember that point is always between characters, and the cursor normally appears over the character following point. Therefore, the character returned by following-char is the character the cursor is over.

In this example, point is between the ‘a’ and the ‘c’.

---------- Buffer: foo ----------
Gentlemen may cry ``Pea∗ce! Peace!,''
but there is no peace.
---------- Buffer: foo ----------

(string (preceding-char))
     ⇒ "a"
(string (following-char))
     ⇒ "c"
Function: preceding-char

This function returns the character preceding point in the current buffer. See above, under following-char, for an example. If point is at the beginning of the buffer, preceding-char returns 0.

Function: bobp

This function returns t if point is at the beginning of the buffer. If narrowing is in effect, this means the beginning of the accessible portion of the text. See also point-min in Point.

Function: eobp

This function returns t if point is at the end of the buffer. If narrowing is in effect, this means the end of accessible portion of the text. See also point-max in See section Point.

Function: bolp

This function returns t if point is at the beginning of a line. See section Motion by Text Lines. The beginning of the buffer (or of its accessible portion) always counts as the beginning of a line.

Function: eolp

This function returns t if point is at the end of a line. The end of the buffer (or of its accessible portion) is always considered the end of a line.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.2 Examining Buffer Contents

This section describes functions that allow a Lisp program to convert any portion of the text in the buffer into a string.

Function: buffer-substring start end

This function returns a string containing a copy of the text of the region defined by positions start and end in the current buffer. If the arguments are not positions in the accessible portion of the buffer, buffer-substring signals an args-out-of-range error.

Here’s an example which assumes Font-Lock mode is not enabled:

---------- Buffer: foo ----------
This is the contents of buffer foo

---------- Buffer: foo ----------

(buffer-substring 1 10)
     ⇒ "This is t"
(buffer-substring (point-max) 10)
     ⇒ "he contents of buffer foo\n"

If the text being copied has any text properties, these are copied into the string along with the characters they belong to. See section Text Properties. However, overlays (see section Overlays) in the buffer and their properties are ignored, not copied.

For example, if Font-Lock mode is enabled, you might get results like these:

(buffer-substring 1 10)
     ⇒ #("This is t" 0 1 (fontified t) 1 9 (fontified t))
Function: buffer-substring-no-properties start end

This is like buffer-substring, except that it does not copy text properties, just the characters themselves. See section Text Properties.

Function: buffer-string

This function returns the contents of the entire accessible portion of the current buffer, as a string.

Function: filter-buffer-substring start end &optional delete

This function filters the buffer text between start and end using a function specified by the variable filter-buffer-substring-function, and returns the result.

The default filter function consults the obsolete wrapper hook filter-buffer-substring-functions, and the obsolete variable buffer-substring-filters. If both of these are nil, it returns the unaltered text from the buffer, i.e., what buffer-substring would return.

If delete is non-nil, the function deletes the text between start and end after copying it, like delete-and-extract-region.

Lisp code should use this function instead of buffer-substring, buffer-substring-no-properties, or delete-and-extract-region when copying into user-accessible data structures such as the kill-ring, X clipboard, and registers. Major and minor modes can modify filter-buffer-substring-function to alter such text as it is copied out of the buffer.

Variable: filter-buffer-substring-function

The value of this variable is a function that filter-buffer-substring will call to do the actual work. The function receives three arguments, the same as those of filter-buffer-substring, which it should treat as per the documentation of that function. It should return the filtered text (and optionally delete the source text).

The following two variables are obsoleted by filter-buffer-substring-function, but are still supported for backward compatibility.

Variable: filter-buffer-substring-functions

This obsolete variable is a wrapper hook, whose members should be functions that accept four arguments: fun, start, end, and delete. fun is a function that takes three arguments (start, end, and delete), and returns a string. In both cases, the start, end, and delete arguments are the same as those of filter-buffer-substring.

The first hook function is passed a fun that is equivalent to the default operation of filter-buffer-substring, i.e., it returns the buffer-substring between start and end (processed by any buffer-substring-filters) and optionally deletes the original text from the buffer. In most cases, the hook function will call fun once, and then do its own processing of the result. The next hook function receives a fun equivalent to this, and so on. The actual return value is the result of all the hook functions acting in sequence.

Variable: buffer-substring-filters

The value of this obsolete variable should be a list of functions that accept a single string argument and return another string. The default filter-buffer-substring function passes the buffer substring to the first function in this list, and the return value of each function is passed to the next function. The return value of the last function is passed to filter-buffer-substring-functions.

Function: current-word &optional strict really-word

This function returns the symbol (or word) at or near point, as a string. The return value includes no text properties.

If the optional argument really-word is non-nil, it finds a word; otherwise, it finds a symbol (which includes both word characters and symbol constituent characters).

If the optional argument strict is non-nil, then point must be in or next to the symbol or word—if no symbol or word is there, the function returns nil. Otherwise, a nearby symbol or word on the same line is acceptable.

Function: thing-at-point thing

Return the thing around or next to point, as a string.

The argument thing is a symbol which specifies a kind of syntactic entity. Possibilities include symbol, list, sexp, defun, filename, url, word, sentence, whitespace, line, page, and others.

---------- Buffer: foo ----------
Gentlemen may cry ``Pea∗ce! Peace!,''
but there is no peace.
---------- Buffer: foo ----------

(thing-at-point 'word)
     ⇒ "Peace"
(thing-at-point 'line)
     ⇒ "Gentlemen may cry ``Peace! Peace!,''\n"
(thing-at-point 'whitespace)
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.3 Comparing Text

This function lets you compare portions of the text in a buffer, without copying them into strings first.

Function: compare-buffer-substrings buffer1 start1 end1 buffer2 start2 end2

This function lets you compare two substrings of the same buffer or two different buffers. The first three arguments specify one substring, giving a buffer (or a buffer name) and two positions within the buffer. The last three arguments specify the other substring in the same way. You can use nil for buffer1, buffer2, or both to stand for the current buffer.

The value is negative if the first substring is less, positive if the first is greater, and zero if they are equal. The absolute value of the result is one plus the index of the first differing characters within the substrings.

This function ignores case when comparing characters if case-fold-search is non-nil. It always ignores text properties.

Suppose you have the text ‘foobarbar haha!rara! in the current buffer; then in this example the two substrings are ‘rbar ’ and ‘rara!’. The value is 2 because the first substring is greater at the second character.

(compare-buffer-substrings nil 6 11 nil 16 21)
     ⇒ 2

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.4 Inserting Text

Insertion means adding new text to a buffer. The inserted text goes at point—between the character before point and the character after point. Some insertion functions leave point before the inserted text, while other functions leave it after. We call the former insertion after point and the latter insertion before point.

Insertion moves markers located at positions after the insertion point, so that they stay with the surrounding text (see section Markers). When a marker points at the place of insertion, insertion may or may not relocate the marker, depending on the marker’s insertion type (see section Marker Insertion Types). Certain special functions such as insert-before-markers relocate all such markers to point after the inserted text, regardless of the markers’ insertion type.

Insertion functions signal an error if the current buffer is read-only (see section Read-Only Buffers) or if they insert within read-only text (see section Properties with Special Meanings).

These functions copy text characters from strings and buffers along with their properties. The inserted characters have exactly the same properties as the characters they were copied from. By contrast, characters specified as separate arguments, not part of a string or buffer, inherit their text properties from the neighboring text.

The insertion functions convert text from unibyte to multibyte in order to insert in a multibyte buffer, and vice versa—if the text comes from a string or from a buffer. However, they do not convert unibyte character codes 128 through 255 to multibyte characters, not even if the current buffer is a multibyte buffer. See section Converting Text Representations.

Function: insert &rest args

This function inserts the strings and/or characters args into the current buffer, at point, moving point forward. In other words, it inserts the text before point. An error is signaled unless all args are either strings or characters. The value is nil.

Function: insert-before-markers &rest args

This function inserts the strings and/or characters args into the current buffer, at point, moving point forward. An error is signaled unless all args are either strings or characters. The value is nil.

This function is unlike the other insertion functions in that it relocates markers initially pointing at the insertion point, to point after the inserted text. If an overlay begins at the insertion point, the inserted text falls outside the overlay; if a nonempty overlay ends at the insertion point, the inserted text falls inside that overlay.

Command: insert-char character &optional count inherit

This command inserts count instances of character into the current buffer before point. The argument count must be an integer, and character must be a character.

If called interactively, this command prompts for character using its Unicode name or its code point. See Inserting Text in The GNU Emacs Manual.

This function does not convert unibyte character codes 128 through 255 to multibyte characters, not even if the current buffer is a multibyte buffer. See section Converting Text Representations.

If inherit is non-nil, the inserted characters inherit sticky text properties from the two characters before and after the insertion point. See section Stickiness of Text Properties.

Function: insert-buffer-substring from-buffer-or-name &optional start end

This function inserts a portion of buffer from-buffer-or-name into the current buffer before point. The text inserted is the region between start (inclusive) and end (exclusive). (These arguments default to the beginning and end of the accessible portion of that buffer.) This function returns nil.

In this example, the form is executed with buffer ‘bar’ as the current buffer. We assume that buffer ‘bar’ is initially empty.

---------- Buffer: foo ----------
We hold these truths to be self-evident, that all
---------- Buffer: foo ----------

(insert-buffer-substring "foo" 1 20)
     ⇒ nil

---------- Buffer: bar ----------
We hold these truth∗
---------- Buffer: bar ----------
Function: insert-buffer-substring-no-properties from-buffer-or-name &optional start end

This is like insert-buffer-substring except that it does not copy any text properties.

See section Stickiness of Text Properties, for other insertion functions that inherit text properties from the nearby text in addition to inserting it. Whitespace inserted by indentation functions also inherits text properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.5 User-Level Insertion Commands

This section describes higher-level commands for inserting text, commands intended primarily for the user but useful also in Lisp programs.

Command: insert-buffer from-buffer-or-name

This command inserts the entire accessible contents of from-buffer-or-name (which must exist) into the current buffer after point. It leaves the mark after the inserted text. The value is nil.

Command: self-insert-command count

This command inserts the last character typed; it does so count times, before point, and returns nil. Most printing characters are bound to this command. In routine use, self-insert-command is the most frequently called function in Emacs, but programs rarely use it except to install it on a keymap.

In an interactive call, count is the numeric prefix argument.

Self-insertion translates the input character through translation-table-for-input. See section Translation of Characters.

This command calls auto-fill-function whenever that is non-nil and the character inserted is in the table auto-fill-chars (see section Auto Filling).

This command performs abbrev expansion if Abbrev mode is enabled and the inserted character does not have word-constituent syntax. (See section Abbrevs and Abbrev Expansion, and Table of Syntax Classes.) It is also responsible for calling blink-paren-function when the inserted character has close parenthesis syntax (see section Blinking Parentheses).

The final thing this command does is to run the hook post-self-insert-hook. You could use this to automatically reindent text as it is typed, for example.

Do not try substituting your own definition of self-insert-command for the standard one. The editor command loop handles this function specially.

Command: newline &optional number-of-newlines

This command inserts newlines into the current buffer before point. If number-of-newlines is supplied, that many newline characters are inserted.

This function calls auto-fill-function if the current column number is greater than the value of fill-column and number-of-newlines is nil. Typically what auto-fill-function does is insert a newline; thus, the overall result in this case is to insert two newlines at different places: one at point, and another earlier in the line. newline does not auto-fill if number-of-newlines is non-nil.

This command indents to the left margin if that is not zero. See section Margins for Filling.

The value returned is nil. In an interactive call, count is the numeric prefix argument.

Variable: overwrite-mode

This variable controls whether overwrite mode is in effect. The value should be overwrite-mode-textual, overwrite-mode-binary, or nil. overwrite-mode-textual specifies textual overwrite mode (treats newlines and tabs specially), and overwrite-mode-binary specifies binary overwrite mode (treats newlines and tabs like any other characters).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.6 Deleting Text

Deletion means removing part of the text in a buffer, without saving it in the kill ring (see section The Kill Ring). Deleted text can’t be yanked, but can be reinserted using the undo mechanism (see section Undo). Some deletion functions do save text in the kill ring in some special cases.

All of the deletion functions operate on the current buffer.

Command: erase-buffer

This function deletes the entire text of the current buffer (not just the accessible portion), leaving it empty. If the buffer is read-only, it signals a buffer-read-only error; if some of the text in it is read-only, it signals a text-read-only error. Otherwise, it deletes the text without asking for any confirmation. It returns nil.

Normally, deleting a large amount of text from a buffer inhibits further auto-saving of that buffer “because it has shrunk”. However, erase-buffer does not do this, the idea being that the future text is not really related to the former text, and its size should not be compared with that of the former text.

Command: delete-region start end

This command deletes the text between positions start and end in the current buffer, and returns nil. If point was inside the deleted region, its value afterward is start. Otherwise, point relocates with the surrounding text, as markers do.

Function: delete-and-extract-region start end

This function deletes the text between positions start and end in the current buffer, and returns a string containing the text just deleted.

If point was inside the deleted region, its value afterward is start. Otherwise, point relocates with the surrounding text, as markers do.

Command: delete-char count &optional killp

This command deletes count characters directly after point, or before point if count is negative. If killp is non-nil, then it saves the deleted characters in the kill ring.

In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.

The value returned is always nil.

Command: delete-backward-char count &optional killp

This command deletes count characters directly before point, or after point if count is negative. If killp is non-nil, then it saves the deleted characters in the kill ring.

In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.

The value returned is always nil.

Command: backward-delete-char-untabify count &optional killp

This command deletes count characters backward, changing tabs into spaces. When the next character to be deleted is a tab, it is first replaced with the proper number of spaces to preserve alignment and then one of those spaces is deleted instead of the tab. If killp is non-nil, then the command saves the deleted characters in the kill ring.

Conversion of tabs to spaces happens only if count is positive. If it is negative, exactly -count characters after point are deleted.

In an interactive call, count is the numeric prefix argument, and killp is the unprocessed prefix argument. Therefore, if a prefix argument is supplied, the text is saved in the kill ring. If no prefix argument is supplied, then one character is deleted, but not saved in the kill ring.

The value returned is always nil.

User Option: backward-delete-char-untabify-method

This option specifies how backward-delete-char-untabify should deal with whitespace. Possible values include untabify, the default, meaning convert a tab to many spaces and delete one; hungry, meaning delete all tabs and spaces before point with one command; all meaning delete all tabs, spaces and newlines before point, and nil, meaning do nothing special for whitespace characters.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.7 User-Level Deletion Commands

This section describes higher-level commands for deleting text, commands intended primarily for the user but useful also in Lisp programs.

Command: delete-horizontal-space &optional backward-only

This function deletes all spaces and tabs around point. It returns nil.

If backward-only is non-nil, the function deletes spaces and tabs before point, but not after point.

In the following examples, we call delete-horizontal-space four times, once on each line, with point between the second and third characters on the line each time.

---------- Buffer: foo ----------
I ∗thought
I ∗     thought
We∗ thought
Yo∗u thought
---------- Buffer: foo ----------

(delete-horizontal-space)   ; Four times.
     ⇒ nil

---------- Buffer: foo ----------
Ithought
Ithought
Wethought
You thought
---------- Buffer: foo ----------
Command: delete-indentation &optional join-following-p

This function joins the line point is on to the previous line, deleting any whitespace at the join and in some cases replacing it with one space. If join-following-p is non-nil, delete-indentation joins this line to the following line instead. The function returns nil.

If there is a fill prefix, and the second of the lines being joined starts with the prefix, then delete-indentation deletes the fill prefix before joining the lines. See section Margins for Filling.

In the example below, point is located on the line starting ‘events’, and it makes no difference if there are trailing spaces in the preceding line.

---------- Buffer: foo ----------
When in the course of human
∗    events, it becomes necessary
---------- Buffer: foo ----------

(delete-indentation)
     ⇒ nil

---------- Buffer: foo ----------
When in the course of human∗ events, it becomes necessary
---------- Buffer: foo ----------

After the lines are joined, the function fixup-whitespace is responsible for deciding whether to leave a space at the junction.

Command: fixup-whitespace

This function replaces all the horizontal whitespace surrounding point with either one space or no space, according to the context. It returns nil.

At the beginning or end of a line, the appropriate amount of space is none. Before a character with close parenthesis syntax, or after a character with open parenthesis or expression-prefix syntax, no space is also appropriate. Otherwise, one space is appropriate. See section Table of Syntax Classes.

In the example below, fixup-whitespace is called the first time with point before the word ‘spaces’ in the first line. For the second invocation, point is directly after the ‘(’.

---------- Buffer: foo ----------
This has too many     ∗spaces
This has too many spaces at the start of (∗   this list)
---------- Buffer: foo ----------

(fixup-whitespace)
     ⇒ nil
(fixup-whitespace)
     ⇒ nil

---------- Buffer: foo ----------
This has too many spaces
This has too many spaces at the start of (this list)
---------- Buffer: foo ----------
Command: just-one-space &optional n

This command replaces any spaces and tabs around point with a single space, or n spaces if n is specified. It returns nil.

Command: delete-blank-lines

This function deletes blank lines surrounding point. If point is on a blank line with one or more blank lines before or after it, then all but one of them are deleted. If point is on an isolated blank line, then it is deleted. If point is on a nonblank line, the command deletes all blank lines immediately following it.

A blank line is defined as a line containing only tabs and spaces.

delete-blank-lines returns nil.

Command: delete-trailing-whitespace start end

Delete trailing whitespace in the region defined by start and end.

This command deletes whitespace characters after the last non-whitespace character in each line in the region.

If this command acts on the entire buffer (i.e. if called interactively with the mark inactive, or called from Lisp with end nil), it also deletes all trailing lines at the end of the buffer if the variable delete-trailing-lines is non-nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8 The Kill Ring

Kill functions delete text like the deletion functions, but save it so that the user can reinsert it by yanking. Most of these functions have ‘kill-’ in their name. By contrast, the functions whose names start with ‘delete-’ normally do not save text for yanking (though they can still be undone); these are “deletion” functions.

Most of the kill commands are primarily for interactive use, and are not described here. What we do describe are the functions provided for use in writing such commands. You can use these functions to write commands for killing text. When you need to delete text for internal purposes within a Lisp function, you should normally use deletion functions, so as not to disturb the kill ring contents. See section Deleting Text.

Killed text is saved for later yanking in the kill ring. This is a list that holds a number of recent kills, not just the last text kill. We call this a “ring” because yanking treats it as having elements in a cyclic order. The list is kept in the variable kill-ring, and can be operated on with the usual functions for lists; there are also specialized functions, described in this section, that treat it as a ring.

Some people think this use of the word “kill” is unfortunate, since it refers to operations that specifically do not destroy the entities “killed”. This is in sharp contrast to ordinary life, in which death is permanent and “killed” entities do not come back to life. Therefore, other metaphors have been proposed. For example, the term “cut ring” makes sense to people who, in pre-computer days, used scissors and paste to cut up and rearrange manuscripts. However, it would be difficult to change the terminology now.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.1 Kill Ring Concepts

The kill ring records killed text as strings in a list, most recent first. A short kill ring, for example, might look like this:

("some text" "a different piece of text" "even older text")

When the list reaches kill-ring-max entries in length, adding a new entry automatically deletes the last entry.

When kill commands are interwoven with other commands, each kill command makes a new entry in the kill ring. Multiple kill commands in succession build up a single kill ring entry, which would be yanked as a unit; the second and subsequent consecutive kill commands add text to the entry made by the first one.

For yanking, one entry in the kill ring is designated the “front” of the ring. Some yank commands “rotate” the ring by designating a different element as the “front”. But this virtual rotation doesn’t change the list itself—the most recent entry always comes first in the list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.2 Functions for Killing

kill-region is the usual subroutine for killing text. Any command that calls this function is a “kill command” (and should probably have ‘kill’ in its name). kill-region puts the newly killed text in a new element at the beginning of the kill ring or adds it to the most recent element. It determines automatically (using last-command) whether the previous command was a kill command, and if so appends the killed text to the most recent entry.

Command: kill-region start end

This function kills the text in the region defined by start and end. The text is deleted but saved in the kill ring, along with its text properties. The value is always nil.

In an interactive call, start and end are point and the mark.

If the buffer or text is read-only, kill-region modifies the kill ring just the same, then signals an error without modifying the buffer. This is convenient because it lets the user use a series of kill commands to copy text from a read-only buffer into the kill ring.

User Option: kill-read-only-ok

If this option is non-nil, kill-region does not signal an error if the buffer or text is read-only. Instead, it simply returns, updating the kill ring but not changing the buffer.

Command: copy-region-as-kill start end

This command saves the region defined by start and end on the kill ring (including text properties), but does not delete the text from the buffer. It returns nil.

The command does not set this-command to kill-region, so a subsequent kill command does not append to the same kill ring entry.

In Lisp programs, it is better to use kill-new or kill-append instead of this command. See section Low-Level Kill Ring.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.3 Yanking

Yanking means inserting text from the kill ring, but it does not insert the text blindly. The yank command, and related commands, use insert-for-yank to perform special processing on the text before it is inserted.

Function: insert-for-yank string

This function works like insert, except that it processes the text in string according to the yank-handler text property, as well as the variables yank-handled-properties and yank-excluded-properties (see below), before inserting the result into the current buffer.

Function: insert-buffer-substring-as-yank buf &optional start end

This function resembles insert-buffer-substring, except that it processes the text according to yank-handled-properties and yank-excluded-properties. (It does not handle the yank-handler property, which does not normally occur in buffer text anyway.)

If you put a yank-handler text property on all or part of a string, that alters how insert-for-yank inserts the string. If different parts of the string have different yank-handler values (comparison being done with eq), each substring is handled separately. The property value must be a list of one to four elements, with the following format (where elements after the first may be omitted):

(function param noexclude undo)

Here is what the elements do:

function

When function is non-nil, it is called instead of insert to insert the string, with one argument—the string to insert.

param

If param is present and non-nil, it replaces string (or the substring of string being processed) as the object passed to function (or insert). For example, if function is yank-rectangle, param should be a list of strings to insert as a rectangle.

noexclude

If noexclude is present and non-nil, that disables the normal action of yank-handled-properties and yank-excluded-properties on the inserted string.

undo

If undo is present and non-nil, it is a function that will be called by yank-pop to undo the insertion of the current object. It is called with two arguments, the start and end of the current region. function can set yank-undo-function to override the undo value.

User Option: yank-handled-properties

This variable specifies special text property handling conditions for yanked text. It takes effect after the text has been inserted (either normally, or via the yank-handler property), and prior to yank-excluded-properties taking effect.

The value should be an alist of elements (prop . fun). Each alist element is handled in order. The inserted text is scanned for stretches of text having text properties eq to prop; for each such stretch, fun is called with three arguments: the value of the property, and the start and end positions of the text.

User Option: yank-excluded-properties

The value of this variable is the list of properties to remove from inserted text. Its default value contains properties that might lead to annoying results, such as causing the text to respond to the mouse or specifying key bindings. It takes effect after yank-handled-properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.4 Functions for Yanking

This section describes higher-level commands for yanking, which are intended primarily for the user but useful also in Lisp programs. Both yank and yank-pop honor the yank-excluded-properties variable and yank-handler text property (see section Yanking).

Command: yank &optional arg

This command inserts before point the text at the front of the kill ring. It sets the mark at the beginning of that text, using push-mark (see section The Mark), and puts point at the end.

If arg is a non-nil list (which occurs interactively when the user types C-u with no digits), then yank inserts the text as described above, but puts point before the yanked text and sets the mark after it.

If arg is a number, then yank inserts the argth most recently killed text—the argth element of the kill ring list, counted cyclically from the front, which is considered the first element for this purpose.

yank does not alter the contents of the kill ring, unless it used text provided by another program, in which case it pushes that text onto the kill ring. However if arg is an integer different from one, it rotates the kill ring to place the yanked string at the front.

yank returns nil.

Command: yank-pop &optional arg

This command replaces the just-yanked entry from the kill ring with a different entry from the kill ring.

This is allowed only immediately after a yank or another yank-pop. At such a time, the region contains text that was just inserted by yanking. yank-pop deletes that text and inserts in its place a different piece of killed text. It does not add the deleted text to the kill ring, since it is already in the kill ring somewhere. It does however rotate the kill ring to place the newly yanked string at the front.

If arg is nil, then the replacement text is the previous element of the kill ring. If arg is numeric, the replacement is the argth previous kill. If arg is negative, a more recent kill is the replacement.

The sequence of kills in the kill ring wraps around, so that after the oldest one comes the newest one, and before the newest one goes the oldest.

The return value is always nil.

Variable: yank-undo-function

If this variable is non-nil, the function yank-pop uses its value instead of delete-region to delete the text inserted by the previous yank or yank-pop command. The value must be a function of two arguments, the start and end of the current region.

The function insert-for-yank automatically sets this variable according to the undo element of the yank-handler text property, if there is one.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.5 Low-Level Kill Ring

These functions and variables provide access to the kill ring at a lower level, but are still convenient for use in Lisp programs, because they take care of interaction with window system selections (see section Window System Selections).

Function: current-kill n &optional do-not-move

The function current-kill rotates the yanking pointer, which designates the “front” of the kill ring, by n places (from newer kills to older ones), and returns the text at that place in the ring.

If the optional second argument do-not-move is non-nil, then current-kill doesn’t alter the yanking pointer; it just returns the nth kill, counting from the current yanking pointer.

If n is zero, indicating a request for the latest kill, current-kill calls the value of interprogram-paste-function (documented below) before consulting the kill ring. If that value is a function and calling it returns a string or a list of several string, current-kill pushes the strings onto the kill ring and returns the first string. It also sets the yanking pointer to point to the kill-ring entry of the first string returned by interprogram-paste-function, regardless of the value of do-not-move. Otherwise, current-kill does not treat a zero value for n specially: it returns the entry pointed at by the yanking pointer and does not move the yanking pointer.

Function: kill-new string &optional replace

This function pushes the text string onto the kill ring and makes the yanking pointer point to it. It discards the oldest entry if appropriate. It also invokes the value of interprogram-cut-function (see below).

If replace is non-nil, then kill-new replaces the first element of the kill ring with string, rather than pushing string onto the kill ring.

Function: kill-append string before-p

This function appends the text string to the first entry in the kill ring and makes the yanking pointer point to the combined entry. Normally string goes at the end of the entry, but if before-p is non-nil, it goes at the beginning. This function also invokes the value of interprogram-cut-function (see below).

Variable: interprogram-paste-function

This variable provides a way of transferring killed text from other programs, when you are using a window system. Its value should be nil or a function of no arguments.

If the value is a function, current-kill calls it to get the “most recent kill”. If the function returns a non-nil value, then that value is used as the “most recent kill”. If it returns nil, then the front of the kill ring is used.

To facilitate support for window systems that support multiple selections, this function may also return a list of strings. In that case, the first string is used as the “most recent kill”, and all the other strings are pushed onto the kill ring, for easy access by yank-pop.

The normal use of this function is to get the window system’s clipboard as the most recent kill, even if the selection belongs to another application. See section Window System Selections. However, if the clipboard contents come from the current Emacs session, this function should return nil.

Variable: interprogram-cut-function

This variable provides a way of communicating killed text to other programs, when you are using a window system. Its value should be nil or a function of one required argument.

If the value is a function, kill-new and kill-append call it with the new first element of the kill ring as the argument.

The normal use of this function is to put newly killed text in the window system’s clipboard. See section Window System Selections.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.8.6 Internals of the Kill Ring

The variable kill-ring holds the kill ring contents, in the form of a list of strings. The most recent kill is always at the front of the list.

The kill-ring-yank-pointer variable points to a link in the kill ring list, whose CAR is the text to yank next. We say it identifies the “front” of the ring. Moving kill-ring-yank-pointer to a different link is called rotating the kill ring. We call the kill ring a “ring” because the functions that move the yank pointer wrap around from the end of the list to the beginning, or vice-versa. Rotation of the kill ring is virtual; it does not change the value of kill-ring.

Both kill-ring and kill-ring-yank-pointer are Lisp variables whose values are normally lists. The word “pointer” in the name of the kill-ring-yank-pointer indicates that the variable’s purpose is to identify one element of the list for use by the next yank command.

The value of kill-ring-yank-pointer is always eq to one of the links in the kill ring list. The element it identifies is the CAR of that link. Kill commands, which change the kill ring, also set this variable to the value of kill-ring. The effect is to rotate the ring so that the newly killed text is at the front.

Here is a diagram that shows the variable kill-ring-yank-pointer pointing to the second entry in the kill ring ("some text" "a different piece of text" "yet older text").

kill-ring                  ---- kill-ring-yank-pointer
  |                       |
  |                       v
  |     --- ---          --- ---      --- ---
   --> |   |   |------> |   |   |--> |   |   |--> nil
        --- ---          --- ---      --- ---
         |                |            |
         |                |            |
         |                |             -->"yet older text"
         |                |
         |                 --> "a different piece of text"
         |
          --> "some text"

This state of affairs might occur after C-y (yank) immediately followed by M-y (yank-pop).

Variable: kill-ring

This variable holds the list of killed text sequences, most recently killed first.

Variable: kill-ring-yank-pointer

This variable’s value indicates which element of the kill ring is at the “front” of the ring for yanking. More precisely, the value is a tail of the value of kill-ring, and its CAR is the kill string that C-y should yank.

User Option: kill-ring-max

The value of this variable is the maximum length to which the kill ring can grow, before elements are thrown away at the end. The default value for kill-ring-max is 60.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.9 Undo

Most buffers have an undo list, which records all changes made to the buffer’s text so that they can be undone. (The buffers that don’t have one are usually special-purpose buffers for which Emacs assumes that undoing is not useful. In particular, any buffer whose name begins with a space has its undo recording off by default; see Buffer Names.) All the primitives that modify the text in the buffer automatically add elements to the front of the undo list, which is in the variable buffer-undo-list.

Variable: buffer-undo-list

This buffer-local variable’s value is the undo list of the current buffer. A value of t disables the recording of undo information.

Here are the kinds of elements an undo list can have:

position

This kind of element records a previous value of point; undoing this element moves point to position. Ordinary cursor motion does not make any sort of undo record, but deletion operations use these entries to record where point was before the command.

(beg . end)

This kind of element indicates how to delete text that was inserted. Upon insertion, the text occupied the range begend in the buffer.

(text . position)

This kind of element indicates how to reinsert text that was deleted. The deleted text itself is the string text. The place to reinsert it is (abs position). If position is positive, point was at the beginning of the deleted text, otherwise it was at the end. Zero or more (marker . adjustment) elements follow immediately after this element.

(t . time-flag)

This kind of element indicates that an unmodified buffer became modified. A time-flag of the form (sec-high sec-low microsec picosec) represents the visited file’s modification time as of when it was previously visited or saved, using the same format as current-time; see Time of Day. A time-flag of 0 means the buffer does not correspond to any file; -1 means the visited file previously did not exist. primitive-undo uses these values to determine whether to mark the buffer as unmodified once again; it does so only if the file’s status matches that of time-flag.

(nil property value beg . end)

This kind of element records a change in a text property. Here’s how you might undo the change:

(put-text-property beg end property value)
(marker . adjustment)

This kind of element records the fact that the marker marker was relocated due to deletion of surrounding text, and that it moved adjustment character positions. If the marker’s location is consistent with the (text . position) element preceding it in the undo list, then undoing this element moves marker - adjustment characters.

(apply funname . args)

This is an extensible undo item, which is undone by calling funname with arguments args.

(apply delta beg end funname . args)

This is an extensible undo item, which records a change limited to the range beg to end, which increased the size of the buffer by delta characters. It is undone by calling funname with arguments args.

This kind of element enables undo limited to a region to determine whether the element pertains to that region.

nil

This element is a boundary. The elements between two boundaries are called a change group; normally, each change group corresponds to one keyboard command, and undo commands normally undo an entire group as a unit.

Function: undo-boundary

This function places a boundary element in the undo list. The undo command stops at such a boundary, and successive undo commands undo to earlier and earlier boundaries. This function returns nil.

The editor command loop automatically calls undo-boundary just before executing each key sequence, so that each undo normally undoes the effects of one command. As an exception, the command self-insert-command, which produces self-inserting input characters (see section User-Level Insertion Commands), may remove the boundary inserted by the command loop: a boundary is accepted for the first such character, the next 19 consecutive self-inserting input characters do not have boundaries, and then the 20th does; and so on as long as the self-inserting characters continue. Hence, sequences of consecutive character insertions can be undone as a group.

All buffer modifications add a boundary whenever the previous undoable change was made in some other buffer. This is to ensure that each command makes a boundary in each buffer where it makes changes.

Calling this function explicitly is useful for splitting the effects of a command into more than one unit. For example, query-replace calls undo-boundary after each replacement, so that the user can undo individual replacements one by one.

Variable: undo-in-progress

This variable is normally nil, but the undo commands bind it to t. This is so that various kinds of change hooks can tell when they’re being called for the sake of undoing.

Function: primitive-undo count list

This is the basic function for undoing elements of an undo list. It undoes the first count elements of list, returning the rest of list.

primitive-undo adds elements to the buffer’s undo list when it changes the buffer. Undo commands avoid confusion by saving the undo list value at the beginning of a sequence of undo operations. Then the undo operations use and update the saved value. The new elements added by undoing are not part of this saved value, so they don’t interfere with continuing to undo.

This function does not bind undo-in-progress.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.10 Maintaining Undo Lists

This section describes how to enable and disable undo information for a given buffer. It also explains how the undo list is truncated automatically so it doesn’t get too big.

Recording of undo information in a newly created buffer is normally enabled to start with; but if the buffer name starts with a space, the undo recording is initially disabled. You can explicitly enable or disable undo recording with the following two functions, or by setting buffer-undo-list yourself.

Command: buffer-enable-undo &optional buffer-or-name

This command enables recording undo information for buffer buffer-or-name, so that subsequent changes can be undone. If no argument is supplied, then the current buffer is used. This function does nothing if undo recording is already enabled in the buffer. It returns nil.

In an interactive call, buffer-or-name is the current buffer. You cannot specify any other buffer.

Command: buffer-disable-undo &optional buffer-or-name

This function discards the undo list of buffer-or-name, and disables further recording of undo information. As a result, it is no longer possible to undo either previous changes or any subsequent changes. If the undo list of buffer-or-name is already disabled, this function has no effect.

In an interactive call, BUFFER-OR-NAME is the current buffer. You cannot specify any other buffer. This function returns nil.

As editing continues, undo lists get longer and longer. To prevent them from using up all available memory space, garbage collection trims them back to size limits you can set. (For this purpose, the “size” of an undo list measures the cons cells that make up the list, plus the strings of deleted text.) Three variables control the range of acceptable sizes: undo-limit, undo-strong-limit and undo-outer-limit. In these variables, size is counted as the number of bytes occupied, which includes both saved text and other data.

User Option: undo-limit

This is the soft limit for the acceptable size of an undo list. The change group at which this size is exceeded is the last one kept.

User Option: undo-strong-limit

This is the upper limit for the acceptable size of an undo list. The change group at which this size is exceeded is discarded itself (along with all older change groups). There is one exception: the very latest change group is only discarded if it exceeds undo-outer-limit.

User Option: undo-outer-limit

If at garbage collection time the undo info for the current command exceeds this limit, Emacs discards the info and displays a warning. This is a last ditch limit to prevent memory overflow.

User Option: undo-ask-before-discard

If this variable is non-nil, when the undo info exceeds undo-outer-limit, Emacs asks in the echo area whether to discard the info. The default value is nil, which means to discard it automatically.

This option is mainly intended for debugging. Garbage collection is inhibited while the question is asked, which means that Emacs might leak memory if the user waits too long before answering the question.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.11 Filling

Filling means adjusting the lengths of lines (by moving the line breaks) so that they are nearly (but no greater than) a specified maximum width. Additionally, lines can be justified, which means inserting spaces to make the left and/or right margins line up precisely. The width is controlled by the variable fill-column. For ease of reading, lines should be no longer than 70 or so columns.

You can use Auto Fill mode (see section Auto Filling) to fill text automatically as you insert it, but changes to existing text may leave it improperly filled. Then you must fill the text explicitly.

Most of the commands in this section return values that are not meaningful. All the functions that do filling take note of the current left margin, current right margin, and current justification style (see section Margins for Filling). If the current justification style is none, the filling functions don’t actually do anything.

Several of the filling functions have an argument justify. If it is non-nil, that requests some kind of justification. It can be left, right, full, or center, to request a specific style of justification. If it is t, that means to use the current justification style for this part of the text (see current-justification, below). Any other value is treated as full.

When you call the filling functions interactively, using a prefix argument implies the value full for justify.

Command: fill-paragraph &optional justify region

This command fills the paragraph at or after point. If justify is non-nil, each line is justified as well. It uses the ordinary paragraph motion commands to find paragraph boundaries. See Paragraphs in The GNU Emacs Manual.

When region is non-nil, then if Transient Mark mode is enabled and the mark is active, this command calls fill-region to fill all the paragraphs in the region, instead of filling only the current paragraph. When this command is called interactively, region is t.

Command: fill-region start end &optional justify nosqueeze to-eop

This command fills each of the paragraphs in the region from start to end. It justifies as well if justify is non-nil.

If nosqueeze is non-nil, that means to leave whitespace other than line breaks untouched. If to-eop is non-nil, that means to keep filling to the end of the paragraph—or the next hard newline, if use-hard-newlines is enabled (see below).

The variable paragraph-separate controls how to distinguish paragraphs. See section Standard Regular Expressions Used in Editing.

Command: fill-individual-paragraphs start end &optional justify citation-regexp

This command fills each paragraph in the region according to its individual fill prefix. Thus, if the lines of a paragraph were indented with spaces, the filled paragraph will remain indented in the same fashion.

The first two arguments, start and end, are the beginning and end of the region to be filled. The third and fourth arguments, justify and citation-regexp, are optional. If justify is non-nil, the paragraphs are justified as well as filled. If citation-regexp is non-nil, it means the function is operating on a mail message and therefore should not fill the header lines. If citation-regexp is a string, it is used as a regular expression; if it matches the beginning of a line, that line is treated as a citation marker.

Ordinarily, fill-individual-paragraphs regards each change in indentation as starting a new paragraph. If fill-individual-varying-indent is non-nil, then only separator lines separate paragraphs. That mode can handle indented paragraphs with additional indentation on the first line.

User Option: fill-individual-varying-indent

This variable alters the action of fill-individual-paragraphs as described above.

Command: fill-region-as-paragraph start end &optional justify nosqueeze squeeze-after

This command considers a region of text as a single paragraph and fills it. If the region was made up of many paragraphs, the blank lines between paragraphs are removed. This function justifies as well as filling when justify is non-nil.

If nosqueeze is non-nil, that means to leave whitespace other than line breaks untouched. If squeeze-after is non-nil, it specifies a position in the region, and means don’t canonicalize spaces before that position.

In Adaptive Fill mode, this command calls fill-context-prefix to choose a fill prefix by default. See section Adaptive Fill Mode.

Command: justify-current-line &optional how eop nosqueeze

This command inserts spaces between the words of the current line so that the line ends exactly at fill-column. It returns nil.

The argument how, if non-nil specifies explicitly the style of justification. It can be left, right, full, center, or none. If it is t, that means to do follow specified justification style (see current-justification, below). nil means to do full justification.

If eop is non-nil, that means do only left-justification if current-justification specifies full justification. This is used for the last line of a paragraph; even if the paragraph as a whole is fully justified, the last line should not be.

If nosqueeze is non-nil, that means do not change interior whitespace.

User Option: default-justification

This variable’s value specifies the style of justification to use for text that doesn’t specify a style with a text property. The possible values are left, right, full, center, or none. The default value is left.

Function: current-justification

This function returns the proper justification style to use for filling the text around point.

This returns the value of the justification text property at point, or the variable default-justification if there is no such text property. However, it returns nil rather than none to mean “don’t justify”.

User Option: sentence-end-double-space

If this variable is non-nil, a period followed by just one space does not count as the end of a sentence, and the filling functions avoid breaking the line at such a place.

User Option: sentence-end-without-period

If this variable is non-nil, a sentence can end without a period. This is used for languages like Thai, where sentences end with a double space but without a period.

User Option: sentence-end-without-space

If this variable is non-nil, it should be a string of characters that can end a sentence without following spaces.

Variable: fill-paragraph-function

This variable provides a way to override the filling of paragraphs. If its value is non-nil, fill-paragraph calls this function to do the work. If the function returns a non-nil value, fill-paragraph assumes the job is done, and immediately returns that value.

The usual use of this feature is to fill comments in programming language modes. If the function needs to fill a paragraph in the usual way, it can do so as follows:

(let ((fill-paragraph-function nil))
  (fill-paragraph arg))
Variable: fill-forward-paragraph-function

This variable provides a way to override how the filling functions, such as fill-region and fill-paragraph, move forward to the next paragraph. Its value should be a function, which is called with a single argument n, the number of paragraphs to move, and should return the difference between n and the number of paragraphs actually moved. The default value of this variable is forward-paragraph. See Paragraphs in The GNU Emacs Manual.

Variable: use-hard-newlines

If this variable is non-nil, the filling functions do not delete newlines that have the hard text property. These “hard newlines” act as paragraph separators. See Hard and Soft Newlines in The GNU Emacs Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.12 Margins for Filling

User Option: fill-prefix

This buffer-local variable, if non-nil, specifies a string of text that appears at the beginning of normal text lines and should be disregarded when filling them. Any line that fails to start with the fill prefix is considered the start of a paragraph; so is any line that starts with the fill prefix followed by additional whitespace. Lines that start with the fill prefix but no additional whitespace are ordinary text lines that can be filled together. The resulting filled lines also start with the fill prefix.

The fill prefix follows the left margin whitespace, if any.

User Option: fill-column

This buffer-local variable specifies the maximum width of filled lines. Its value should be an integer, which is a number of columns. All the filling, justification, and centering commands are affected by this variable, including Auto Fill mode (see section Auto Filling).

As a practical matter, if you are writing text for other people to read, you should set fill-column to no more than 70. Otherwise the line will be too long for people to read comfortably, and this can make the text seem clumsy.

The default value for fill-column is 70.

Command: set-left-margin from to margin

This sets the left-margin property on the text from from to to to the value margin. If Auto Fill mode is enabled, this command also refills the region to fit the new margin.

Command: set-right-margin from to margin

This sets the right-margin property on the text from from to to to the value margin. If Auto Fill mode is enabled, this command also refills the region to fit the new margin.

Function: current-left-margin

This function returns the proper left margin value to use for filling the text around point. The value is the sum of the left-margin property of the character at the start of the current line (or zero if none), and the value of the variable left-margin.

Function: current-fill-column

This function returns the proper fill column value to use for filling the text around point. The value is the value of the fill-column variable, minus the value of the right-margin property of the character after point.

Command: move-to-left-margin &optional n force

This function moves point to the left margin of the current line. The column moved to is determined by calling the function current-left-margin. If the argument n is non-nil, move-to-left-margin moves forward n-1 lines first.

If force is non-nil, that says to fix the line’s indentation if that doesn’t match the left margin value.

Function: delete-to-left-margin &optional from to

This function removes left margin indentation from the text between from and to. The amount of indentation to delete is determined by calling current-left-margin. In no case does this function delete non-whitespace. If from and to are omitted, they default to the whole buffer.

Function: indent-to-left-margin

This function adjusts the indentation at the beginning of the current line to the value specified by the variable left-margin. (That may involve either inserting or deleting whitespace.) This function is value of indent-line-function in Paragraph-Indent Text mode.

User Option: left-margin

This variable specifies the base left margin column. In Fundamental mode, RET indents to this column. This variable automatically becomes buffer-local when set in any fashion.

User Option: fill-nobreak-predicate

This variable gives major modes a way to specify not to break a line at certain places. Its value should be a list of functions. Whenever filling considers breaking the line at a certain place in the buffer, it calls each of these functions with no arguments and with point located at that place. If any of the functions returns non-nil, then the line won’t be broken there.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.13 Adaptive Fill Mode

When Adaptive Fill Mode is enabled, Emacs determines the fill prefix automatically from the text in each paragraph being filled rather than using a predetermined value. During filling, this fill prefix gets inserted at the start of the second and subsequent lines of the paragraph as described in Filling, and in Auto Filling.

User Option: adaptive-fill-mode

Adaptive Fill mode is enabled when this variable is non-nil. It is t by default.

Function: fill-context-prefix from to

This function implements the heart of Adaptive Fill mode; it chooses a fill prefix based on the text between from and to, typically the start and end of a paragraph. It does this by looking at the first two lines of the paragraph, based on the variables described below.

Usually, this function returns the fill prefix, a string. However, before doing this, the function makes a final check (not specially mentioned in the following) that a line starting with this prefix wouldn’t look like the start of a paragraph. Should this happen, the function signals the anomaly by returning nil instead.

In detail, fill-context-prefix does this:

  1. It takes a candidate for the fill prefix from the first line—it tries first the function in adaptive-fill-function (if any), then the regular expression adaptive-fill-regexp (see below). The first non-nil result of these, or the empty string if they’re both nil, becomes the first line’s candidate.
  2. If the paragraph has as yet only one line, the function tests the validity of the prefix candidate just found. The function then returns the candidate if it’s valid, or a string of spaces otherwise. (see the description of adaptive-fill-first-line-regexp below).
  3. When the paragraph already has two lines, the function next looks for a prefix candidate on the second line, in just the same way it did for the first line. If it doesn’t find one, it returns nil.
  4. The function now compares the two candidate prefixes heuristically: if the non-whitespace characters in the line 2 candidate occur in the same order in the line 1 candidate, the function returns the line 2 candidate. Otherwise, it returns the largest initial substring which is common to both candidates (which might be the empty string).
User Option: adaptive-fill-regexp

Adaptive Fill mode matches this regular expression against the text starting after the left margin whitespace (if any) on a line; the characters it matches are that line’s candidate for the fill prefix.

The default value matches whitespace with certain punctuation characters intermingled.

User Option: adaptive-fill-first-line-regexp

Used only in one-line paragraphs, this regular expression acts as an additional check of the validity of the one available candidate fill prefix: the candidate must match this regular expression, or match comment-start-skip. If it doesn’t, fill-context-prefix replaces the candidate with a string of spaces “of the same width” as it.

The default value of this variable is "\\`[ \t]*\\'", which matches only a string of whitespace. The effect of this default is to force the fill prefixes found in one-line paragraphs always to be pure whitespace.

User Option: adaptive-fill-function

You can specify more complex ways of choosing a fill prefix automatically by setting this variable to a function. The function is called with point after the left margin (if any) of a line, and it must preserve point. It should return either “that line’s” fill prefix or nil, meaning it has failed to determine a prefix.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.14 Auto Filling

Auto Fill mode is a minor mode that fills lines automatically as text is inserted. This section describes the hook used by Auto Fill mode. For a description of functions that you can call explicitly to fill and justify existing text, see Filling.

Auto Fill mode also enables the functions that change the margins and justification style to refill portions of the text. See section Margins for Filling.

Variable: auto-fill-function

The value of this buffer-local variable should be a function (of no arguments) to be called after self-inserting a character from the table auto-fill-chars. It may be nil, in which case nothing special is done in that case.

The value of auto-fill-function is do-auto-fill when Auto-Fill mode is enabled. That is a function whose sole purpose is to implement the usual strategy for breaking a line.

Variable: normal-auto-fill-function

This variable specifies the function to use for auto-fill-function, if and when Auto Fill is turned on. Major modes can set buffer-local values for this variable to alter how Auto Fill works.

Variable: auto-fill-chars

A char table of characters which invoke auto-fill-function when self-inserted—space and newline in most language environments. They have an entry t in the table.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.15 Sorting Text

The sorting functions described in this section all rearrange text in a buffer. This is in contrast to the function sort, which rearranges the order of the elements of a list (see section Functions that Rearrange Lists). The values returned by these functions are not meaningful.

Function: sort-subr reverse nextrecfun endrecfun &optional startkeyfun endkeyfun predicate

This function is the general text-sorting routine that subdivides a buffer into records and then sorts them. Most of the commands in this section use this function.

To understand how sort-subr works, consider the whole accessible portion of the buffer as being divided into disjoint pieces called sort records. The records may or may not be contiguous, but they must not overlap. A portion of each sort record (perhaps all of it) is designated as the sort key. Sorting rearranges the records in order by their sort keys.

Usually, the records are rearranged in order of ascending sort key. If the first argument to the sort-subr function, reverse, is non-nil, the sort records are rearranged in order of descending sort key.

The next four arguments to sort-subr are functions that are called to move point across a sort record. They are called many times from within sort-subr.

  1. nextrecfun is called with point at the end of a record. This function moves point to the start of the next record. The first record is assumed to start at the position of point when sort-subr is called. Therefore, you should usually move point to the beginning of the buffer before calling sort-subr.

    This function can indicate there are no more sort records by leaving point at the end of the buffer.

  2. endrecfun is called with point within a record. It moves point to the end of the record.
  3. startkeyfun is called to move point from the start of a record to the start of the sort key. This argument is optional; if it is omitted, the whole record is the sort key. If supplied, the function should either return a non-nil value to be used as the sort key, or return nil to indicate that the sort key is in the buffer starting at point. In the latter case, endkeyfun is called to find the end of the sort key.
  4. endkeyfun is called to move point from the start of the sort key to the end of the sort key. This argument is optional. If startkeyfun returns nil and this argument is omitted (or nil), then the sort key extends to the end of the record. There is no need for endkeyfun if startkeyfun returns a non-nil value.

The argument predicate is the function to use to compare keys. If keys are numbers, it defaults to <; otherwise it defaults to string<.

As an example of sort-subr, here is the complete function definition for sort-lines:

;; Note that the first two lines of doc string
;; are effectively one line when viewed by a user.
(defun sort-lines (reverse beg end)
  "Sort lines in region alphabetically;\
 argument means descending order.
Called from a program, there are three arguments:
REVERSE (non-nil means reverse order),\
 BEG and END (region to sort).
The variable `sort-fold-case' determines\
 whether alphabetic case affects
the sort order."
  (interactive "P\nr")
  (save-excursion
    (save-restriction
      (narrow-to-region beg end)
      (goto-char (point-min))
      (let ((inhibit-field-text-motion t))
        (sort-subr reverse 'forward-line 'end-of-line)))))

Here forward-line moves point to the start of the next record, and end-of-line moves point to the end of record. We do not pass the arguments startkeyfun and endkeyfun, because the entire record is used as the sort key.

The sort-paragraphs function is very much the same, except that its sort-subr call looks like this:

(sort-subr reverse
           (function
            (lambda ()
              (while (and (not (eobp))
                          (looking-at paragraph-separate))
                (forward-line 1))))
           'forward-paragraph)

Markers pointing into any sort records are left with no useful position after sort-subr returns.

User Option: sort-fold-case

If this variable is non-nil, sort-subr and the other buffer sorting functions ignore case when comparing strings.

Command: sort-regexp-fields reverse record-regexp key-regexp start end

This command sorts the region between start and end alphabetically as specified by record-regexp and key-regexp. If reverse is a negative integer, then sorting is in reverse order.

Alphabetical sorting means that two sort keys are compared by comparing the first characters of each, the second characters of each, and so on. If a mismatch is found, it means that the sort keys are unequal; the sort key whose character is less at the point of first mismatch is the lesser sort key. The individual characters are compared according to their numerical character codes in the Emacs character set.

The value of the record-regexp argument specifies how to divide the buffer into sort records. At the end of each record, a search is done for this regular expression, and the text that matches it is taken as the next record. For example, the regular expression ‘^.+$’, which matches lines with at least one character besides a newline, would make each such line into a sort record. See section Regular Expressions, for a description of the syntax and meaning of regular expressions.

The value of the key-regexp argument specifies what part of each record is the sort key. The key-regexp could match the whole record, or only a part. In the latter case, the rest of the record has no effect on the sorted order of records, but it is carried along when the record moves to its new position.

The key-regexp argument can refer to the text matched by a subexpression of record-regexp, or it can be a regular expression on its own.

If key-regexp is:

\digit

then the text matched by the digitth ‘\(...\)’ parenthesis grouping in record-regexp is the sort key.

\&

then the whole record is the sort key.

a regular expression

then sort-regexp-fields searches for a match for the regular expression within the record. If such a match is found, it is the sort key. If there is no match for key-regexp within a record then that record is ignored, which means its position in the buffer is not changed. (The other records may move around it.)

For example, if you plan to sort all the lines in the region by the first word on each line starting with the letter ‘f’, you should set record-regexp to ‘^.*$’ and set key-regexp to ‘\<f\w*\>’. The resulting expression looks like this:

(sort-regexp-fields nil "^.*$" "\\<f\\w*\\>"
                    (region-beginning)
                    (region-end))

If you call sort-regexp-fields interactively, it prompts for record-regexp and key-regexp in the minibuffer.

Command: sort-lines reverse start end

This command alphabetically sorts lines in the region between start and end. If reverse is non-nil, the sort is in reverse order.

Command: sort-paragraphs reverse start end

This command alphabetically sorts paragraphs in the region between start and end. If reverse is non-nil, the sort is in reverse order.

Command: sort-pages reverse start end

This command alphabetically sorts pages in the region between start and end. If reverse is non-nil, the sort is in reverse order.

Command: sort-fields field start end

This command sorts lines in the region between start and end, comparing them alphabetically by the fieldth field of each line. Fields are separated by whitespace and numbered starting from 1. If field is negative, sorting is by the -fieldth field from the end of the line. This command is useful for sorting tables.

Command: sort-numeric-fields field start end

This command sorts lines in the region between start and end, comparing them numerically by the fieldth field of each line. Fields are separated by whitespace and numbered starting from 1. The specified field must contain a number in each line of the region. Numbers starting with 0 are treated as octal, and numbers starting with ‘0x’ are treated as hexadecimal.

If field is negative, sorting is by the -fieldth field from the end of the line. This command is useful for sorting tables.

User Option: sort-numeric-base

This variable specifies the default radix for sort-numeric-fields to parse numbers.

Command: sort-columns reverse &optional beg end

This command sorts the lines in the region between beg and end, comparing them alphabetically by a certain range of columns. The column positions of beg and end bound the range of columns to sort on.

If reverse is non-nil, the sort is in reverse order.

One unusual thing about this command is that the entire line containing position beg, and the entire line containing position end, are included in the region sorted.

Note that sort-columns rejects text that contains tabs, because tabs could be split across the specified columns. Use M-x untabify to convert tabs to spaces before sorting.

When possible, this command actually works by calling the sort utility program.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.16 Counting Columns

The column functions convert between a character position (counting characters from the beginning of the buffer) and a column position (counting screen characters from the beginning of a line).

These functions count each character according to the number of columns it occupies on the screen. This means control characters count as occupying 2 or 4 columns, depending upon the value of ctl-arrow, and tabs count as occupying a number of columns that depends on the value of tab-width and on the column where the tab begins. See section Usual Display Conventions.

Column number computations ignore the width of the window and the amount of horizontal scrolling. Consequently, a column value can be arbitrarily high. The first (or leftmost) column is numbered 0. They also ignore overlays and text properties, aside from invisibility.

Function: current-column

This function returns the horizontal position of point, measured in columns, counting from 0 at the left margin. The column position is the sum of the widths of all the displayed representations of the characters between the start of the current line and point.

For an example of using current-column, see the description of count-lines in Motion by Text Lines.

Command: move-to-column column &optional force

This function moves point to column in the current line. The calculation of column takes into account the widths of the displayed representations of the characters between the start of the line and point.

When called interactively, column is the value of prefix numeric argument. If column is not an integer, an error is signaled.

If it is impossible to move to column column because that is in the middle of a multicolumn character such as a tab, point moves to the end of that character. However, if force is non-nil, and column is in the middle of a tab, then move-to-column converts the tab into spaces so that it can move precisely to column column. Other multicolumn characters can cause anomalies despite force, since there is no way to split them.

The argument force also has an effect if the line isn’t long enough to reach column column; if it is t, that means to add whitespace at the end of the line to reach that column.

The return value is the column number actually moved to.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17 Indentation

The indentation functions are used to examine, move to, and change whitespace that is at the beginning of a line. Some of the functions can also change whitespace elsewhere on a line. Columns and indentation count from zero at the left margin.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.1 Indentation Primitives

This section describes the primitive functions used to count and insert indentation. The functions in the following sections use these primitives. See section Size of Displayed Text, for related functions.

Function: current-indentation

This function returns the indentation of the current line, which is the horizontal position of the first nonblank character. If the contents are entirely blank, then this is the horizontal position of the end of the line.

Command: indent-to column &optional minimum

This function indents from point with tabs and spaces until column is reached. If minimum is specified and non-nil, then at least that many spaces are inserted even if this requires going beyond column. Otherwise the function does nothing if point is already beyond column. The value is the column at which the inserted indentation ends.

The inserted whitespace characters inherit text properties from the surrounding text (usually, from the preceding text only). See section Stickiness of Text Properties.

User Option: indent-tabs-mode

If this variable is non-nil, indentation functions can insert tabs as well as spaces. Otherwise, they insert only spaces. Setting this variable automatically makes it buffer-local in the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.2 Indentation Controlled by Major Mode

An important function of each major mode is to customize the TAB key to indent properly for the language being edited. This section describes the mechanism of the TAB key and how to control it. The functions in this section return unpredictable values.

Command: indent-for-tab-command &optional rigid

This is the command bound to TAB in most editing modes. Its usual action is to indent the current line, but it can alternatively insert a tab character or indent a region.

Here is what it does:

If rigid is non-nil (interactively, with a prefix argument), then after this command indents a line or inserts a tab, it also rigidly indents the entire balanced expression which starts at the beginning of the current line, in order to reflect the new indentation. This argument is ignored if the command indents the region.

Variable: indent-line-function

This variable’s value is the function to be used by indent-for-tab-command, and various other indentation commands, to indent the current line. It is usually assigned by the major mode; for instance, Lisp mode sets it to lisp-indent-line, C mode sets it to c-indent-line, and so on. The default value is indent-relative. See section Automatic Indentation of code.

Command: indent-according-to-mode

This command calls the function in indent-line-function to indent the current line in a way appropriate for the current major mode.

Command: newline-and-indent

This function inserts a newline, then indents the new line (the one following the newline just inserted) according to the major mode. It does indentation by calling indent-according-to-mode.

Command: reindent-then-newline-and-indent

This command reindents the current line, inserts a newline at point, and then indents the new line (the one following the newline just inserted). It does indentation on both lines by calling indent-according-to-mode.

User Option: tab-always-indent

This variable can be used to customize the behavior of the TAB (indent-for-tab-command) command. If the value is t (the default), the command normally just indents the current line. If the value is nil, the command indents the current line only if point is at the left margin or in the line’s indentation; otherwise, it inserts a tab character. If the value is complete, the command first tries to indent the current line, and if the line was already indented, it calls completion-at-point to complete the text at point (see section Completion in Ordinary Buffers).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.3 Indenting an Entire Region

This section describes commands that indent all the lines in the region. They return unpredictable values.

Command: indent-region start end &optional to-column

This command indents each nonblank line starting between start (inclusive) and end (exclusive). If to-column is nil, indent-region indents each nonblank line by calling the current mode’s indentation function, the value of indent-line-function.

If to-column is non-nil, it should be an integer specifying the number of columns of indentation; then this function gives each line exactly that much indentation, by either adding or deleting whitespace.

If there is a fill prefix, indent-region indents each line by making it start with the fill prefix.

Variable: indent-region-function

The value of this variable is a function that can be used by indent-region as a short cut. It should take two arguments, the start and end of the region. You should design the function so that it will produce the same results as indenting the lines of the region one by one, but presumably faster.

If the value is nil, there is no short cut, and indent-region actually works line by line.

A short-cut function is useful in modes such as C mode and Lisp mode, where the indent-line-function must scan from the beginning of the function definition: applying it to each line would be quadratic in time. The short cut can update the scan information as it moves through the lines indenting them; this takes linear time. In a mode where indenting a line individually is fast, there is no need for a short cut.

indent-region with a non-nil argument to-column has a different meaning and does not use this variable.

Command: indent-rigidly start end count

This function indents all lines starting between start (inclusive) and end (exclusive) sideways by count columns. This “preserves the shape” of the affected region, moving it as a rigid unit.

This is useful not only for indenting regions of unindented text, but also for indenting regions of formatted code. For example, if count is 3, this command adds 3 columns of indentation to every line that begins in the specified region.

If called interactively with no prefix argument, this command invokes a transient mode for adjusting indentation rigidly. See Indentation Commands in The GNU Emacs Manual.

Command: indent-code-rigidly start end columns &optional nochange-regexp

This is like indent-rigidly, except that it doesn’t alter lines that start within strings or comments.

In addition, it doesn’t alter a line if nochange-regexp matches at the beginning of the line (if nochange-regexp is non-nil).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.4 Indentation Relative to Previous Lines

This section describes two commands that indent the current line based on the contents of previous lines.

Command: indent-relative &optional unindented-ok

This command inserts whitespace at point, extending to the same column as the next indent point of the previous nonblank line. An indent point is a non-whitespace character following whitespace. The next indent point is the first one at a column greater than the current column of point. For example, if point is underneath and to the left of the first non-blank character of a line of text, it moves to that column by inserting whitespace.

If the previous nonblank line has no next indent point (i.e., none at a great enough column position), indent-relative either does nothing (if unindented-ok is non-nil) or calls tab-to-tab-stop. Thus, if point is underneath and to the right of the last column of a short line of text, this command ordinarily moves point to the next tab stop by inserting whitespace.

The return value of indent-relative is unpredictable.

In the following example, point is at the beginning of the second line:

            This line is indented twelve spaces.
∗The quick brown fox jumped.

Evaluation of the expression (indent-relative nil) produces the following:

            This line is indented twelve spaces.
            ∗The quick brown fox jumped.

In this next example, point is between the ‘m’ and ‘p’ of ‘jumped’:

            This line is indented twelve spaces.
The quick brown fox jum∗ped.

Evaluation of the expression (indent-relative nil) produces the following:

            This line is indented twelve spaces.
The quick brown fox jum  ∗ped.
Command: indent-relative-maybe

This command indents the current line like the previous nonblank line, by calling indent-relative with t as the unindented-ok argument. The return value is unpredictable.

If the previous nonblank line has no indent points beyond the current column, this command does nothing.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.5 Adjustable “Tab Stops”

This section explains the mechanism for user-specified “tab stops” and the mechanisms that use and set them. The name “tab stops” is used because the feature is similar to that of the tab stops on a typewriter. The feature works by inserting an appropriate number of spaces and tab characters to reach the next tab stop column; it does not affect the display of tab characters in the buffer (see section Usual Display Conventions). Note that the TAB character as input uses this tab stop feature only in a few major modes, such as Text mode. See Tab Stops in The GNU Emacs Manual.

Command: tab-to-tab-stop

This command inserts spaces or tabs before point, up to the next tab stop column defined by tab-stop-list.

User Option: tab-stop-list

This variable defines the tab stop columns used by tab-to-tab-stop. It should be either nil, or a list of increasing integers, which need not be evenly spaced. The list is implicitly extended to infinity through repetition of the interval between the last and penultimate elements (or tab-width if the list has fewer than two elements). A value of nil means a tab stop every tab-width columns.

Use M-x edit-tab-stops to edit the location of tab stops interactively.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.17.6 Indentation-Based Motion Commands

These commands, primarily for interactive use, act based on the indentation in the text.

Command: back-to-indentation

This command moves point to the first non-whitespace character in the current line (which is the line in which point is located). It returns nil.

Command: backward-to-indentation &optional arg

This command moves point backward arg lines and then to the first nonblank character on that line. It returns nil. If arg is omitted or nil, it defaults to 1.

Command: forward-to-indentation &optional arg

This command moves point forward arg lines and then to the first nonblank character on that line. It returns nil. If arg is omitted or nil, it defaults to 1.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.18 Case Changes

The case change commands described here work on text in the current buffer. See section Case Conversion in Lisp, for case conversion functions that work on strings and characters. See section The Case Table, for how to customize which characters are upper or lower case and how to convert them.

Command: capitalize-region start end

This function capitalizes all words in the region defined by start and end. To capitalize means to convert each word’s first character to upper case and convert the rest of each word to lower case. The function returns nil.

If one end of the region is in the middle of a word, the part of the word within the region is treated as an entire word.

When capitalize-region is called interactively, start and end are point and the mark, with the smallest first.

---------- Buffer: foo ----------
This is the contents of the 5th foo.
---------- Buffer: foo ----------

(capitalize-region 1 37)
⇒ nil

---------- Buffer: foo ----------
This Is The Contents Of The 5th Foo.
---------- Buffer: foo ----------
Command: downcase-region start end

This function converts all of the letters in the region defined by start and end to lower case. The function returns nil.

When downcase-region is called interactively, start and end are point and the mark, with the smallest first.

Command: upcase-region start end

This function converts all of the letters in the region defined by start and end to upper case. The function returns nil.

When upcase-region is called interactively, start and end are point and the mark, with the smallest first.

Command: capitalize-word count

This function capitalizes count words after point, moving point over as it does. To capitalize means to convert each word’s first character to upper case and convert the rest of each word to lower case. If count is negative, the function capitalizes the -count previous words but does not move point. The value is nil.

If point is in the middle of a word, the part of the word before point is ignored when moving forward. The rest is treated as an entire word.

When capitalize-word is called interactively, count is set to the numeric prefix argument.

Command: downcase-word count

This function converts the count words after point to all lower case, moving point over as it does. If count is negative, it converts the -count previous words but does not move point. The value is nil.

When downcase-word is called interactively, count is set to the numeric prefix argument.

Command: upcase-word count

This function converts the count words after point to all upper case, moving point over as it does. If count is negative, it converts the -count previous words but does not move point. The value is nil.

When upcase-word is called interactively, count is set to the numeric prefix argument.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19 Text Properties

Each character position in a buffer or a string can have a text property list, much like the property list of a symbol (see section Property Lists). The properties belong to a particular character at a particular place, such as, the letter ‘T’ at the beginning of this sentence or the first ‘o’ in ‘foo’—if the same character occurs in two different places, the two occurrences in general have different properties.

Each property has a name and a value. Both of these can be any Lisp object, but the name is normally a symbol. Typically each property name symbol is used for a particular purpose; for instance, the text property face specifies the faces for displaying the character (see section Properties with Special Meanings). The usual way to access the property list is to specify a name and ask what value corresponds to it.

If a character has a category property, we call it the property category of the character. It should be a symbol. The properties of the symbol serve as defaults for the properties of the character.

Copying text between strings and buffers preserves the properties along with the characters; this includes such diverse functions as substring, insert, and buffer-substring.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.1 Examining Text Properties

The simplest way to examine text properties is to ask for the value of a particular property of a particular character. For that, use get-text-property. Use text-properties-at to get the entire property list of a character. See section Text Property Search Functions, for functions to examine the properties of a number of characters at once.

These functions handle both strings and buffers. Keep in mind that positions in a string start from 0, whereas positions in a buffer start from 1.

Function: get-text-property pos prop &optional object

This function returns the value of the prop property of the character after position pos in object (a buffer or string). The argument object is optional and defaults to the current buffer.

If there is no prop property strictly speaking, but the character has a property category that is a symbol, then get-text-property returns the prop property of that symbol.

Function: get-char-property position prop &optional object

This function is like get-text-property, except that it checks overlays first and then text properties. See section Overlays.

The argument object may be a string, a buffer, or a window. If it is a window, then the buffer displayed in that window is used for text properties and overlays, but only the overlays active for that window are considered. If object is a buffer, then overlays in that buffer are considered first, in order of decreasing priority, followed by the text properties. If object is a string, only text properties are considered, since strings never have overlays.

Function: get-pos-property position prop &optional object

This function is like get-char-property, except that it pays attention to properties’ stickiness and overlays’ advancement settings instead of the property of the character at (i.e. right after) position.

Function: get-char-property-and-overlay position prop &optional object

This is like get-char-property, but gives extra information about the overlay that the property value comes from.

Its value is a cons cell whose CAR is the property value, the same value get-char-property would return with the same arguments. Its CDR is the overlay in which the property was found, or nil, if it was found as a text property or not found at all.

If position is at the end of object, both the CAR and the CDR of the value are nil.

Variable: char-property-alias-alist

This variable holds an alist which maps property names to a list of alternative property names. If a character does not specify a direct value for a property, the alternative property names are consulted in order; the first non-nil value is used. This variable takes precedence over default-text-properties, and category properties take precedence over this variable.

Function: text-properties-at position &optional object

This function returns the entire property list of the character at position in the string or buffer object. If object is nil, it defaults to the current buffer.

Variable: default-text-properties

This variable holds a property list giving default values for text properties. Whenever a character does not specify a value for a property, neither directly, through a category symbol, or through char-property-alias-alist, the value stored in this list is used instead. Here is an example:

(setq default-text-properties '(foo 69)
      char-property-alias-alist nil)
;; Make sure character 1 has no properties of its own.
(set-text-properties 1 2 nil)
;; What we get, when we ask, is the default value.
(get-text-property 1 'foo)
     ⇒ 69

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.2 Changing Text Properties

The primitives for changing properties apply to a specified range of text in a buffer or string. The function set-text-properties (see end of section) sets the entire property list of the text in that range; more often, it is useful to add, change, or delete just certain properties specified by name.

Since text properties are considered part of the contents of the buffer (or string), and can affect how a buffer looks on the screen, any change in buffer text properties marks the buffer as modified. Buffer text property changes are undoable also (see section Undo). Positions in a string start from 0, whereas positions in a buffer start from 1.

Function: put-text-property start end prop value &optional object

This function sets the prop property to value for the text between start and end in the string or buffer object. If object is nil, it defaults to the current buffer.

Function: add-text-properties start end props &optional object

This function adds or overrides text properties for the text between start and end in the string or buffer object. If object is nil, it defaults to the current buffer.

The argument props specifies which properties to add. It should have the form of a property list (see section Property Lists): a list whose elements include the property names followed alternately by the corresponding values.

The return value is t if the function actually changed some property’s value; nil otherwise (if props is nil or its values agree with those in the text).

For example, here is how to set the comment and face properties of a range of text:

(add-text-properties start end
                     '(comment t face highlight))
Function: remove-text-properties start end props &optional object

This function deletes specified text properties from the text between start and end in the string or buffer object. If object is nil, it defaults to the current buffer.

The argument props specifies which properties to delete. It should have the form of a property list (see section Property Lists): a list whose elements are property names alternating with corresponding values. But only the names matter—the values that accompany them are ignored. For example, here’s how to remove the face property.

(remove-text-properties start end '(face nil))

The return value is t if the function actually changed some property’s value; nil otherwise (if props is nil or if no character in the specified text had any of those properties).

To remove all text properties from certain text, use set-text-properties and specify nil for the new property list.

Function: remove-list-of-text-properties start end list-of-properties &optional object

Like remove-text-properties except that list-of-properties is a list of property names only, not an alternating list of property names and values.

Function: set-text-properties start end props &optional object

This function completely replaces the text property list for the text between start and end in the string or buffer object. If object is nil, it defaults to the current buffer.

The argument props is the new property list. It should be a list whose elements are property names alternating with corresponding values.

After set-text-properties returns, all the characters in the specified range have identical properties.

If props is nil, the effect is to get rid of all properties from the specified range of text. Here’s an example:

(set-text-properties start end nil)

Do not rely on the return value of this function.

Function: add-face-text-property start end face &optional appendp object

This function acts on the text between start and end, adding the face face to the face text property. face should be a valid value for the face property (see section Properties with Special Meanings), such as a face name or an anonymous face (see section Faces).

If any text in the region already has a non-nil face property, those face(s) are retained. This function sets the face property to a list of faces, with face as the first element (by default) and the pre-existing faces as the remaining elements. If the optional argument append is non-nil, face is appended to the end of the list instead. Note that in a face list, the first occurring value for each attribute takes precedence.

For example, the following code would assign a italicized green face to the text between start and end:

(add-face-text-property start end 'italic)
(add-face-text-property start end '(:foreground "red"))
(add-face-text-property start end '(:foreground "green"))

The optional argument object, if non-nil, specifies a buffer or string to act on, rather than the current buffer. If object is a string, then start and end are zero-based indices into the string.

The easiest way to make a string with text properties is with propertize:

Function: propertize string &rest properties

This function returns a copy of string with the text properties properties added. These properties apply to all the characters in the string that is returned. Here is an example that constructs a string with a face property and a mouse-face property:

(propertize "foo" 'face 'italic
            'mouse-face 'bold-italic)
     ⇒ #("foo" 0 3 (mouse-face bold-italic face italic))

To put different properties on various parts of a string, you can construct each part with propertize and then combine them with concat:

(concat
 (propertize "foo" 'face 'italic
             'mouse-face 'bold-italic)
 " and "
 (propertize "bar" 'face 'italic
             'mouse-face 'bold-italic))
     ⇒ #("foo and bar"
                 0 3 (face italic mouse-face bold-italic)
                 3 8 nil
                 8 11 (face italic mouse-face bold-italic))

See section Examining Buffer Contents, for the function buffer-substring-no-properties, which copies text from the buffer but does not copy its properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.3 Text Property Search Functions

In typical use of text properties, most of the time several or many consecutive characters have the same value for a property. Rather than writing your programs to examine characters one by one, it is much faster to process chunks of text that have the same property value.

Here are functions you can use to do this. They use eq for comparing property values. In all cases, object defaults to the current buffer.

For good performance, it’s very important to use the limit argument to these functions, especially the ones that search for a single property—otherwise, they may spend a long time scanning to the end of the buffer, if the property you are interested in does not change.

These functions do not move point; instead, they return a position (or nil). Remember that a position is always between two characters; the position returned by these functions is between two characters with different properties.

Function: next-property-change pos &optional object limit

The function scans the text forward from position pos in the string or buffer object until it finds a change in some text property, then returns the position of the change. In other words, it returns the position of the first character beyond pos whose properties are not identical to those of the character just after pos.

If limit is non-nil, then the scan ends at position limit. If there is no property change before that point, this function returns limit.

The value is nil if the properties remain unchanged all the way to the end of object and limit is nil. If the value is non-nil, it is a position greater than or equal to pos. The value equals pos only when limit equals pos.

Here is an example of how to scan the buffer by chunks of text within which all properties are constant:

(while (not (eobp))
  (let ((plist (text-properties-at (point)))
        (next-change
         (or (next-property-change (point) (current-buffer))
             (point-max))))
    Process text from point to next-change
    (goto-char next-change)))
Function: previous-property-change pos &optional object limit

This is like next-property-change, but scans back from pos instead of forward. If the value is non-nil, it is a position less than or equal to pos; it equals pos only if limit equals pos.

Function: next-single-property-change pos prop &optional object limit

The function scans text for a change in the prop property, then returns the position of the change. The scan goes forward from position pos in the string or buffer object. In other words, this function returns the position of the first character beyond pos whose prop property differs from that of the character just after pos.

If limit is non-nil, then the scan ends at position limit. If there is no property change before that point, next-single-property-change returns limit.

The value is nil if the property remains unchanged all the way to the end of object and limit is nil. If the value is non-nil, it is a position greater than or equal to pos; it equals pos only if limit equals pos.

Function: previous-single-property-change pos prop &optional object limit

This is like next-single-property-change, but scans back from pos instead of forward. If the value is non-nil, it is a position less than or equal to pos; it equals pos only if limit equals pos.

Function: next-char-property-change pos &optional limit

This is like next-property-change except that it considers overlay properties as well as text properties, and if no change is found before the end of the buffer, it returns the maximum buffer position rather than nil (in this sense, it resembles the corresponding overlay function next-overlay-change, rather than next-property-change). There is no object operand because this function operates only on the current buffer. It returns the next address at which either kind of property changes.

Function: previous-char-property-change pos &optional limit

This is like next-char-property-change, but scans back from pos instead of forward, and returns the minimum buffer position if no change is found.

Function: next-single-char-property-change pos prop &optional object limit

This is like next-single-property-change except that it considers overlay properties as well as text properties, and if no change is found before the end of the object, it returns the maximum valid position in object rather than nil. Unlike next-char-property-change, this function does have an object operand; if object is not a buffer, only text-properties are considered.

Function: previous-single-char-property-change pos prop &optional object limit

This is like next-single-char-property-change, but scans back from pos instead of forward, and returns the minimum valid position in object if no change is found.

Function: text-property-any start end prop value &optional object

This function returns non-nil if at least one character between start and end has a property prop whose value is value. More precisely, it returns the position of the first such character. Otherwise, it returns nil.

The optional fifth argument, object, specifies the string or buffer to scan. Positions are relative to object. The default for object is the current buffer.

Function: text-property-not-all start end prop value &optional object

This function returns non-nil if at least one character between start and end does not have a property prop with value value. More precisely, it returns the position of the first such character. Otherwise, it returns nil.

The optional fifth argument, object, specifies the string or buffer to scan. Positions are relative to object. The default for object is the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.4 Properties with Special Meanings

Here is a table of text property names that have special built-in meanings. The following sections list a few additional special property names that control filling and property inheritance. All other names have no standard meaning, and you can use them as you like.

Note: the properties composition, display, invisible and intangible can also cause point to move to an acceptable place, after each Emacs command. See section Adjusting Point After Commands.

category

If a character has a category property, we call it the property category of the character. It should be a symbol. The properties of this symbol serve as defaults for the properties of the character.

face

The face property controls the appearance of the character (see section Faces). The value of the property can be the following:

Font Lock mode (see section Font Lock Mode) works in most buffers by dynamically updating the face property of characters based on the context.

The add-face-text-property function provides a convenient way to set this text property. See section Changing Text Properties.

font-lock-face

This property specifies a value for the face property that Font Lock mode should apply to the underlying text. It is one of the fontification methods used by Font Lock mode, and is useful for special modes that implement their own highlighting. See section Precalculated Fontification. When Font Lock mode is disabled, font-lock-face has no effect.

mouse-face

This property is used instead of face when the mouse is on or near the character. For this purpose, “near” means that all text between the character and where the mouse is have the same mouse-face property value.

Emacs ignores all face attributes from the mouse-face property that alter the text size (e.g., :height, :weight, and :slant). Those attributes are always the same as for the unhighlighted text.

fontified

This property says whether the text is ready for display. If nil, Emacs’s redisplay routine calls the functions in fontification-functions (see section Automatic Face Assignment) to prepare this part of the buffer before it is displayed. It is used internally by the “just in time” font locking code.

display

This property activates various features that change the way text is displayed. For example, it can make text appear taller or shorter, higher or lower, wider or narrow, or replaced with an image. See section The display Property.

help-echo

If text has a string as its help-echo property, then when you move the mouse onto that text, Emacs displays that string in the echo area, or in the tooltip window (see Tooltips in The GNU Emacs Manual).

If the value of the help-echo property is a function, that function is called with three arguments, window, object and pos and should return a help string or nil for none. The first argument, window is the window in which the help was found. The second, object, is the buffer, overlay or string which had the help-echo property. The pos argument is as follows:

If the value of the help-echo property is neither a function nor a string, it is evaluated to obtain a help string.

You can alter the way help text is displayed by setting the variable show-help-function (see Help display).

This feature is used in the mode line and for other active text.

keymap

The keymap property specifies an additional keymap for commands. When this keymap applies, it is used for key lookup before the minor mode keymaps and before the buffer’s local map. See section Active Keymaps. If the property value is a symbol, the symbol’s function definition is used as the keymap.

The property’s value for the character before point applies if it is non-nil and rear-sticky, and the property’s value for the character after point applies if it is non-nil and front-sticky. (For mouse clicks, the position of the click is used instead of the position of point.)

local-map

This property works like keymap except that it specifies a keymap to use instead of the buffer’s local map. For most purposes (perhaps all purposes), it is better to use the keymap property.

syntax-table

The syntax-table property overrides what the syntax table says about this particular character. See section Syntax Properties.

read-only

If a character has the property read-only, then modifying that character is not allowed. Any command that would do so gets an error, text-read-only. If the property value is a string, that string is used as the error message.

Insertion next to a read-only character is an error if inserting ordinary text there would inherit the read-only property due to stickiness. Thus, you can control permission to insert next to read-only text by controlling the stickiness. See section Stickiness of Text Properties.

Since changing properties counts as modifying the buffer, it is not possible to remove a read-only property unless you know the special trick: bind inhibit-read-only to a non-nil value and then remove the property. See section Read-Only Buffers.

invisible

A non-nil invisible property can make a character invisible on the screen. See section Invisible Text, for details.

intangible

If a group of consecutive characters have equal and non-nil intangible properties, then you cannot place point between them. If you try to move point forward into the group, point actually moves to the end of the group. If you try to move point backward into the group, point actually moves to the start of the group.

If consecutive characters have unequal non-nil intangible properties, they belong to separate groups; each group is separately treated as described above.

When the variable inhibit-point-motion-hooks is non-nil, the intangible property is ignored.

Beware: this property operates at a very low level, and affects a lot of code in unexpected ways. So use it with extreme caution. A common misuse is to put an intangible property on invisible text, which is actually unnecessary since the command loop will move point outside of the invisible text at the end of each command anyway. See section Adjusting Point After Commands.

field

Consecutive characters with the same field property constitute a field. Some motion functions including forward-word and beginning-of-line stop moving at a field boundary. See section Defining and Using Fields.

cursor

Normally, the cursor is displayed at the beginning or the end of any overlay and text property strings present at the current buffer position. You can place the cursor on any desired character of these strings by giving that character a non-nil cursor text property. In addition, if the value of the cursor property is an integer, it specifies the number of buffer’s character positions, starting with the position where the overlay or the display property begins, for which the cursor should be displayed on that character. Specifically, if the value of the cursor property of a character is the number n, the cursor will be displayed on this character for any buffer position in the range [ovpos..ovpos+n), where ovpos is the overlay’s starting position given by overlay-start (see section Managing Overlays), or the position where the display text property begins in the buffer.

In other words, the string character with the cursor property of any non-nil value is the character where to display the cursor. The value of the property says for which buffer positions to display the cursor there. If the value is an integer n, the cursor is displayed there when point is anywhere between the beginning of the overlay or display property and n positions after that. If the value is anything else and non-nil, the cursor is displayed there only when point is at the beginning of the display property or at overlay-start.

When the buffer has many overlay strings (e.g., see section before-string) or display properties that are strings, it is a good idea to use the cursor property on these strings to cue the Emacs display about the places where to put the cursor while traversing these strings. This directly communicates to the display engine where the Lisp program wants to put the cursor, or where the user would expect the cursor.

pointer

This specifies a specific pointer shape when the mouse pointer is over this text or image. See section Pointer Shape, for possible pointer shapes.

line-spacing

A newline can have a line-spacing text or overlay property that controls the height of the display line ending with that newline. The property value overrides the default frame line spacing and the buffer local line-spacing variable. See section Line Height.

line-height

A newline can have a line-height text or overlay property that controls the total height of the display line ending in that newline. See section Line Height.

wrap-prefix

If text has a wrap-prefix property, the prefix it defines will be added at display time to the beginning of every continuation line due to text wrapping (so if lines are truncated, the wrap-prefix is never used). It may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the :width or :align-to display properties (see section Specified Spaces).

A wrap-prefix may also be specified for an entire buffer using the wrap-prefix buffer-local variable (however, a wrap-prefix text-property takes precedence over the value of the wrap-prefix variable). See section Truncation.

line-prefix

If text has a line-prefix property, the prefix it defines will be added at display time to the beginning of every non-continuation line. It may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the :width or :align-to display properties (see section Specified Spaces).

A line-prefix may also be specified for an entire buffer using the line-prefix buffer-local variable (however, a line-prefix text-property takes precedence over the value of the line-prefix variable). See section Truncation.

modification-hooks

If a character has the property modification-hooks, then its value should be a list of functions; modifying that character calls all of those functions before the actual modification. Each function receives two arguments: the beginning and end of the part of the buffer being modified. Note that if a particular modification hook function appears on several characters being modified by a single primitive, you can’t predict how many times the function will be called. Furthermore, insertion will not modify any existing character, so this hook will only be run when removing some characters, replacing them with others, or changing their text-properties.

If these functions modify the buffer, they should bind inhibit-modification-hooks to t around doing so, to avoid confusing the internal mechanism that calls these hooks.

Overlays also support the modification-hooks property, but the details are somewhat different (see section Overlay Properties).

insert-in-front-hooks
insert-behind-hooks

The operation of inserting text in a buffer also calls the functions listed in the insert-in-front-hooks property of the following character and in the insert-behind-hooks property of the preceding character. These functions receive two arguments, the beginning and end of the inserted text. The functions are called after the actual insertion takes place.

See also Change Hooks, for other hooks that are called when you change text in a buffer.

point-entered
point-left

The special properties point-entered and point-left record hook functions that report motion of point. Each time point moves, Emacs compares these two property values:

If these two values differ, each of them is called (if not nil) with two arguments: the old value of point, and the new one.

The same comparison is made for the characters before the old and new locations. The result may be to execute two point-left functions (which may be the same function) and/or two point-entered functions (which may be the same function). In any case, all the point-left functions are called first, followed by all the point-entered functions.

It is possible to use char-after to examine characters at various buffer positions without moving point to those positions. Only an actual change in the value of point runs these hook functions.

The variable inhibit-point-motion-hooks can inhibit running the point-left and point-entered hooks, see Inhibit point motion hooks.

composition

This text property is used to display a sequence of characters as a single glyph composed from components. But the value of the property itself is completely internal to Emacs and should not be manipulated directly by, for instance, put-text-property.

Variable: inhibit-point-motion-hooks

When this variable is non-nil, point-left and point-entered hooks are not run, and the intangible property has no effect. Do not set this variable globally; bind it with let.

Variable: show-help-function

If this variable is non-nil, it specifies a function called to display help strings. These may be help-echo properties, menu help strings (see section Simple Menu Items, see section Extended Menu Items), or tool bar help strings (see section Tool bars). The specified function is called with one argument, the help string to display. Tooltip mode (see Tooltips in The GNU Emacs Manual) provides an example.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.5 Formatted Text Properties

These text properties affect the behavior of the fill commands. They are used for representing formatted text. See section Filling, and Margins for Filling.

hard

If a newline character has this property, it is a “hard” newline. The fill commands do not alter hard newlines and do not move words across them. However, this property takes effect only if the use-hard-newlines minor mode is enabled. See Hard and Soft Newlines in The GNU Emacs Manual.

right-margin

This property specifies an extra right margin for filling this part of the text.

left-margin

This property specifies an extra left margin for filling this part of the text.

justification

This property specifies the style of justification for filling this part of the text.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.6 Stickiness of Text Properties

Self-inserting characters normally take on the same properties as the preceding character. This is called inheritance of properties.

A Lisp program can do insertion with inheritance or without, depending on the choice of insertion primitive. The ordinary text insertion functions, such as insert, do not inherit any properties. They insert text with precisely the properties of the string being inserted, and no others. This is correct for programs that copy text from one context to another—for example, into or out of the kill ring. To insert with inheritance, use the special primitives described in this section. Self-inserting characters inherit properties because they work using these primitives.

When you do insertion with inheritance, which properties are inherited, and from where, depends on which properties are sticky. Insertion after a character inherits those of its properties that are rear-sticky. Insertion before a character inherits those of its properties that are front-sticky. When both sides offer different sticky values for the same property, the previous character’s value takes precedence.

By default, a text property is rear-sticky but not front-sticky; thus, the default is to inherit all the properties of the preceding character, and nothing from the following character.

You can control the stickiness of various text properties with two specific text properties, front-sticky and rear-nonsticky, and with the variable text-property-default-nonsticky. You can use the variable to specify a different default for a given property. You can use those two text properties to make any specific properties sticky or nonsticky in any particular part of the text.

If a character’s front-sticky property is t, then all its properties are front-sticky. If the front-sticky property is a list, then the sticky properties of the character are those whose names are in the list. For example, if a character has a front-sticky property whose value is (face read-only), then insertion before the character can inherit its face property and its read-only property, but no others.

The rear-nonsticky property works the opposite way. Most properties are rear-sticky by default, so the rear-nonsticky property says which properties are not rear-sticky. If a character’s rear-nonsticky property is t, then none of its properties are rear-sticky. If the rear-nonsticky property is a list, properties are rear-sticky unless their names are in the list.

Variable: text-property-default-nonsticky

This variable holds an alist which defines the default rear-stickiness of various text properties. Each element has the form (property . nonstickiness), and it defines the stickiness of a particular text property, property.

If nonstickiness is non-nil, this means that the property property is rear-nonsticky by default. Since all properties are front-nonsticky by default, this makes property nonsticky in both directions by default.

The text properties front-sticky and rear-nonsticky, when used, take precedence over the default nonstickiness specified in text-property-default-nonsticky.

Here are the functions that insert text with inheritance of properties:

Function: insert-and-inherit &rest strings

Insert the strings strings, just like the function insert, but inherit any sticky properties from the adjoining text.

Function: insert-before-markers-and-inherit &rest strings

Insert the strings strings, just like the function insert-before-markers, but inherit any sticky properties from the adjoining text.

See section Inserting Text, for the ordinary insertion functions which do not inherit.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.7 Lazy Computation of Text Properties

Instead of computing text properties for all the text in the buffer, you can arrange to compute the text properties for parts of the text when and if something depends on them.

The primitive that extracts text from the buffer along with its properties is buffer-substring. Before examining the properties, this function runs the abnormal hook buffer-access-fontify-functions.

Variable: buffer-access-fontify-functions

This variable holds a list of functions for computing text properties. Before buffer-substring copies the text and text properties for a portion of the buffer, it calls all the functions in this list. Each of the functions receives two arguments that specify the range of the buffer being accessed. (The buffer itself is always the current buffer.)

The function buffer-substring-no-properties does not call these functions, since it ignores text properties anyway.

In order to prevent the hook functions from being called more than once for the same part of the buffer, you can use the variable buffer-access-fontified-property.

Variable: buffer-access-fontified-property

If this variable’s value is non-nil, it is a symbol which is used as a text property name. A non-nil value for that text property means, “the other text properties for this character have already been computed”.

If all the characters in the range specified for buffer-substring have a non-nil value for this property, buffer-substring does not call the buffer-access-fontify-functions functions. It assumes these characters already have the right text properties, and just copies the properties they already have.

The normal way to use this feature is that the buffer-access-fontify-functions functions add this property, as well as others, to the characters they operate on. That way, they avoid being called over and over for the same text.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.8 Defining Clickable Text

Clickable text is text that can be clicked, with either the mouse or via a keyboard command, to produce some result. Many major modes use clickable text to implement textual hyper-links, or links for short.

The easiest way to insert and manipulate links is to use the button package. See section Buttons. In this section, we will explain how to manually set up clickable text in a buffer, using text properties. For simplicity, we will refer to the clickable text as a link.

Implementing a link involves three separate steps: (1) indicating clickability when the mouse moves over the link; (2) making RET or Mouse-2 on that link do something; and (3) setting up a follow-link condition so that the link obeys mouse-1-click-follows-link.

To indicate clickability, add the mouse-face text property to the text of the link; then Emacs will highlight the link when the mouse moves over it. In addition, you should define a tooltip or echo area message, using the help-echo text property. See section Properties with Special Meanings. For instance, here is how Dired indicates that file names are clickable:

 (if (dired-move-to-filename)
     (add-text-properties
       (point)
       (save-excursion
         (dired-move-to-end-of-filename)
         (point))
       '(mouse-face highlight
         help-echo "mouse-2: visit this file in other window")))

To make the link clickable, bind RET and Mouse-2 to commands that perform the desired action. Each command should check to see whether it was called on a link, and act accordingly. For instance, Dired’s major mode keymap binds Mouse-2 to the following command:

(defun dired-mouse-find-file-other-window (event)
  "In Dired, visit the file or directory name you click on."
  (interactive "e")
  (let ((window (posn-window (event-end event)))
        (pos (posn-point (event-end event)))
        file)
    (if (not (windowp window))
        (error "No file chosen"))
    (with-current-buffer (window-buffer window)
      (goto-char pos)
      (setq file (dired-get-file-for-visit)))
    (if (file-directory-p file)
        (or (and (cdr dired-subdir-alist)
                 (dired-goto-subdir file))
            (progn
              (select-window window)
              (dired-other-window file)))
      (select-window window)
      (find-file-other-window (file-name-sans-versions file t)))))

This command uses the functions posn-window and posn-point to determine where the click occurred, and dired-get-file-for-visit to determine which file to visit.

Instead of binding the mouse command in a major mode keymap, you can bind it within the link text, using the keymap text property (see section Properties with Special Meanings). For instance:

(let ((map (make-sparse-keymap)))
  (define-key map [mouse-2] 'operate-this-button)
  (put-text-property link-start link-end 'keymap map))

With this method, you can easily define different commands for different links. Furthermore, the global definition of RET and Mouse-2 remain available for the rest of the text in the buffer.

The basic Emacs command for clicking on links is Mouse-2. However, for compatibility with other graphical applications, Emacs also recognizes Mouse-1 clicks on links, provided the user clicks on the link quickly without moving the mouse. This behavior is controlled by the user option mouse-1-click-follows-link. See Mouse References in The GNU Emacs Manual.

To set up the link so that it obeys mouse-1-click-follows-link, you must either (1) apply a follow-link text or overlay property to the link text, or (2) bind the follow-link event to a keymap (which can be a major mode keymap or a local keymap specified via the keymap text property). The value of the follow-link property, or the binding for the follow-link event, acts as a “condition” for the link action. This condition tells Emacs two things: the circumstances under which a Mouse-1 click should be regarded as occurring “inside” the link, and how to compute an “action code” that says what to translate the Mouse-1 click into. The link action condition can be one of the following:

mouse-face

If the condition is the symbol mouse-face, a position is inside a link if there is a non-nil mouse-face property at that position. The action code is always t.

For example, here is how Info mode handles Mouse-1:

(define-key Info-mode-map [follow-link] 'mouse-face)
a function

If the condition is a function, func, then a position pos is inside a link if (func pos) evaluates to non-nil. The value returned by func serves as the action code.

For example, here is how pcvs enables Mouse-1 to follow links on file names only:

(define-key map [follow-link]
  (lambda (pos)
    (eq (get-char-property pos 'face) 'cvs-filename-face)))
anything else

If the condition value is anything else, then the position is inside a link and the condition itself is the action code. Clearly, you should specify this kind of condition only when applying the condition via a text or property overlay on the link text (so that it does not apply to the entire buffer).

The action code tells Mouse-1 how to follow the link:

a string or vector

If the action code is a string or vector, the Mouse-1 event is translated into the first element of the string or vector; i.e., the action of the Mouse-1 click is the local or global binding of that character or symbol. Thus, if the action code is "foo", Mouse-1 translates into f. If it is [foo], Mouse-1 translates into foo.

anything else

For any other non-nil action code, the Mouse-1 event is translated into a Mouse-2 event at the same position.

To define Mouse-1 to activate a button defined with define-button-type, give the button a follow-link property. The property value should be a link action condition, as described above. See section Buttons. For example, here is how Help mode handles Mouse-1:

(define-button-type 'help-xref
  'follow-link t
  'action #'help-button-action)

To define Mouse-1 on a widget defined with define-widget, give the widget a :follow-link property. The property value should be a link action condition, as described above. For example, here is how the link widget specifies that a Mouse-1 click shall be translated to RET:

(define-widget 'link 'item
  "An embedded link."
  :button-prefix 'widget-link-prefix
  :button-suffix 'widget-link-suffix
  :follow-link "\C-m"
  :help-echo "Follow the link."
  :format "%[%t%]")
Function: mouse-on-link-p pos

This function returns non-nil if position pos in the current buffer is on a link. pos can also be a mouse event location, as returned by event-start (see section Accessing Mouse Events).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.9 Defining and Using Fields

A field is a range of consecutive characters in the buffer that are identified by having the same value (comparing with eq) of the field property (either a text-property or an overlay property). This section describes special functions that are available for operating on fields.

You specify a field with a buffer position, pos. We think of each field as containing a range of buffer positions, so the position you specify stands for the field containing that position.

When the characters before and after pos are part of the same field, there is no doubt which field contains pos: the one those characters both belong to. When pos is at a boundary between fields, which field it belongs to depends on the stickiness of the field properties of the two surrounding characters (see section Stickiness of Text Properties). The field whose property would be inherited by text inserted at pos is the field that contains pos.

There is an anomalous case where newly inserted text at pos would not inherit the field property from either side. This happens if the previous character’s field property is not rear-sticky, and the following character’s field property is not front-sticky. In this case, pos belongs to neither the preceding field nor the following field; the field functions treat it as belonging to an empty field whose beginning and end are both at pos.

In all of these functions, if pos is omitted or nil, the value of point is used by default. If narrowing is in effect, then pos should fall within the accessible portion. See section Narrowing.

Function: field-beginning &optional pos escape-from-edge limit

This function returns the beginning of the field specified by pos.

If pos is at the beginning of its field, and escape-from-edge is non-nil, then the return value is always the beginning of the preceding field that ends at pos, regardless of the stickiness of the field properties around pos.

If limit is non-nil, it is a buffer position; if the beginning of the field is before limit, then limit will be returned instead.

Function: field-end &optional pos escape-from-edge limit

This function returns the end of the field specified by pos.

If pos is at the end of its field, and escape-from-edge is non-nil, then the return value is always the end of the following field that begins at pos, regardless of the stickiness of the field properties around pos.

If limit is non-nil, it is a buffer position; if the end of the field is after limit, then limit will be returned instead.

Function: field-string &optional pos

This function returns the contents of the field specified by pos, as a string.

Function: field-string-no-properties &optional pos

This function returns the contents of the field specified by pos, as a string, discarding text properties.

Function: delete-field &optional pos

This function deletes the text of the field specified by pos.

Function: constrain-to-field new-pos old-pos &optional escape-from-edge only-in-line inhibit-capture-property

This function “constrains” new-pos to the field that old-pos belongs to—in other words, it returns the position closest to new-pos that is in the same field as old-pos.

If new-pos is nil, then constrain-to-field uses the value of point instead, and moves point to the resulting position in addition to returning that position.

If old-pos is at the boundary of two fields, then the acceptable final positions depend on the argument escape-from-edge. If escape-from-edge is nil, then new-pos must be in the field whose field property equals what new characters inserted at old-pos would inherit. (This depends on the stickiness of the field property for the characters before and after old-pos.) If escape-from-edge is non-nil, new-pos can be anywhere in the two adjacent fields. Additionally, if two fields are separated by another field with the special value boundary, then any point within this special field is also considered to be “on the boundary”.

Commands like C-a with no argument, that normally move backward to a specific kind of location and stay there once there, probably should specify nil for escape-from-edge. Other motion commands that check fields should probably pass t.

If the optional argument only-in-line is non-nil, and constraining new-pos in the usual way would move it to a different line, new-pos is returned unconstrained. This used in commands that move by line, such as next-line and beginning-of-line, so that they respect field boundaries only in the case where they can still move to the right line.

If the optional argument inhibit-capture-property is non-nil, and old-pos has a non-nil property of that name, then any field boundaries are ignored.

You can cause constrain-to-field to ignore all field boundaries (and so never constrain anything) by binding the variable inhibit-field-text-motion to a non-nil value.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.19.10 Why Text Properties are not Intervals

Some editors that support adding attributes to text in the buffer do so by letting the user specify “intervals” within the text, and adding the properties to the intervals. Those editors permit the user or the programmer to determine where individual intervals start and end. We deliberately provided a different sort of interface in Emacs Lisp to avoid certain paradoxical behavior associated with text modification.

If the actual subdivision into intervals is meaningful, that means you can distinguish between a buffer that is just one interval with a certain property, and a buffer containing the same text subdivided into two intervals, both of which have that property.

Suppose you take the buffer with just one interval and kill part of the text. The text remaining in the buffer is one interval, and the copy in the kill ring (and the undo list) becomes a separate interval. Then if you yank back the killed text, you get two intervals with the same properties. Thus, editing does not preserve the distinction between one interval and two.

Suppose we “fix” this problem by coalescing the two intervals when the text is inserted. That works fine if the buffer originally was a single interval. But suppose instead that we have two adjacent intervals with the same properties, and we kill the text of one interval and yank it back. The same interval-coalescence feature that rescues the other case causes trouble in this one: after yanking, we have just one interval. Once again, editing does not preserve the distinction between one interval and two.

Insertion of text at the border between intervals also raises questions that have no satisfactory answer.

However, it is easy to arrange for editing to behave consistently for questions of the form, “What are the properties of text at this buffer or string position?” So we have decided these are the only questions that make sense; we have not implemented asking questions about where intervals start or end.

In practice, you can usually use the text property search functions in place of explicit interval boundaries. You can think of them as finding the boundaries of intervals, assuming that intervals are always coalesced whenever possible. See section Text Property Search Functions.

Emacs also provides explicit intervals as a presentation feature; see Overlays.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.20 Substituting for a Character Code

The following functions replace characters within a specified region based on their character codes.

Function: subst-char-in-region start end old-char new-char &optional noundo

This function replaces all occurrences of the character old-char with the character new-char in the region of the current buffer defined by start and end.

If noundo is non-nil, then subst-char-in-region does not record the change for undo and does not mark the buffer as modified. This was useful for controlling the old selective display feature (see section Selective Display).

subst-char-in-region does not move point and returns nil.

---------- Buffer: foo ----------
This is the contents of the buffer before.
---------- Buffer: foo ----------

(subst-char-in-region 1 20 ?i ?X)
     ⇒ nil

---------- Buffer: foo ----------
ThXs Xs the contents of the buffer before.
---------- Buffer: foo ----------
Command: translate-region start end table

This function applies a translation table to the characters in the buffer between positions start and end.

The translation table table is a string or a char-table; (aref table ochar) gives the translated character corresponding to ochar. If table is a string, any characters with codes larger than the length of table are not altered by the translation.

The return value of translate-region is the number of characters that were actually changed by the translation. This does not count characters that were mapped into themselves in the translation table.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.21 Registers

A register is a sort of variable used in Emacs editing that can hold a variety of different kinds of values. Each register is named by a single character. All ASCII characters and their meta variants (but with the exception of C-g) can be used to name registers. Thus, there are 255 possible registers. A register is designated in Emacs Lisp by the character that is its name.

Variable: register-alist

This variable is an alist of elements of the form (name . contents). Normally, there is one element for each Emacs register that has been used.

The object name is a character (an integer) identifying the register.

The contents of a register can have several possible types:

a number

A number stands for itself. If insert-register finds a number in the register, it converts the number to decimal.

a marker

A marker represents a buffer position to jump to.

a string

A string is text saved in the register.

a rectangle

A rectangle is represented by a list of strings.

(window-configuration position)

This represents a window configuration to restore in one frame, and a position to jump to in the current buffer.

(frame-configuration position)

This represents a frame configuration to restore, and a position to jump to in the current buffer.

(file filename)

This represents a file to visit; jumping to this value visits file filename.

(file-query filename position)

This represents a file to visit and a position in it; jumping to this value visits file filename and goes to buffer position position. Restoring this type of position asks the user for confirmation first.

The functions in this section return unpredictable values unless otherwise stated.

Function: get-register reg

This function returns the contents of the register reg, or nil if it has no contents.

Function: set-register reg value

This function sets the contents of register reg to value. A register can be set to any value, but the other register functions expect only certain data types. The return value is value.

Command: view-register reg

This command displays what is contained in register reg.

Command: insert-register reg &optional beforep

This command inserts contents of register reg into the current buffer.

Normally, this command puts point before the inserted text, and the mark after it. However, if the optional second argument beforep is non-nil, it puts the mark before and point after. You can pass a non-nil second argument beforep to this function interactively by supplying any prefix argument.

If the register contains a rectangle, then the rectangle is inserted with its upper left corner at point. This means that text is inserted in the current line and underneath it on successive lines.

If the register contains something other than saved text (a string) or a rectangle (a list), currently useless things happen. This may be changed in the future.

Function: register-read-with-preview prompt

This function reads and returns a register name, prompting with prompt and possibly showing a preview of the existing registers and their contents. The preview is shown in a temporary window, after the delay specified by the user option register-preview-delay, if its value and register-alist are both non-nil. The preview is also shown if the user requests help (e.g., by typing the help character). We recommend that all interactive commands which read register names use this function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.22 Transposition of Text

This function can be used to transpose stretches of text:

Function: transpose-regions start1 end1 start2 end2 &optional leave-markers

This function exchanges two nonoverlapping portions of the buffer. Arguments start1 and end1 specify the bounds of one portion and arguments start2 and end2 specify the bounds of the other portion.

Normally, transpose-regions relocates markers with the transposed text; a marker previously positioned within one of the two transposed portions moves along with that portion, thus remaining between the same two characters in their new position. However, if leave-markers is non-nil, transpose-regions does not do this—it leaves all markers unrelocated.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.23 Dealing With Compressed Data

When auto-compression-mode is enabled, Emacs automatically uncompresses compressed files when you visit them, and automatically recompresses them if you alter and save them. See Compressed Files in The GNU Emacs Manual.

The above feature works by calling an external executable (e.g., gzip). Emacs can also be compiled with support for built-in decompression using the zlib library, which is faster than calling an external program.

Function: zlib-available-p

This function returns non-nil if built-in zlib decompression is available.

Function: zlib-decompress-region start end

This function decompresses the region between start and end, using built-in zlib decompression. The region should contain data that were compressed with gzip or zlib. On success, the function replaces the contents of the region with the decompressed data. On failure, the function leaves the region unchanged and returns nil. This function can be called only in unibyte buffers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.24 Base 64 Encoding

Base 64 code is used in email to encode a sequence of 8-bit bytes as a longer sequence of ASCII graphic characters. It is defined in Internet RFC142045. This section describes the functions for converting to and from this code.

Command: base64-encode-region beg end &optional no-line-break

This function converts the region from beg to end into base 64 code. It returns the length of the encoded text. An error is signaled if a character in the region is multibyte, i.e., in a multibyte buffer the region must contain only characters from the charsets ascii, eight-bit-control and eight-bit-graphic.

Normally, this function inserts newline characters into the encoded text, to avoid overlong lines. However, if the optional argument no-line-break is non-nil, these newlines are not added, so the output is just one long line.

Function: base64-encode-string string &optional no-line-break

This function converts the string string into base 64 code. It returns a string containing the encoded text. As for base64-encode-region, an error is signaled if a character in the string is multibyte.

Normally, this function inserts newline characters into the encoded text, to avoid overlong lines. However, if the optional argument no-line-break is non-nil, these newlines are not added, so the result string is just one long line.

Command: base64-decode-region beg end

This function converts the region from beg to end from base 64 code into the corresponding decoded text. It returns the length of the decoded text.

The decoding functions ignore newline characters in the encoded text.

Function: base64-decode-string string

This function converts the string string from base 64 code into the corresponding decoded text. It returns a unibyte string containing the decoded text.

The decoding functions ignore newline characters in the encoded text.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.25 Checksum/Hash

Emacs has built-in support for computing cryptographic hashes. A cryptographic hash, or checksum, is a digital “fingerprint” of a piece of data (e.g., a block of text) which can be used to check that you have an unaltered copy of that data.

Emacs supports several common cryptographic hash algorithms: MD5, SHA-1, SHA-2, SHA-224, SHA-256, SHA-384 and SHA-512. MD5 is the oldest of these algorithms, and is commonly used in message digests to check the integrity of messages transmitted over a network. MD5 is not “collision resistant” (i.e., it is possible to deliberately design different pieces of data which have the same MD5 hash), so you should not used it for anything security-related. A similar theoretical weakness also exists in SHA-1. Therefore, for security-related applications you should use the other hash types, such as SHA-2.

Function: secure-hash algorithm object &optional start end binary

This function returns a hash for object. The argument algorithm is a symbol stating which hash to compute: one of md5, sha1, sha224, sha256, sha384 or sha512. The argument object should be a buffer or a string.

The optional arguments start and end are character positions specifying the portion of object to compute the message digest for. If they are nil or omitted, the hash is computed for the whole of object.

If the argument binary is omitted or nil, the function returns the text form of the hash, as an ordinary Lisp string. If binary is non-nil, it returns the hash in binary form, as a sequence of bytes stored in a unibyte string.

This function does not compute the hash directly from the internal representation of object’s text (see section Text Representations). Instead, it encodes the text using a coding system (see section Coding Systems), and computes the hash from that encoded text. If object is a buffer, the coding system used is the one which would be chosen by default for writing the text into a file. If object is a string, the user’s preferred coding system is used (see Recognize Coding in GNU Emacs Manual).

Function: md5 object &optional start end coding-system noerror

This function returns an MD5 hash. It is semi-obsolete, since for most purposes it is equivalent to calling secure-hash with md5 as the algorithm argument. The object, start and end arguments have the same meanings as in secure-hash.

If coding-system is non-nil, it specifies a coding system to use to encode the text; if omitted or nil, the default coding system is used, like in secure-hash.

Normally, md5 signals an error if the text can’t be encoded using the specified or chosen coding system. However, if noerror is non-nil, it silently uses raw-text coding instead.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.26 Parsing HTML and XML

When Emacs is compiled with libxml2 support, the following functions are available to parse HTML or XML text into Lisp object trees.

Function: libxml-parse-html-region start end &optional base-url

This function parses the text between start and end as HTML, and returns a list representing the HTML parse tree. It attempts to handle “real world” HTML by robustly coping with syntax mistakes.

The optional argument base-url, if non-nil, should be a string specifying the base URL for relative URLs occurring in links.

In the parse tree, each HTML node is represented by a list in which the first element is a symbol representing the node name, the second element is an alist of node attributes, and the remaining elements are the subnodes.

The following example demonstrates this. Given this (malformed) HTML document:

<html><head></head><body width=101><div class=thing>Foo<div>Yes

A call to libxml-parse-html-region returns this:

(html ()
  (head ())
  (body ((width . "101"))
   (div ((class . "thing"))
    "Foo"
    (div ()
      "Yes"))))
Function: shr-insert-document dom

This function renders the parsed HTML in dom into the current buffer. The argument dom should be a list as generated by libxml-parse-html-region. This function is, e.g., used by EWW in The Emacs Web Wowser Manual.

Function: libxml-parse-xml-region start end &optional base-url

This function is the same as libxml-parse-html-region, except that it parses the text as XML rather than HTML (so it is stricter about syntax).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.27 Atomic Change Groups

In database terminology, an atomic change is an indivisible change—it can succeed entirely or it can fail entirely, but it cannot partly succeed. A Lisp program can make a series of changes to one or several buffers as an atomic change group, meaning that either the entire series of changes will be installed in their buffers or, in case of an error, none of them will be.

To do this for one buffer, the one already current, simply write a call to atomic-change-group around the code that makes the changes, like this:

(atomic-change-group
  (insert foo)
  (delete-region x y))

If an error (or other nonlocal exit) occurs inside the body of atomic-change-group, it unmakes all the changes in that buffer that were during the execution of the body. This kind of change group has no effect on any other buffers—any such changes remain.

If you need something more sophisticated, such as to make changes in various buffers constitute one atomic group, you must directly call lower-level functions that atomic-change-group uses.

Function: prepare-change-group &optional buffer

This function sets up a change group for buffer buffer, which defaults to the current buffer. It returns a “handle” that represents the change group. You must use this handle to activate the change group and subsequently to finish it.

To use the change group, you must activate it. You must do this before making any changes in the text of buffer.

Function: activate-change-group handle

This function activates the change group that handle designates.

After you activate the change group, any changes you make in that buffer become part of it. Once you have made all the desired changes in the buffer, you must finish the change group. There are two ways to do this: you can either accept (and finalize) all the changes, or cancel them all.

Function: accept-change-group handle

This function accepts all the changes in the change group specified by handle, making them final.

Function: cancel-change-group handle

This function cancels and undoes all the changes in the change group specified by handle.

Your code should use unwind-protect to make sure the group is always finished. The call to activate-change-group should be inside the unwind-protect, in case the user types C-g just after it runs. (This is one reason why prepare-change-group and activate-change-group are separate functions, because normally you would call prepare-change-group before the start of that unwind-protect.) Once you finish the group, don’t use the handle again—in particular, don’t try to finish the same group twice.

To make a multibuffer change group, call prepare-change-group once for each buffer you want to cover, then use nconc to combine the returned values, like this:

(nconc (prepare-change-group buffer-1)
       (prepare-change-group buffer-2))

You can then activate the multibuffer change group with a single call to activate-change-group, and finish it with a single call to accept-change-group or cancel-change-group.

Nested use of several change groups for the same buffer works as you would expect. Non-nested use of change groups for the same buffer will get Emacs confused, so don’t let it happen; the first change group you start for any given buffer should be the last one finished.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

31.28 Change Hooks

These hook variables let you arrange to take notice of all changes in all buffers (or in a particular buffer, if you make them buffer-local). See also Properties with Special Meanings, for how to detect changes to specific parts of the text.

The functions you use in these hooks should save and restore the match data if they do anything that uses regular expressions; otherwise, they will interfere in bizarre ways with the editing operations that call them.

Variable: before-change-functions

This variable holds a list of functions to call before any buffer modification. Each function gets two arguments, the beginning and end of the region that is about to change, represented as integers. The buffer that is about to change is always the current buffer.

Variable: after-change-functions

This variable holds a list of functions to call after any buffer modification. Each function receives three arguments: the beginning and end of the region just changed, and the length of the text that existed before the change. All three arguments are integers. The buffer that has been changed is always the current buffer.

The length of the old text is the difference between the buffer positions before and after that text as it was before the change. As for the changed text, its length is simply the difference between the first two arguments.

Output of messages into the *Messages* buffer does not call these functions.

Macro: combine-after-change-calls body…

The macro executes body normally, but arranges to call the after-change functions just once for a series of several changes—if that seems safe.

If a program makes several text changes in the same area of the buffer, using the macro combine-after-change-calls around that part of the program can make it run considerably faster when after-change hooks are in use. When the after-change hooks are ultimately called, the arguments specify a portion of the buffer including all of the changes made within the combine-after-change-calls body.

Warning: You must not alter the values of after-change-functions within the body of a combine-after-change-calls form.

Warning: if the changes you combine occur in widely scattered parts of the buffer, this will still work, but it is not advisable, because it may lead to inefficient behavior for some change hook functions.

Variable: first-change-hook

This variable is a normal hook that is run whenever a buffer is changed that was previously in the unmodified state.

Variable: inhibit-modification-hooks

If this variable is non-nil, all of the change hooks are disabled; none of them run. This affects all the hook variables described above in this section, as well as the hooks attached to certain special text properties (see section Properties with Special Meanings) and overlay properties (see section Overlay Properties).

Also, this variable is bound to non-nil while running those same hook variables, so that by default modifying the buffer from a modification hook does not cause other modification hooks to be run. If you do want modification hooks to be run in a particular piece of code that is itself run from a modification hook, then rebind locally inhibit-modification-hooks to nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32 Non-ASCII Characters

This chapter covers the special issues relating to characters and how they are stored in strings and buffers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.1 Text Representations

Emacs buffers and strings support a large repertoire of characters from many different scripts, allowing users to type and display text in almost any known written language.

To support this multitude of characters and scripts, Emacs closely follows the Unicode Standard. The Unicode Standard assigns a unique number, called a codepoint, to each and every character. The range of codepoints defined by Unicode, or the Unicode codespace, is 0..#x10FFFF (in hexadecimal notation), inclusive. Emacs extends this range with codepoints in the range #x110000..#x3FFFFF, which it uses for representing characters that are not unified with Unicode and raw 8-bit bytes that cannot be interpreted as characters. Thus, a character codepoint in Emacs is a 22-bit integer.

To conserve memory, Emacs does not hold fixed-length 22-bit numbers that are codepoints of text characters within buffers and strings. Rather, Emacs uses a variable-length internal representation of characters, that stores each character as a sequence of 1 to 5 8-bit bytes, depending on the magnitude of its codepoint15. For example, any ASCII character takes up only 1 byte, a Latin-1 character takes up 2 bytes, etc. We call this representation of text multibyte.

Outside Emacs, characters can be represented in many different encodings, such as ISO-8859-1, GB-2312, Big-5, etc. Emacs converts between these external encodings and its internal representation, as appropriate, when it reads text into a buffer or a string, or when it writes text to a disk file or passes it to some other process.

Occasionally, Emacs needs to hold and manipulate encoded text or binary non-text data in its buffers or strings. For example, when Emacs visits a file, it first reads the file’s text verbatim into a buffer, and only then converts it to the internal representation. Before the conversion, the buffer holds encoded text.

Encoded text is not really text, as far as Emacs is concerned, but rather a sequence of raw 8-bit bytes. We call buffers and strings that hold encoded text unibyte buffers and strings, because Emacs treats them as a sequence of individual bytes. Usually, Emacs displays unibyte buffers and strings as octal codes such as \237. We recommend that you never use unibyte buffers and strings except for manipulating encoded text or binary non-text data.

In a buffer, the buffer-local value of the variable enable-multibyte-characters specifies the representation used. The representation for a string is determined and recorded in the string when the string is constructed.

Variable: enable-multibyte-characters

This variable specifies the current buffer’s text representation. If it is non-nil, the buffer contains multibyte text; otherwise, it contains unibyte encoded text or binary non-text data.

You cannot set this variable directly; instead, use the function set-buffer-multibyte to change a buffer’s representation.

Function: position-bytes position

Buffer positions are measured in character units. This function returns the byte-position corresponding to buffer position position in the current buffer. This is 1 at the start of the buffer, and counts upward in bytes. If position is out of range, the value is nil.

Function: byte-to-position byte-position

Return the buffer position, in character units, corresponding to given byte-position in the current buffer. If byte-position is out of range, the value is nil. In a multibyte buffer, an arbitrary value of byte-position can be not at character boundary, but inside a multibyte sequence representing a single character; in this case, this function returns the buffer position of the character whose multibyte sequence includes byte-position. In other words, the value does not change for all byte positions that belong to the same character.

Function: multibyte-string-p string

Return t if string is a multibyte string, nil otherwise. This function also returns nil if string is some object other than a string.

Function: string-bytes string

This function returns the number of bytes in string. If string is a multibyte string, this can be greater than (length string).

Function: unibyte-string &rest bytes

This function concatenates all its argument bytes and makes the result a unibyte string.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.2 Disabling Multibyte Characters

By default, Emacs starts in multibyte mode: it stores the contents of buffers and strings using an internal encoding that represents non-ASCII characters using multi-byte sequences. Multibyte mode allows you to use all the supported languages and scripts without limitations.

Under very special circumstances, you may want to disable multibyte character support, for a specific buffer. When multibyte characters are disabled in a buffer, we call that unibyte mode. In unibyte mode, each character in the buffer has a character code ranging from 0 through 255 (0377 octal); 0 through 127 (0177 octal) represent ASCII characters, and 128 (0200 octal) through 255 (0377 octal) represent non-ASCII characters.

To edit a particular file in unibyte representation, visit it using find-file-literally. See section Functions for Visiting Files. You can convert a multibyte buffer to unibyte by saving it to a file, killing the buffer, and visiting the file again with find-file-literally. Alternatively, you can use C-x RET c (universal-coding-system-argument) and specify ‘raw-text’ as the coding system with which to visit or save a file. See Specifying a Coding System for File Text in GNU Emacs Manual. Unlike find-file-literally, finding a file as ‘raw-text’ doesn’t disable format conversion, uncompression, or auto mode selection.

The buffer-local variable enable-multibyte-characters is non-nil in multibyte buffers, and nil in unibyte ones. The mode line also indicates whether a buffer is multibyte or not. With a graphical display, in a multibyte buffer, the portion of the mode line that indicates the character set has a tooltip that (amongst other things) says that the buffer is multibyte. In a unibyte buffer, the character set indicator is absent. Thus, in a unibyte buffer (when using a graphical display) there is normally nothing before the indication of the visited file’s end-of-line convention (colon, backslash, etc.), unless you are using an input method.

You can turn off multibyte support in a specific buffer by invoking the command toggle-enable-multibyte-characters in that buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.3 Converting Text Representations

Emacs can convert unibyte text to multibyte; it can also convert multibyte text to unibyte, provided that the multibyte text contains only ASCII and 8-bit raw bytes. In general, these conversions happen when inserting text into a buffer, or when putting text from several strings together in one string. You can also explicitly convert a string’s contents to either representation.

Emacs chooses the representation for a string based on the text from which it is constructed. The general rule is to convert unibyte text to multibyte text when combining it with other multibyte text, because the multibyte representation is more general and can hold whatever characters the unibyte text has.

When inserting text into a buffer, Emacs converts the text to the buffer’s representation, as specified by enable-multibyte-characters in that buffer. In particular, when you insert multibyte text into a unibyte buffer, Emacs converts the text to unibyte, even though this conversion cannot in general preserve all the characters that might be in the multibyte text. The other natural alternative, to convert the buffer contents to multibyte, is not acceptable because the buffer’s representation is a choice made by the user that cannot be overridden automatically.

Converting unibyte text to multibyte text leaves ASCII characters unchanged, and converts bytes with codes 128 through 255 to the multibyte representation of raw eight-bit bytes.

Converting multibyte text to unibyte converts all ASCII and eight-bit characters to their single-byte form, but loses information for non-ASCII characters by discarding all but the low 8 bits of each character’s codepoint. Converting unibyte text to multibyte and back to unibyte reproduces the original unibyte text.

The next two functions either return the argument string, or a newly created string with no text properties.

Function: string-to-multibyte string

This function returns a multibyte string containing the same sequence of characters as string. If string is a multibyte string, it is returned unchanged. The function assumes that string includes only ASCII characters and raw 8-bit bytes; the latter are converted to their multibyte representation corresponding to the codepoints #x3FFF80 through #x3FFFFF, inclusive (see section codepoints).

Function: string-to-unibyte string

This function returns a unibyte string containing the same sequence of characters as string. It signals an error if string contains a non-ASCII character. If string is a unibyte string, it is returned unchanged. Use this function for string arguments that contain only ASCII and eight-bit characters.

Function: byte-to-string byte

This function returns a unibyte string containing a single byte of character data, character. It signals an error if character is not an integer between 0 and 255.

Function: multibyte-char-to-unibyte char

This converts the multibyte character char to a unibyte character, and returns that character. If char is neither ASCII nor eight-bit, the function returns -1.

Function: unibyte-char-to-multibyte char

This convert the unibyte character char to a multibyte character, assuming char is either ASCII or raw 8-bit byte.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.4 Selecting a Representation

Sometimes it is useful to examine an existing buffer or string as multibyte when it was unibyte, or vice versa.

Function: set-buffer-multibyte multibyte

Set the representation type of the current buffer. If multibyte is non-nil, the buffer becomes multibyte. If multibyte is nil, the buffer becomes unibyte.

This function leaves the buffer contents unchanged when viewed as a sequence of bytes. As a consequence, it can change the contents viewed as characters; for instance, a sequence of three bytes which is treated as one character in multibyte representation will count as three characters in unibyte representation. Eight-bit characters representing raw bytes are an exception. They are represented by one byte in a unibyte buffer, but when the buffer is set to multibyte, they are converted to two-byte sequences, and vice versa.

This function sets enable-multibyte-characters to record which representation is in use. It also adjusts various data in the buffer (including overlays, text properties and markers) so that they cover the same text as they did before.

This function signals an error if the buffer is narrowed, since the narrowing might have occurred in the middle of multibyte character sequences.

This function also signals an error if the buffer is an indirect buffer. An indirect buffer always inherits the representation of its base buffer.

Function: string-as-unibyte string

If string is already a unibyte string, this function returns string itself. Otherwise, it returns a new string with the same bytes as string, but treating each byte as a separate character (so that the value may have more characters than string); as an exception, each eight-bit character representing a raw byte is converted into a single byte. The newly-created string contains no text properties.

Function: string-as-multibyte string

If string is a multibyte string, this function returns string itself. Otherwise, it returns a new string with the same bytes as string, but treating each multibyte sequence as one character. This means that the value may have fewer characters than string has. If a byte sequence in string is invalid as a multibyte representation of a single character, each byte in the sequence is treated as a raw 8-bit byte. The newly-created string contains no text properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.5 Character Codes

The unibyte and multibyte text representations use different character codes. The valid character codes for unibyte representation range from 0 to #xFF (255)—the values that can fit in one byte. The valid character codes for multibyte representation range from 0 to #x3FFFFF. In this code space, values 0 through #x7F (127) are for ASCII characters, and values #x80 (128) through #x3FFF7F (4194175) are for non-ASCII characters.

Emacs character codes are a superset of the Unicode standard. Values 0 through #x10FFFF (1114111) correspond to Unicode characters of the same codepoint; values #x110000 (1114112) through #x3FFF7F (4194175) represent characters that are not unified with Unicode; and values #x3FFF80 (4194176) through #x3FFFFF (4194303) represent eight-bit raw bytes.

Function: characterp charcode

This returns t if charcode is a valid character, and nil otherwise.

(characterp 65)
     ⇒ t
(characterp 4194303)
     ⇒ t
(characterp 4194304)
     ⇒ nil
Function: max-char

This function returns the largest value that a valid character codepoint can have.

(characterp (max-char))
     ⇒ t
(characterp (1+ (max-char)))
     ⇒ nil
Function: get-byte &optional pos string

This function returns the byte at character position pos in the current buffer. If the current buffer is unibyte, this is literally the byte at that position. If the buffer is multibyte, byte values of ASCII characters are the same as character codepoints, whereas eight-bit raw bytes are converted to their 8-bit codes. The function signals an error if the character at pos is non-ASCII.

The optional argument string means to get a byte value from that string instead of the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.6 Character Properties

A character property is a named attribute of a character that specifies how the character behaves and how it should be handled during text processing and display. Thus, character properties are an important part of specifying the character’s semantics.

On the whole, Emacs follows the Unicode Standard in its implementation of character properties. In particular, Emacs supports the Unicode Character Property Model, and the Emacs character property database is derived from the Unicode Character Database (UCD). See the Character Properties chapter of the Unicode Standard, for a detailed description of Unicode character properties and their meaning. This section assumes you are already familiar with that chapter of the Unicode Standard, and want to apply that knowledge to Emacs Lisp programs.

In Emacs, each property has a name, which is a symbol, and a set of possible values, whose types depend on the property; if a character does not have a certain property, the value is nil. As a general rule, the names of character properties in Emacs are produced from the corresponding Unicode properties by downcasing them and replacing each ‘_’ character with a dash ‘-’. For example, Canonical_Combining_Class becomes canonical-combining-class. However, sometimes we shorten the names to make their use easier.

Some codepoints are left unassigned by the UCD—they don’t correspond to any character. The Unicode Standard defines default values of properties for such codepoints; they are mentioned below for each property.

Here is the full list of value types for all the character properties that Emacs knows about:

name

Corresponds to the Name Unicode property. The value is a string consisting of upper-case Latin letters A to Z, digits, spaces, and hyphen ‘-’ characters. For unassigned codepoints, the value is nil.

general-category

Corresponds to the General_Category Unicode property. The value is a symbol whose name is a 2-letter abbreviation of the character’s classification. For unassigned codepoints, the value is Cn.

canonical-combining-class

Corresponds to the Canonical_Combining_Class Unicode property. The value is an integer. For unassigned codepoints, the value is zero.

bidi-class

Corresponds to the Unicode Bidi_Class property. The value is a symbol whose name is the Unicode directional type of the character. Emacs uses this property when it reorders bidirectional text for display (see section Bidirectional Display). For unassigned codepoints, the value depends on the code blocks to which the codepoint belongs: most unassigned codepoints get the value of L (strong L), but some get values of AL (Arabic letter) or R (strong R).

decomposition

Corresponds to the Unicode properties Decomposition_Type and Decomposition_Value. The value is a list, whose first element may be a symbol representing a compatibility formatting tag, such as small16; the other elements are characters that give the compatibility decomposition sequence of this character. For unassigned codepoints, the value is the character itself.

decimal-digit-value

Corresponds to the Unicode Numeric_Value property for characters whose Numeric_Type is ‘Decimal’. The value is an integer. For unassigned codepoints, the value is nil, which means NaN, or “not-a-number”.

digit-value

Corresponds to the Unicode Numeric_Value property for characters whose Numeric_Type is ‘Digit’. The value is an integer. Examples of such characters include compatibility subscript and superscript digits, for which the value is the corresponding number. For unassigned codepoints, the value is nil, which means NaN.

numeric-value

Corresponds to the Unicode Numeric_Value property for characters whose Numeric_Type is ‘Numeric’. The value of this property is a number. Examples of characters that have this property include fractions, subscripts, superscripts, Roman numerals, currency numerators, and encircled numbers. For example, the value of this property for the character U+2155 (VULGAR FRACTION ONE FIFTH) is 0.2. For unassigned codepoints, the value is nil, which means NaN.

mirrored

Corresponds to the Unicode Bidi_Mirrored property. The value of this property is a symbol, either Y or N. For unassigned codepoints, the value is N.

mirroring

Corresponds to the Unicode Bidi_Mirroring_Glyph property. The value of this property is a character whose glyph represents the mirror image of the character’s glyph, or nil if there’s no defined mirroring glyph. All the characters whose mirrored property is N have nil as their mirroring property; however, some characters whose mirrored property is Y also have nil for mirroring, because no appropriate characters exist with mirrored glyphs. Emacs uses this property to display mirror images of characters when appropriate (see section Bidirectional Display). For unassigned codepoints, the value is nil.

old-name

Corresponds to the Unicode Unicode_1_Name property. The value is a string. Unassigned codepoints, and characters that have no value for this property, the value is nil.

iso-10646-comment

Corresponds to the Unicode ISO_Comment property. The value is a string. For unassigned codepoints, the value is an empty string.

uppercase

Corresponds to the Unicode Simple_Uppercase_Mapping property. The value of this property is a single character. For unassigned codepoints, the value is nil, which means the character itself.

lowercase

Corresponds to the Unicode Simple_Lowercase_Mapping property. The value of this property is a single character. For unassigned codepoints, the value is nil, which means the character itself.

titlecase

Corresponds to the Unicode Simple_Titlecase_Mapping property. Title case is a special form of a character used when the first character of a word needs to be capitalized. The value of this property is a single character. For unassigned codepoints, the value is nil, which means the character itself.

Function: get-char-code-property char propname

This function returns the value of char’s propname property.

(get-char-code-property ?\s 'general-category)
     ⇒ Zs
(get-char-code-property ?1 'general-category)
     ⇒ Nd
;; subscript 4
(get-char-code-property ?\u2084 'digit-value)
     ⇒ 4
;; one fifth
(get-char-code-property ?\u2155 'numeric-value)
     ⇒ 0.2
;; Roman IV
(get-char-code-property ?\u2163 'numeric-value)
     ⇒ 4
Function: char-code-property-description prop value

This function returns the description string of property prop’s value, or nil if value has no description.

(char-code-property-description 'general-category 'Zs)
     ⇒ "Separator, Space"
(char-code-property-description 'general-category 'Nd)
     ⇒ "Number, Decimal Digit"
(char-code-property-description 'numeric-value '1/5)
     ⇒ nil
Function: put-char-code-property char propname value

This function stores value as the value of the property propname for the character char.

Variable: unicode-category-table

The value of this variable is a char-table (see section Char-Tables) that specifies, for each character, its Unicode General_Category property as a symbol.

Variable: char-script-table

The value of this variable is a char-table that specifies, for each character, a symbol whose name is the script to which the character belongs, according to the Unicode Standard classification of the Unicode code space into script-specific blocks. This char-table has a single extra slot whose value is the list of all script symbols.

Variable: char-width-table

The value of this variable is a char-table that specifies the width of each character in columns that it will occupy on the screen.

Variable: printable-chars

The value of this variable is a char-table that specifies, for each character, whether it is printable or not. That is, if evaluating (aref printable-chars char) results in t, the character is printable, and if it results in nil, it is not.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.7 Character Sets

An Emacs character set, or charset, is a set of characters in which each character is assigned a numeric code point. (The Unicode Standard calls this a coded character set.) Each Emacs charset has a name which is a symbol. A single character can belong to any number of different character sets, but it will generally have a different code point in each charset. Examples of character sets include ascii, iso-8859-1, greek-iso8859-7, and windows-1255. The code point assigned to a character in a charset is usually different from its code point used in Emacs buffers and strings.

Emacs defines several special character sets. The character set unicode includes all the characters whose Emacs code points are in the range 0..#x10FFFF. The character set emacs includes all ASCII and non-ASCII characters. Finally, the eight-bit charset includes the 8-bit raw bytes; Emacs uses it to represent raw bytes encountered in text.

Function: charsetp object

Returns t if object is a symbol that names a character set, nil otherwise.

Variable: charset-list

The value is a list of all defined character set names.

Function: charset-priority-list &optional highestp

This function returns a list of all defined character sets ordered by their priority. If highestp is non-nil, the function returns a single character set of the highest priority.

Function: set-charset-priority &rest charsets

This function makes charsets the highest priority character sets.

Function: char-charset character &optional restriction

This function returns the name of the character set of highest priority that character belongs to. ASCII characters are an exception: for them, this function always returns ascii.

If restriction is non-nil, it should be a list of charsets to search. Alternatively, it can be a coding system, in which case the returned charset must be supported by that coding system (see section Coding Systems).

Function: charset-plist charset

This function returns the property list of the character set charset. Although charset is a symbol, this is not the same as the property list of that symbol. Charset properties include important information about the charset, such as its documentation string, short name, etc.

Function: put-charset-property charset propname value

This function sets the propname property of charset to the given value.

Function: get-charset-property charset propname

This function returns the value of charsets property propname.

Command: list-charset-chars charset

This command displays a list of characters in the character set charset.

Emacs can convert between its internal representation of a character and the character’s codepoint in a specific charset. The following two functions support these conversions.

Function: decode-char charset code-point

This function decodes a character that is assigned a code-point in charset, to the corresponding Emacs character, and returns it. If charset doesn’t contain a character of that code point, the value is nil. If code-point doesn’t fit in a Lisp integer (see section most-positive-fixnum), it can be specified as a cons cell (high . low), where low are the lower 16 bits of the value and high are the high 16 bits.

Function: encode-char char charset

This function returns the code point assigned to the character char in charset. If the result does not fit in a Lisp integer, it is returned as a cons cell (high . low) that fits the second argument of decode-char above. If charset doesn’t have a codepoint for char, the value is nil.

The following function comes in handy for applying a certain function to all or part of the characters in a charset:

Function: map-charset-chars function charset &optional arg from-code to-code

Call function for characters in charset. function is called with two arguments. The first one is a cons cell (from . to), where from and to indicate a range of characters contained in charset. The second argument passed to function is arg.

By default, the range of codepoints passed to function includes all the characters in charset, but optional arguments from-code and to-code limit that to the range of characters between these two codepoints of charset. If either of them is nil, it defaults to the first or last codepoint of charset, respectively.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.8 Scanning for Character Sets

Sometimes it is useful to find out which character set a particular character belongs to. One use for this is in determining which coding systems (see section Coding Systems) are capable of representing all of the text in question; another is to determine the font(s) for displaying that text.

Function: charset-after &optional pos

This function returns the charset of highest priority containing the character at position pos in the current buffer. If pos is omitted or nil, it defaults to the current value of point. If pos is out of range, the value is nil.

Function: find-charset-region beg end &optional translation

This function returns a list of the character sets of highest priority that contain characters in the current buffer between positions beg and end.

The optional argument translation specifies a translation table to use for scanning the text (see section Translation of Characters). If it is non-nil, then each character in the region is translated through this table, and the value returned describes the translated characters instead of the characters actually in the buffer.

Function: find-charset-string string &optional translation

This function returns a list of character sets of highest priority that contain characters in string. It is just like find-charset-region, except that it applies to the contents of string instead of part of the current buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.9 Translation of Characters

A translation table is a char-table (see section Char-Tables) that specifies a mapping of characters into characters. These tables are used in encoding and decoding, and for other purposes. Some coding systems specify their own particular translation tables; there are also default translation tables which apply to all other coding systems.

A translation table has two extra slots. The first is either nil or a translation table that performs the reverse translation; the second is the maximum number of characters to look up for translating sequences of characters (see the description of make-translation-table-from-alist below).

Function: make-translation-table &rest translations

This function returns a translation table based on the argument translations. Each element of translations should be a list of elements of the form (from . to); this says to translate the character from into to.

The arguments and the forms in each argument are processed in order, and if a previous form already translates to to some other character, say to-alt, from is also translated to to-alt.

During decoding, the translation table’s translations are applied to the characters that result from ordinary decoding. If a coding system has the property :decode-translation-table, that specifies the translation table to use, or a list of translation tables to apply in sequence. (This is a property of the coding system, as returned by coding-system-get, not a property of the symbol that is the coding system’s name. See section Basic Concepts of Coding Systems.) Finally, if standard-translation-table-for-decode is non-nil, the resulting characters are translated by that table.

During encoding, the translation table’s translations are applied to the characters in the buffer, and the result of translation is actually encoded. If a coding system has property :encode-translation-table, that specifies the translation table to use, or a list of translation tables to apply in sequence. In addition, if the variable standard-translation-table-for-encode is non-nil, it specifies the translation table to use for translating the result.

Variable: standard-translation-table-for-decode

This is the default translation table for decoding. If a coding systems specifies its own translation tables, the table that is the value of this variable, if non-nil, is applied after them.

Variable: standard-translation-table-for-encode

This is the default translation table for encoding. If a coding systems specifies its own translation tables, the table that is the value of this variable, if non-nil, is applied after them.

Variable: translation-table-for-input

Self-inserting characters are translated through this translation table before they are inserted. Search commands also translate their input through this table, so they can compare more reliably with what’s in the buffer.

This variable automatically becomes buffer-local when set.

Function: make-translation-table-from-vector vec

This function returns a translation table made from vec that is an array of 256 elements to map bytes (values 0 through #xFF) to characters. Elements may be nil for untranslated bytes. The returned table has a translation table for reverse mapping in the first extra slot, and the value 1 in the second extra slot.

This function provides an easy way to make a private coding system that maps each byte to a specific character. You can specify the returned table and the reverse translation table using the properties :decode-translation-table and :encode-translation-table respectively in the props argument to define-coding-system.

Function: make-translation-table-from-alist alist

This function is similar to make-translation-table but returns a complex translation table rather than a simple one-to-one mapping. Each element of alist is of the form (from . to), where from and to are either characters or vectors specifying a sequence of characters. If from is a character, that character is translated to to (i.e., to a character or a character sequence). If from is a vector of characters, that sequence is translated to to. The returned table has a translation table for reverse mapping in the first extra slot, and the maximum length of all the from character sequences in the second extra slot.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10 Coding Systems

When Emacs reads or writes a file, and when Emacs sends text to a subprocess or receives text from a subprocess, it normally performs character code conversion and end-of-line conversion as specified by a particular coding system.

How to define a coding system is an arcane matter, and is not documented here.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.1 Basic Concepts of Coding Systems

Character code conversion involves conversion between the internal representation of characters used inside Emacs and some other encoding. Emacs supports many different encodings, in that it can convert to and from them. For example, it can convert text to or from encodings such as Latin 1, Latin 2, Latin 3, Latin 4, Latin 5, and several variants of ISO 2022. In some cases, Emacs supports several alternative encodings for the same characters; for example, there are three coding systems for the Cyrillic (Russian) alphabet: ISO, Alternativnyj, and KOI8.

Every coding system specifies a particular set of character code conversions, but the coding system undecided is special: it leaves the choice unspecified, to be chosen heuristically for each file, based on the file’s data.

In general, a coding system doesn’t guarantee roundtrip identity: decoding a byte sequence using coding system, then encoding the resulting text in the same coding system, can produce a different byte sequence. But some coding systems do guarantee that the byte sequence will be the same as what you originally decoded. Here are a few examples:

iso-8859-1, utf-8, big5, shift_jis, euc-jp

Encoding buffer text and then decoding the result can also fail to reproduce the original text. For instance, if you encode a character with a coding system which does not support that character, the result is unpredictable, and thus decoding it using the same coding system may produce a different text. Currently, Emacs can’t report errors that result from encoding unsupported characters.

End of line conversion handles three different conventions used on various systems for representing end of line in files. The Unix convention, used on GNU and Unix systems, is to use the linefeed character (also called newline). The DOS convention, used on MS-Windows and MS-DOS systems, is to use a carriage-return and a linefeed at the end of a line. The Mac convention is to use just carriage-return. (This was the convention used on the Macintosh system prior to OS X.)

Base coding systems such as latin-1 leave the end-of-line conversion unspecified, to be chosen based on the data. Variant coding systems such as latin-1-unix, latin-1-dos and latin-1-mac specify the end-of-line conversion explicitly as well. Most base coding systems have three corresponding variants whose names are formed by adding ‘-unix’, ‘-dos’ and ‘-mac’.

The coding system raw-text is special in that it prevents character code conversion, and causes the buffer visited with this coding system to be a unibyte buffer. For historical reasons, you can save both unibyte and multibyte text with this coding system. When you use raw-text to encode multibyte text, it does perform one character code conversion: it converts eight-bit characters to their single-byte external representation. raw-text does not specify the end-of-line conversion, allowing that to be determined as usual by the data, and has the usual three variants which specify the end-of-line conversion.

no-conversion (and its alias binary) is equivalent to raw-text-unix: it specifies no conversion of either character codes or end-of-line.

The coding system utf-8-emacs specifies that the data is represented in the internal Emacs encoding (see section Text Representations). This is like raw-text in that no code conversion happens, but different in that the result is multibyte data. The name emacs-internal is an alias for utf-8-emacs.

Function: coding-system-get coding-system property

This function returns the specified property of the coding system coding-system. Most coding system properties exist for internal purposes, but one that you might find useful is :mime-charset. That property’s value is the name used in MIME for the character coding which this coding system can read and write. Examples:

(coding-system-get 'iso-latin-1 :mime-charset)
     ⇒ iso-8859-1
(coding-system-get 'iso-2022-cn :mime-charset)
     ⇒ iso-2022-cn
(coding-system-get 'cyrillic-koi8 :mime-charset)
     ⇒ koi8-r

The value of the :mime-charset property is also defined as an alias for the coding system.

Function: coding-system-aliases coding-system

This function returns the list of aliases of coding-system.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.2 Encoding and I/O

The principal purpose of coding systems is for use in reading and writing files. The function insert-file-contents uses a coding system to decode the file data, and write-region uses one to encode the buffer contents.

You can specify the coding system to use either explicitly (see section Specifying a Coding System for One Operation), or implicitly using a default mechanism (see section Default Coding Systems). But these methods may not completely specify what to do. For example, they may choose a coding system such as undefined which leaves the character code conversion to be determined from the data. In these cases, the I/O operation finishes the job of choosing a coding system. Very often you will want to find out afterwards which coding system was chosen.

Variable: buffer-file-coding-system

This buffer-local variable records the coding system used for saving the buffer and for writing part of the buffer with write-region. If the text to be written cannot be safely encoded using the coding system specified by this variable, these operations select an alternative encoding by calling the function select-safe-coding-system (see section User-Chosen Coding Systems). If selecting a different encoding requires to ask the user to specify a coding system, buffer-file-coding-system is updated to the newly selected coding system.

buffer-file-coding-system does not affect sending text to a subprocess.

Variable: save-buffer-coding-system

This variable specifies the coding system for saving the buffer (by overriding buffer-file-coding-system). Note that it is not used for write-region.

When a command to save the buffer starts out to use buffer-file-coding-system (or save-buffer-coding-system), and that coding system cannot handle the actual text in the buffer, the command asks the user to choose another coding system (by calling select-safe-coding-system). After that happens, the command also updates buffer-file-coding-system to represent the coding system that the user specified.

Variable: last-coding-system-used

I/O operations for files and subprocesses set this variable to the coding system name that was used. The explicit encoding and decoding functions (see section Explicit Encoding and Decoding) set it too.

Warning: Since receiving subprocess output sets this variable, it can change whenever Emacs waits; therefore, you should copy the value shortly after the function call that stores the value you are interested in.

The variable selection-coding-system specifies how to encode selections for the window system. See section Window System Selections.

Variable: file-name-coding-system

The variable file-name-coding-system specifies the coding system to use for encoding file names. Emacs encodes file names using that coding system for all file operations. If file-name-coding-system is nil, Emacs uses a default coding system determined by the selected language environment. In the default language environment, any non-ASCII characters in file names are not encoded specially; they appear in the file system using the internal Emacs representation.

Warning: if you change file-name-coding-system (or the language environment) in the middle of an Emacs session, problems can result if you have already visited files whose names were encoded using the earlier coding system and are handled differently under the new coding system. If you try to save one of these buffers under the visited file name, saving may use the wrong file name, or it may get an error. If such a problem happens, use C-x C-w to specify a new file name for that buffer.

On Windows 2000 and later, Emacs by default uses Unicode APIs to pass file names to the OS, so the value of file-name-coding-system is largely ignored. Lisp applications that need to encode or decode file names on the Lisp level should use utf-8 coding-system when system-type is windows-nt; the conversion of UTF-8 encoded file names to the encoding appropriate for communicating with the OS is performed internally by Emacs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.3 Coding Systems in Lisp

Here are the Lisp facilities for working with coding systems:

Function: coding-system-list &optional base-only

This function returns a list of all coding system names (symbols). If base-only is non-nil, the value includes only the base coding systems. Otherwise, it includes alias and variant coding systems as well.

Function: coding-system-p object

This function returns t if object is a coding system name or nil.

Function: check-coding-system coding-system

This function checks the validity of coding-system. If that is valid, it returns coding-system. If coding-system is nil, the function return nil. For any other values, it signals an error whose error-symbol is coding-system-error (see section signal).

Function: coding-system-eol-type coding-system

This function returns the type of end-of-line (a.k.a. eol) conversion used by coding-system. If coding-system specifies a certain eol conversion, the return value is an integer 0, 1, or 2, standing for unix, dos, and mac, respectively. If coding-system doesn’t specify eol conversion explicitly, the return value is a vector of coding systems, each one with one of the possible eol conversion types, like this:

(coding-system-eol-type 'latin-1)
     ⇒ [latin-1-unix latin-1-dos latin-1-mac]

If this function returns a vector, Emacs will decide, as part of the text encoding or decoding process, what eol conversion to use. For decoding, the end-of-line format of the text is auto-detected, and the eol conversion is set to match it (e.g., DOS-style CRLF format will imply dos eol conversion). For encoding, the eol conversion is taken from the appropriate default coding system (e.g., default value of buffer-file-coding-system for buffer-file-coding-system), or from the default eol conversion appropriate for the underlying platform.

Function: coding-system-change-eol-conversion coding-system eol-type

This function returns a coding system which is like coding-system except for its eol conversion, which is specified by eol-type. eol-type should be unix, dos, mac, or nil. If it is nil, the returned coding system determines the end-of-line conversion from the data.

eol-type may also be 0, 1 or 2, standing for unix, dos and mac, respectively.

Function: coding-system-change-text-conversion eol-coding text-coding

This function returns a coding system which uses the end-of-line conversion of eol-coding, and the text conversion of text-coding. If text-coding is nil, it returns undecided, or one of its variants according to eol-coding.

Function: find-coding-systems-region from to

This function returns a list of coding systems that could be used to encode a text between from and to. All coding systems in the list can safely encode any multibyte characters in that portion of the text.

If the text contains no multibyte characters, the function returns the list (undecided).

Function: find-coding-systems-string string

This function returns a list of coding systems that could be used to encode the text of string. All coding systems in the list can safely encode any multibyte characters in string. If the text contains no multibyte characters, this returns the list (undecided).

Function: find-coding-systems-for-charsets charsets

This function returns a list of coding systems that could be used to encode all the character sets in the list charsets.

Function: check-coding-systems-region start end coding-system-list

This function checks whether coding systems in the list coding-system-list can encode all the characters in the region between start and end. If all of the coding systems in the list can encode the specified text, the function returns nil. If some coding systems cannot encode some of the characters, the value is an alist, each element of which has the form (coding-system1 pos1 pos2 …), meaning that coding-system1 cannot encode characters at buffer positions pos1, pos2, ....

start may be a string, in which case end is ignored and the returned value references string indices instead of buffer positions.

Function: detect-coding-region start end &optional highest

This function chooses a plausible coding system for decoding the text from start to end. This text should be a byte sequence, i.e., unibyte text or multibyte text with only ASCII and eight-bit characters (see section Explicit Encoding and Decoding).

Normally this function returns a list of coding systems that could handle decoding the text that was scanned. They are listed in order of decreasing priority. But if highest is non-nil, then the return value is just one coding system, the one that is highest in priority.

If the region contains only ASCII characters except for such ISO-2022 control characters ISO-2022 as ESC, the value is undecided or (undecided), or a variant specifying end-of-line conversion, if that can be deduced from the text.

If the region contains null bytes, the value is no-conversion, even if the region contains text encoded in some coding system.

Function: detect-coding-string string &optional highest

This function is like detect-coding-region except that it operates on the contents of string instead of bytes in the buffer.

Variable: inhibit-null-byte-detection

If this variable has a non-nil value, null bytes are ignored when detecting the encoding of a region or a string. This allows to correctly detect the encoding of text that contains null bytes, such as Info files with Index nodes.

Variable: inhibit-iso-escape-detection

If this variable has a non-nil value, ISO-2022 escape sequences are ignored when detecting the encoding of a region or a string. The result is that no text is ever detected as encoded in some ISO-2022 encoding, and all escape sequences become visible in a buffer. Warning: Use this variable with extreme caution, because many files in the Emacs distribution use ISO-2022 encoding.

Function: coding-system-charset-list coding-system

This function returns the list of character sets (see section Character Sets) supported by coding-system. Some coding systems that support too many character sets to list them all yield special values:

See Process Information, in particular the description of the functions process-coding-system and set-process-coding-system, for how to examine or set the coding systems used for I/O to a subprocess.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.4 User-Chosen Coding Systems

Function: select-safe-coding-system from to &optional default-coding-system accept-default-p file

This function selects a coding system for encoding specified text, asking the user to choose if necessary. Normally the specified text is the text in the current buffer between from and to. If from is a string, the string specifies the text to encode, and to is ignored.

If the specified text includes raw bytes (see section Text Representations), select-safe-coding-system suggests raw-text for its encoding.

If default-coding-system is non-nil, that is the first coding system to try; if that can handle the text, select-safe-coding-system returns that coding system. It can also be a list of coding systems; then the function tries each of them one by one. After trying all of them, it next tries the current buffer’s value of buffer-file-coding-system (if it is not undecided), then the default value of buffer-file-coding-system and finally the user’s most preferred coding system, which the user can set using the command prefer-coding-system (see Recognizing Coding Systems in The GNU Emacs Manual).

If one of those coding systems can safely encode all the specified text, select-safe-coding-system chooses it and returns it. Otherwise, it asks the user to choose from a list of coding systems which can encode all the text, and returns the user’s choice.

default-coding-system can also be a list whose first element is t and whose other elements are coding systems. Then, if no coding system in the list can handle the text, select-safe-coding-system queries the user immediately, without trying any of the three alternatives described above.

The optional argument accept-default-p, if non-nil, should be a function to determine whether a coding system selected without user interaction is acceptable. select-safe-coding-system calls this function with one argument, the base coding system of the selected coding system. If accept-default-p returns nil, select-safe-coding-system rejects the silently selected coding system, and asks the user to select a coding system from a list of possible candidates.

If the variable select-safe-coding-system-accept-default-p is non-nil, it should be a function taking a single argument. It is used in place of accept-default-p, overriding any value supplied for this argument.

As a final step, before returning the chosen coding system, select-safe-coding-system checks whether that coding system is consistent with what would be selected if the contents of the region were read from a file. (If not, this could lead to data corruption in a file subsequently re-visited and edited.) Normally, select-safe-coding-system uses buffer-file-name as the file for this purpose, but if file is non-nil, it uses that file instead (this can be relevant for write-region and similar functions). If it detects an apparent inconsistency, select-safe-coding-system queries the user before selecting the coding system.

Here are two functions you can use to let the user specify a coding system, with completion. See section Completion.

Function: read-coding-system prompt &optional default

This function reads a coding system using the minibuffer, prompting with string prompt, and returns the coding system name as a symbol. If the user enters null input, default specifies which coding system to return. It should be a symbol or a string.

Function: read-non-nil-coding-system prompt

This function reads a coding system using the minibuffer, prompting with string prompt, and returns the coding system name as a symbol. If the user tries to enter null input, it asks the user to try again. See section Coding Systems.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.5 Default Coding Systems

This section describes variables that specify the default coding system for certain files or when running certain subprograms, and the function that I/O operations use to access them.

The idea of these variables is that you set them once and for all to the defaults you want, and then do not change them again. To specify a particular coding system for a particular operation in a Lisp program, don’t change these variables; instead, override them using coding-system-for-read and coding-system-for-write (see section Specifying a Coding System for One Operation).

User Option: auto-coding-regexp-alist

This variable is an alist of text patterns and corresponding coding systems. Each element has the form (regexp . coding-system); a file whose first few kilobytes match regexp is decoded with coding-system when its contents are read into a buffer. The settings in this alist take priority over coding: tags in the files and the contents of file-coding-system-alist (see below). The default value is set so that Emacs automatically recognizes mail files in Babyl format and reads them with no code conversions.

User Option: file-coding-system-alist

This variable is an alist that specifies the coding systems to use for reading and writing particular files. Each element has the form (pattern . coding), where pattern is a regular expression that matches certain file names. The element applies to file names that match pattern.

The CDR of the element, coding, should be either a coding system, a cons cell containing two coding systems, or a function name (a symbol with a function definition). If coding is a coding system, that coding system is used for both reading the file and writing it. If coding is a cons cell containing two coding systems, its CAR specifies the coding system for decoding, and its CDR specifies the coding system for encoding.

If coding is a function name, the function should take one argument, a list of all arguments passed to find-operation-coding-system. It must return a coding system or a cons cell containing two coding systems. This value has the same meaning as described above.

If coding (or what returned by the above function) is undecided, the normal code-detection is performed.

User Option: auto-coding-alist

This variable is an alist that specifies the coding systems to use for reading and writing particular files. Its form is like that of file-coding-system-alist, but, unlike the latter, this variable takes priority over any coding: tags in the file.

Variable: process-coding-system-alist

This variable is an alist specifying which coding systems to use for a subprocess, depending on which program is running in the subprocess. It works like file-coding-system-alist, except that pattern is matched against the program name used to start the subprocess. The coding system or systems specified in this alist are used to initialize the coding systems used for I/O to the subprocess, but you can specify other coding systems later using set-process-coding-system.

Warning: Coding systems such as undecided, which determine the coding system from the data, do not work entirely reliably with asynchronous subprocess output. This is because Emacs handles asynchronous subprocess output in batches, as it arrives. If the coding system leaves the character code conversion unspecified, or leaves the end-of-line conversion unspecified, Emacs must try to detect the proper conversion from one batch at a time, and this does not always work.

Therefore, with an asynchronous subprocess, if at all possible, use a coding system which determines both the character code conversion and the end of line conversion—that is, one like latin-1-unix, rather than undecided or latin-1.

Variable: network-coding-system-alist

This variable is an alist that specifies the coding system to use for network streams. It works much like file-coding-system-alist, with the difference that the pattern in an element may be either a port number or a regular expression. If it is a regular expression, it is matched against the network service name used to open the network stream.

Variable: default-process-coding-system

This variable specifies the coding systems to use for subprocess (and network stream) input and output, when nothing else specifies what to do.

The value should be a cons cell of the form (input-coding . output-coding). Here input-coding applies to input from the subprocess, and output-coding applies to output to it.

User Option: auto-coding-functions

This variable holds a list of functions that try to determine a coding system for a file based on its undecoded contents.

Each function in this list should be written to look at text in the current buffer, but should not modify it in any way. The buffer will contain undecoded text of parts of the file. Each function should take one argument, size, which tells it how many characters to look at, starting from point. If the function succeeds in determining a coding system for the file, it should return that coding system. Otherwise, it should return nil.

If a file has a ‘coding:’ tag, that takes precedence, so these functions won’t be called.

Function: find-auto-coding filename size

This function tries to determine a suitable coding system for filename. It examines the buffer visiting the named file, using the variables documented above in sequence, until it finds a match for one of the rules specified by these variables. It then returns a cons cell of the form (coding . source), where coding is the coding system to use and source is a symbol, one of auto-coding-alist, auto-coding-regexp-alist, :coding, or auto-coding-functions, indicating which one supplied the matching rule. The value :coding means the coding system was specified by the coding: tag in the file (see coding tag in The GNU Emacs Manual). The order of looking for a matching rule is auto-coding-alist first, then auto-coding-regexp-alist, then the coding: tag, and lastly auto-coding-functions. If no matching rule was found, the function returns nil.

The second argument size is the size of text, in characters, following point. The function examines text only within size characters after point. Normally, the buffer should be positioned at the beginning when this function is called, because one of the places for the coding: tag is the first one or two lines of the file; in that case, size should be the size of the buffer.

Function: set-auto-coding filename size

This function returns a suitable coding system for file filename. It uses find-auto-coding to find the coding system. If no coding system could be determined, the function returns nil. The meaning of the argument size is like in find-auto-coding.

Function: find-operation-coding-system operation &rest arguments

This function returns the coding system to use (by default) for performing operation with arguments. The value has this form:

(decoding-system . encoding-system)

The first element, decoding-system, is the coding system to use for decoding (in case operation does decoding), and encoding-system is the coding system for encoding (in case operation does encoding).

The argument operation is a symbol; it should be one of write-region, start-process, call-process, call-process-region, insert-file-contents, or open-network-stream. These are the names of the Emacs I/O primitives that can do character code and eol conversion.

The remaining arguments should be the same arguments that might be given to the corresponding I/O primitive. Depending on the primitive, one of those arguments is selected as the target. For example, if operation does file I/O, whichever argument specifies the file name is the target. For subprocess primitives, the process name is the target. For open-network-stream, the target is the service name or port number.

Depending on operation, this function looks up the target in file-coding-system-alist, process-coding-system-alist, or network-coding-system-alist. If the target is found in the alist, find-operation-coding-system returns its association in the alist; otherwise it returns nil.

If operation is insert-file-contents, the argument corresponding to the target may be a cons cell of the form (filename . buffer). In that case, filename is a file name to look up in file-coding-system-alist, and buffer is a buffer that contains the file’s contents (not yet decoded). If file-coding-system-alist specifies a function to call for this file, and that function needs to examine the file’s contents (as it usually does), it should examine the contents of buffer instead of reading the file.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.6 Specifying a Coding System for One Operation

You can specify the coding system for a specific operation by binding the variables coding-system-for-read and/or coding-system-for-write.

Variable: coding-system-for-read

If this variable is non-nil, it specifies the coding system to use for reading a file, or for input from a synchronous subprocess.

It also applies to any asynchronous subprocess or network stream, but in a different way: the value of coding-system-for-read when you start the subprocess or open the network stream specifies the input decoding method for that subprocess or network stream. It remains in use for that subprocess or network stream unless and until overridden.

The right way to use this variable is to bind it with let for a specific I/O operation. Its global value is normally nil, and you should not globally set it to any other value. Here is an example of the right way to use the variable:

;; Read the file with no character code conversion.
(let ((coding-system-for-read 'no-conversion))
  (insert-file-contents filename))

When its value is non-nil, this variable takes precedence over all other methods of specifying a coding system to use for input, including file-coding-system-alist, process-coding-system-alist and network-coding-system-alist.

Variable: coding-system-for-write

This works much like coding-system-for-read, except that it applies to output rather than input. It affects writing to files, as well as sending output to subprocesses and net connections.

When a single operation does both input and output, as do call-process-region and start-process, both coding-system-for-read and coding-system-for-write affect it.

User Option: inhibit-eol-conversion

When this variable is non-nil, no end-of-line conversion is done, no matter which coding system is specified. This applies to all the Emacs I/O and subprocess primitives, and to the explicit encoding and decoding functions (see section Explicit Encoding and Decoding).

Sometimes, you need to prefer several coding systems for some operation, rather than fix a single one. Emacs lets you specify a priority order for using coding systems. This ordering affects the sorting of lists of coding systems returned by functions such as find-coding-systems-region (see section Coding Systems in Lisp).

Function: coding-system-priority-list &optional highestp

This function returns the list of coding systems in the order of their current priorities. Optional argument highestp, if non-nil, means return only the highest priority coding system.

Function: set-coding-system-priority &rest coding-systems

This function puts coding-systems at the beginning of the priority list for coding systems, thus making their priority higher than all the rest.

Macro: with-coding-priority coding-systems &rest body…

This macro execute body, like progn does (see section progn), with coding-systems at the front of the priority list for coding systems. coding-systems should be a list of coding systems to prefer during execution of body.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.7 Explicit Encoding and Decoding

All the operations that transfer text in and out of Emacs have the ability to use a coding system to encode or decode the text. You can also explicitly encode and decode text using the functions in this section.

The result of encoding, and the input to decoding, are not ordinary text. They logically consist of a series of byte values; that is, a series of ASCII and eight-bit characters. In unibyte buffers and strings, these characters have codes in the range 0 through #xFF (255). In a multibyte buffer or string, eight-bit characters have character codes higher than #xFF (see section Text Representations), but Emacs transparently converts them to their single-byte values when you encode or decode such text.

The usual way to read a file into a buffer as a sequence of bytes, so you can decode the contents explicitly, is with insert-file-contents-literally (see section Reading from Files); alternatively, specify a non-nil rawfile argument when visiting a file with find-file-noselect. These methods result in a unibyte buffer.

The usual way to use the byte sequence that results from explicitly encoding text is to copy it to a file or process—for example, to write it with write-region (see section Writing to Files), and suppress encoding by binding coding-system-for-write to no-conversion.

Here are the functions to perform explicit encoding or decoding. The encoding functions produce sequences of bytes; the decoding functions are meant to operate on sequences of bytes. All of these functions discard text properties. They also set last-coding-system-used to the precise coding system they used.

Command: encode-coding-region start end coding-system &optional destination

This command encodes the text from start to end according to coding system coding-system. Normally, the encoded text replaces the original text in the buffer, but the optional argument destination can change that. If destination is a buffer, the encoded text is inserted in that buffer after point (point does not move); if it is t, the command returns the encoded text as a unibyte string without inserting it.

If encoded text is inserted in some buffer, this command returns the length of the encoded text.

The result of encoding is logically a sequence of bytes, but the buffer remains multibyte if it was multibyte before, and any 8-bit bytes are converted to their multibyte representation (see section Text Representations).

Do not use undecided for coding-system when encoding text, since that may lead to unexpected results. Instead, use select-safe-coding-system (see section select-safe-coding-system) to suggest a suitable encoding, if there’s no obvious pertinent value for coding-system.

Function: encode-coding-string string coding-system &optional nocopy buffer

This function encodes the text in string according to coding system coding-system. It returns a new string containing the encoded text, except when nocopy is non-nil, in which case the function may return string itself if the encoding operation is trivial. The result of encoding is a unibyte string.

Command: decode-coding-region start end coding-system &optional destination

This command decodes the text from start to end according to coding system coding-system. To make explicit decoding useful, the text before decoding ought to be a sequence of byte values, but both multibyte and unibyte buffers are acceptable (in the multibyte case, the raw byte values should be represented as eight-bit characters). Normally, the decoded text replaces the original text in the buffer, but the optional argument destination can change that. If destination is a buffer, the decoded text is inserted in that buffer after point (point does not move); if it is t, the command returns the decoded text as a multibyte string without inserting it.

If decoded text is inserted in some buffer, this command returns the length of the decoded text.

This command puts a charset text property on the decoded text. The value of the property states the character set used to decode the original text.

Function: decode-coding-string string coding-system &optional nocopy buffer

This function decodes the text in string according to coding-system. It returns a new string containing the decoded text, except when nocopy is non-nil, in which case the function may return string itself if the decoding operation is trivial. To make explicit decoding useful, the contents of string ought to be a unibyte string with a sequence of byte values, but a multibyte string is also acceptable (assuming it contains 8-bit bytes in their multibyte form).

If optional argument buffer specifies a buffer, the decoded text is inserted in that buffer after point (point does not move). In this case, the return value is the length of the decoded text.

This function puts a charset text property on the decoded text. The value of the property states the character set used to decode the original text:

(decode-coding-string "Gr\374ss Gott" 'latin-1)
     ⇒ #("Grüss Gott" 0 9 (charset iso-8859-1))
Function: decode-coding-inserted-region from to filename &optional visit beg end replace

This function decodes the text from from to to as if it were being read from file filename using insert-file-contents using the rest of the arguments provided.

The normal way to use this function is after reading text from a file without decoding, if you decide you would rather have decoded it. Instead of deleting the text and reading it again, this time with decoding, you can call this function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.10.8 Terminal I/O Encoding

Emacs can use coding systems to decode keyboard input and encode terminal output. This is useful for terminals that transmit or display text using a particular encoding, such as Latin-1. Emacs does not set last-coding-system-used when encoding or decoding terminal I/O.

Function: keyboard-coding-system &optional terminal

This function returns the coding system used for decoding keyboard input from terminal. A value of no-conversion means no decoding is done. If terminal is omitted or nil, it means the selected frame’s terminal. See section Multiple Terminals.

Command: set-keyboard-coding-system coding-system &optional terminal

This command specifies coding-system as the coding system to use for decoding keyboard input from terminal. If coding-system is nil, that means not to decode keyboard input. If terminal is a frame, it means that frame’s terminal; if it is nil, that means the currently selected frame’s terminal. See section Multiple Terminals.

Function: terminal-coding-system &optional terminal

This function returns the coding system that is in use for encoding terminal output from terminal. A value of no-conversion means no encoding is done. If terminal is a frame, it means that frame’s terminal; if it is nil, that means the currently selected frame’s terminal.

Command: set-terminal-coding-system coding-system &optional terminal

This command specifies coding-system as the coding system to use for encoding terminal output from terminal. If coding-system is nil, that means not to encode terminal output. If terminal is a frame, it means that frame’s terminal; if it is nil, that means the currently selected frame’s terminal.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.11 Input Methods

Input methods provide convenient ways of entering non-ASCII characters from the keyboard. Unlike coding systems, which translate non-ASCII characters to and from encodings meant to be read by programs, input methods provide human-friendly commands. (See Input Methods in The GNU Emacs Manual, for information on how users use input methods to enter text.) How to define input methods is not yet documented in this manual, but here we describe how to use them.

Each input method has a name, which is currently a string; in the future, symbols may also be usable as input method names.

Variable: current-input-method

This variable holds the name of the input method now active in the current buffer. (It automatically becomes local in each buffer when set in any fashion.) It is nil if no input method is active in the buffer now.

User Option: default-input-method

This variable holds the default input method for commands that choose an input method. Unlike current-input-method, this variable is normally global.

Command: set-input-method input-method

This command activates input method input-method for the current buffer. It also sets default-input-method to input-method. If input-method is nil, this command deactivates any input method for the current buffer.

Function: read-input-method-name prompt &optional default inhibit-null

This function reads an input method name with the minibuffer, prompting with prompt. If default is non-nil, that is returned by default, if the user enters empty input. However, if inhibit-null is non-nil, empty input signals an error.

The returned value is a string.

Variable: input-method-alist

This variable defines all the supported input methods. Each element defines one input method, and should have the form:

(input-method language-env activate-func
 title description args...)

Here input-method is the input method name, a string; language-env is another string, the name of the language environment this input method is recommended for. (That serves only for documentation purposes.)

activate-func is a function to call to activate this method. The args, if any, are passed as arguments to activate-func. All told, the arguments to activate-func are input-method and the args.

title is a string to display in the mode line while this method is active. description is a string describing this method and what it is good for.

The fundamental interface to input methods is through the variable input-method-function. See section Reading One Event, and Invoking the Input Method.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

32.12 Locales

POSIX defines a concept of “locales” which control which language to use in language-related features. These Emacs variables control how Emacs interacts with these features.

Variable: locale-coding-system

This variable specifies the coding system to use for decoding system error messages and—on X Window system only—keyboard input, for encoding the format argument to format-time-string, and for decoding the return value of format-time-string.

Variable: system-messages-locale

This variable specifies the locale to use for generating system error messages. Changing the locale can cause messages to come out in a different language or in a different orthography. If the variable is nil, the locale is specified by environment variables in the usual POSIX fashion.

Variable: system-time-locale

This variable specifies the locale to use for formatting time values. Changing the locale can cause messages to appear according to the conventions of a different language. If the variable is nil, the locale is specified by environment variables in the usual POSIX fashion.

Function: locale-info item

This function returns locale data item for the current POSIX locale, if available. item should be one of these symbols:

codeset

Return the character set as a string (locale item CODESET).

days

Return a 7-element vector of day names (locale items DAY_1 through DAY_7);

months

Return a 12-element vector of month names (locale items MON_1 through MON_12).

paper

Return a list (width height) for the default paper size measured in millimeters (locale items PAPER_WIDTH and PAPER_HEIGHT).

If the system can’t provide the requested information, or if item is not one of those symbols, the value is nil. All strings in the return value are decoded using locale-coding-system. See Locales in The GNU Libc Manual, for more information about locales and locale items.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33 Searching and Matching

GNU Emacs provides two ways to search through a buffer for specified text: exact string searches and regular expression searches. After a regular expression search, you can examine the match data to determine which text matched the whole regular expression or various portions of it.

The ‘skip-chars…’ functions also perform a kind of searching. See section Skipping Characters. To search for changes in character properties, see Text Property Search Functions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.1 Searching for Strings

These are the primitive functions for searching through the text in a buffer. They are meant for use in programs, but you may call them interactively. If you do so, they prompt for the search string; the arguments limit and noerror are nil, and repeat is 1. For more details on interactive searching, see Searching and Replacement in The GNU Emacs Manual.

These search functions convert the search string to multibyte if the buffer is multibyte; they convert the search string to unibyte if the buffer is unibyte. See section Text Representations.

Command: search-forward string &optional limit noerror repeat

This function searches forward from point for an exact match for string. If successful, it sets point to the end of the occurrence found, and returns the new value of point. If no match is found, the value and side effects depend on noerror (see below).

In the following example, point is initially at the beginning of the line. Then (search-forward "fox") moves point after the last letter of ‘fox’:

---------- Buffer: foo ----------
∗The quick brown fox jumped over the lazy dog.
---------- Buffer: foo ----------

(search-forward "fox")
     ⇒ 20

---------- Buffer: foo ----------
The quick brown fox∗ jumped over the lazy dog.
---------- Buffer: foo ----------

The argument limit specifies the bound to the search, and should be a position in the current buffer. No match extending after that position is accepted. If limit is omitted or nil, it defaults to the end of the accessible portion of the buffer.

What happens when the search fails depends on the value of noerror. If noerror is nil, a search-failed error is signaled. If noerror is t, search-forward returns nil and does nothing. If noerror is neither nil nor t, then search-forward moves point to the upper bound and returns nil.

The argument noerror only affects valid searches which fail to find a match. Invalid arguments cause errors regardless of noerror.

If repeat is a positive number n, it serves as a repeat count: the search is repeated n times, each time starting at the end of the previous time’s match. If these successive searches succeed, the function succeeds, moving point and returning its new value. Otherwise the search fails, with results depending on the value of noerror, as described above. If repeat is a negative number -n, it serves as a repeat count of n for a search in the opposite (backward) direction.

Command: search-backward string &optional limit noerror repeat

This function searches backward from point for string. It is like search-forward, except that it searches backwards rather than forwards. Backward searches leave point at the beginning of the match.

Command: word-search-forward string &optional limit noerror repeat

This function searches forward from point for a “word” match for string. If it finds a match, it sets point to the end of the match found, and returns the new value of point.

Word matching regards string as a sequence of words, disregarding punctuation that separates them. It searches the buffer for the same sequence of words. Each word must be distinct in the buffer (searching for the word ‘ball’ does not match the word ‘balls’), but the details of punctuation and spacing are ignored (searching for ‘ball boy’ does match ‘ball. Boy!’).

In this example, point is initially at the beginning of the buffer; the search leaves it between the ‘y’ and the ‘!’.

---------- Buffer: foo ----------
∗He said "Please!  Find
the ball boy!"
---------- Buffer: foo ----------

(word-search-forward "Please find the ball, boy.")
     ⇒ 39

---------- Buffer: foo ----------
He said "Please!  Find
the ball boy∗!"
---------- Buffer: foo ----------

If limit is non-nil, it must be a position in the current buffer; it specifies the upper bound to the search. The match found must not extend after that position.

If noerror is nil, then word-search-forward signals an error if the search fails. If noerror is t, then it returns nil instead of signaling an error. If noerror is neither nil nor t, it moves point to limit (or the end of the accessible portion of the buffer) and returns nil.

If repeat is non-nil, then the search is repeated that many times. Point is positioned at the end of the last match.

Internally, word-search-forward and related functions use the function word-search-regexp to convert string to a regular expression that ignores punctuation.

Command: word-search-forward-lax string &optional limit noerror repeat

This command is identical to word-search-forward, except that the beginning or the end of string need not match a word boundary, unless string begins or ends in whitespace. For instance, searching for ‘ball boy’ matches ‘ball boyee’, but does not match ‘balls boy’.

Command: word-search-backward string &optional limit noerror repeat

This function searches backward from point for a word match to string. This function is just like word-search-forward except that it searches backward and normally leaves point at the beginning of the match.

Command: word-search-backward-lax string &optional limit noerror repeat

This command is identical to word-search-backward, except that the beginning or the end of string need not match a word boundary, unless string begins or ends in whitespace.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.2 Searching and Case

By default, searches in Emacs ignore the case of the text they are searching through; if you specify searching for ‘FOO’, then ‘Foo’ or ‘foo’ is also considered a match. This applies to regular expressions, too; thus, ‘[aB]’ would match ‘a’ or ‘A’ or ‘b’ or ‘B’.

If you do not want this feature, set the variable case-fold-search to nil. Then all letters must match exactly, including case. This is a buffer-local variable; altering the variable affects only the current buffer. (See section Introduction to Buffer-Local Variables.) Alternatively, you may change the default value. In Lisp code, you will more typically use let to bind case-fold-search to the desired value.

Note that the user-level incremental search feature handles case distinctions differently. When the search string contains only lower case letters, the search ignores case, but when the search string contains one or more upper case letters, the search becomes case-sensitive. But this has nothing to do with the searching functions used in Lisp code. See Incremental Search in The GNU Emacs Manual.

User Option: case-fold-search

This buffer-local variable determines whether searches should ignore case. If the variable is nil they do not ignore case; otherwise (and by default) they do ignore case.

User Option: case-replace

This variable determines whether the higher-level replacement functions should preserve case. If the variable is nil, that means to use the replacement text verbatim. A non-nil value means to convert the case of the replacement text according to the text being replaced.

This variable is used by passing it as an argument to the function replace-match. See section Replacing the Text that Matched.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3 Regular Expressions

A regular expression, or regexp for short, is a pattern that denotes a (possibly infinite) set of strings. Searching for matches for a regexp is a very powerful operation. This section explains how to write regexps; the following section says how to search for them.

For interactive development of regular expressions, you can use the M-x re-builder command. It provides a convenient interface for creating regular expressions, by giving immediate visual feedback in a separate buffer. As you edit the regexp, all its matches in the target buffer are highlighted. Each parenthesized sub-expression of the regexp is shown in a distinct face, which makes it easier to verify even very complex regexps.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.1 Syntax of Regular Expressions

Regular expressions have a syntax in which a few characters are special constructs and the rest are ordinary. An ordinary character is a simple regular expression that matches that character and nothing else. The special characters are ‘.’, ‘*’, ‘+’, ‘?’, ‘[’, ‘^’, ‘$’, and ‘\’; no new special characters will be defined in the future. The character ‘]’ is special if it ends a character alternative (see later). The character ‘-’ is special inside a character alternative. A ‘[:’ and balancing ‘:]’ enclose a character class inside a character alternative. Any other character appearing in a regular expression is ordinary, unless a ‘\’ precedes it.

For example, ‘f’ is not a special character, so it is ordinary, and therefore ‘f’ is a regular expression that matches the string ‘f’ and no other string. (It does not match the string ‘fg’, but it does match a part of that string.) Likewise, ‘o’ is a regular expression that matches only ‘o’.

Any two regular expressions a and b can be concatenated. The result is a regular expression that matches a string if a matches some amount of the beginning of that string and b matches the rest of the string.

As a simple example, we can concatenate the regular expressions ‘f’ and ‘o’ to get the regular expression ‘fo’, which matches only the string ‘fo’. Still trivial. To do something more powerful, you need to use one of the special regular expression constructs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.1.1 Special Characters in Regular Expressions

Here is a list of the characters that are special in a regular expression.

.(Period)

is a special character that matches any single character except a newline. Using concatenation, we can make regular expressions like ‘a.b’, which matches any three-character string that begins with ‘a’ and ends with ‘b’.

*

is not a construct by itself; it is a postfix operator that means to match the preceding regular expression repetitively as many times as possible. Thus, ‘o*’ matches any number of ‘o’s (including no ‘o’s).

*’ always applies to the smallest possible preceding expression. Thus, ‘fo*’ has a repeating ‘o’, not a repeating ‘fo’. It matches ‘f’, ‘fo’, ‘foo’, and so on.

The matcher processes a ‘*’ construct by matching, immediately, as many repetitions as can be found. Then it continues with the rest of the pattern. If that fails, backtracking occurs, discarding some of the matches of the ‘*’-modified construct in the hope that that will make it possible to match the rest of the pattern. For example, in matching ‘ca*ar’ against the string ‘caaar’, the ‘a*’ first tries to match all three ‘a’s; but the rest of the pattern is ‘ar’ and there is only ‘r’ left to match, so this try fails. The next alternative is for ‘a*’ to match only two ‘a’s. With this choice, the rest of the regexp matches successfully.

Warning: Nested repetition operators can run for an indefinitely long time, if they lead to ambiguous matching. For example, trying to match the regular expression ‘\(x+y*\)*a’ against the string ‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz’ could take hours before it ultimately fails. Emacs must try each way of grouping the ‘x’s before concluding that none of them can work. Even worse, ‘\(x*\)*’ can match the null string in infinitely many ways, so it causes an infinite loop. To avoid these problems, check nested repetitions carefully, to make sure that they do not cause combinatorial explosions in backtracking.

+

is a postfix operator, similar to ‘*’ except that it must match the preceding expression at least once. So, for example, ‘ca+r’ matches the strings ‘car’ and ‘caaaar’ but not the string ‘cr’, whereas ‘ca*r’ matches all three strings.

?

is a postfix operator, similar to ‘*’ except that it must match the preceding expression either once or not at all. For example, ‘ca?r’ matches ‘car’ or ‘cr’; nothing else.

*?’, ‘+?’, ‘??

These are “non-greedy” variants of the operators ‘*’, ‘+’ and ‘?’. Where those operators match the largest possible substring (consistent with matching the entire containing expression), the non-greedy variants match the smallest possible substring (consistent with matching the entire containing expression).

For example, the regular expression ‘c[ad]*a’ when applied to the string ‘cdaaada’ matches the whole string; but the regular expression ‘c[ad]*?a’, applied to that same string, matches just ‘cda’. (The smallest possible match here for ‘[ad]*?’ that permits the whole expression to match is ‘d’.)

[ … ]

is a character alternative, which begins with ‘[’ and is terminated by ‘]’. In the simplest case, the characters between the two brackets are what this character alternative can match.

Thus, ‘[ad]’ matches either one ‘a’ or one ‘d’, and ‘[ad]*’ matches any string composed of just ‘a’s and ‘d’s (including the empty string). It follows that ‘c[ad]*r’ matches ‘cr’, ‘car’, ‘cdr’, ‘caddaar’, etc.

You can also include character ranges in a character alternative, by writing the starting and ending characters with a ‘-’ between them. Thus, ‘[a-z]’ matches any lower-case ASCII letter. Ranges may be intermixed freely with individual characters, as in ‘[a-z$%.]’, which matches any lower case ASCII letter or ‘$’, ‘%’ or period.

If case-fold-search is non-nil, ‘[a-z]’ also matches upper-case letters. Note that a range like ‘[a-z]’ is not affected by the locale’s collation sequence, it always represents a sequence in ASCII order.

Note also that the usual regexp special characters are not special inside a character alternative. A completely different set of characters is special inside character alternatives: ‘]’, ‘-’ and ‘^’.

To include a ‘]’ in a character alternative, you must make it the first character. For example, ‘[]a]’ matches ‘]’ or ‘a’. To include a ‘-’, write ‘-’ as the first or last character of the character alternative, or put it after a range. Thus, ‘[]-]’ matches both ‘]’ and ‘-’. (As explained below, you cannot use ‘\]’ to include a ‘]’ inside a character alternative, since ‘\’ is not special there.)

To include ‘^’ in a character alternative, put it anywhere but at the beginning.

If a range starts with a unibyte character c and ends with a multibyte character c2, the range is divided into two parts: one spans the unibyte characters ‘c..?\377’, the other the multibyte characters ‘c1..c2’, where c1 is the first character of the charset to which c2 belongs.

A character alternative can also specify named character classes (see section Character Classes). This is a POSIX feature. For example, ‘[[:ascii:]]’ matches any ASCII character. Using a character class is equivalent to mentioning each of the characters in that class; but the latter is not feasible in practice, since some classes include thousands of different characters.

[^ … ]

[^’ begins a complemented character alternative. This matches any character except the ones specified. Thus, ‘[^a-z0-9A-Z]’ matches all characters except letters and digits.

^’ is not special in a character alternative unless it is the first character. The character following the ‘^’ is treated as if it were first (in other words, ‘-’ and ‘]’ are not special there).

A complemented character alternative can match a newline, unless newline is mentioned as one of the characters not to match. This is in contrast to the handling of regexps in programs such as grep.

You can specify named character classes, just like in character alternatives. For instance, ‘[^[:ascii:]]’ matches any non-ASCII character. See section Character Classes.

^

When matching a buffer, ‘^’ matches the empty string, but only at the beginning of a line in the text being matched (or the beginning of the accessible portion of the buffer). Otherwise it fails to match anything. Thus, ‘^foo’ matches a ‘foo’ that occurs at the beginning of a line.

When matching a string instead of a buffer, ‘^’ matches at the beginning of the string or after a newline character.

For historical compatibility reasons, ‘^’ can be used only at the beginning of the regular expression, or after ‘\(’, ‘\(?:’ or ‘\|’.

$

is similar to ‘^’ but matches only at the end of a line (or the end of the accessible portion of the buffer). Thus, ‘x+$’ matches a string of one ‘x’ or more at the end of a line.

When matching a string instead of a buffer, ‘$’ matches at the end of the string or before a newline character.

For historical compatibility reasons, ‘$’ can be used only at the end of the regular expression, or before ‘\)’ or ‘\|’.

\

has two functions: it quotes the special characters (including ‘\’), and it introduces additional special constructs.

Because ‘\’ quotes special characters, ‘\$’ is a regular expression that matches only ‘$’, and ‘\[’ is a regular expression that matches only ‘[’, and so on.

Note that ‘\’ also has special meaning in the read syntax of Lisp strings (see section String Type), and must be quoted with ‘\’. For example, the regular expression that matches the ‘\’ character is ‘\\’. To write a Lisp string that contains the characters ‘\\’, Lisp syntax requires you to quote each ‘\’ with another ‘\’. Therefore, the read syntax for a regular expression matching ‘\’ is "\\\\".

Please note: For historical compatibility, special characters are treated as ordinary ones if they are in contexts where their special meanings make no sense. For example, ‘*foo’ treats ‘*’ as ordinary since there is no preceding expression on which the ‘*’ can act. It is poor practice to depend on this behavior; quote the special character anyway, regardless of where it appears.

As a ‘\’ is not special inside a character alternative, it can never remove the special meaning of ‘-’ or ‘]’. So you should not quote these characters when they have no special meaning either. This would not clarify anything, since backslashes can legitimately precede these characters where they have special meaning, as in ‘[^\]’ ("[^\\]" for Lisp string syntax), which matches any single character except a backslash.

In practice, most ‘]’ that occur in regular expressions close a character alternative and hence are special. However, occasionally a regular expression may try to match a complex pattern of literal ‘[’ and ‘]’. In such situations, it sometimes may be necessary to carefully parse the regexp from the start to determine which square brackets enclose a character alternative. For example, ‘[^][]]’ consists of the complemented character alternative ‘[^][]’ (which matches any single character that is not a square bracket), followed by a literal ‘]’.

The exact rules are that at the beginning of a regexp, ‘[’ is special and ‘]’ not. This lasts until the first unquoted ‘[’, after which we are in a character alternative; ‘[’ is no longer special (except when it starts a character class) but ‘]’ is special, unless it immediately follows the special ‘[’ or that ‘[’ followed by a ‘^’. This lasts until the next special ‘]’ that does not end a character class. This ends the character alternative and restores the ordinary syntax of regular expressions; an unquoted ‘[’ is special again and a ‘]’ not.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.1.2 Character Classes

Here is a table of the classes you can use in a character alternative, and what they mean:

[:ascii:]

This matches any ASCII character (codes 0–127).

[:alnum:]

This matches any letter or digit. (At present, for multibyte characters, it matches anything that has word syntax.)

[:alpha:]

This matches any letter. (At present, for multibyte characters, it matches anything that has word syntax.)

[:blank:]

This matches space and tab only.

[:cntrl:]

This matches any ASCII control character.

[:digit:]

This matches ‘0’ through ‘9’. Thus, ‘[-+[:digit:]]’ matches any digit, as well as ‘+’ and ‘-’.

[:graph:]

This matches graphic characters—everything except ASCII control characters, space, and the delete character.

[:lower:]

This matches any lower-case letter, as determined by the current case table (see section The Case Table). If case-fold-search is non-nil, this also matches any upper-case letter.

[:multibyte:]

This matches any multibyte character (see section Text Representations).

[:nonascii:]

This matches any non-ASCII character.

[:print:]

This matches printing characters—everything except ASCII control characters and the delete character.

[:punct:]

This matches any punctuation character. (At present, for multibyte characters, it matches anything that has non-word syntax.)

[:space:]

This matches any character that has whitespace syntax (see section Table of Syntax Classes).

[:unibyte:]

This matches any unibyte character (see section Text Representations).

[:upper:]

This matches any upper-case letter, as determined by the current case table (see section The Case Table). If case-fold-search is non-nil, this also matches any lower-case letter.

[:word:]

This matches any character that has word syntax (see section Table of Syntax Classes).

[:xdigit:]

This matches the hexadecimal digits: ‘0’ through ‘9’, ‘a’ through ‘f’ and ‘A’ through ‘F’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.1.3 Backslash Constructs in Regular Expressions

For the most part, ‘\’ followed by any character matches only that character. However, there are several exceptions: certain sequences starting with ‘\’ that have special meanings. Here is a table of the special ‘\’ constructs.

\|

specifies an alternative. Two regular expressions a and b with ‘\|’ in between form an expression that matches anything that either a or b matches.

Thus, ‘foo\|bar’ matches either ‘foo’ or ‘bar’ but no other string.

\|’ applies to the largest possible surrounding expressions. Only a surrounding ‘\( … \)’ grouping can limit the grouping power of ‘\|’.

If you need full backtracking capability to handle multiple uses of ‘\|’, use the POSIX regular expression functions (see section POSIX Regular Expression Searching).

\{m\}

is a postfix operator that repeats the previous pattern exactly m times. Thus, ‘x\{5\}’ matches the string ‘xxxxx’ and nothing else. ‘c[ad]\{3\}r’ matches string such as ‘caaar’, ‘cdddr’, ‘cadar’, and so on.

\{m,n\}

is a more general postfix operator that specifies repetition with a minimum of m repeats and a maximum of n repeats. If m is omitted, the minimum is 0; if n is omitted, there is no maximum.

For example, ‘c[ad]\{1,2\}r’ matches the strings ‘car’, ‘cdr’, ‘caar’, ‘cadr’, ‘cdar’, and ‘cddr’, and nothing else.
\{0,1\}’ or ‘\{,1\}’ is equivalent to ‘?’.
\{0,\}’ or ‘\{,\}’ is equivalent to ‘*’.
\{1,\}’ is equivalent to ‘+’.

\( … \)

is a grouping construct that serves three purposes:

  1. To enclose a set of ‘\|’ alternatives for other operations. Thus, the regular expression ‘\(foo\|bar\)x’ matches either ‘foox’ or ‘barx’.
  2. To enclose a complicated expression for the postfix operators ‘*’, ‘+’ and ‘?’ to operate on. Thus, ‘ba\(na\)*’ matches ‘ba’, ‘bana’, ‘banana’, ‘bananana’, etc., with any number (zero or more) of ‘na’ strings.
  3. To record a matched substring for future reference with ‘\digit’ (see below).

This last application is not a consequence of the idea of a parenthetical grouping; it is a separate feature that was assigned as a second meaning to the same ‘\( … \)’ construct because, in practice, there was usually no conflict between the two meanings. But occasionally there is a conflict, and that led to the introduction of shy groups.

\(?: … \)

is the shy group construct. A shy group serves the first two purposes of an ordinary group (controlling the nesting of other operators), but it does not get a number, so you cannot refer back to its value with ‘\digit’. Shy groups are particularly useful for mechanically-constructed regular expressions, because they can be added automatically without altering the numbering of ordinary, non-shy groups.

Shy groups are also called non-capturing or unnumbered groups.

\(?num: … \)

is the explicitly numbered group construct. Normal groups get their number implicitly, based on their position, which can be inconvenient. This construct allows you to force a particular group number. There is no particular restriction on the numbering, e.g., you can have several groups with the same number in which case the last one to match (i.e., the rightmost match) will win. Implicitly numbered groups always get the smallest integer larger than the one of any previous group.

\digit

matches the same text that matched the digitth occurrence of a grouping (‘\( … \)’) construct.

In other words, after the end of a group, the matcher remembers the beginning and end of the text matched by that group. Later on in the regular expression you can use ‘\’ followed by digit to match that same text, whatever it may have been.

The strings matching the first nine grouping constructs appearing in the entire regular expression passed to a search or matching function are assigned numbers 1 through 9 in the order that the open parentheses appear in the regular expression. So you can use ‘\1’ through ‘\9’ to refer to the text matched by the corresponding grouping constructs.

For example, ‘\(.*\)\1’ matches any newline-free string that is composed of two identical halves. The ‘\(.*\)’ matches the first half, which may be anything, but the ‘\1’ that follows must match the same exact text.

If a ‘\( … \)’ construct matches more than once (which can happen, for instance, if it is followed by ‘*’), only the last match is recorded.

If a particular grouping construct in the regular expression was never matched—for instance, if it appears inside of an alternative that wasn’t used, or inside of a repetition that repeated zero times—then the corresponding ‘\digit’ construct never matches anything. To use an artificial example, ‘\(foo\(b*\)\|lose\)\2’ cannot match ‘lose’: the second alternative inside the larger group matches it, but then ‘\2’ is undefined and can’t match anything. But it can match ‘foobb’, because the first alternative matches ‘foob’ and ‘\2’ matches ‘b’.

\w

matches any word-constituent character. The editor syntax table determines which characters these are. See section Syntax Tables.

\W

matches any character that is not a word constituent.

\scode

matches any character whose syntax is code. Here code is a character that represents a syntax code: thus, ‘w’ for word constituent, ‘-’ for whitespace, ‘(’ for open parenthesis, etc. To represent whitespace syntax, use either ‘-’ or a space character. See section Table of Syntax Classes, for a list of syntax codes and the characters that stand for them.

\Scode

matches any character whose syntax is not code.

\cc

matches any character whose category is c. Here c is a character that represents a category: thus, ‘c’ for Chinese characters or ‘g’ for Greek characters in the standard category table. You can see the list of all the currently defined categories with M-x describe-categories RET. You can also define your own categories in addition to the standard ones using the define-category function (see section Categories).

\Cc

matches any character whose category is not c.

The following regular expression constructs match the empty string—that is, they don’t use up any characters—but whether they match depends on the context. For all, the beginning and end of the accessible portion of the buffer are treated as if they were the actual beginning and end of the buffer.

\`

matches the empty string, but only at the beginning of the buffer or string being matched against.

\'

matches the empty string, but only at the end of the buffer or string being matched against.

\=

matches the empty string, but only at point. (This construct is not defined when matching against a string.)

\b

matches the empty string, but only at the beginning or end of a word. Thus, ‘\bfoo\b’ matches any occurrence of ‘foo’ as a separate word. ‘\bballs?\b’ matches ‘ball’ or ‘balls’ as a separate word.

\b’ matches at the beginning or end of the buffer (or string) regardless of what text appears next to it.

\B

matches the empty string, but not at the beginning or end of a word, nor at the beginning or end of the buffer (or string).

\<

matches the empty string, but only at the beginning of a word. ‘\<’ matches at the beginning of the buffer (or string) only if a word-constituent character follows.

\>

matches the empty string, but only at the end of a word. ‘\>’ matches at the end of the buffer (or string) only if the contents end with a word-constituent character.

\_<

matches the empty string, but only at the beginning of a symbol. A symbol is a sequence of one or more word or symbol constituent characters. ‘\_<’ matches at the beginning of the buffer (or string) only if a symbol-constituent character follows.

\_>

matches the empty string, but only at the end of a symbol. ‘\_>’ matches at the end of the buffer (or string) only if the contents end with a symbol-constituent character.

Not every string is a valid regular expression. For example, a string that ends inside a character alternative without a terminating ‘]’ is invalid, and so is a string that ends with a single ‘\’. If an invalid regular expression is passed to any of the search functions, an invalid-regexp error is signaled.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.2 Complex Regexp Example

Here is a complicated regexp which was formerly used by Emacs to recognize the end of a sentence together with any whitespace that follows. (Nowadays Emacs uses a similar but more complex default regexp constructed by the function sentence-end. See section Standard Regular Expressions Used in Editing.)

Below, we show first the regexp as a string in Lisp syntax (to distinguish spaces from tab characters), and then the result of evaluating it. The string constant begins and ends with a double-quote. ‘\"’ stands for a double-quote as part of the string, ‘\\’ for a backslash as part of the string, ‘\t’ for a tab and ‘\n’ for a newline.

"[.?!][]\"')}]*\\($\\| $\\|\t\\|  \\)[ \t\n]*"
     ⇒ "[.?!][]\"')}]*\\($\\| $\\|  \\|  \\)[
]*"

In the output, tab and newline appear as themselves.

This regular expression contains four parts in succession and can be deciphered as follows:

[.?!]

The first part of the pattern is a character alternative that matches any one of three characters: period, question mark, and exclamation mark. The match must begin with one of these three characters. (This is one point where the new default regexp used by Emacs differs from the old. The new value also allows some non-ASCII characters that end a sentence without any following whitespace.)

[]\"')}]*

The second part of the pattern matches any closing braces and quotation marks, zero or more of them, that may follow the period, question mark or exclamation mark. The \" is Lisp syntax for a double-quote in a string. The ‘*’ at the end indicates that the immediately preceding regular expression (a character alternative, in this case) may be repeated zero or more times.

\\($\\| $\\|\t\\|  \\)

The third part of the pattern matches the whitespace that follows the end of a sentence: the end of a line (optionally with a space), or a tab, or two spaces. The double backslashes mark the parentheses and vertical bars as regular expression syntax; the parentheses delimit a group and the vertical bars separate alternatives. The dollar sign is used to match the end of a line.

[ \t\n]*

Finally, the last part of the pattern matches any additional whitespace beyond the minimum needed to end a sentence.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.3.3 Regular Expression Functions

These functions operate on regular expressions.

Function: regexp-quote string

This function returns a regular expression whose only exact match is string. Using this regular expression in looking-at will succeed only if the next characters in the buffer are string; using it in a search function will succeed if the text being searched contains string. See section Regular Expression Searching.

This allows you to request an exact string match or search when calling a function that wants a regular expression.

(regexp-quote "^The cat$")
     ⇒ "\\^The cat\\$"

One use of regexp-quote is to combine an exact string match with context described as a regular expression. For example, this searches for the string that is the value of string, surrounded by whitespace:

(re-search-forward
 (concat "\\s-" (regexp-quote string) "\\s-"))
Function: regexp-opt strings &optional paren

This function returns an efficient regular expression that will match any of the strings in the list strings. This is useful when you need to make matching or searching as fast as possible—for example, for Font Lock mode17.

If the optional argument paren is non-nil, then the returned regular expression is always enclosed by at least one parentheses-grouping construct. If paren is words, then that construct is additionally surrounded by ‘\<’ and ‘\>’; alternatively, if paren is symbols, then that construct is additionally surrounded by ‘\_<’ and ‘\_>’ (symbols is often appropriate when matching programming-language keywords and the like).

This simplified definition of regexp-opt produces a regular expression which is equivalent to the actual value (but not as efficient):

(defun regexp-opt (strings &optional paren)
  (let ((open-paren (if paren "\\(" ""))
        (close-paren (if paren "\\)" "")))
    (concat open-paren
            (mapconcat 'regexp-quote strings "\\|")
            close-paren)))
Function: regexp-opt-depth regexp

This function returns the total number of grouping constructs (parenthesized expressions) in regexp. This does not include shy groups (see section Backslash Constructs in Regular Expressions).

Function: regexp-opt-charset chars

This function returns a regular expression matching a character in the list of characters chars.

(regexp-opt-charset '(?a ?b ?c ?d ?e))
     ⇒ "[a-e]"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.4 Regular Expression Searching

In GNU Emacs, you can search for the next match for a regular expression (see section Syntax of Regular Expressions) either incrementally or not. For incremental search commands, see Regular Expression Search in The GNU Emacs Manual. Here we describe only the search functions useful in programs. The principal one is re-search-forward.

These search functions convert the regular expression to multibyte if the buffer is multibyte; they convert the regular expression to unibyte if the buffer is unibyte. See section Text Representations.

Command: re-search-forward regexp &optional limit noerror repeat

This function searches forward in the current buffer for a string of text that is matched by the regular expression regexp. The function skips over any amount of text that is not matched by regexp, and leaves point at the end of the first match found. It returns the new value of point.

If limit is non-nil, it must be a position in the current buffer. It specifies the upper bound to the search. No match extending after that position is accepted.

If repeat is supplied, it must be a positive number; the search is repeated that many times; each repetition starts at the end of the previous match. If all these successive searches succeed, the search succeeds, moving point and returning its new value. Otherwise the search fails. What re-search-forward does when the search fails depends on the value of noerror:

nil

Signal a search-failed error.

t

Do nothing and return nil.

anything else

Move point to limit (or the end of the accessible portion of the buffer) and return nil.

In the following example, point is initially before the ‘T’. Evaluating the search call moves point to the end of that line (between the ‘t’ of ‘hat’ and the newline).

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(re-search-forward "[a-z]+" nil t 5)
     ⇒ 27

---------- Buffer: foo ----------
I read "The cat in the hat∗
comes back" twice.
---------- Buffer: foo ----------
Command: re-search-backward regexp &optional limit noerror repeat

This function searches backward in the current buffer for a string of text that is matched by the regular expression regexp, leaving point at the beginning of the first text found.

This function is analogous to re-search-forward, but they are not simple mirror images. re-search-forward finds the match whose beginning is as close as possible to the starting point. If re-search-backward were a perfect mirror image, it would find the match whose end is as close as possible. However, in fact it finds the match whose beginning is as close as possible (and yet ends before the starting point). The reason for this is that matching a regular expression at a given spot always works from beginning to end, and starts at a specified beginning position.

A true mirror-image of re-search-forward would require a special feature for matching regular expressions from end to beginning. It’s not worth the trouble of implementing that.

Function: string-match regexp string &optional start

This function returns the index of the start of the first match for the regular expression regexp in string, or nil if there is no match. If start is non-nil, the search starts at that index in string.

For example,

(string-match
 "quick" "The quick brown fox jumped quickly.")
     ⇒ 4
(string-match
 "quick" "The quick brown fox jumped quickly." 8)
     ⇒ 27

The index of the first character of the string is 0, the index of the second character is 1, and so on.

After this function returns, the index of the first character beyond the match is available as (match-end 0). See section The Match Data.

(string-match
 "quick" "The quick brown fox jumped quickly." 8)
     ⇒ 27

(match-end 0)
     ⇒ 32
Function: string-match-p regexp string &optional start

This predicate function does what string-match does, but it avoids modifying the match data.

Function: looking-at regexp

This function determines whether the text in the current buffer directly following point matches the regular expression regexp. “Directly following” means precisely that: the search is “anchored” and it can succeed only starting with the first character following point. The result is t if so, nil otherwise.

This function does not move point, but it does update the match data. See section The Match Data. If you need to test for a match without modifying the match data, use looking-at-p, described below.

In this example, point is located directly before the ‘T’. If it were anywhere else, the result would be nil.

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(looking-at "The cat in the hat$")
     ⇒ t
Function: looking-back regexp &optional limit greedy

This function returns t if regexp matches the text immediately before point (i.e., ending at point), and nil otherwise.

Because regular expression matching works only going forward, this is implemented by searching backwards from point for a match that ends at point. That can be quite slow if it has to search a long distance. You can bound the time required by specifying limit, which says not to search before limit. In this case, the match that is found must begin at or after limit. Here’s an example:

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(looking-back "read \"" 3)
     ⇒ t
(looking-back "read \"" 4)
     ⇒ nil

If greedy is non-nil, this function extends the match backwards as far as possible, stopping when a single additional previous character cannot be part of a match for regexp. When the match is extended, its starting position is allowed to occur before limit.

As a general recommendation, try to avoid using looking-back wherever possible, since it is slow. For this reason, there are no plans to add a looking-back-p function.

Function: looking-at-p regexp

This predicate function works like looking-at, but without updating the match data.

Variable: search-spaces-regexp

If this variable is non-nil, it should be a regular expression that says how to search for whitespace. In that case, any group of spaces in a regular expression being searched for stands for use of this regular expression. However, spaces inside of constructs such as ‘[…]’ and ‘*’, ‘+’, ‘?’ are not affected by search-spaces-regexp.

Since this variable affects all regular expression search and match constructs, you should bind it temporarily for as small as possible a part of the code.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.5 POSIX Regular Expression Searching

The usual regular expression functions do backtracking when necessary to handle the ‘\|’ and repetition constructs, but they continue this only until they find some match. Then they succeed and report the first match found.

This section describes alternative search functions which perform the full backtracking specified by the POSIX standard for regular expression matching. They continue backtracking until they have tried all possibilities and found all matches, so they can report the longest match, as required by POSIX. This is much slower, so use these functions only when you really need the longest match.

The POSIX search and match functions do not properly support the non-greedy repetition operators (see section non-greedy). This is because POSIX backtracking conflicts with the semantics of non-greedy repetition.

Command: posix-search-forward regexp &optional limit noerror repeat

This is like re-search-forward except that it performs the full backtracking specified by the POSIX standard for regular expression matching.

Command: posix-search-backward regexp &optional limit noerror repeat

This is like re-search-backward except that it performs the full backtracking specified by the POSIX standard for regular expression matching.

Function: posix-looking-at regexp

This is like looking-at except that it performs the full backtracking specified by the POSIX standard for regular expression matching.

Function: posix-string-match regexp string &optional start

This is like string-match except that it performs the full backtracking specified by the POSIX standard for regular expression matching.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6 The Match Data

Emacs keeps track of the start and end positions of the segments of text found during a search; this is called the match data. Thanks to the match data, you can search for a complex pattern, such as a date in a mail message, and then extract parts of the match under control of the pattern.

Because the match data normally describe the most recent search only, you must be careful not to do another search inadvertently between the search you wish to refer back to and the use of the match data. If you can’t avoid another intervening search, you must save and restore the match data around it, to prevent it from being overwritten.

Notice that all functions are allowed to overwrite the match data unless they’re explicitly documented not to do so. A consequence is that functions that are run implicitly in the background (see section Timers for Delayed Execution, and Idle Timers) should likely save and restore the match data explicitly.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6.1 Replacing the Text that Matched

This function replaces all or part of the text matched by the last search. It works by means of the match data.

Function: replace-match replacement &optional fixedcase literal string subexp

This function performs a replacement operation on a buffer or string.

If you did the last search in a buffer, you should omit the string argument or specify nil for it, and make sure that the current buffer is the one in which you performed the last search. Then this function edits the buffer, replacing the matched text with replacement. It leaves point at the end of the replacement text.

If you performed the last search on a string, pass the same string as string. Then this function returns a new string, in which the matched text is replaced by replacement.

If fixedcase is non-nil, then replace-match uses the replacement text without case conversion; otherwise, it converts the replacement text depending upon the capitalization of the text to be replaced. If the original text is all upper case, this converts the replacement text to upper case. If all words of the original text are capitalized, this capitalizes all the words of the replacement text. If all the words are one-letter and they are all upper case, they are treated as capitalized words rather than all-upper-case words.

If literal is non-nil, then replacement is inserted exactly as it is, the only alterations being case changes as needed. If it is nil (the default), then the character ‘\’ is treated specially. If a ‘\’ appears in replacement, then it must be part of one of the following sequences:

\&

This stands for the entire text being replaced.

\n’, where n is a digit

This stands for the text that matched the nth subexpression in the original regexp. Subexpressions are those expressions grouped inside ‘\(…\)’. If the nth subexpression never matched, an empty string is substituted.

\\

This stands for a single ‘\’ in the replacement text.

\?

This stands for itself (for compatibility with replace-regexp and related commands; see Regexp Replace in The GNU Emacs Manual).

Any other character following ‘\’ signals an error.

The substitutions performed by ‘\&’ and ‘\n’ occur after case conversion, if any. Therefore, the strings they substitute are never case-converted.

If subexp is non-nil, that says to replace just subexpression number subexp of the regexp that was matched, not the entire match. For example, after matching ‘foo \(ba*r\)’, calling replace-match with 1 as subexp means to replace just the text that matched ‘\(ba*r\)’.

Function: match-substitute-replacement replacement &optional fixedcase literal string subexp

This function returns the text that would be inserted into the buffer by replace-match, but without modifying the buffer. It is useful if you want to present the user with actual replacement result, with constructs like ‘\n’ or ‘\&’ substituted with matched groups. Arguments replacement and optional fixedcase, literal, string and subexp have the same meaning as for replace-match.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6.2 Simple Match Data Access

This section explains how to use the match data to find out what was matched by the last search or match operation, if it succeeded.

You can ask about the entire matching text, or about a particular parenthetical subexpression of a regular expression. The count argument in the functions below specifies which. If count is zero, you are asking about the entire match. If count is positive, it specifies which subexpression you want.

Recall that the subexpressions of a regular expression are those expressions grouped with escaped parentheses, ‘\(…\)’. The countth subexpression is found by counting occurrences of ‘\(’ from the beginning of the whole regular expression. The first subexpression is numbered 1, the second 2, and so on. Only regular expressions can have subexpressions—after a simple string search, the only information available is about the entire match.

Every successful search sets the match data. Therefore, you should query the match data immediately after searching, before calling any other function that might perform another search. Alternatively, you may save and restore the match data (see section Saving and Restoring the Match Data) around the call to functions that could perform another search. Or use the functions that explicitly do not modify the match data; e.g., string-match-p.

A search which fails may or may not alter the match data. In the current implementation, it does not, but we may change it in the future. Don’t try to rely on the value of the match data after a failing search.

Function: match-string count &optional in-string

This function returns, as a string, the text matched in the last search or match operation. It returns the entire text if count is zero, or just the portion corresponding to the countth parenthetical subexpression, if count is positive.

If the last such operation was done against a string with string-match, then you should pass the same string as the argument in-string. After a buffer search or match, you should omit in-string or pass nil for it; but you should make sure that the current buffer when you call match-string is the one in which you did the searching or matching. Failure to follow this advice will lead to incorrect results.

The value is nil if count is out of range, or for a subexpression inside a ‘\|’ alternative that wasn’t used or a repetition that repeated zero times.

Function: match-string-no-properties count &optional in-string

This function is like match-string except that the result has no text properties.

Function: match-beginning count

This function returns the position of the start of the text matched by the last regular expression searched for, or a subexpression of it.

If count is zero, then the value is the position of the start of the entire match. Otherwise, count specifies a subexpression in the regular expression, and the value of the function is the starting position of the match for that subexpression.

The value is nil for a subexpression inside a ‘\|’ alternative that wasn’t used or a repetition that repeated zero times.

Function: match-end count

This function is like match-beginning except that it returns the position of the end of the match, rather than the position of the beginning.

Here is an example of using the match data, with a comment showing the positions within the text:

(string-match "\\(qu\\)\\(ick\\)"
              "The quick fox jumped quickly.")
              ;0123456789
     ⇒ 4

(match-string 0 "The quick fox jumped quickly.")
     ⇒ "quick"
(match-string 1 "The quick fox jumped quickly.")
     ⇒ "qu"
(match-string 2 "The quick fox jumped quickly.")
     ⇒ "ick"

(match-beginning 1)       ; The beginning of the match
     ⇒ 4                 ;   with ‘qu’ is at index 4.

(match-beginning 2)       ; The beginning of the match
     ⇒ 6                 ;   with ‘ick’ is at index 6.

(match-end 1)             ; The end of the match
     ⇒ 6                 ;   with ‘qu’ is at index 6.

(match-end 2)             ; The end of the match
     ⇒ 9                 ;   with ‘ick’ is at index 9.

Here is another example. Point is initially located at the beginning of the line. Searching moves point to between the space and the word ‘in’. The beginning of the entire match is at the 9th character of the buffer (‘T’), and the beginning of the match for the first subexpression is at the 13th character (‘c’).

(list
  (re-search-forward "The \\(cat \\)")
  (match-beginning 0)
  (match-beginning 1))
    ⇒ (17 9 13)

---------- Buffer: foo ----------
I read "The cat ∗in the hat comes back" twice.
        ^   ^
        9  13
---------- Buffer: foo ----------

(In this case, the index returned is a buffer position; the first character of the buffer counts as 1.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6.3 Accessing the Entire Match Data

The functions match-data and set-match-data read or write the entire match data, all at once.

Function: match-data &optional integers reuse reseat

This function returns a list of positions (markers or integers) that record all the information on the text that the last search matched. Element zero is the position of the beginning of the match for the whole expression; element one is the position of the end of the match for the expression. The next two elements are the positions of the beginning and end of the match for the first subexpression, and so on. In general, element number 2n corresponds to (match-beginning n); and element number 2n + 1 corresponds to (match-end n).

Normally all the elements are markers or nil, but if integers is non-nil, that means to use integers instead of markers. (In that case, the buffer itself is appended as an additional element at the end of the list, to facilitate complete restoration of the match data.) If the last match was done on a string with string-match, then integers are always used, since markers can’t point into a string.

If reuse is non-nil, it should be a list. In that case, match-data stores the match data in reuse. That is, reuse is destructively modified. reuse does not need to have the right length. If it is not long enough to contain the match data, it is extended. If it is too long, the length of reuse stays the same, but the elements that were not used are set to nil. The purpose of this feature is to reduce the need for garbage collection.

If reseat is non-nil, all markers on the reuse list are reseated to point to nowhere.

As always, there must be no possibility of intervening searches between the call to a search function and the call to match-data that is intended to access the match data for that search.

(match-data)
     ⇒  (#<marker at 9 in foo>
          #<marker at 17 in foo>
          #<marker at 13 in foo>
          #<marker at 17 in foo>)
Function: set-match-data match-list &optional reseat

This function sets the match data from the elements of match-list, which should be a list that was the value of a previous call to match-data. (More precisely, anything that has the same format will work.)

If match-list refers to a buffer that doesn’t exist, you don’t get an error; that sets the match data in a meaningless but harmless way.

If reseat is non-nil, all markers on the match-list list are reseated to point to nowhere.

store-match-data is a semi-obsolete alias for set-match-data.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.6.4 Saving and Restoring the Match Data

When you call a function that may search, you may need to save and restore the match data around that call, if you want to preserve the match data from an earlier search for later use. Here is an example that shows the problem that arises if you fail to save the match data:

(re-search-forward "The \\(cat \\)")
     ⇒ 48
(foo)                   ; foo does more searching.
(match-end 0)
     ⇒ 61              ; Unexpected result—not 48!

You can save and restore the match data with save-match-data:

Macro: save-match-data body…

This macro executes body, saving and restoring the match data around it. The return value is the value of the last form in body.

You could use set-match-data together with match-data to imitate the effect of the special form save-match-data. Here is how:

(let ((data (match-data)))
  (unwind-protect
      …   ; Ok to change the original match data.
    (set-match-data data)))

Emacs automatically saves and restores the match data when it runs process filter functions (see section Process Filter Functions) and process sentinels (see section Sentinels: Detecting Process Status Changes).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.7 Search and Replace

If you want to find all matches for a regexp in part of the buffer, and replace them, the best way is to write an explicit loop using re-search-forward and replace-match, like this:

(while (re-search-forward "foo[ \t]+bar" nil t)
  (replace-match "foobar"))

See section Replacing the Text that Matched, for a description of replace-match.

However, replacing matches in a string is more complex, especially if you want to do it efficiently. So Emacs provides a function to do this.

Function: replace-regexp-in-string regexp rep string &optional fixedcase literal subexp start

This function copies string and searches it for matches for regexp, and replaces them with rep. It returns the modified copy. If start is non-nil, the search for matches starts at that index in string, so matches starting before that index are not changed.

This function uses replace-match to do the replacement, and it passes the optional arguments fixedcase, literal and subexp along to replace-match.

Instead of a string, rep can be a function. In that case, replace-regexp-in-string calls rep for each match, passing the text of the match as its sole argument. It collects the value rep returns and passes that to replace-match as the replacement string. The match data at this point are the result of matching regexp against a substring of string.

If you want to write a command along the lines of query-replace, you can use perform-replace to do the work.

Function: perform-replace from-string replacements query-flag regexp-flag delimited-flag &optional repeat-count map start end

This function is the guts of query-replace and related commands. It searches for occurrences of from-string in the text between positions start and end and replaces some or all of them. If start is nil (or omitted), point is used instead, and the end of the buffer’s accessible portion is used for end.

If query-flag is nil, it replaces all occurrences; otherwise, it asks the user what to do about each one.

If regexp-flag is non-nil, then from-string is considered a regular expression; otherwise, it must match literally. If delimited-flag is non-nil, then only replacements surrounded by word boundaries are considered.

The argument replacements specifies what to replace occurrences with. If it is a string, that string is used. It can also be a list of strings, to be used in cyclic order.

If replacements is a cons cell, (function . data), this means to call function after each match to get the replacement text. This function is called with two arguments: data, and the number of replacements already made.

If repeat-count is non-nil, it should be an integer. Then it specifies how many times to use each of the strings in the replacements list before advancing cyclically to the next one.

If from-string contains upper-case letters, then perform-replace binds case-fold-search to nil, and it uses the replacements without altering their case.

Normally, the keymap query-replace-map defines the possible user responses for queries. The argument map, if non-nil, specifies a keymap to use instead of query-replace-map.

This function uses one of two functions to search for the next occurrence of from-string. These functions are specified by the values of two variables: replace-re-search-function and replace-search-function. The former is called when the argument regexp-flag is non-nil, the latter when it is nil.

Variable: query-replace-map

This variable holds a special keymap that defines the valid user responses for perform-replace and the commands that use it, as well as y-or-n-p and map-y-or-n-p. This map is unusual in two ways:

Here are the meaningful “bindings” for query-replace-map. Several of them are meaningful only for query-replace and friends.

act

Do take the action being considered—in other words, “yes”.

skip

Do not take action for this question—in other words, “no”.

exit

Answer this question “no”, and give up on the entire series of questions, assuming that the answers will be “no”.

exit-prefix

Like exit, but add the key that was pressed to unread-command-events (see section Miscellaneous Event Input Features).

act-and-exit

Answer this question “yes”, and give up on the entire series of questions, assuming that subsequent answers will be “no”.

act-and-show

Answer this question “yes”, but show the results—don’t advance yet to the next question.

automatic

Answer this question and all subsequent questions in the series with “yes”, without further user interaction.

backup

Move back to the previous place that a question was asked about.

edit

Enter a recursive edit to deal with this question—instead of any other action that would normally be taken.

edit-replacement

Edit the replacement for this question in the minibuffer.

delete-and-edit

Delete the text being considered, then enter a recursive edit to replace it.

recenter
scroll-up
scroll-down
scroll-other-window
scroll-other-window-down

Perform the specified window scroll operation, then ask the same question again. Only y-or-n-p and related functions use this answer.

quit

Perform a quit right away. Only y-or-n-p and related functions use this answer.

help

Display some help, then ask again.

Variable: multi-query-replace-map

This variable holds a keymap that extends query-replace-map by providing additional keybindings that are useful in multi-buffer replacements. The additional “bindings” are:

automatic-all

Answer this question and all subsequent questions in the series with “yes”, without further user interaction, for all remaining buffers.

exit-current

Answer this question “no”, and give up on the entire series of questions for the current buffer. Continue to the next buffer in the sequence.

Variable: replace-search-function

This variable specifies a function that perform-replace calls to search for the next string to replace. Its default value is search-forward. Any other value should name a function of 3 arguments: the first 3 arguments of search-forward (see section Searching for Strings).

Variable: replace-re-search-function

This variable specifies a function that perform-replace calls to search for the next regexp to replace. Its default value is re-search-forward. Any other value should name a function of 3 arguments: the first 3 arguments of re-search-forward (see section Regular Expression Searching).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

33.8 Standard Regular Expressions Used in Editing

This section describes some variables that hold regular expressions used for certain purposes in editing:

User Option: page-delimiter

This is the regular expression describing line-beginnings that separate pages. The default value is "^\014" (i.e., "^^L" or "^\C-l"); this matches a line that starts with a formfeed character.

The following two regular expressions should not assume the match always starts at the beginning of a line; they should not use ‘^’ to anchor the match. Most often, the paragraph commands do check for a match only at the beginning of a line, which means that ‘^’ would be superfluous. When there is a nonzero left margin, they accept matches that start after the left margin. In that case, a ‘^’ would be incorrect. However, a ‘^’ is harmless in modes where a left margin is never used.

User Option: paragraph-separate

This is the regular expression for recognizing the beginning of a line that separates paragraphs. (If you change this, you may have to change paragraph-start also.) The default value is "[ \t\f]*$", which matches a line that consists entirely of spaces, tabs, and form feeds (after its left margin).

User Option: paragraph-start

This is the regular expression for recognizing the beginning of a line that starts or separates paragraphs. The default value is "\f\\|[ \t]*$", which matches a line containing only whitespace or starting with a form feed (after its left margin).

User Option: sentence-end

If non-nil, the value should be a regular expression describing the end of a sentence, including the whitespace following the sentence. (All paragraph boundaries also end sentences, regardless.)

If the value is nil, as it is by default, then the function sentence-end constructs the regexp. That is why you should always call the function sentence-end to obtain the regexp to be used to recognize the end of a sentence.

Function: sentence-end

This function returns the value of the variable sentence-end, if non-nil. Otherwise it returns a default value based on the values of the variables sentence-end-double-space (see Definition of sentence-end-double-space), sentence-end-without-period, and sentence-end-without-space.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34 Syntax Tables

A syntax table specifies the syntactic role of each character in a buffer. It can be used to determine where words, symbols, and other syntactic constructs begin and end. This information is used by many Emacs facilities, including Font Lock mode (see section Font Lock Mode) and the various complex movement commands (see section Motion).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.1 Syntax Table Concepts

A syntax table is a data structure which can be used to look up the syntax class and other syntactic properties of each character. Syntax tables are used by Lisp programs for scanning and moving across text.

Internally, a syntax table is a char-table (see section Char-Tables). The element at index c describes the character with code c; its value is a cons cell which specifies the syntax of the character in question. See section Syntax Table Internals, for details. However, instead of using aset and aref to modify and inspect syntax table contents, you should usually use the higher-level functions char-syntax and modify-syntax-entry, which are described in Syntax Table Functions.

Function: syntax-table-p object

This function returns t if object is a syntax table.

Each buffer has its own major mode, and each major mode has its own idea of the syntax class of various characters. For example, in Lisp mode, the character ‘;’ begins a comment, but in C mode, it terminates a statement. To support these variations, the syntax table is local to each buffer. Typically, each major mode has its own syntax table, which it installs in all buffers that use that mode. For example, the variable emacs-lisp-mode-syntax-table holds the syntax table used by Emacs Lisp mode, and c-mode-syntax-table holds the syntax table used by C mode. Changing a major mode’s syntax table alters the syntax in all of that mode’s buffers, as well as in any buffers subsequently put in that mode. Occasionally, several similar modes share one syntax table. See section Major Mode Examples, for an example of how to set up a syntax table.

A syntax table can inherit from another syntax table, which is called its parent syntax table. A syntax table can leave the syntax class of some characters unspecified, by giving them the “inherit” syntax class; such a character then acquires the syntax class specified by the parent syntax table (see section Table of Syntax Classes). Emacs defines a standard syntax table, which is the default parent syntax table, and is also the syntax table used by Fundamental mode.

Function: standard-syntax-table

This function returns the standard syntax table, which is the syntax table used in Fundamental mode.

Syntax tables are not used by the Emacs Lisp reader, which has its own built-in syntactic rules which cannot be changed. (Some Lisp systems provide ways to redefine the read syntax, but we decided to leave this feature out of Emacs Lisp for simplicity.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.2 Syntax Descriptors

The syntax class of a character describes its syntactic role. Each syntax table specifies the syntax class of each character. There is no necessary relationship between the class of a character in one syntax table and its class in any other table.

Each syntax class is designated by a mnemonic character, which serves as the name of the class when you need to specify a class. Usually, this designator character is one that is often assigned that class; however, its meaning as a designator is unvarying and independent of what syntax that character currently has. Thus, ‘\’ as a designator character always means “escape character” syntax, regardless of whether the ‘\’ character actually has that syntax in the current syntax table. See section Table of Syntax Classes, for a list of syntax classes and their designator characters.

A syntax descriptor is a Lisp string that describes the syntax class and other syntactic properties of a character. When you want to modify the syntax of a character, that is done by calling the function modify-syntax-entry and passing a syntax descriptor as one of its arguments (see section Syntax Table Functions).

The first character in a syntax descriptor must be a syntax class designator character. The second character, if present, specifies a matching character (e.g., in Lisp, the matching character for ‘(’ is ‘)’); a space specifies that there is no matching character. Then come characters specifying additional syntax properties (see section Syntax Flags).

If no matching character or flags are needed, only one character (specifying the syntax class) is sufficient.

For example, the syntax descriptor for the character ‘*’ in C mode is ". 23" (i.e., punctuation, matching character slot unused, second character of a comment-starter, first character of a comment-ender), and the entry for ‘/’ is ‘. 14’ (i.e., punctuation, matching character slot unused, first character of a comment-starter, second character of a comment-ender).

Emacs also defines raw syntax descriptors, which are used to describe syntax classes at a lower level. See section Syntax Table Internals.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.2.1 Table of Syntax Classes

Here is a table of syntax classes, the characters that designate them, their meanings, and examples of their use.

Whitespace characters: ‘ ’ or ‘-

Characters that separate symbols and words from each other. Typically, whitespace characters have no other syntactic significance, and multiple whitespace characters are syntactically equivalent to a single one. Space, tab, and formfeed are classified as whitespace in almost all major modes.

This syntax class can be designated by either ‘  or ‘-’. Both designators are equivalent.

Word constituents: ‘w

Parts of words in human languages. These are typically used in variable and command names in programs. All upper- and lower-case letters, and the digits, are typically word constituents.

Symbol constituents: ‘_

Extra characters used in variable and command names along with word constituents. Examples include the characters ‘$&*+-_<>’ in Lisp mode, which may be part of a symbol name even though they are not part of English words. In standard C, the only non-word-constituent character that is valid in symbols is underscore (‘_’).

Punctuation characters: ‘.

Characters used as punctuation in a human language, or used in a programming language to separate symbols from one another. Some programming language modes, such as Emacs Lisp mode, have no characters in this class since the few characters that are not symbol or word constituents all have other uses. Other programming language modes, such as C mode, use punctuation syntax for operators.

Open parenthesis characters: ‘(
Close parenthesis characters: ‘)

Characters used in dissimilar pairs to surround sentences or expressions. Such a grouping is begun with an open parenthesis character and terminated with a close. Each open parenthesis character matches a particular close parenthesis character, and vice versa. Normally, Emacs indicates momentarily the matching open parenthesis when you insert a close parenthesis. See section Blinking Parentheses.

In human languages, and in C code, the parenthesis pairs are ‘()’, ‘[]’, and ‘{}’. In Emacs Lisp, the delimiters for lists and vectors (‘()’ and ‘[]’) are classified as parenthesis characters.

String quotes: ‘"

Characters used to delimit string constants. The same string quote character appears at the beginning and the end of a string. Such quoted strings do not nest.

The parsing facilities of Emacs consider a string as a single token. The usual syntactic meanings of the characters in the string are suppressed.

The Lisp modes have two string quote characters: double-quote (‘"’) and vertical bar (‘|’). ‘|’ is not used in Emacs Lisp, but it is used in Common Lisp. C also has two string quote characters: double-quote for strings, and single-quote (‘'’) for character constants.

Human text has no string quote characters. We do not want quotation marks to turn off the usual syntactic properties of other characters in the quotation.

Escape-syntax characters: ‘\

Characters that start an escape sequence, such as is used in string and character constants. The character ‘\’ belongs to this class in both C and Lisp. (In C, it is used thus only inside strings, but it turns out to cause no trouble to treat it this way throughout C code.)

Characters in this class count as part of words if words-include-escapes is non-nil. See section Motion by Words.

Character quotes: ‘/

Characters used to quote the following character so that it loses its normal syntactic meaning. This differs from an escape character in that only the character immediately following is ever affected.

Characters in this class count as part of words if words-include-escapes is non-nil. See section Motion by Words.

This class is used for backslash in TeX mode.

Paired delimiters: ‘$

Similar to string quote characters, except that the syntactic properties of the characters between the delimiters are not suppressed. Only TeX mode uses a paired delimiter presently—the ‘$’ that both enters and leaves math mode.

Expression prefixes: ‘'

Characters used for syntactic operators that are considered as part of an expression if they appear next to one. In Lisp modes, these characters include the apostrophe, ‘'’ (used for quoting), the comma, ‘,’ (used in macros), and ‘#’ (used in the read syntax for certain data types).

Comment starters: ‘<
Comment enders: ‘>

Characters used in various languages to delimit comments. Human text has no comment characters. In Lisp, the semicolon (‘;’) starts a comment and a newline or formfeed ends one.

Inherit standard syntax: ‘@

This syntax class does not specify a particular syntax. It says to look in the standard syntax table to find the syntax of this character.

Generic comment delimiters: ‘!

Characters that start or end a special kind of comment. Any generic comment delimiter matches any generic comment delimiter, but they cannot match a comment starter or comment ender; generic comment delimiters can only match each other.

This syntax class is primarily meant for use with the syntax-table text property (see section Syntax Properties). You can mark any range of characters as forming a comment, by giving the first and last characters of the range syntax-table properties identifying them as generic comment delimiters.

Generic string delimiters: ‘|

Characters that start or end a string. This class differs from the string quote class in that any generic string delimiter can match any other generic string delimiter; but they do not match ordinary string quote characters.

This syntax class is primarily meant for use with the syntax-table text property (see section Syntax Properties). You can mark any range of characters as forming a string constant, by giving the first and last characters of the range syntax-table properties identifying them as generic string delimiters.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.2.2 Syntax Flags

In addition to the classes, entries for characters in a syntax table can specify flags. There are eight possible flags, represented by the characters ‘1’, ‘2’, ‘3’, ‘4’, ‘b’, ‘c’, ‘n’, and ‘p’.

All the flags except ‘p’ are used to describe comment delimiters. The digit flags are used for comment delimiters made up of 2 characters. They indicate that a character can also be part of a comment sequence, in addition to the syntactic properties associated with its character class. The flags are independent of the class and each other for the sake of characters such as ‘*’ in C mode, which is a punctuation character, and the second character of a start-of-comment sequence (‘/*’), and the first character of an end-of-comment sequence (‘*/’). The flags ‘b’, ‘c’, and ‘n’ are used to qualify the corresponding comment delimiter.

Here is a table of the possible flags for a character c, and what they mean:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.3 Syntax Table Functions

In this section we describe functions for creating, accessing and altering syntax tables.

Function: make-syntax-table &optional table

This function creates a new syntax table. If table is non-nil, the parent of the new syntax table is table; otherwise, the parent is the standard syntax table.

In the new syntax table, all characters are initially given the “inherit” (‘@’) syntax class, i.e., their syntax is inherited from the parent table (see section Table of Syntax Classes).

Function: copy-syntax-table &optional table

This function constructs a copy of table and returns it. If table is omitted or nil, it returns a copy of the standard syntax table. Otherwise, an error is signaled if table is not a syntax table.

Command: modify-syntax-entry char syntax-descriptor &optional table

This function sets the syntax entry for char according to syntax-descriptor. char must be a character, or a cons cell of the form (min . max); in the latter case, the function sets the syntax entries for all characters in the range between min and max, inclusive.

The syntax is changed only for table, which defaults to the current buffer’s syntax table, and not in any other syntax table.

The argument syntax-descriptor is a syntax descriptor, i.e., a string whose first character is a syntax class designator and whose second and subsequent characters optionally specify a matching character and syntax flags. See section Syntax Descriptors. An error is signaled if syntax-descriptor is not a valid syntax descriptor.

This function always returns nil. The old syntax information in the table for this character is discarded.

Examples:

;; Put the space character in class whitespace.
(modify-syntax-entry ?\s " ")
     ⇒ nil

;; Make ‘$’ an open parenthesis character,
;;   with ‘^’ as its matching close.
(modify-syntax-entry ?$ "(^")
     ⇒ nil

;; Make ‘^’ a close parenthesis character,
;;   with ‘$’ as its matching open.
(modify-syntax-entry ?^ ")$")
     ⇒ nil

;; Make ‘/’ a punctuation character,
;;   the first character of a start-comment sequence,
;;   and the second character of an end-comment sequence.
;;   This is used in C mode.
(modify-syntax-entry ?/ ". 14")
     ⇒ nil
Function: char-syntax character

This function returns the syntax class of character, represented by its designator character (see section Table of Syntax Classes). This returns only the class, not its matching character or syntax flags.

The following examples apply to C mode. (We use string to make it easier to see the character returned by char-syntax.)

;; Space characters have whitespace syntax class.
(string (char-syntax ?\s))
     ⇒ " "

;; Forward slash characters have punctuation syntax.
;; Note that this char-syntax call does not reveal
;; that it is also part of comment-start and -end sequences.
(string (char-syntax ?/))
     ⇒ "."

;; Open parenthesis characters have open parenthesis syntax.
;; Note that this char-syntax call does not reveal that
;; it has a matching character, ‘)’.
(string (char-syntax ?\())
     ⇒ "("
Function: set-syntax-table table

This function makes table the syntax table for the current buffer. It returns table.

Function: syntax-table

This function returns the current syntax table, which is the table for the current buffer.

Command: describe-syntax &optional buffer

This command displays the contents of the syntax table of buffer (by default, the current buffer) in a help buffer.

Macro: with-syntax-table table body…

This macro executes body using table as the current syntax table. It returns the value of the last form in body, after restoring the old current syntax table.

Since each buffer has its own current syntax table, we should make that more precise: with-syntax-table temporarily alters the current syntax table of whichever buffer is current at the time the macro execution starts. Other buffers are not affected.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.4 Syntax Properties

When the syntax table is not flexible enough to specify the syntax of a language, you can override the syntax table for specific character occurrences in the buffer, by applying a syntax-table text property. See section Text Properties, for how to apply text properties.

The valid values of syntax-table text property are:

syntax-table

If the property value is a syntax table, that table is used instead of the current buffer’s syntax table to determine the syntax for the underlying text character.

(syntax-code . matching-char)

A cons cell of this format is a raw syntax descriptor (see section Syntax Table Internals), which directly specifies a syntax class for the underlying text character.

nil

If the property is nil, the character’s syntax is determined from the current syntax table in the usual way.

Variable: parse-sexp-lookup-properties

If this is non-nil, the syntax scanning functions, like forward-sexp, pay attention to syntax text properties. Otherwise they use only the current syntax table.

Variable: syntax-propertize-function

This variable, if non-nil, should store a function for applying syntax-table properties to a specified stretch of text. It is intended to be used by major modes to install a function which applies syntax-table properties in some mode-appropriate way.

The function is called by syntax-ppss (see section Finding the Parse State for a Position), and by Font Lock mode during syntactic fontification (see section Syntactic Font Lock). It is called with two arguments, start and end, which are the starting and ending positions of the text on which it should act. It is allowed to call syntax-ppss on any position before end. However, it should not call syntax-ppss-flush-cache; so, it is not allowed to call syntax-ppss on some position and later modify the buffer at an earlier position.

Variable: syntax-propertize-extend-region-functions

This abnormal hook is run by the syntax parsing code prior to calling syntax-propertize-function. Its role is to help locate safe starting and ending buffer positions for passing to syntax-propertize-function. For example, a major mode can add a function to this hook to identify multi-line syntactic constructs, and ensure that the boundaries do not fall in the middle of one.

Each function in this hook should accept two arguments, start and end. It should return either a cons cell of two adjusted buffer positions, (new-start . new-end), or nil if no adjustment is necessary. The hook functions are run in turn, repeatedly, until they all return nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.5 Motion and Syntax

This section describes functions for moving across characters that have certain syntax classes.

Function: skip-syntax-forward syntaxes &optional limit

This function moves point forward across characters having syntax classes mentioned in syntaxes (a string of syntax class characters). It stops when it encounters the end of the buffer, or position limit (if specified), or a character it is not supposed to skip.

If syntaxes starts with ‘^’, then the function skips characters whose syntax is not in syntaxes.

The return value is the distance traveled, which is a nonnegative integer.

Function: skip-syntax-backward syntaxes &optional limit

This function moves point backward across characters whose syntax classes are mentioned in syntaxes. It stops when it encounters the beginning of the buffer, or position limit (if specified), or a character it is not supposed to skip.

If syntaxes starts with ‘^’, then the function skips characters whose syntax is not in syntaxes.

The return value indicates the distance traveled. It is an integer that is zero or less.

Function: backward-prefix-chars

This function moves point backward over any number of characters with expression prefix syntax. This includes both characters in the expression prefix syntax class, and characters with the ‘p’ flag.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6 Parsing Expressions

This section describes functions for parsing and scanning balanced expressions. We will refer to such expressions as sexps, following the terminology of Lisp, even though these functions can act on languages other than Lisp. Basically, a sexp is either a balanced parenthetical grouping, a string, or a “symbol” (i.e., a sequence of characters whose syntax is either word constituent or symbol constituent). However, characters in the expression prefix syntax class (see section Table of Syntax Classes) are treated as part of the sexp if they appear next to it.

The syntax table controls the interpretation of characters, so these functions can be used for Lisp expressions when in Lisp mode and for C expressions when in C mode. See section Moving over Balanced Expressions, for convenient higher-level functions for moving over balanced expressions.

A character’s syntax controls how it changes the state of the parser, rather than describing the state itself. For example, a string delimiter character toggles the parser state between “in-string” and “in-code”, but the syntax of characters does not directly say whether they are inside a string. For example (note that 15 is the syntax code for generic string delimiters),

(put-text-property 1 9 'syntax-table '(15 . nil))

does not tell Emacs that the first eight chars of the current buffer are a string, but rather that they are all string delimiters. As a result, Emacs treats them as four consecutive empty string constants.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.1 Motion Commands Based on Parsing

This section describes simple point-motion functions that operate based on parsing expressions.

Function: scan-lists from count depth

This function scans forward count balanced parenthetical groupings from position from. It returns the position where the scan stops. If count is negative, the scan moves backwards.

If depth is nonzero, treat the starting position as being depth parentheses deep. The scanner moves forward or backward through the buffer until the depth changes to zero count times. Hence, a positive value for depth has the effect of moving out depth levels of parenthesis from the starting position, while a negative depth has the effect of moving deeper by -depth levels of parenthesis.

Scanning ignores comments if parse-sexp-ignore-comments is non-nil.

If the scan reaches the beginning or end of the accessible part of the buffer before it has scanned over count parenthetical groupings, the return value is nil if the depth at that point is zero; if the depth is non-zero, a scan-error error is signaled.

Function: scan-sexps from count

This function scans forward count sexps from position from. It returns the position where the scan stops. If count is negative, the scan moves backwards.

Scanning ignores comments if parse-sexp-ignore-comments is non-nil.

If the scan reaches the beginning or end of (the accessible part of) the buffer while in the middle of a parenthetical grouping, an error is signaled. If it reaches the beginning or end between groupings but before count is used up, nil is returned.

Function: forward-comment count

This function moves point forward across count complete comments (that is, including the starting delimiter and the terminating delimiter if any), plus any whitespace encountered on the way. It moves backward if count is negative. If it encounters anything other than a comment or whitespace, it stops, leaving point at the place where it stopped. This includes (for instance) finding the end of a comment when moving forward and expecting the beginning of one. The function also stops immediately after moving over the specified number of complete comments. If count comments are found as expected, with nothing except whitespace between them, it returns t; otherwise it returns nil.

This function cannot tell whether the “comments” it traverses are embedded within a string. If they look like comments, it treats them as comments.

To move forward over all comments and whitespace following point, use (forward-comment (buffer-size)). (buffer-size) is a good argument to use, because the number of comments in the buffer cannot exceed that many.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.2 Finding the Parse State for a Position

For syntactic analysis, such as in indentation, often the useful thing is to compute the syntactic state corresponding to a given buffer position. This function does that conveniently.

Function: syntax-ppss &optional pos

This function returns the parser state that the parser would reach at position pos starting from the beginning of the buffer. See section Parser State, for a description of the parser state.

The return value is the same as if you call the low-level parsing function parse-partial-sexp to parse from the beginning of the buffer to pos (see section Low-Level Parsing). However, syntax-ppss uses a cache to speed up the computation. Due to this optimization, the second value (previous complete subexpression) and sixth value (minimum parenthesis depth) in the returned parser state are not meaningful.

This function has a side effect: it adds a buffer-local entry to before-change-functions (see section Change Hooks) for syntax-ppss-flush-cache (see below). This entry keeps the cache consistent as the buffer is modified. However, the cache might not be updated if syntax-ppss is called while before-change-functions is temporarily let-bound, or if the buffer is modified without running the hook, such as when using inhibit-modification-hooks. In those cases, it is necessary to call syntax-ppss-flush-cache explicitly.

Function: syntax-ppss-flush-cache beg &rest ignored-args

This function flushes the cache used by syntax-ppss, starting at position beg. The remaining arguments, ignored-args, are ignored; this function accepts them so that it can be directly used on hooks such as before-change-functions (see section Change Hooks).

Major modes can make syntax-ppss run faster by specifying where it needs to start parsing.

Variable: syntax-begin-function

If this is non-nil, it should be a function that moves to an earlier buffer position where the parser state is equivalent to nil—in other words, a position outside of any comment, string, or parenthesis. syntax-ppss uses it to further optimize its computations, when the cache gives no help.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.3 Parser State

A parser state is a list of ten elements describing the state of the syntactic parser, after it parses the text between a specified starting point and a specified end point in the buffer. Parsing functions such as syntax-ppss (see section Finding the Parse State for a Position) return a parser state as the value. Some parsing functions accept a parser state as an argument, for resuming parsing.

Here are the meanings of the elements of the parser state:

  1. The depth in parentheses, counting from 0. Warning: this can be negative if there are more close parens than open parens between the parser’s starting point and end point.
  2. The character position of the start of the innermost parenthetical grouping containing the stopping point; nil if none.
  3. The character position of the start of the last complete subexpression terminated; nil if none.
  4. Non-nil if inside a string. More precisely, this is the character that will terminate the string, or t if a generic string delimiter character should terminate it.
  5. t if inside a non-nestable comment (of any comment style; see section Syntax Flags); or the comment nesting level if inside a comment that can be nested.
  6. t if the end point is just after a quote character.
  7. The minimum parenthesis depth encountered during this scan.
  8. What kind of comment is active: nil if not in a comment or in a comment of style ‘a’; 1 for a comment of style ‘b’; 2 for a comment of style ‘c’; and syntax-table for a comment that should be ended by a generic comment delimiter character.
  9. The string or comment start position. While inside a comment, this is the position where the comment began; while inside a string, this is the position where the string began. When outside of strings and comments, this element is nil.
  10. Internal data for continuing the parsing. The meaning of this data is subject to change; it is used if you pass this list as the state argument to another call.

Elements 1, 2, and 6 are ignored in a state which you pass as an argument to continue parsing, and elements 8 and 9 are used only in trivial cases. Those elements are mainly used internally by the parser code.

One additional piece of useful information is available from a parser state using this function:

Function: syntax-ppss-toplevel-pos state

This function extracts, from parser state state, the last position scanned in the parse which was at top level in grammatical structure. “At top level” means outside of any parentheses, comments, or strings.

The value is nil if state represents a parse which has arrived at a top level position.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.4 Low-Level Parsing

The most basic way to use the expression parser is to tell it to start at a given position with a certain state, and parse up to a specified end position.

Function: parse-partial-sexp start limit &optional target-depth stop-before state stop-comment

This function parses a sexp in the current buffer starting at start, not scanning past limit. It stops at position limit or when certain criteria described below are met, and sets point to the location where parsing stops. It returns a parser state describing the status of the parse at the point where it stops.

If the third argument target-depth is non-nil, parsing stops if the depth in parentheses becomes equal to target-depth. The depth starts at 0, or at whatever is given in state.

If the fourth argument stop-before is non-nil, parsing stops when it comes to any character that starts a sexp. If stop-comment is non-nil, parsing stops when it comes to the start of a comment. If stop-comment is the symbol syntax-table, parsing stops after the start of a comment or a string, or the end of a comment or a string, whichever comes first.

If state is nil, start is assumed to be at the top level of parenthesis structure, such as the beginning of a function definition. Alternatively, you might wish to resume parsing in the middle of the structure. To do this, you must provide a state argument that describes the initial status of parsing. The value returned by a previous call to parse-partial-sexp will do nicely.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.6.5 Parameters to Control Parsing

Variable: multibyte-syntax-as-symbol

If this variable is non-nil, scan-sexps treats all non-ASCII characters as symbol constituents regardless of what the syntax table says about them. (However, text properties can still override the syntax.)

User Option: parse-sexp-ignore-comments

If the value is non-nil, then comments are treated as whitespace by the functions in this section and by forward-sexp, scan-lists and scan-sexps.

The behavior of parse-partial-sexp is also affected by parse-sexp-lookup-properties (see section Syntax Properties).

You can use forward-comment to move forward or backward over one comment or several comments.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.7 Syntax Table Internals

Syntax tables are implemented as char-tables (see section Char-Tables), but most Lisp programs don’t work directly with their elements. Syntax tables do not store syntax data as syntax descriptors (see section Syntax Descriptors); they use an internal format, which is documented in this section. This internal format can also be assigned as syntax properties (see section Syntax Properties).

Each entry in a syntax table is a raw syntax descriptor: a cons cell of the form (syntax-code . matching-char). syntax-code is an integer which encodes the syntax class and syntax flags, according to the table below. matching-char, if non-nil, specifies a matching character (similar to the second character in a syntax descriptor).

Here are the syntax codes corresponding to the various syntax classes:

CodeClassCodeClass
0whitespace8paired delimiter
1punctuation9escape
2word10character quote
3symbol11comment-start
4open parenthesis12comment-end
5close parenthesis13inherit
6expression prefix14generic comment
7string quote15generic string

For example, in the standard syntax table, the entry for ‘(’ is (4 . 41). 41 is the character code for ‘)’.

Syntax flags are encoded in higher order bits, starting 16 bits from the least significant bit. This table gives the power of two which corresponds to each syntax flag.

PrefixFlagPrefixFlag
1(lsh 1 16)p(lsh 1 20)
2(lsh 1 17)b(lsh 1 21)
3(lsh 1 18)n(lsh 1 22)
4(lsh 1 19)
Function: string-to-syntax desc

Given a syntax descriptor desc (a string), this function returns the corresponding raw syntax descriptor.

Function: syntax-after pos

This function returns the raw syntax descriptor for the character in the buffer after position pos, taking account of syntax properties as well as the syntax table. If pos is outside the buffer’s accessible portion (see section accessible portion), the return value is nil.

Function: syntax-class syntax

This function returns the syntax code for the raw syntax descriptor syntax. More precisely, it takes the raw syntax descriptor’s syntax-code component, masks off the high 16 bits which record the syntax flags, and returns the resulting integer.

If syntax is nil, the return value is returns nil. This is so that the expression

(syntax-class (syntax-after pos))

evaluates to nil if pos is outside the buffer’s accessible portion, without throwing errors or returning an incorrect code.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

34.8 Categories

Categories provide an alternate way of classifying characters syntactically. You can define several categories as needed, then independently assign each character to one or more categories. Unlike syntax classes, categories are not mutually exclusive; it is normal for one character to belong to several categories.

Each buffer has a category table which records which categories are defined and also which characters belong to each category. Each category table defines its own categories, but normally these are initialized by copying from the standard categories table, so that the standard categories are available in all modes.

Each category has a name, which is an ASCII printing character in the range ‘  to ‘~’. You specify the name of a category when you define it with define-category.

The category table is actually a char-table (see section Char-Tables). The element of the category table at index c is a category set—a bool-vector—that indicates which categories character c belongs to. In this category set, if the element at index cat is t, that means category cat is a member of the set, and that character c belongs to category cat.

For the next three functions, the optional argument table defaults to the current buffer’s category table.

Function: define-category char docstring &optional table

This function defines a new category, with name char and documentation docstring, for the category table table.

Here’s an example of defining a new category for characters that have strong right-to-left directionality (see section Bidirectional Display) and using it in a special category table:

(defvar special-category-table-for-bidi
  (let ((category-table (make-category-table))
	(uniprop-table (unicode-property-table-internal 'bidi-class)))
    (define-category ?R "Characters of bidi-class R, AL, or RLO"
                     category-table)
    (map-char-table
     #'(lambda (key val)
	 (if (memq val '(R AL RLO))
	     (modify-category-entry key ?R category-table)))
     uniprop-table)
    category-table))
Function: category-docstring category &optional table

This function returns the documentation string of category category in category table table.

(category-docstring ?a)
     ⇒ "ASCII"
(category-docstring ?l)
     ⇒ "Latin"
Function: get-unused-category &optional table

This function returns a category name (a character) which is not currently defined in table. If all possible categories are in use in table, it returns nil.

Function: category-table

This function returns the current buffer’s category table.

Function: category-table-p object

This function returns t if object is a category table, otherwise nil.

Function: standard-category-table

This function returns the standard category table.

Function: copy-category-table &optional table

This function constructs a copy of table and returns it. If table is not supplied (or is nil), it returns a copy of the standard category table. Otherwise, an error is signaled if table is not a category table.

Function: set-category-table table

This function makes table the category table for the current buffer. It returns table.

Function: make-category-table

This creates and returns an empty category table. In an empty category table, no categories have been allocated, and no characters belong to any categories.

Function: make-category-set categories

This function returns a new category set—a bool-vector—whose initial contents are the categories listed in the string categories. The elements of categories should be category names; the new category set has t for each of those categories, and nil for all other categories.

(make-category-set "al")
     ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
Function: char-category-set char

This function returns the category set for character char in the current buffer’s category table. This is the bool-vector which records which categories the character char belongs to. The function char-category-set does not allocate storage, because it returns the same bool-vector that exists in the category table.

(char-category-set ?a)
     ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
Function: category-set-mnemonics category-set

This function converts the category set category-set into a string containing the characters that designate the categories that are members of the set.

(category-set-mnemonics (char-category-set ?a))
     ⇒ "al"
Function: modify-category-entry char category &optional table reset

This function modifies the category set of char in category table table (which defaults to the current buffer’s category table). char can be a character, or a cons cell of the form (min . max); in the latter case, the function modifies the category sets of all characters in the range between min and max, inclusive.

Normally, it modifies a category set by adding category to it. But if reset is non-nil, then it deletes category instead.

Command: describe-categories &optional buffer-or-name

This function describes the category specifications in the current category table. It inserts the descriptions in a buffer, and then displays that buffer. If buffer-or-name is non-nil, it describes the category table of that buffer instead.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35 Abbrevs and Abbrev Expansion

An abbreviation or abbrev is a string of characters that may be expanded to a longer string. The user can insert the abbrev string and find it replaced automatically with the expansion of the abbrev. This saves typing.

The set of abbrevs currently in effect is recorded in an abbrev table. Each buffer has a local abbrev table, but normally all buffers in the same major mode share one abbrev table. There is also a global abbrev table. Normally both are used.

An abbrev table is represented as an obarray. See section Creating and Interning Symbols, for information about obarrays. Each abbreviation is represented by a symbol in the obarray. The symbol’s name is the abbreviation; its value is the expansion; its function definition is the hook function for performing the expansion (see section Defining Abbrevs); and its property list cell contains various additional properties, including the use count and the number of times the abbreviation has been expanded (see section Abbrev Properties).

Certain abbrevs, called system abbrevs, are defined by a major mode instead of the user. A system abbrev is identified by its non-nil :system property (see section Abbrev Properties). When abbrevs are saved to an abbrev file, system abbrevs are omitted. See section Saving Abbrevs in Files.

Because the symbols used for abbrevs are not interned in the usual obarray, they will never appear as the result of reading a Lisp expression; in fact, normally they are never used except by the code that handles abbrevs. Therefore, it is safe to use them in a nonstandard way.

If the minor mode Abbrev mode is enabled, the buffer-local variable abbrev-mode is non-nil, and abbrevs are automatically expanded in the buffer. For the user-level commands for abbrevs, see Abbrev Mode in The GNU Emacs Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.1 Abbrev Tables

This section describes how to create and manipulate abbrev tables.

Function: make-abbrev-table &optional props

This function creates and returns a new, empty abbrev table—an obarray containing no symbols. It is a vector filled with zeros. props is a property list that is applied to the new table (see section Abbrev Table Properties).

Function: abbrev-table-p object

This function returns a non-nil value if object is an abbrev table.

Function: clear-abbrev-table abbrev-table

This function undefines all the abbrevs in abbrev-table, leaving it empty.

Function: copy-abbrev-table abbrev-table

This function returns a copy of abbrev-table—a new abbrev table containing the same abbrev definitions. It does not copy any property lists; only the names, values, and functions.

Function: define-abbrev-table tabname definitions &optional docstring &rest props

This function defines tabname (a symbol) as an abbrev table name, i.e., as a variable whose value is an abbrev table. It defines abbrevs in the table according to definitions, a list of elements of the form (abbrevname expansion [hook] [props...]). These elements are passed as arguments to define-abbrev.

The optional string docstring is the documentation string of the variable tabname. The property list props is applied to the abbrev table (see section Abbrev Table Properties).

If this function is called more than once for the same tabname, subsequent calls add the definitions in definitions to tabname, rather than overwriting the entire original contents. (A subsequent call only overrides abbrevs explicitly redefined or undefined in definitions.)

Variable: abbrev-table-name-list

This is a list of symbols whose values are abbrev tables. define-abbrev-table adds the new abbrev table name to this list.

Function: insert-abbrev-table-description name &optional human

This function inserts before point a description of the abbrev table named name. The argument name is a symbol whose value is an abbrev table.

If human is non-nil, the description is human-oriented. System abbrevs are listed and identified as such. Otherwise the description is a Lisp expression—a call to define-abbrev-table that would define name as it is currently defined, but without the system abbrevs. (The mode or package using name is supposed to add these to name separately.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.2 Defining Abbrevs

define-abbrev is the low-level basic function for defining an abbrev in an abbrev table.

When a major mode defines a system abbrev, it should call define-abbrev and specify t for the :system property. Be aware that any saved non-“system” abbrevs are restored at startup, i.e., before some major modes are loaded. Therefore, major modes should not assume that their abbrev tables are empty when they are first loaded.

Function: define-abbrev abbrev-table name expansion &optional hook &rest props

This function defines an abbrev named name, in abbrev-table, to expand to expansion and call hook, with properties props (see section Abbrev Properties). The return value is name. The :system property in props is treated specially here: if it has the value force, then it will overwrite an existing definition even for a non-“system” abbrev of the same name.

name should be a string. The argument expansion is normally the desired expansion (a string), or nil to undefine the abbrev. If it is anything but a string or nil, then the abbreviation “expands” solely by running hook.

The argument hook is a function or nil. If hook is non-nil, then it is called with no arguments after the abbrev is replaced with expansion; point is located at the end of expansion when hook is called.

If hook is a non-nil symbol whose no-self-insert property is non-nil, hook can explicitly control whether to insert the self-inserting input character that triggered the expansion. If hook returns non-nil in this case, that inhibits insertion of the character. By contrast, if hook returns nil, expand-abbrev (or abbrev-insert) also returns nil, as if expansion had not really occurred.

Normally, define-abbrev sets the variable abbrevs-changed to t, if it actually changes the abbrev. This is so that some commands will offer to save the abbrevs. It does not do this for a system abbrev, since those aren’t saved anyway.

User Option: only-global-abbrevs

If this variable is non-nil, it means that the user plans to use global abbrevs only. This tells the commands that define mode-specific abbrevs to define global ones instead. This variable does not alter the behavior of the functions in this section; it is examined by their callers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.3 Saving Abbrevs in Files

A file of saved abbrev definitions is actually a file of Lisp code. The abbrevs are saved in the form of a Lisp program to define the same abbrev tables with the same contents. Therefore, you can load the file with load (see section How Programs Do Loading). However, the function quietly-read-abbrev-file is provided as a more convenient interface. Emacs automatically calls this function at startup.

User-level facilities such as save-some-buffers can save abbrevs in a file automatically, under the control of variables described here.

User Option: abbrev-file-name

This is the default file name for reading and saving abbrevs.

Function: quietly-read-abbrev-file &optional filename

This function reads abbrev definitions from a file named filename, previously written with write-abbrev-file. If filename is omitted or nil, the file specified in abbrev-file-name is used.

As the name implies, this function does not display any messages.

User Option: save-abbrevs

A non-nil value for save-abbrevs means that Emacs should offer to save abbrevs (if any have changed) when files are saved. If the value is silently, Emacs saves the abbrevs without asking the user. abbrev-file-name specifies the file to save the abbrevs in.

Variable: abbrevs-changed

This variable is set non-nil by defining or altering any abbrevs (except system abbrevs). This serves as a flag for various Emacs commands to offer to save your abbrevs.

Command: write-abbrev-file &optional filename

Save all abbrev definitions (except system abbrevs), for all abbrev tables listed in abbrev-table-name-list, in the file filename, in the form of a Lisp program that when loaded will define the same abbrevs. If filename is nil or omitted, abbrev-file-name is used. This function returns nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.4 Looking Up and Expanding Abbreviations

Abbrevs are usually expanded by certain interactive commands, including self-insert-command. This section describes the subroutines used in writing such commands, as well as the variables they use for communication.

Function: abbrev-symbol abbrev &optional table

This function returns the symbol representing the abbrev named abbrev. It returns nil if that abbrev is not defined. The optional second argument table is the abbrev table in which to look it up. If table is nil, this function tries first the current buffer’s local abbrev table, and second the global abbrev table.

Function: abbrev-expansion abbrev &optional table

This function returns the string that abbrev would expand into (as defined by the abbrev tables used for the current buffer). It returns nil if abbrev is not a valid abbrev. The optional argument table specifies the abbrev table to use, as in abbrev-symbol.

Command: expand-abbrev

This command expands the abbrev before point, if any. If point does not follow an abbrev, this command does nothing. To do the expansion, it calls the function that is the value of the abbrev-expand-function variable, with no arguments, and returns whatever that function does.

The default expansion function returns the abbrev symbol if it did expansion, and nil otherwise. If the abbrev symbol has a hook function that is a symbol whose no-self-insert property is non-nil, and if the hook function returns nil as its value, then the default expansion function returns nil, even though expansion did occur.

Function: abbrev-insert abbrev &optional name start end

This function inserts the abbrev expansion of abbrev, replacing the text between start and end. If start is omitted, it defaults to point. name, if non-nil, should be the name by which this abbrev was found (a string); it is used to figure out whether to adjust the capitalization of the expansion. The function returns abbrev if the abbrev was successfully inserted.

Command: abbrev-prefix-mark &optional arg

This command marks the current location of point as the beginning of an abbrev. The next call to expand-abbrev will use the text from here to point (where it is then) as the abbrev to expand, rather than using the previous word as usual.

First, this command expands any abbrev before point, unless arg is non-nil. (Interactively, arg is the prefix argument.) Then it inserts a hyphen before point, to indicate the start of the next abbrev to be expanded. The actual expansion removes the hyphen.

User Option: abbrev-all-caps

When this is set non-nil, an abbrev entered entirely in upper case is expanded using all upper case. Otherwise, an abbrev entered entirely in upper case is expanded by capitalizing each word of the expansion.

Variable: abbrev-start-location

The value of this variable is a buffer position (an integer or a marker) for expand-abbrev to use as the start of the next abbrev to be expanded. The value can also be nil, which means to use the word before point instead. abbrev-start-location is set to nil each time expand-abbrev is called. This variable is also set by abbrev-prefix-mark.

Variable: abbrev-start-location-buffer

The value of this variable is the buffer for which abbrev-start-location has been set. Trying to expand an abbrev in any other buffer clears abbrev-start-location. This variable is set by abbrev-prefix-mark.

Variable: last-abbrev

This is the abbrev-symbol of the most recent abbrev expanded. This information is left by expand-abbrev for the sake of the unexpand-abbrev command (see Expanding Abbrevs in The GNU Emacs Manual).

Variable: last-abbrev-location

This is the location of the most recent abbrev expanded. This contains information left by expand-abbrev for the sake of the unexpand-abbrev command.

Variable: last-abbrev-text

This is the exact expansion text of the most recent abbrev expanded, after case conversion (if any). Its value is nil if the abbrev has already been unexpanded. This contains information left by expand-abbrev for the sake of the unexpand-abbrev command.

Variable: abbrev-expand-function

The value of this variable is a function that expand-abbrev will call with no arguments to do the expansion. The function can do anything it wants before and after performing the expansion. It should return the abbrev symbol if expansion took place.

The following sample code shows a simple use of abbrev-expand-function. It assumes that foo-mode is a mode for editing certain files in which lines that start with ‘#’ are comments. You want to use Text mode abbrevs for those lines. The regular local abbrev table, foo-mode-abbrev-table is appropriate for all other lines. See section Standard Abbrev Tables, for the definitions of local-abbrev-table and text-mode-abbrev-table. See section Advising Emacs Lisp Functions, for details of add-function.

(defun foo-mode-abbrev-expand-function (expand)
  (if (not (save-excursion (forward-line 0) (eq (char-after) ?#)))
      ;; Performs normal expansion.
      (funcall expand)
    ;; We're inside a comment: use the text-mode abbrevs.
    (let ((local-abbrev-table text-mode-abbrev-table))
      (funcall expand))))

(add-hook 'foo-mode-hook
          #'(lambda ()
              (add-function :around (local 'abbrev-expand-function)
                            #'foo-mode-abbrev-expand-function)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.5 Standard Abbrev Tables

Here we list the variables that hold the abbrev tables for the preloaded major modes of Emacs.

Variable: global-abbrev-table

This is the abbrev table for mode-independent abbrevs. The abbrevs defined in it apply to all buffers. Each buffer may also have a local abbrev table, whose abbrev definitions take precedence over those in the global table.

Variable: local-abbrev-table

The value of this buffer-local variable is the (mode-specific) abbreviation table of the current buffer. It can also be a list of such tables.

Variable: abbrev-minor-mode-table-alist

The value of this variable is a list of elements of the form (mode . abbrev-table) where mode is the name of a variable: if the variable is bound to a non-nil value, then the abbrev-table is active, otherwise it is ignored. abbrev-table can also be a list of abbrev tables.

Variable: fundamental-mode-abbrev-table

This is the local abbrev table used in Fundamental mode; in other words, it is the local abbrev table in all buffers in Fundamental mode.

Variable: text-mode-abbrev-table

This is the local abbrev table used in Text mode.

Variable: lisp-mode-abbrev-table

This is the local abbrev table used in Lisp mode. It is the parent of the local abbrev table used in Emacs Lisp mode. See section Abbrev Table Properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.6 Abbrev Properties

Abbrevs have properties, some of which influence the way they work. You can provide them as arguments to define-abbrev, and manipulate them with the following functions:

Function: abbrev-put abbrev prop val

Set the property prop of abbrev to value val.

Function: abbrev-get abbrev prop

Return the property prop of abbrev, or nil if the abbrev has no such property.

The following properties have special meanings:

:count

This property counts the number of times the abbrev has been expanded. If not explicitly set, it is initialized to 0 by define-abbrev.

:system

If non-nil, this property marks the abbrev as a system abbrev. Such abbrevs are not saved (see section Saving Abbrevs in Files).

:enable-function

If non-nil, this property should be a function of no arguments which returns nil if the abbrev should not be used and t otherwise.

:case-fixed

If non-nil, this property indicates that the case of the abbrev’s name is significant and should only match a text with the same pattern of capitalization. It also disables the code that modifies the capitalization of the expansion.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

35.7 Abbrev Table Properties

Like abbrevs, abbrev tables have properties, some of which influence the way they work. You can provide them as arguments to define-abbrev-table, and manipulate them with the functions:

Function: abbrev-table-put table prop val

Set the property prop of abbrev table table to value val.

Function: abbrev-table-get table prop

Return the property prop of abbrev table table, or nil if the abbrev has no such property.

The following properties have special meaning:

:enable-function

This is like the :enable-function abbrev property except that it applies to all abbrevs in the table. It is used before even trying to find the abbrev before point, so it can dynamically modify the abbrev table.

:case-fixed

This is like the :case-fixed abbrev property except that it applies to all abbrevs in the table.

:regexp

If non-nil, this property is a regular expression that indicates how to extract the name of the abbrev before point, before looking it up in the table. When the regular expression matches before point, the abbrev name is expected to be in submatch 1. If this property is nil, the default is to use backward-word and forward-word to find the name. This property allows the use of abbrevs whose name contains characters of non-word syntax.

:parents

This property holds a list of tables from which to inherit other abbrevs.

:abbrev-table-modiff

This property holds a counter incremented each time a new abbrev is added to the table.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36 Processes

In the terminology of operating systems, a process is a space in which a program can execute. Emacs runs in a process. Emacs Lisp programs can invoke other programs in processes of their own. These are called subprocesses or child processes of the Emacs process, which is their parent process.

A subprocess of Emacs may be synchronous or asynchronous, depending on how it is created. When you create a synchronous subprocess, the Lisp program waits for the subprocess to terminate before continuing execution. When you create an asynchronous subprocess, it can run in parallel with the Lisp program. This kind of subprocess is represented within Emacs by a Lisp object which is also called a “process”. Lisp programs can use this object to communicate with the subprocess or to control it. For example, you can send signals, obtain status information, receive output from the process, or send input to it.

Function: processp object

This function returns t if object represents an Emacs subprocess, nil otherwise.

In addition to subprocesses of the current Emacs session, you can also access other processes running on your machine. See section Accessing Other Processes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.1 Functions that Create Subprocesses

There are three primitives that create a new subprocess in which to run a program. One of them, start-process, creates an asynchronous process and returns a process object (see section Creating an Asynchronous Process). The other two, call-process and call-process-region, create a synchronous process and do not return a process object (see section Creating a Synchronous Process). There are various higher-level functions that make use of these primitives to run particular types of process.

Synchronous and asynchronous processes are explained in the following sections. Since the three functions are all called in a similar fashion, their common arguments are described here.

In all cases, the function’s program argument specifies the program to be run. An error is signaled if the file is not found or cannot be executed. If the file name is relative, the variable exec-path contains a list of directories to search. Emacs initializes exec-path when it starts up, based on the value of the environment variable PATH. The standard file name constructs, ‘~’, ‘.’, and ‘..’, are interpreted as usual in exec-path, but environment variable substitutions (‘$HOME’, etc.) are not recognized; use substitute-in-file-name to perform them (see section Functions that Expand Filenames). nil in this list refers to default-directory.

Executing a program can also try adding suffixes to the specified name:

User Option: exec-suffixes

This variable is a list of suffixes (strings) to try adding to the specified program file name. The list should include "" if you want the name to be tried exactly as specified. The default value is system-dependent.

Please note: The argument program contains only the name of the program; it may not contain any command-line arguments. You must use a separate argument, args, to provide those, as described below.

Each of the subprocess-creating functions has a buffer-or-name argument that specifies where the standard output from the program will go. It should be a buffer or a buffer name; if it is a buffer name, that will create the buffer if it does not already exist. It can also be nil, which says to discard the output, unless a custom filter function handles it. (See section Process Filter Functions, and Reading and Printing Lisp Objects.) Normally, you should avoid having multiple processes send output to the same buffer because their output would be intermixed randomly. For synchronous processes, you can send the output to a file instead of a buffer.

All three of the subprocess-creating functions have a &rest argument, args. The args must all be strings, and they are supplied to program as separate command line arguments. Wildcard characters and other shell constructs have no special meanings in these strings, since the strings are passed directly to the specified program.

The subprocess inherits its environment from Emacs, but you can specify overrides for it with process-environment. See section Operating System Environment. The subprocess gets its current directory from the value of default-directory.

Variable: exec-directory

The value of this variable is a string, the name of a directory that contains programs that come with GNU Emacs and are intended for Emacs to invoke. The program movemail is an example of such a program; Rmail uses it to fetch new mail from an inbox.

User Option: exec-path

The value of this variable is a list of directories to search for programs to run in subprocesses. Each element is either the name of a directory (i.e., a string), or nil, which stands for the default directory (which is the value of default-directory).

The value of exec-path is used by call-process and start-process when the program argument is not an absolute file name.

Generally, you should not modify exec-path directly. Instead, ensure that your PATH environment variable is set appropriately before starting Emacs. Trying to modify exec-path independently of PATH can lead to confusing results.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.2 Shell Arguments

Lisp programs sometimes need to run a shell and give it a command that contains file names that were specified by the user. These programs ought to be able to support any valid file name. But the shell gives special treatment to certain characters, and if these characters occur in the file name, they will confuse the shell. To handle these characters, use the function shell-quote-argument:

Function: shell-quote-argument argument

This function returns a string that represents, in shell syntax, an argument whose actual contents are argument. It should work reliably to concatenate the return value into a shell command and then pass it to a shell for execution.

Precisely what this function does depends on your operating system. The function is designed to work with the syntax of your system’s standard shell; if you use an unusual shell, you will need to redefine this function.

;; This example shows the behavior on GNU and Unix systems.
(shell-quote-argument "foo > bar")
     ⇒ "foo\\ \\>\\ bar"

;; This example shows the behavior on MS-DOS and MS-Windows.
(shell-quote-argument "foo > bar")
     ⇒ "\"foo > bar\""

Here’s an example of using shell-quote-argument to construct a shell command:

(concat "diff -c "
        (shell-quote-argument oldfile)
        " "
        (shell-quote-argument newfile))

The following two functions are useful for combining a list of individual command-line argument strings into a single string, and taking a string apart into a list of individual command-line arguments. These functions are mainly intended for converting user input in the minibuffer, a Lisp string, into a list of string arguments to be passed to call-process or start-process, or for converting such lists of arguments into a single Lisp string to be presented in the minibuffer or echo area.

Function: split-string-and-unquote string &optional separators

This function splits string into substrings at matches for the regular expression separators, like split-string does (see section Creating Strings); in addition, it removes quoting from the substrings. It then makes a list of the substrings and returns it.

If separators is omitted or nil, it defaults to "\\s-+", which is a regular expression that matches one or more characters with whitespace syntax (see section Table of Syntax Classes).

This function supports two types of quoting: enclosing a whole string in double quotes "…", and quoting individual characters with a backslash escape ‘\’. The latter is also used in Lisp strings, so this function can handle those as well.

Function: combine-and-quote-strings list-of-strings &optional separator

This function concatenates list-of-strings into a single string, quoting each string as necessary. It also sticks the separator string between each pair of strings; if separator is omitted or nil, it defaults to " ". The return value is the resulting string.

The strings in list-of-strings that need quoting are those that include separator as their substring. Quoting a string encloses it in double quotes "…". In the simplest case, if you are consing a command from the individual command-line arguments, every argument that includes embedded blanks will be quoted.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.3 Creating a Synchronous Process

After a synchronous process is created, Emacs waits for the process to terminate before continuing. Starting Dired on GNU or Unix18 is an example of this: it runs ls in a synchronous process, then modifies the output slightly. Because the process is synchronous, the entire directory listing arrives in the buffer before Emacs tries to do anything with it.

While Emacs waits for the synchronous subprocess to terminate, the user can quit by typing C-g. The first C-g tries to kill the subprocess with a SIGINT signal; but it waits until the subprocess actually terminates before quitting. If during that time the user types another C-g, that kills the subprocess instantly with SIGKILL and quits immediately (except on MS-DOS, where killing other processes doesn’t work). See section Quitting.

The synchronous subprocess functions return an indication of how the process terminated.

The output from a synchronous subprocess is generally decoded using a coding system, much like text read from a file. The input sent to a subprocess by call-process-region is encoded using a coding system, much like text written into a file. See section Coding Systems.

Function: call-process program &optional infile destination display &rest args

This function calls program and waits for it to finish.

The current working directory of the subprocess is default-directory.

The standard input for the new process comes from file infile if infile is not nil, and from the null device otherwise. The argument destination says where to put the process output. Here are the possibilities:

a buffer

Insert the output in that buffer, before point. This includes both the standard output stream and the standard error stream of the process.

a string

Insert the output in a buffer with that name, before point.

t

Insert the output in the current buffer, before point.

nil

Discard the output.

0

Discard the output, and return nil immediately without waiting for the subprocess to finish.

In this case, the process is not truly synchronous, since it can run in parallel with Emacs; but you can think of it as synchronous in that Emacs is essentially finished with the subprocess as soon as this function returns.

MS-DOS doesn’t support asynchronous subprocesses, so this option doesn’t work there.

(:file file-name)

Send the output to the file name specified, overwriting it if it already exists.

(real-destination error-destination)

Keep the standard output stream separate from the standard error stream; deal with the ordinary output as specified by real-destination, and dispose of the error output according to error-destination. If error-destination is nil, that means to discard the error output, t means mix it with the ordinary output, and a string specifies a file name to redirect error output into.

You can’t directly specify a buffer to put the error output in; that is too difficult to implement. But you can achieve this result by sending the error output to a temporary file and then inserting the file into a buffer.

If display is non-nil, then call-process redisplays the buffer as output is inserted. (However, if the coding system chosen for decoding output is undecided, meaning deduce the encoding from the actual data, then redisplay sometimes cannot continue once non-ASCII characters are encountered. There are fundamental reasons why it is hard to fix this; see Receiving Output from Processes.)

Otherwise the function call-process does no redisplay, and the results become visible on the screen only when Emacs redisplays that buffer in the normal course of events.

The remaining arguments, args, are strings that specify command line arguments for the program.

The value returned by call-process (unless you told it not to wait) indicates the reason for process termination. A number gives the exit status of the subprocess; 0 means success, and any other value means failure. If the process terminated with a signal, call-process returns a string describing the signal.

In the examples below, the buffer ‘foo’ is current.

(call-process "pwd" nil t)
     ⇒ 0

---------- Buffer: foo ----------
/home/lewis/manual
---------- Buffer: foo ----------

(call-process "grep" nil "bar" nil "lewis" "/etc/passwd")
     ⇒ 0

---------- Buffer: bar ----------
lewis:x:1001:1001:Bil Lewis,,,,:/home/lewis:/bin/bash

---------- Buffer: bar ----------

Here is an example of the use of call-process, as used to be found in the definition of the insert-directory function:

(call-process insert-directory-program nil t nil switches
              (if full-directory-p
                  (concat (file-name-as-directory file) ".")
                file))
Function: process-file program &optional infile buffer display &rest args

This function processes files synchronously in a separate process. It is similar to call-process, but may invoke a file handler based on the value of the variable default-directory, which specifies the current working directory of the subprocess.

The arguments are handled in almost the same way as for call-process, with the following differences:

Some file handlers may not support all combinations and forms of the arguments infile, buffer, and display. For example, some file handlers might behave as if display were nil, regardless of the value actually passed. As another example, some file handlers might not support separating standard output and error output by way of the buffer argument.

If a file handler is invoked, it determines the program to run based on the first argument program. For instance, suppose that a handler for remote files is invoked. Then the path that is used for searching for the program might be different from exec-path.

The second argument infile may invoke a file handler. The file handler could be different from the handler chosen for the process-file function itself. (For example, default-directory could be on one remote host, and infile on a different remote host. Or default-directory could be non-special, whereas infile is on a remote host.)

If buffer is a list of the form (real-destination error-destination), and error-destination names a file, then the same remarks as for infile apply.

The remaining arguments (args) will be passed to the process verbatim. Emacs is not involved in processing file names that are present in args. To avoid confusion, it may be best to avoid absolute file names in args, but rather to specify all file names as relative to default-directory. The function file-relative-name is useful for constructing such relative file names.

Variable: process-file-side-effects

This variable indicates whether a call of process-file changes remote files.

By default, this variable is always set to t, meaning that a call of process-file could potentially change any file on a remote host. When set to nil, a file handler could optimize its behavior with respect to remote file attribute caching.

You should only ever change this variable with a let-binding; never with setq.

Function: call-process-region start end program &optional delete destination display &rest args

This function sends the text from start to end as standard input to a process running program. It deletes the text sent if delete is non-nil; this is useful when destination is t, to insert the output in the current buffer in place of the input.

The arguments destination and display control what to do with the output from the subprocess, and whether to update the display as it comes in. For details, see the description of call-process, above. If destination is the integer 0, call-process-region discards the output and returns nil immediately, without waiting for the subprocess to finish (this only works if asynchronous subprocesses are supported; i.e., not on MS-DOS).

The remaining arguments, args, are strings that specify command line arguments for the program.

The return value of call-process-region is just like that of call-process: nil if you told it to return without waiting; otherwise, a number or string which indicates how the subprocess terminated.

In the following example, we use call-process-region to run the cat utility, with standard input being the first five characters in buffer ‘foo’ (the word ‘input’). cat copies its standard input into its standard output. Since the argument destination is t, this output is inserted in the current buffer.

---------- Buffer: foo ----------
input∗
---------- Buffer: foo ----------

(call-process-region 1 6 "cat" nil t)
     ⇒ 0

---------- Buffer: foo ----------
inputinput∗
---------- Buffer: foo ----------

For example, the shell-command-on-region command uses call-process-region in a manner similar to this:

(call-process-region
 start end
 shell-file-name      ; name of program
 nil                  ; do not delete region
 buffer               ; send output to buffer
 nil                  ; no redisplay during output
 "-c" command)        ; arguments for the shell
Function: call-process-shell-command command &optional infile destination display

This function executes the shell command command synchronously. The arguments are handled as in call-process. An old calling convention allowed to pass any number of additional arguments after display, which were concatenated to command; this is still supported, but strongly discouraged.

Function: process-file-shell-command command &optional infile destination display

This function is like call-process-shell-command, but uses process-file internally. Depending on default-directory, command can be executed also on remote hosts. An old calling convention allowed to pass any number of additional arguments after display, which were concatenated to command; this is still supported, but strongly discouraged.

Function: shell-command-to-string command

This function executes command (a string) as a shell command, then returns the command’s output as a string.

Function: process-lines program &rest args

This function runs program, waits for it to finish, and returns its output as a list of strings. Each string in the list holds a single line of text output by the program; the end-of-line characters are stripped from each line. The arguments beyond program, args, are strings that specify command-line arguments with which to run the program.

If program exits with a non-zero exit status, this function signals an error.

This function works by calling call-process, so program output is decoded in the same way as for call-process.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.4 Creating an Asynchronous Process

In this section, we describe how to create an asynchronous process. After an asynchronous process is created, it runs in parallel with Emacs, and Emacs can communicate with it using the functions described in the following sections (see section Sending Input to Processes, and see section Receiving Output from Processes). Note that process communication is only partially asynchronous: Emacs sends data to the process only when certain functions are called, and Emacs accepts data from the process only while waiting for input or for a time delay.

An asynchronous process is controlled either via a pty (pseudo-terminal) or a pipe. The choice of pty or pipe is made when creating the process, based on the value of the variable process-connection-type (see below). Ptys are usually preferable for processes visible to the user, as in Shell mode, because they allow for job control (C-c, C-z, etc.) between the process and its children, whereas pipes do not. For subprocesses used for internal purposes by programs, it is often better to use a pipe, because they are more efficient, and because they are immune to stray character injections that ptys introduce for large (around 500 byte) messages. Also, the total number of ptys is limited on many systems and it is good not to waste them.

Function: start-process name buffer-or-name program &rest args

This function creates a new asynchronous subprocess and starts the program program running in it. It returns a process object that stands for the new subprocess in Lisp. The argument name specifies the name for the process object; if a process with this name already exists, then name is modified (by appending ‘<1>’, etc.) to be unique. The buffer buffer-or-name is the buffer to associate with the process.

If program is nil, Emacs opens a new pseudoterminal (pty) and associates its input and output with buffer-or-name, without creating a subprocess. In that case, the remaining arguments args are ignored.

The remaining arguments, args, are strings that specify command line arguments for the subprocess.

In the example below, the first process is started and runs (rather, sleeps) for 100 seconds (the output buffer ‘foo’ is created immediately). Meanwhile, the second process is started, and given the name ‘my-process<1>’ for the sake of uniqueness. It inserts the directory listing at the end of the buffer ‘foo’, before the first process finishes. Then it finishes, and a message to that effect is inserted in the buffer. Much later, the first process finishes, and another message is inserted in the buffer for it.

(start-process "my-process" "foo" "sleep" "100")
     ⇒ #<process my-process>

(start-process "my-process" "foo" "ls" "-l" "/bin")
     ⇒ #<process my-process<1>>

---------- Buffer: foo ----------
total 8336
-rwxr-xr-x 1 root root 971384 Mar 30 10:14 bash
-rwxr-xr-x 1 root root 146920 Jul  5  2011 bsd-csh
…
-rwxr-xr-x 1 root root 696880 Feb 28 15:55 zsh4

Process my-process<1> finished

Process my-process finished
---------- Buffer: foo ----------
Function: start-file-process name buffer-or-name program &rest args

Like start-process, this function starts a new asynchronous subprocess running program in it, and returns its process object.

The difference from start-process is that this function may invoked a file handler based on the value of default-directory. This handler ought to run program, perhaps on the local host, perhaps on a remote host that corresponds to default-directory. In the latter case, the local part of default-directory becomes the working directory of the process.

This function does not try to invoke file name handlers for program or for the program-args.

Depending on the implementation of the file handler, it might not be possible to apply process-filter or process-sentinel to the resulting process object. See section Process Filter Functions, and Sentinels: Detecting Process Status Changes.

Some file handlers may not support start-file-process (for example the function ange-ftp-hook-function). In such cases, this function does nothing and returns nil.

Function: start-process-shell-command name buffer-or-name command

This function is like start-process, except that it uses a shell to execute the specified command. The argument command is a shell command name. The variable shell-file-name specifies which shell to use.

The point of running a program through the shell, rather than directly with start-process, is so that you can employ shell features such as wildcards in the arguments. It follows that if you include any arbitrary user-specified arguments in the command, you should quote them with shell-quote-argument first, so that any special shell characters do not have their special shell meanings. See section Shell Arguments. Of course, when executing commands based on user input you should also consider the security implications.

Function: start-file-process-shell-command name buffer-or-name command

This function is like start-process-shell-command, but uses start-file-process internally. Because of this, command can also be executed on remote hosts, depending on default-directory.

Variable: process-connection-type

This variable controls the type of device used to communicate with asynchronous subprocesses. If it is non-nil, then ptys are used, when available. Otherwise, pipes are used.

The value of process-connection-type takes effect when start-process is called. So you can specify how to communicate with one subprocess by binding the variable around the call to start-process.

(let ((process-connection-type nil))  ; use a pipe
  (start-process …))

To determine whether a given subprocess actually got a pipe or a pty, use the function process-tty-name (see section Process Information).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.5 Deleting Processes

Deleting a process disconnects Emacs immediately from the subprocess. Processes are deleted automatically after they terminate, but not necessarily right away. You can delete a process explicitly at any time. If you explicitly delete a terminated process before it is deleted automatically, no harm results. Deleting a running process sends a signal to terminate it (and its child processes, if any), and calls the process sentinel. See section Sentinels: Detecting Process Status Changes.

When a process is deleted, the process object itself continues to exist as long as other Lisp objects point to it. All the Lisp primitives that work on process objects accept deleted processes, but those that do I/O or send signals will report an error. The process mark continues to point to the same place as before, usually into a buffer where output from the process was being inserted.

User Option: delete-exited-processes

This variable controls automatic deletion of processes that have terminated (due to calling exit or to a signal). If it is nil, then they continue to exist until the user runs list-processes. Otherwise, they are deleted immediately after they exit.

Function: delete-process process

This function deletes a process, killing it with a SIGKILL signal. The argument may be a process, the name of a process, a buffer, or the name of a buffer. (A buffer or buffer-name stands for the process that get-buffer-process returns.) Calling delete-process on a running process terminates it, updates the process status, and runs the sentinel immediately. If the process has already terminated, calling delete-process has no effect on its status, or on the running of its sentinel (which will happen sooner or later).

(delete-process "*shell*")
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.6 Process Information

Several functions return information about processes.

Command: list-processes &optional query-only buffer

This command displays a listing of all living processes. In addition, it finally deletes any process whose status was ‘Exited’ or ‘Signaled’. It returns nil.

The processes are shown in a buffer named *Process List* (unless you specify otherwise using the optional argument buffer), whose major mode is Process Menu mode.

If query-only is non-nil, it only lists processes whose query flag is non-nil. See section Querying Before Exit.

Function: process-list

This function returns a list of all processes that have not been deleted.

(process-list)
     ⇒ (#<process display-time> #<process shell>)
Function: get-process name

This function returns the process named name (a string), or nil if there is none.

(get-process "shell")
     ⇒ #<process shell>
Function: process-command process

This function returns the command that was executed to start process. This is a list of strings, the first string being the program executed and the rest of the strings being the arguments that were given to the program.

(process-command (get-process "shell"))
     ⇒ ("bash" "-i")
Function: process-contact process &optional key

This function returns information about how a network or serial process was set up. When key is nil, it returns (hostname service) for a network process, and (port speed) for a serial process. For an ordinary child process, this function always returns t.

If key is t, the value is the complete status information for the connection, server, or serial port; that is, the list of keywords and values specified in make-network-process or make-serial-process, except that some of the values represent the current status instead of what you specified.

For a network process, the values include (see make-network-process for a complete list):

:buffer

The associated value is the process buffer.

:filter

The associated value is the process filter function.

:sentinel

The associated value is the process sentinel function.

:remote

In a connection, the address in internal format of the remote peer.

:local

The local address, in internal format.

:service

In a server, if you specified t for service, this value is the actual port number.

:local and :remote are included even if they were not specified explicitly in make-network-process.

For a serial process, see make-serial-process and serial-process-configure for a list of keys.

If key is a keyword, the function returns the value corresponding to that keyword.

Function: process-id process

This function returns the PID of process. This is an integer that distinguishes the process process from all other processes running on the same computer at the current time. The PID of a process is chosen by the operating system kernel when the process is started and remains constant as long as the process exists.

Function: process-name process

This function returns the name of process, as a string.

Function: process-status process-name

This function returns the status of process-name as a symbol. The argument process-name must be a process, a buffer, or a process name (a string).

The possible values for an actual subprocess are:

run

for a process that is running.

stop

for a process that is stopped but continuable.

exit

for a process that has exited.

signal

for a process that has received a fatal signal.

open

for a network connection that is open.

closed

for a network connection that is closed. Once a connection is closed, you cannot reopen it, though you might be able to open a new connection to the same place.

connect

for a non-blocking connection that is waiting to complete.

failed

for a non-blocking connection that has failed to complete.

listen

for a network server that is listening.

nil

if process-name is not the name of an existing process.

(process-status (get-buffer "*shell*"))
     ⇒ run

For a network connection, process-status returns one of the symbols open or closed. The latter means that the other side closed the connection, or Emacs did delete-process.

Function: process-live-p process

This function returns non-nil if process is alive. A process is considered alive if its status is run, open, listen, connect or stop.

Function: process-type process

This function returns the symbol network for a network connection or server, serial for a serial port connection, or real for a real subprocess.

Function: process-exit-status process

This function returns the exit status of process or the signal number that killed it. (Use the result of process-status to determine which of those it is.) If process has not yet terminated, the value is 0.

Function: process-tty-name process

This function returns the terminal name that process is using for its communication with Emacs—or nil if it is using pipes instead of a terminal (see process-connection-type in Creating an Asynchronous Process). If process represents a program running on a remote host, the terminal name used by that program on the remote host is provided as process property remote-tty.

Function: process-coding-system process

This function returns a cons cell (decode . encode), describing the coding systems in use for decoding output from, and encoding input to, process (see section Coding Systems).

Function: set-process-coding-system process &optional decoding-system encoding-system

This function specifies the coding systems to use for subsequent output from and input to process. It will use decoding-system to decode subprocess output, and encoding-system to encode subprocess input.

Every process also has a property list that you can use to store miscellaneous values associated with the process.

Function: process-get process propname

This function returns the value of the propname property of process.

Function: process-put process propname value

This function sets the value of the propname property of process to value.

Function: process-plist process

This function returns the process plist of process.

Function: set-process-plist process plist

This function sets the process plist of process to plist.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.7 Sending Input to Processes

Asynchronous subprocesses receive input when it is sent to them by Emacs, which is done with the functions in this section. You must specify the process to send input to, and the input data to send. The data appears on the “standard input” of the subprocess.

Some operating systems have limited space for buffered input in a pty. On these systems, Emacs sends an EOF periodically amidst the other characters, to force them through. For most programs, these EOFs do no harm.

Subprocess input is normally encoded using a coding system before the subprocess receives it, much like text written into a file. You can use set-process-coding-system to specify which coding system to use (see section Process Information). Otherwise, the coding system comes from coding-system-for-write, if that is non-nil; or else from the defaulting mechanism (see section Default Coding Systems).

Sometimes the system is unable to accept input for that process, because the input buffer is full. When this happens, the send functions wait a short while, accepting output from subprocesses, and then try again. This gives the subprocess a chance to read more of its pending input and make space in the buffer. It also allows filters, sentinels and timers to run—so take account of that in writing your code.

In these functions, the process argument can be a process or the name of a process, or a buffer or buffer name (which stands for a process via get-buffer-process). nil means the current buffer’s process.

Function: process-send-string process string

This function sends process the contents of string as standard input. It returns nil. For example, to make a Shell buffer list files:

(process-send-string "shell<1>" "ls\n")
     ⇒ nil
Function: process-send-region process start end

This function sends the text in the region defined by start and end as standard input to process.

An error is signaled unless both start and end are integers or markers that indicate positions in the current buffer. (It is unimportant which number is larger.)

Function: process-send-eof &optional process

This function makes process see an end-of-file in its input. The EOF comes after any text already sent to it. The function returns process.

(process-send-eof "shell")
     ⇒ "shell"
Function: process-running-child-p &optional process

This function will tell you whether a process has given control of its terminal to its own child process. The value is t if this is true, or if Emacs cannot tell; it is nil if Emacs can be certain that this is not so.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.8 Sending Signals to Processes

Sending a signal to a subprocess is a way of interrupting its activities. There are several different signals, each with its own meaning. The set of signals and their names is defined by the operating system. For example, the signal SIGINT means that the user has typed C-c, or that some analogous thing has happened.

Each signal has a standard effect on the subprocess. Most signals kill the subprocess, but some stop (or resume) execution instead. Most signals can optionally be handled by programs; if the program handles the signal, then we can say nothing in general about its effects.

You can send signals explicitly by calling the functions in this section. Emacs also sends signals automatically at certain times: killing a buffer sends a SIGHUP signal to all its associated processes; killing Emacs sends a SIGHUP signal to all remaining processes. (SIGHUP is a signal that usually indicates that the user “hung up the phone”, i.e., disconnected.)

Each of the signal-sending functions takes two optional arguments: process and current-group.

The argument process must be either a process, a process name, a buffer, a buffer name, or nil. A buffer or buffer name stands for a process through get-buffer-process. nil stands for the process associated with the current buffer. An error is signaled if process does not identify a process.

The argument current-group is a flag that makes a difference when you are running a job-control shell as an Emacs subprocess. If it is non-nil, then the signal is sent to the current process-group of the terminal that Emacs uses to communicate with the subprocess. If the process is a job-control shell, this means the shell’s current subjob. If it is nil, the signal is sent to the process group of the immediate subprocess of Emacs. If the subprocess is a job-control shell, this is the shell itself.

The flag current-group has no effect when a pipe is used to communicate with the subprocess, because the operating system does not support the distinction in the case of pipes. For the same reason, job-control shells won’t work when a pipe is used. See process-connection-type in Creating an Asynchronous Process.

Function: interrupt-process &optional process current-group

This function interrupts the process process by sending the signal SIGINT. Outside of Emacs, typing the “interrupt character” (normally C-c on some systems, and DEL on others) sends this signal. When the argument current-group is non-nil, you can think of this function as “typing C-c” on the terminal by which Emacs talks to the subprocess.

Function: kill-process &optional process current-group

This function kills the process process by sending the signal SIGKILL. This signal kills the subprocess immediately, and cannot be handled by the subprocess.

Function: quit-process &optional process current-group

This function sends the signal SIGQUIT to the process process. This signal is the one sent by the “quit character” (usually C-b or C-\) when you are not inside Emacs.

Function: stop-process &optional process current-group

This function stops the process process by sending the signal SIGTSTP. Use continue-process to resume its execution.

Outside of Emacs, on systems with job control, the “stop character” (usually C-z) normally sends this signal. When current-group is non-nil, you can think of this function as “typing C-z” on the terminal Emacs uses to communicate with the subprocess.

Function: continue-process &optional process current-group

This function resumes execution of the process process by sending it the signal SIGCONT. This presumes that process was stopped previously.

Command: signal-process process signal

This function sends a signal to process process. The argument signal specifies which signal to send; it should be an integer, or a symbol whose name is a signal.

The process argument can be a system process ID (an integer); that allows you to send signals to processes that are not children of Emacs. See section Accessing Other Processes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9 Receiving Output from Processes

The output that a subprocess writes to its standard output stream is passed to a function called the filter function. The default filter function simply inserts the output into a buffer, which is called the associated buffer of the process (see section Process Buffers). If the process has no buffer then the default filter discards the output.

When a subprocess terminates, Emacs reads any pending output, then stops reading output from that subprocess. Therefore, if the subprocess has children that are still live and still producing output, Emacs won’t receive that output.

Output from a subprocess can arrive only while Emacs is waiting: when reading terminal input (see the function waiting-for-user-input-p), in sit-for and sleep-for (see section Waiting for Elapsed Time or Input), and in accept-process-output (see section Accepting Output from Processes). This minimizes the problem of timing errors that usually plague parallel programming. For example, you can safely create a process and only then specify its buffer or filter function; no output can arrive before you finish, if the code in between does not call any primitive that waits.

Variable: process-adaptive-read-buffering

On some systems, when Emacs reads the output from a subprocess, the output data is read in very small blocks, potentially resulting in very poor performance. This behavior can be remedied to some extent by setting the variable process-adaptive-read-buffering to a non-nil value (the default), as it will automatically delay reading from such processes, thus allowing them to produce more output before Emacs tries to read it.

It is impossible to separate the standard output and standard error streams of the subprocess, because Emacs normally spawns the subprocess inside a pseudo-TTY, and a pseudo-TTY has only one output channel. If you want to keep the output to those streams separate, you should redirect one of them to a file—for example, by using an appropriate shell command.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9.1 Process Buffers

A process can (and usually does) have an associated buffer, which is an ordinary Emacs buffer that is used for two purposes: storing the output from the process, and deciding when to kill the process. You can also use the buffer to identify a process to operate on, since in normal practice only one process is associated with any given buffer. Many applications of processes also use the buffer for editing input to be sent to the process, but this is not built into Emacs Lisp.

By default, process output is inserted in the associated buffer. (You can change this by defining a custom filter function, see section Process Filter Functions.) The position to insert the output is determined by the process-mark, which is then updated to point to the end of the text just inserted. Usually, but not always, the process-mark is at the end of the buffer.

Killing the associated buffer of a process also kills the process. Emacs asks for confirmation first, if the process’s process-query-on-exit-flag is non-nil (see section Querying Before Exit). This confirmation is done by the function process-kill-buffer-query-function, which is run from kill-buffer-query-functions (see section Killing Buffers).

Function: process-buffer process

This function returns the associated buffer of the process process.

(process-buffer (get-process "shell"))
     ⇒ #<buffer *shell*>
Function: process-mark process

This function returns the process marker for process, which is the marker that says where to insert output from the process.

If process does not have a buffer, process-mark returns a marker that points nowhere.

The default filter function uses this marker to decide where to insert process output, and updates it to point after the inserted text. That is why successive batches of output are inserted consecutively.

Custom filter functions normally should use this marker in the same fashion. For an example of a filter function that uses process-mark, see Process Filter Example.

When the user is expected to enter input in the process buffer for transmission to the process, the process marker separates the new input from previous output.

Function: set-process-buffer process buffer

This function sets the buffer associated with process to buffer. If buffer is nil, the process becomes associated with no buffer.

Function: get-buffer-process buffer-or-name

This function returns a nondeleted process associated with the buffer specified by buffer-or-name. If there are several processes associated with it, this function chooses one (currently, the one most recently created, but don’t count on that). Deletion of a process (see delete-process) makes it ineligible for this function to return.

It is usually a bad idea to have more than one process associated with the same buffer.

(get-buffer-process "*shell*")
     ⇒ #<process shell>

Killing the process’s buffer deletes the process, which kills the subprocess with a SIGHUP signal (see section Sending Signals to Processes).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9.2 Process Filter Functions

A process filter function is a function that receives the standard output from the associated process. All output from that process is passed to the filter. The default filter simply outputs directly to the process buffer.

The filter function can only be called when Emacs is waiting for something, because process output arrives only at such times. Emacs waits when reading terminal input (see the function waiting-for-user-input-p), in sit-for and sleep-for (see section Waiting for Elapsed Time or Input), and in accept-process-output (see section Accepting Output from Processes).

A filter function must accept two arguments: the associated process and a string, which is output just received from it. The function is then free to do whatever it chooses with the output.

Quitting is normally inhibited within a filter function—otherwise, the effect of typing C-g at command level or to quit a user command would be unpredictable. If you want to permit quitting inside a filter function, bind inhibit-quit to nil. In most cases, the right way to do this is with the macro with-local-quit. See section Quitting.

If an error happens during execution of a filter function, it is caught automatically, so that it doesn’t stop the execution of whatever program was running when the filter function was started. However, if debug-on-error is non-nil, errors are not caught. This makes it possible to use the Lisp debugger to debug the filter function. See section The Lisp Debugger.

Many filter functions sometimes (or always) insert the output in the process’s buffer, mimicking the actions of the default filter. Such filter functions need to make sure that they save the current buffer, select the correct buffer (if different) before inserting output, and then restore the original buffer. They should also check whether the buffer is still alive, update the process marker, and in some cases update the value of point. Here is how to do these things:

(defun ordinary-insertion-filter (proc string)
  (when (buffer-live-p (process-buffer proc))
    (with-current-buffer (process-buffer proc)
      (let ((moving (= (point) (process-mark proc))))
        (save-excursion
          ;; Insert the text, advancing the process marker.
          (goto-char (process-mark proc))
          (insert string)
          (set-marker (process-mark proc) (point)))
        (if moving (goto-char (process-mark proc)))))))

To make the filter force the process buffer to be visible whenever new text arrives, you could insert a line like the following just before the with-current-buffer construct:

(display-buffer (process-buffer proc))

To force point to the end of the new output, no matter where it was previously, eliminate the variable moving and call goto-char unconditionally.

Note that Emacs automatically saves and restores the match data while executing filter functions. See section The Match Data.

The output to the filter may come in chunks of any size. A program that produces the same output twice in a row may send it as one batch of 200 characters one time, and five batches of 40 characters the next. If the filter looks for certain text strings in the subprocess output, make sure to handle the case where one of these strings is split across two or more batches of output; one way to do this is to insert the received text into a temporary buffer, which can then be searched.

Function: set-process-filter process filter

This function gives process the filter function filter. If filter is nil, it gives the process the default filter, which inserts the process output into the process buffer.

Function: process-filter process

This function returns the filter function of process.

In case the process’s output needs to be passed to several filters, you can use add-function to combine an existing filter with a new one. See section Advising Emacs Lisp Functions.

Here is an example of the use of a filter function:

(defun keep-output (process output)
   (setq kept (cons output kept)))
     ⇒ keep-output
(setq kept nil)
     ⇒ nil
(set-process-filter (get-process "shell") 'keep-output)
     ⇒ keep-output
(process-send-string "shell" "ls ~/other\n")
     ⇒ nil
kept
     ⇒ ("lewis@slug:$ "
"FINAL-W87-SHORT.MSS    backup.otl              kolstad.mss~
address.txt             backup.psf              kolstad.psf
backup.bib~             david.mss               resume-Dec-86.mss~
backup.err              david.psf               resume-Dec.psf
backup.mss              dland                   syllabus.mss
"
"#backups.mss#          backup.mss~             kolstad.mss
")

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9.3 Decoding Process Output

When Emacs writes process output directly into a multibyte buffer, it decodes the output according to the process output coding system. If the coding system is raw-text or no-conversion, Emacs converts the unibyte output to multibyte using string-to-multibyte, and inserts the resulting multibyte text.

You can use set-process-coding-system to specify which coding system to use (see section Process Information). Otherwise, the coding system comes from coding-system-for-read, if that is non-nil; or else from the defaulting mechanism (see section Default Coding Systems). If the text output by a process contains null bytes, Emacs by default uses no-conversion for it; see inhibit-null-byte-detection, for how to control this behavior.

Warning: Coding systems such as undecided, which determine the coding system from the data, do not work entirely reliably with asynchronous subprocess output. This is because Emacs has to process asynchronous subprocess output in batches, as it arrives. Emacs must try to detect the proper coding system from one batch at a time, and this does not always work. Therefore, if at all possible, specify a coding system that determines both the character code conversion and the end of line conversion—that is, one like latin-1-unix, rather than undecided or latin-1.

When Emacs calls a process filter function, it provides the process output as a multibyte string or as a unibyte string according to the process’s filter coding system. Emacs decodes the output according to the process output coding system, which usually produces a multibyte string, except for coding systems such as binary and raw-text.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.9.4 Accepting Output from Processes

Output from asynchronous subprocesses normally arrives only while Emacs is waiting for some sort of external event, such as elapsed time or terminal input. Occasionally it is useful in a Lisp program to explicitly permit output to arrive at a specific point, or even to wait until output arrives from a process.

Function: accept-process-output &optional process seconds millisec just-this-one

This function allows Emacs to read pending output from processes. The output is given to their filter functions. If process is non-nil then this function does not return until some output has been received from process.

The arguments seconds and millisec let you specify timeout periods. The former specifies a period measured in seconds and the latter specifies one measured in milliseconds. The two time periods thus specified are added together, and accept-process-output returns after that much time, whether or not there has been any subprocess output.

The argument millisec is obsolete (and should not be used), because seconds can be floating point to specify waiting a fractional number of seconds. If seconds is 0, the function accepts whatever output is pending but does not wait.

If process is a process, and the argument just-this-one is non-nil, only output from that process is handled, suspending output from other processes until some output has been received from that process or the timeout expires. If just-this-one is an integer, also inhibit running timers. This feature is generally not recommended, but may be necessary for specific applications, such as speech synthesis.

The function accept-process-output returns non-nil if it did get some output, or nil if the timeout expired before output arrived.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.10 Sentinels: Detecting Process Status Changes

A process sentinel is a function that is called whenever the associated process changes status for any reason, including signals (whether sent by Emacs or caused by the process’s own actions) that terminate, stop, or continue the process. The process sentinel is also called if the process exits. The sentinel receives two arguments: the process for which the event occurred, and a string describing the type of event.

The string describing the event looks like one of the following:

A sentinel runs only while Emacs is waiting (e.g., for terminal input, or for time to elapse, or for process output). This avoids the timing errors that could result from running sentinels at random places in the middle of other Lisp programs. A program can wait, so that sentinels will run, by calling sit-for or sleep-for (see section Waiting for Elapsed Time or Input), or accept-process-output (see section Accepting Output from Processes). Emacs also allows sentinels to run when the command loop is reading input. delete-process calls the sentinel when it terminates a running process.

Emacs does not keep a queue of multiple reasons to call the sentinel of one process; it records just the current status and the fact that there has been a change. Therefore two changes in status, coming in quick succession, can call the sentinel just once. However, process termination will always run the sentinel exactly once. This is because the process status can’t change again after termination.

Emacs explicitly checks for output from the process before running the process sentinel. Once the sentinel runs due to process termination, no further output can arrive from the process.

A sentinel that writes the output into the buffer of the process should check whether the buffer is still alive. If it tries to insert into a dead buffer, it will get an error. If the buffer is dead, (buffer-name (process-buffer process)) returns nil.

Quitting is normally inhibited within a sentinel—otherwise, the effect of typing C-g at command level or to quit a user command would be unpredictable. If you want to permit quitting inside a sentinel, bind inhibit-quit to nil. In most cases, the right way to do this is with the macro with-local-quit. See section Quitting.

If an error happens during execution of a sentinel, it is caught automatically, so that it doesn’t stop the execution of whatever programs was running when the sentinel was started. However, if debug-on-error is non-nil, errors are not caught. This makes it possible to use the Lisp debugger to debug the sentinel. See section The Lisp Debugger.

While a sentinel is running, the process sentinel is temporarily set to nil so that the sentinel won’t run recursively. For this reason it is not possible for a sentinel to specify a new sentinel.

Note that Emacs automatically saves and restores the match data while executing sentinels. See section The Match Data.

Function: set-process-sentinel process sentinel

This function associates sentinel with process. If sentinel is nil, then the process will have the default sentinel, which inserts a message in the process’s buffer when the process status changes.

Changes in process sentinels take effect immediately—if the sentinel is slated to be run but has not been called yet, and you specify a new sentinel, the eventual call to the sentinel will use the new one.

(defun msg-me (process event)
   (princ
     (format "Process: %s had the event `%s'" process event)))
(set-process-sentinel (get-process "shell") 'msg-me)
     ⇒ msg-me
(kill-process (get-process "shell"))
     -| Process: #<process shell> had the event `killed'
     ⇒ #<process shell>
Function: process-sentinel process

This function returns the sentinel of process.

In case a process status changes need to be passed to several sentinels, you can use add-function to combine an existing sentinel with a new one. See section Advising Emacs Lisp Functions.

Function: waiting-for-user-input-p

While a sentinel or filter function is running, this function returns non-nil if Emacs was waiting for keyboard input from the user at the time the sentinel or filter function was called, or nil if it was not.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.11 Querying Before Exit

When Emacs exits, it terminates all its subprocesses by sending them the SIGHUP signal. Because subprocesses may be doing valuable work, Emacs normally asks the user to confirm that it is ok to terminate them. Each process has a query flag, which, if non-nil, says that Emacs should ask for confirmation before exiting and thus killing that process. The default for the query flag is t, meaning do query.

Function: process-query-on-exit-flag process

This returns the query flag of process.

Function: set-process-query-on-exit-flag process flag

This function sets the query flag of process to flag. It returns flag.

Here is an example of using set-process-query-on-exit-flag on a shell process to avoid querying:

(set-process-query-on-exit-flag (get-process "shell") nil)
     ⇒ nil

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.12 Accessing Other Processes

In addition to accessing and manipulating processes that are subprocesses of the current Emacs session, Emacs Lisp programs can also access other processes running on the same machine. We call these system processes, to distinguish them from Emacs subprocesses.

Emacs provides several primitives for accessing system processes. Not all platforms support these primitives; on those which don’t, these primitives return nil.

Function: list-system-processes

This function returns a list of all the processes running on the system. Each process is identified by its PID, a numerical process ID that is assigned by the OS and distinguishes the process from all the other processes running on the same machine at the same time.

Function: process-attributes pid

This function returns an alist of attributes for the process specified by its process ID pid. Each association in the alist is of the form (key . value), where key designates the attribute and value is the value of that attribute. The various attribute keys that this function can return are listed below. Not all platforms support all of these attributes; if an attribute is not supported, its association will not appear in the returned alist. Values that are numbers can be either integer or floating point, depending on the magnitude of the value.

euid

The effective user ID of the user who invoked the process. The corresponding value is a number. If the process was invoked by the same user who runs the current Emacs session, the value is identical to what user-uid returns (see section User Identification).

user

User name corresponding to the process’s effective user ID, a string.

egid

The group ID of the effective user ID, a number.

group

Group name corresponding to the effective user’s group ID, a string.

comm

The name of the command that runs in the process. This is a string that usually specifies the name of the executable file of the process, without the leading directories. However, some special system processes can report strings that do not correspond to an executable file of a program.

state

The state code of the process. This is a short string that encodes the scheduling state of the process. Here’s a list of the most frequently seen codes:

"D"

uninterruptible sleep (usually I/O)

"R"

running

"S"

interruptible sleep (waiting for some event)

"T"

stopped, e.g., by a job control signal

"Z"

“zombie”: a process that terminated, but was not reaped by its parent

For the full list of the possible states, see the manual page of the ps command.

ppid

The process ID of the parent process, a number.

pgrp

The process group ID of the process, a number.

sess

The session ID of the process. This is a number that is the process ID of the process’s session leader.

ttname

A string that is the name of the process’s controlling terminal. On Unix and GNU systems, this is normally the file name of the corresponding terminal device, such as /dev/pts65.

tpgid

The numerical process group ID of the foreground process group that uses the process’s terminal.

minflt

The number of minor page faults caused by the process since its beginning. (Minor page faults are those that don’t involve reading from disk.)

majflt

The number of major page faults caused by the process since its beginning. (Major page faults require a disk to be read, and are thus more expensive than minor page faults.)

cminflt
cmajflt

Like minflt and majflt, but include the number of page faults for all the child processes of the given process.

utime

Time spent by the process in the user context, for running the application’s code. The corresponding value is in the (high low microsec picosec) format, the same format used by functions current-time (see section current-time) and file-attributes (see section File Attributes).

stime

Time spent by the process in the system (kernel) context, for processing system calls. The corresponding value is in the same format as for utime.

time

The sum of utime and stime. The corresponding value is in the same format as for utime.

cutime
cstime
ctime

Like utime, stime, and time, but include the times of all the child processes of the given process.

pri

The numerical priority of the process.

nice

The nice value of the process, a number. (Processes with smaller nice values get scheduled more favorably.)

thcount

The number of threads in the process.

start

The time when the process was started, in the same (high low microsec picosec) format used by file-attributes and current-time.

etime

The time elapsed since the process started, in the format (high low microsec picosec).

vsize

The virtual memory size of the process, measured in kilobytes.

rss

The size of the process’s resident set, the number of kilobytes occupied by the process in the machine’s physical memory.

pcpu

The percentage of the CPU time used by the process since it started. The corresponding value is a floating-point number between 0 and 100.

pmem

The percentage of the total physical memory installed on the machine used by the process’s resident set. The value is a floating-point number between 0 and 100.

args

The command-line with which the process was invoked. This is a string in which individual command-line arguments are separated by blanks; whitespace characters that are embedded in the arguments are quoted as appropriate for the system’s shell: escaped by backslash characters on GNU and Unix, and enclosed in double quote characters on Windows. Thus, this command-line string can be directly used in primitives such as shell-command.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.13 Transaction Queues

You can use a transaction queue to communicate with a subprocess using transactions. First use tq-create to create a transaction queue communicating with a specified process. Then you can call tq-enqueue to send a transaction.

Function: tq-create process

This function creates and returns a transaction queue communicating with process. The argument process should be a subprocess capable of sending and receiving streams of bytes. It may be a child process, or it may be a TCP connection to a server, possibly on another machine.

Function: tq-enqueue queue question regexp closure fn &optional delay-question

This function sends a transaction to queue queue. Specifying the queue has the effect of specifying the subprocess to talk to.

The argument question is the outgoing message that starts the transaction. The argument fn is the function to call when the corresponding answer comes back; it is called with two arguments: closure, and the answer received.

The argument regexp is a regular expression that should match text at the end of the entire answer, but nothing before; that’s how tq-enqueue determines where the answer ends.

If the argument delay-question is non-nil, delay sending this question until the process has finished replying to any previous questions. This produces more reliable results with some processes.

Function: tq-close queue

Shut down transaction queue queue, waiting for all pending transactions to complete, and then terminate the connection or child process.

Transaction queues are implemented by means of a filter function. See section Process Filter Functions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.14 Network Connections

Emacs Lisp programs can open stream (TCP) and datagram (UDP) network connections (see section Datagrams) to other processes on the same machine or other machines. A network connection is handled by Lisp much like a subprocess, and is represented by a process object. However, the process you are communicating with is not a child of the Emacs process, has no process ID, and you can’t kill it or send it signals. All you can do is send and receive data. delete-process closes the connection, but does not kill the program at the other end; that program must decide what to do about closure of the connection.

Lisp programs can listen for connections by creating network servers. A network server is also represented by a kind of process object, but unlike a network connection, the network server never transfers data itself. When it receives a connection request, it creates a new network connection to represent the connection just made. (The network connection inherits certain information, including the process plist, from the server.) The network server then goes back to listening for more connection requests.

Network connections and servers are created by calling make-network-process with an argument list consisting of keyword/argument pairs, for example :server t to create a server process, or :type 'datagram to create a datagram connection. See section Low-Level Network Access, for details. You can also use the open-network-stream function described below.

To distinguish the different types of processes, the process-type function returns the symbol network for a network connection or server, serial for a serial port connection, or real for a real subprocess.

The process-status function returns open, closed, connect, or failed for network connections. For a network server, the status is always listen. None of those values is possible for a real subprocess. See section Process Information.

You can stop and resume operation of a network process by calling stop-process and continue-process. For a server process, being stopped means not accepting new connections. (Up to 5 connection requests will be queued for when you resume the server; you can increase this limit, unless it is imposed by the operating system—see the :server keyword of make-network-process, make-network-process.) For a network stream connection, being stopped means not processing input (any arriving input waits until you resume the connection). For a datagram connection, some number of packets may be queued but input may be lost. You can use the function process-command to determine whether a network connection or server is stopped; a non-nil value means yes.

Emacs can create encrypted network connections, using either built-in or external support. The built-in support uses the GnuTLS (“Transport Layer Security”) library; see the GnuTLS project page. If your Emacs was compiled with GnuTLS support, the function gnutls-available-p is defined and returns non-nil. For more details, see Overview in The Emacs-GnuTLS manual. The external support uses the starttls.el library, which requires a helper utility such as gnutls-cli to be installed on the system. The open-network-stream function can transparently handle the details of creating encrypted connections for you, using whatever support is available.

Function: open-network-stream name buffer host service &rest parameters

This function opens a TCP connection, with optional encryption, and returns a process object that represents the connection.

The name argument specifies the name for the process object. It is modified as necessary to make it unique.

The buffer argument is the buffer to associate with the connection. Output from the connection is inserted in the buffer, unless you specify your own filter function to handle the output. If buffer is nil, it means that the connection is not associated with any buffer.

The arguments host and service specify where to connect to; host is the host name (a string), and service is the name of a defined network service (a string) or a port number (an integer).

The remaining arguments parameters are keyword/argument pairs that are mainly relevant to encrypted connections:

:nowait boolean

If non-nil, try to make an asynchronous connection.

:type type

The type of connection. Options are:

plain

An ordinary, unencrypted connection.

tls
ssl

A TLS (“Transport Layer Security”) connection.

nil
network

Start with a plain connection, and if parameters ‘:success’ and ‘:capability-command’ are supplied, try to upgrade to an encrypted connection via STARTTLS. If that fails, retain the unencrypted connection.

starttls

As for nil, but if STARTTLS fails drop the connection.

shell

A shell connection.

:always-query-capabilities boolean

If non-nil, always ask for the server’s capabilities, even when doing a ‘plain’ connection.

:capability-command capability-command

Command string to query the host capabilities.

:end-of-command regexp
:end-of-capability regexp

Regular expression matching the end of a command, or the end of the command capability-command. The latter defaults to the former.

:starttls-function function

Function of one argument (the response to capability-command), which returns either nil, or the command to activate STARTTLS if supported.

:success regexp

Regular expression matching a successful STARTTLS negotiation.

:use-starttls-if-possible boolean

If non-nil, do opportunistic STARTTLS upgrades even if Emacs doesn’t have built-in TLS support.

:client-certificate list-or-t

Either a list of the form (key-file cert-file), naming the certificate key file and certificate file itself, or t, meaning to query auth-source for this information (see Overview in The Auth-Source Manual). Only used for TLS or STARTTLS.

:return-list cons-or-nil

The return value of this function. If omitted or nil, return a process object. Otherwise, a cons of the form (process-object . plist), where plist has keywords:

:greeting string-or-nil

If non-nil, the greeting string returned by the host.

:capabilities string-or-nil

If non-nil, the host’s capability string.

:type symbol

The connection type: ‘plain’ or ‘tls’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.15 Network Servers

You create a server by calling make-network-process (see section make-network-process) with :server t. The server will listen for connection requests from clients. When it accepts a client connection request, that creates a new network connection, itself a process object, with the following parameters:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.16 Datagrams

A datagram connection communicates with individual packets rather than streams of data. Each call to process-send sends one datagram packet (see section Sending Input to Processes), and each datagram received results in one call to the filter function.

The datagram connection doesn’t have to talk with the same remote peer all the time. It has a remote peer address which specifies where to send datagrams to. Each time an incoming datagram is passed to the filter function, the peer address is set to the address that datagram came from; that way, if the filter function sends a datagram, it will go back to that place. You can specify the remote peer address when you create the datagram connection using the :remote keyword. You can change it later on by calling set-process-datagram-address.

Function: process-datagram-address process

If process is a datagram connection or server, this function returns its remote peer address.

Function: set-process-datagram-address process address

If process is a datagram connection or server, this function sets its remote peer address to address.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.17 Low-Level Network Access

You can also create network connections by operating at a lower level than that of open-network-stream, using make-network-process.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.17.1 make-network-process

The basic function for creating network connections and network servers is make-network-process. It can do either of those jobs, depending on the arguments you give it.

Function: make-network-process &rest args

This function creates a network connection or server and returns the process object that represents it. The arguments args are a list of keyword/argument pairs. Omitting a keyword is always equivalent to specifying it with value nil, except for :coding, :filter-multibyte, and :reuseaddr. Here are the meaningful keywords (those corresponding to network options are listed in the following section):

:name name

Use the string name as the process name. It is modified if necessary to make it unique.

:type type

Specify the communication type. A value of nil specifies a stream connection (the default); datagram specifies a datagram connection; seqpacket specifies a “sequenced packet stream” connection. Both connections and servers can be of these types.

:server server-flag

If server-flag is non-nil, create a server. Otherwise, create a connection. For a stream type server, server-flag may be an integer, which then specifies the length of the queue of pending connections to the server. The default queue length is 5.

:host host

Specify the host to connect to. host should be a host name or Internet address, as a string, or the symbol local to specify the local host. If you specify host for a server, it must specify a valid address for the local host, and only clients connecting to that address will be accepted.

:service service

service specifies a port number to connect to; or, for a server, the port number to listen on. It should be a service name that translates to a port number, or an integer specifying the port number directly. For a server, it can also be t, which means to let the system select an unused port number.

:family family

family specifies the address (and protocol) family for communication. nil means determine the proper address family automatically for the given host and service. local specifies a Unix socket, in which case host is ignored. ipv4 and ipv6 specify to use IPv4 and IPv6, respectively.

:local local-address

For a server process, local-address is the address to listen on. It overrides family, host and service, so you might as well not specify them.

:remote remote-address

For a connection, remote-address is the address to connect to. It overrides family, host and service, so you might as well not specify them.

For a datagram server, remote-address specifies the initial setting of the remote datagram address.

The format of local-address or remote-address depends on the address family:

  • - An IPv4 address is represented as a five-element vector of four 8-bit integers and one 16-bit integer [a b c d p] corresponding to numeric IPv4 address a.b.c.d and port number p.
  • - An IPv6 address is represented as a nine-element vector of 16-bit integers [a b c d e f g h p] corresponding to numeric IPv6 address a:b:c:d:e:f:g:h and port number p.
  • - A local address is represented as a string, which specifies the address in the local address space.
  • - An “unsupported family” address is represented by a cons (f . av), where f is the family number and av is a vector specifying the socket address using one element per address data byte. Do not rely on this format in portable code, as it may depend on implementation defined constants, data sizes, and data structure alignment.
:nowait bool

If bool is non-nil for a stream connection, return without waiting for the connection to complete. When the connection succeeds or fails, Emacs will call the sentinel function, with a second argument matching "open" (if successful) or "failed". The default is to block, so that make-network-process does not return until the connection has succeeded or failed.

:stop stopped

If stopped is non-nil, start the network connection or server in the “stopped” state.

:buffer buffer

Use buffer as the process buffer.

:coding coding

Use coding as the coding system for this process. To specify different coding systems for decoding data from the connection and for encoding data sent to it, specify (decoding . encoding) for coding.

If you don’t specify this keyword at all, the default is to determine the coding systems from the data.

:noquery query-flag

Initialize the process query flag to query-flag. See section Querying Before Exit.

:filter filter

Initialize the process filter to filter.

:filter-multibyte multibyte

If multibyte is non-nil, strings given to the process filter are multibyte, otherwise they are unibyte. The default is the default value of enable-multibyte-characters.

:sentinel sentinel

Initialize the process sentinel to sentinel.

:log log

Initialize the log function of a server process to log. The log function is called each time the server accepts a network connection from a client. The arguments passed to the log function are server, connection, and message; where server is the server process, connection is the new process for the connection, and message is a string describing what has happened.

:plist plist

Initialize the process plist to plist.

The original argument list, modified with the actual connection information, is available via the process-contact function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.17.2 Network Options

The following network options can be specified when you create a network process. Except for :reuseaddr, you can also set or modify these options later, using set-network-process-option.

For a server process, the options specified with make-network-process are not inherited by the client connections, so you will need to set the necessary options for each child connection as it is created.

:bindtodevice device-name

If device-name is a non-empty string identifying a network interface name (see network-interface-list), only handle packets received on that interface. If device-name is nil (the default), handle packets received on any interface.

Using this option may require special privileges on some systems.

:broadcast broadcast-flag

If broadcast-flag is non-nil for a datagram process, the process will receive datagram packet sent to a broadcast address, and be able to send packets to a broadcast address. This is ignored for a stream connection.

:dontroute dontroute-flag

If dontroute-flag is non-nil, the process can only send to hosts on the same network as the local host.

:keepalive keepalive-flag

If keepalive-flag is non-nil for a stream connection, enable exchange of low-level keep-alive messages.

:linger linger-arg

If linger-arg is non-nil, wait for successful transmission of all queued packets on the connection before it is deleted (see delete-process). If linger-arg is an integer, it specifies the maximum time in seconds to wait for queued packets to be sent before closing the connection. The default is nil, which means to discard unsent queued packets when the process is deleted.

:oobinline oobinline-flag

If oobinline-flag is non-nil for a stream connection, receive out-of-band data in the normal data stream. Otherwise, ignore out-of-band data.

:priority priority

Set the priority for packets sent on this connection to the integer priority. The interpretation of this number is protocol specific; such as setting the TOS (type of service) field on IP packets sent on this connection. It may also have system dependent effects, such as selecting a specific output queue on the network interface.

:reuseaddr reuseaddr-flag

If reuseaddr-flag is non-nil (the default) for a stream server process, allow this server to reuse a specific port number (see :service), unless another process on this host is already listening on that port. If reuseaddr-flag is nil, there may be a period of time after the last use of that port (by any process on the host) where it is not possible to make a new server on that port.

Function: set-network-process-option process option value &optional no-error

This function sets or modifies a network option for network process process. The accepted options and values are as for make-network-process. If no-error is non-nil, this function returns nil instead of signaling an error if option is not a supported option. If the function successfully completes, it returns t.

The current setting of an option is available via the process-contact function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.17.3 Testing Availability of Network Features

To test for the availability of a given network feature, use featurep like this:

(featurep 'make-network-process '(keyword value))

The result of this form is t if it works to specify keyword with value value in make-network-process. Here are some of the keywordvalue pairs you can test in this way.

(:nowait t)

Non-nil if non-blocking connect is supported.

(:type datagram)

Non-nil if datagrams are supported.

(:family local)

Non-nil if local (a.k.a. “UNIX domain”) sockets are supported.

(:family ipv6)

Non-nil if IPv6 is supported.

(:service t)

Non-nil if the system can select the port for a server.

To test for the availability of a given network option, use featurep like this:

(featurep 'make-network-process 'keyword)

The accepted keyword values are :bindtodevice, etc. For the complete list, see section Network Options. This form returns non-nil if that particular network option is supported by make-network-process (or set-network-process-option).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.18 Misc Network Facilities

These additional functions are useful for creating and operating on network connections. Note that they are supported only on some systems.

Function: network-interface-list

This function returns a list describing the network interfaces of the machine you are using. The value is an alist whose elements have the form (name . address). address has the same form as the local-address and remote-address arguments to make-network-process.

Function: network-interface-info ifname

This function returns information about the network interface named ifname. The value is a list of the form (addr bcast netmask hwaddr flags).

addr

The Internet protocol address.

bcast

The broadcast address.

netmask

The network mask.

hwaddr

The layer 2 address (Ethernet MAC address, for instance).

flags

The current flags of the interface.

Function: format-network-address address &optional omit-port

This function converts the Lisp representation of a network address to a string.

A five-element vector [a b c d p] represents an IPv4 address a.b.c.d and port number p. format-network-address converts that to the string "a.b.c.d:p".

A nine-element vector [a b c d e f g h p] represents an IPv6 address along with a port number. format-network-address converts that to the string "[a:b:c:d:e:f:g:h]:p".

If the vector does not include the port number, p, or if omit-port is non-nil, the result does not include the :p suffix.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.19 Communicating with Serial Ports

Emacs can communicate with serial ports. For interactive use, M-x serial-term opens a terminal window. In a Lisp program, make-serial-process creates a process object.

The serial port can be configured at run-time, without having to close and re-open it. The function serial-process-configure lets you change the speed, bytesize, and other parameters. In a terminal window created by serial-term, you can click on the mode line for configuration.

A serial connection is represented by a process object, which can be used in a similar way to a subprocess or network process. You can send and receive data, and configure the serial port. A serial process object has no process ID, however, and you can’t send signals to it, and the status codes are different from other types of processes. delete-process on the process object or kill-buffer on the process buffer close the connection, but this does not affect the device connected to the serial port.

The function process-type returns the symbol serial for a process object representing a serial port connection.

Serial ports are available on GNU/Linux, Unix, and MS Windows systems.

Command: serial-term port speed

Start a terminal-emulator for a serial port in a new buffer. port is the name of the serial port to connect to. For example, this could be /dev/ttyS0 on Unix. On MS Windows, this could be COM1, or \\.\COM10 (double the backslashes in Lisp strings).

speed is the speed of the serial port in bits per second. 9600 is a common value. The buffer is in Term mode; see Term Mode in The GNU Emacs Manual, for the commands to use in that buffer. You can change the speed and the configuration in the mode line menu.

Function: make-serial-process &rest args

This function creates a process and a buffer. Arguments are specified as keyword/argument pairs. Here’s the list of the meaningful keywords, with the first two (port and speed) being mandatory:

:port port

This is the name of the serial port. On Unix and GNU systems, this is a file name such as /dev/ttyS0. On Windows, this could be COM1, or \\.\COM10 for ports higher than COM9 (double the backslashes in Lisp strings).

:speed speed

The speed of the serial port in bits per second. This function calls serial-process-configure to handle the speed; see the following documentation of that function for more details.

:name name

The name of the process. If name is not given, port will serve as the process name as well.

:buffer buffer

The buffer to associate with the process. The value can be either a buffer or a string that names a buffer. Process output goes at the end of that buffer, unless you specify an output stream or filter function to handle the output. If buffer is not given, the process buffer’s name is taken from the value of the :name keyword.

:coding coding

If coding is a symbol, it specifies the coding system used for both reading and writing for this process. If coding is a cons (decoding . encoding), decoding is used for reading, and encoding is used for writing. If not specified, the default is to determine the coding systems from the data itself.

:noquery query-flag

Initialize the process query flag to query-flag. See section Querying Before Exit. The flags defaults to nil if unspecified.

:stop bool

Start process in the “stopped” state if bool is non-nil. In the stopped state, a serial process does not accept incoming data, but you can send outgoing data. The stopped state is cleared by continue-process and set by stop-process.

:filter filter

Install filter as the process filter.

:sentinel sentinel

Install sentinel as the process sentinel.

:plist plist

Install plist as the initial plist of the process.

:bytesize
:parity
:stopbits
:flowcontrol

These are handled by serial-process-configure, which is called by make-serial-process.

The original argument list, possibly modified by later configuration, is available via the function process-contact.

Here is an example:

(make-serial-process :port "/dev/ttyS0" :speed 9600)
Function: serial-process-configure &rest args

This function configures a serial port connection. Arguments are specified as keyword/argument pairs. Attributes that are not given are re-initialized from the process’s current configuration (available via the function process-contact), or set to reasonable default values. The following arguments are defined:

:process process
:name name
:buffer buffer
:port port

Any of these arguments can be given to identify the process that is to be configured. If none of these arguments is given, the current buffer’s process is used.

:speed speed

The speed of the serial port in bits per second, a.k.a. baud rate. The value can be any number, but most serial ports work only at a few defined values between 1200 and 115200, with 9600 being the most common value. If speed is nil, the function ignores all other arguments and does not configure the port. This may be useful for special serial ports such as Bluetooth-to-serial converters, which can only be configured through ‘AT’ commands sent through the connection. The value of nil for speed is valid only for connections that were already opened by a previous call to make-serial-process or serial-term.

:bytesize bytesize

The number of bits per byte, which can be 7 or 8. If bytesize is not given or nil, it defaults to 8.

:parity parity

The value can be nil (don’t use parity), the symbol odd (use odd parity), or the symbol even (use even parity). If parity is not given, it defaults to no parity.

:stopbits stopbits

The number of stopbits used to terminate a transmission of each byte. stopbits can be 1 or 2. If stopbits is not given or nil, it defaults to 1.

:flowcontrol flowcontrol

The type of flow control to use for this connection, which is either nil (don’t use flow control), the symbol hw (use RTS/CTS hardware flow control), or the symbol sw (use XON/XOFF software flow control). If flowcontrol is not given, it defaults to no flow control.

Internally, make-serial-process calls serial-process-configure for the initial configuration of the serial port.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.20 Packing and Unpacking Byte Arrays

This section describes how to pack and unpack arrays of bytes, usually for binary network protocols. These functions convert byte arrays to alists, and vice versa. The byte array can be represented as a unibyte string or as a vector of integers, while the alist associates symbols either with fixed-size objects or with recursive sub-alists. To use the functions referred to in this section, load the bindat library.

Conversion from byte arrays to nested alists is also known as deserializing or unpacking, while going in the opposite direction is also known as serializing or packing.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.20.1 Describing Data Layout

To control unpacking and packing, you write a data layout specification, a special nested list describing named and typed fields. This specification controls the length of each field to be processed, and how to pack or unpack it. We normally keep bindat specs in variables whose names end in ‘-bindat-spec’; that kind of name is automatically recognized as “risky”.

A field’s type describes the size (in bytes) of the object that the field represents and, in the case of multibyte fields, how the bytes are ordered within the field. The two possible orderings are “big endian” (also known as “network byte ordering”) and “little endian”. For instance, the number #x23cd (decimal 9165) in big endian would be the two bytes #x23 #xcd; and in little endian, #xcd #x23. Here are the possible type values:

u8
byte

Unsigned byte, with length 1.

u16
word
short

Unsigned integer in network byte order, with length 2.

u24

Unsigned integer in network byte order, with length 3.

u32
dword
long

Unsigned integer in network byte order, with length 4. Note: These values may be limited by Emacs’s integer implementation limits.

u16r
u24r
u32r

Unsigned integer in little endian order, with length 2, 3 and 4, respectively.

str len

String of length len.

strz len

Zero-terminated string, in a fixed-size field with length len.

vec len [type]

Vector of len elements of type type, defaulting to bytes. The type is any of the simple types above, or another vector specified as a list of the form (vec len [type]).

ip

Four-byte vector representing an Internet address. For example: [127 0 0 1] for localhost.

bits len

List of set bits in len bytes. The bytes are taken in big endian order and the bits are numbered starting with 8 * len - 1 and ending with zero. For example: bits 2 unpacks #x28 #x1c to (2 3 4 11 13) and #x1c #x28 to (3 5 10 11 12).

(eval form)

form is a Lisp expression evaluated at the moment the field is unpacked or packed. The result of the evaluation should be one of the above-listed type specifications.

For a fixed-size field, the length len is given as an integer specifying the number of bytes in the field.

When the length of a field is not fixed, it typically depends on the value of a preceding field. In this case, the length len can be given either as a list (name ...) identifying a field name in the format specified for bindat-get-field below, or by an expression (eval form) where form should evaluate to an integer, specifying the field length.

A field specification generally has the form ([name] handler), where name is optional. Don’t use names that are symbols meaningful as type specifications (above) or handler specifications (below), since that would be ambiguous. name can be a symbol or an expression (eval form), in which case form should evaluate to a symbol.

handler describes how to unpack or pack the field and can be one of the following:

type

Unpack/pack this field according to the type specification type.

eval form

Evaluate form, a Lisp expression, for side-effect only. If the field name is specified, the value is bound to that field name.

fill len

Skip len bytes. In packing, this leaves them unchanged, which normally means they remain zero. In unpacking, this means they are ignored.

align len

Skip to the next multiple of len bytes.

struct spec-name

Process spec-name as a sub-specification. This describes a structure nested within another structure.

union form (tag spec)…

Evaluate form, a Lisp expression, find the first tag that matches it, and process its associated data layout specification spec. Matching can occur in one of three ways:

repeat count field-specs

Process the field-specs recursively, in order, then repeat starting from the first one, processing all the specifications count times overall. The count is given using the same formats as a field length—if an eval form is used, it is evaluated just once. For correct operation, each specification in field-specs must include a name.

For the (eval form) forms used in a bindat specification, the form can access and update these dynamically bound variables during evaluation:

last

Value of the last field processed.

bindat-raw

The data as a byte array.

bindat-idx

Current index (within bindat-raw) for unpacking or packing.

struct

The alist containing the structured data that have been unpacked so far, or the entire structure being packed. You can use bindat-get-field to access specific fields of this structure.

count
index

Inside a repeat block, these contain the maximum number of repetitions (as specified by the count parameter), and the current repetition number (counting from 0). Setting count to zero will terminate the inner-most repeat block after the current repetition has completed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.20.2 Functions to Unpack and Pack Bytes

In the following documentation, spec refers to a data layout specification, bindat-raw to a byte array, and struct to an alist representing unpacked field data.

Function: bindat-unpack spec bindat-raw &optional bindat-idx

This function unpacks data from the unibyte string or byte array bindat-raw according to spec. Normally, this starts unpacking at the beginning of the byte array, but if bindat-idx is non-nil, it specifies a zero-based starting position to use instead.

The value is an alist or nested alist in which each element describes one unpacked field.

Function: bindat-get-field struct &rest name

This function selects a field’s data from the nested alist struct. Usually struct was returned by bindat-unpack. If name corresponds to just one argument, that means to extract a top-level field value. Multiple name arguments specify repeated lookup of sub-structures. An integer name acts as an array index.

For example, if name is (a b 2 c), that means to find field c in the third element of subfield b of field a. (This corresponds to struct.a.b[2].c in C.)

Although packing and unpacking operations change the organization of data (in memory), they preserve the data’s total length, which is the sum of all the fields’ lengths, in bytes. This value is not generally inherent in either the specification or alist alone; instead, both pieces of information contribute to its calculation. Likewise, the length of a string or array being unpacked may be longer than the data’s total length as described by the specification.

Function: bindat-length spec struct

This function returns the total length of the data in struct, according to spec.

Function: bindat-pack spec struct &optional bindat-raw bindat-idx

This function returns a byte array packed according to spec from the data in the alist struct. It normally creates and fills a new byte array starting at the beginning. However, if bindat-raw is non-nil, it specifies a pre-allocated unibyte string or vector to pack into. If bindat-idx is non-nil, it specifies the starting offset for packing into bindat-raw.

When pre-allocating, you should make sure (length bindat-raw) meets or exceeds the total length to avoid an out-of-range error.

Function: bindat-ip-to-string ip

Convert the Internet address vector ip to a string in the usual dotted notation.

(bindat-ip-to-string [127 0 0 1])
     ⇒ "127.0.0.1"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.20.3 Examples of Byte Unpacking and Packing

Here is a complete example of byte unpacking and packing:

(require 'bindat)

(defvar fcookie-index-spec
  '((:version  u32)
    (:count    u32)
    (:longest  u32)
    (:shortest u32)
    (:flags    u32)
    (:delim    u8)
    (:ignored  fill 3)
    (:offset   repeat (:count) (:foo u32)))
  "Description of a fortune cookie index file's contents.")

(defun fcookie (cookies &optional index)
  "Display a random fortune cookie from file COOKIES.
Optional second arg INDEX specifies the associated index
filename, by default \"COOKIES.dat\".  Display cookie text
in buffer \"*Fortune Cookie: BASENAME*\", where BASENAME
is COOKIES without the directory part."
  (interactive "fCookies file: ")
  (let* ((info (with-temp-buffer
                 (insert-file-contents-literally
                  (or index (concat cookies ".dat")))
                 (bindat-unpack fcookie-index-spec
                                (buffer-string))))
         (sel (random (bindat-get-field info :count)))
         (beg (cdar (bindat-get-field info :offset sel)))
         (end (or (cdar (bindat-get-field info
                                          :offset (1+ sel)))
                  (nth 7 (file-attributes cookies)))))
    (switch-to-buffer
     (get-buffer-create
      (format "*Fortune Cookie: %s*"
              (file-name-nondirectory cookies))))
    (erase-buffer)
    (insert-file-contents-literally
     cookies nil beg (- end 3))))

(defun fcookie-create-index (cookies &optional index delim)
  "Scan file COOKIES, and write out its index file.
Optional arg INDEX specifies the index filename, which by
default is \"COOKIES.dat\".  Optional arg DELIM specifies the
unibyte character that, when found on a line of its own in
COOKIES, indicates the border between entries."
  (interactive "fCookies file: ")
  (setq delim (or delim ?%))
  (let ((delim-line (format "\n%c\n" delim))
        (count 0)
        (max 0)
        min p q len offsets)
    (unless (= 3 (string-bytes delim-line))
      (error "Delimiter cannot be represented in one byte"))
    (with-temp-buffer
      (insert-file-contents-literally cookies)
      (while (and (setq p (point))
                  (search-forward delim-line (point-max) t)
                  (setq len (- (point) 3 p)))
        (setq count (1+ count)
              max (max max len)
              min (min (or min max) len)
              offsets (cons (1- p) offsets))))
    (with-temp-buffer
      (set-buffer-multibyte nil)
      (insert
       (bindat-pack
        fcookie-index-spec
        `((:version . 2)
          (:count . ,count)
          (:longest . ,max)
          (:shortest . ,min)
          (:flags . 0)
          (:delim . ,delim)
          (:offset . ,(mapcar (lambda (o)
                                (list (cons :foo o)))
                              (nreverse offsets))))))
      (let ((coding-system-for-write 'raw-text-unix))
        (write-file (or index (concat cookies ".dat")))))))

The following is an example of defining and unpacking a complex structure. Consider the following C structures:

struct header {
    unsigned long    dest_ip;
    unsigned long    src_ip;
    unsigned short   dest_port;
    unsigned short   src_port;
};

struct data {
    unsigned char    type;
    unsigned char    opcode;
    unsigned short   length;  /* in network byte order  */
    unsigned char    id[8];   /* null-terminated string  */
    unsigned char    data[/* (length + 3) & ~3 */];
};

struct packet {
    struct header    header;
    unsigned long    counters[2];  /* in little endian order  */
    unsigned char    items;
    unsigned char    filler[3];
    struct data      item[/* items */];

};

The corresponding data layout specification is:

(setq header-spec
      '((dest-ip   ip)
        (src-ip    ip)
        (dest-port u16)
        (src-port  u16)))

(setq data-spec
      '((type      u8)
        (opcode    u8)
        (length    u16)  ; network byte order
        (id        strz 8)
        (data      vec (length))
        (align     4)))

(setq packet-spec
      '((header    struct header-spec)
        (counters  vec 2 u32r)   ; little endian order
        (items     u8)
        (fill      3)
        (item      repeat (items)
                   (struct data-spec))))

A binary data representation is:

(setq binary-data
      [ 192 168 1 100 192 168 1 101 01 28 21 32
        160 134 1 0 5 1 0 0 2 0 0 0
        2 3 0 5 ?A ?B ?C ?D ?E ?F 0 0 1 2 3 4 5 0 0 0
        1 4 0 7 ?B ?C ?D ?E ?F ?G 0 0 6 7 8 9 10 11 12 0 ])

The corresponding decoded structure is:

(setq decoded (bindat-unpack packet-spec binary-data))
     ⇒
((header
  (dest-ip   . [192 168 1 100])
  (src-ip    . [192 168 1 101])
  (dest-port . 284)
  (src-port  . 5408))
 (counters . [100000 261])
 (items . 2)
 (item ((data . [1 2 3 4 5])
        (id . "ABCDEF")
        (length . 5)
        (opcode . 3)
        (type . 2))
       ((data . [6 7 8 9 10 11 12])
        (id . "BCDEFG")
        (length . 7)
        (opcode . 4)
        (type . 1))))

An example of fetching data from this structure:

(bindat-get-field decoded 'item 1 'id)
     ⇒ "BCDEFG"

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37 Emacs Display

This chapter describes a number of features related to the display that Emacs presents to the user.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.1 Refreshing the Screen

The function redraw-frame clears and redisplays the entire contents of a given frame (see section Frames). This is useful if the screen is corrupted.

Function: redraw-frame frame

This function clears and redisplays frame frame.

Even more powerful is redraw-display:

Command: redraw-display

This function clears and redisplays all visible frames.

In Emacs, processing user input takes priority over redisplay. If you call these functions when input is available, they don’t redisplay immediately, but the requested redisplay does happen eventually—after all the input has been processed.

On text terminals, suspending and resuming Emacs normally also refreshes the screen. Some terminal emulators record separate contents for display-oriented programs such as Emacs and for ordinary sequential display. If you are using such a terminal, you might want to inhibit the redisplay on resumption.

User Option: no-redraw-on-reenter

This variable controls whether Emacs redraws the entire screen after it has been suspended and resumed. Non-nil means there is no need to redraw, nil means redrawing is needed. The default is nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.2 Forcing Redisplay

Emacs normally tries to redisplay the screen whenever it waits for input. With the following function, you can request an immediate attempt to redisplay, in the middle of Lisp code, without actually waiting for input.

Function: redisplay &optional force

This function tries immediately to redisplay. The optional argument force, if non-nil, forces the redisplay to be performed, instead of being preempted if input is pending.

The function returns t if it actually tried to redisplay, and nil otherwise. A value of t does not mean that redisplay proceeded to completion; it could have been preempted by newly arriving input.

Variable: pre-redisplay-function

A function run just before redisplay. It is called with one argument, the set of windows to redisplay.

Although redisplay tries immediately to redisplay, it does not change how Emacs decides which parts of its frame(s) to redisplay. By contrast, the following function adds certain windows to the pending redisplay work (as if their contents had completely changed), but does not immediately try to perform redisplay.

Function: force-window-update &optional object

This function forces some or all windows to be updated the next time Emacs does a redisplay. If object is a window, that window is to be updated. If object is a buffer or buffer name, all windows displaying that buffer are to be updated. If object is nil (or omitted), all windows are to be updated.

This function does not do a redisplay immediately; Emacs does that as it waits for input, or when the function redisplay is called.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.3 Truncation

When a line of text extends beyond the right edge of a window, Emacs can continue the line (make it “wrap” to the next screen line), or truncate the line (limit it to one screen line). The additional screen lines used to display a long text line are called continuation lines. Continuation is not the same as filling; continuation happens on the screen only, not in the buffer contents, and it breaks a line precisely at the right margin, not at a word boundary. See section Filling.

On a graphical display, tiny arrow images in the window fringes indicate truncated and continued lines (see section Fringes). On a text terminal, a ‘$’ in the rightmost column of the window indicates truncation; a ‘\’ on the rightmost column indicates a line that “wraps”. (The display table can specify alternate characters to use for this; see section Display Tables).

User Option: truncate-lines

If this buffer-local variable is non-nil, lines that extend beyond the right edge of the window are truncated; otherwise, they are continued. As a special exception, the variable truncate-partial-width-windows takes precedence in partial-width windows (i.e., windows that do not occupy the entire frame width).

User Option: truncate-partial-width-windows

This variable controls line truncation in partial-width windows. A partial-width window is one that does not occupy the entire frame width (see section Splitting Windows). If the value is nil, line truncation is determined by the variable truncate-lines (see above). If the value is an integer n, lines are truncated if the partial-width window has fewer than n columns, regardless of the value of truncate-lines; if the partial-width window has n or more columns, line truncation is determined by truncate-lines. For any other non-nil value, lines are truncated in every partial-width window, regardless of the value of truncate-lines.

When horizontal scrolling (see section Horizontal Scrolling) is in use in a window, that forces truncation.

Variable: wrap-prefix

If this buffer-local variable is non-nil, it defines a wrap prefix which Emacs displays at the start of every continuation line. (If lines are truncated, wrap-prefix is never used.) Its value may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the :width or :align-to display properties (see section Specified Spaces). The value is interpreted in the same way as a display text property. See section The display Property.

A wrap prefix may also be specified for regions of text, using the wrap-prefix text or overlay property. This takes precedence over the wrap-prefix variable. See section Properties with Special Meanings.

Variable: line-prefix

If this buffer-local variable is non-nil, it defines a line prefix which Emacs displays at the start of every non-continuation line. Its value may be a string or an image (see section Other Display Specifications), or a stretch of whitespace such as specified by the :width or :align-to display properties (see section Specified Spaces). The value is interpreted in the same way as a display text property. See section The display Property.

A line prefix may also be specified for regions of text using the line-prefix text or overlay property. This takes precedence over the line-prefix variable. See section Properties with Special Meanings.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4 The Echo Area

The echo area is used for displaying error messages (see section Errors), for messages made with the message primitive, and for echoing keystrokes. It is not the same as the minibuffer, despite the fact that the minibuffer appears (when active) in the same place on the screen as the echo area. See The Minibuffer in The GNU Emacs Manual.

Apart from the functions documented in this section, you can print Lisp objects to the echo area by specifying t as the output stream. See section Output Streams.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4.1 Displaying Messages in the Echo Area

This section describes the standard functions for displaying messages in the echo area.

Function: message format-string &rest arguments

This function displays a message in the echo area. format-string is a format string, and arguments are the objects for its format specifications, like in the format function (see section Formatting Strings). The resulting formatted string is displayed in the echo area; if it contains face text properties, it is displayed with the specified faces (see section Faces). The string is also added to the *Messages* buffer, but without text properties (see section Logging Messages in *Messages*).

In batch mode, the message is printed to the standard error stream, followed by a newline.

If format-string is nil or the empty string, message clears the echo area; if the echo area has been expanded automatically, this brings it back to its normal size. If the minibuffer is active, this brings the minibuffer contents back onto the screen immediately.

(message "Minibuffer depth is %d."
         (minibuffer-depth))
 -| Minibuffer depth is 0.
⇒ "Minibuffer depth is 0."

---------- Echo Area ----------
Minibuffer depth is 0.
---------- Echo Area ----------

To automatically display a message in the echo area or in a pop-buffer, depending on its size, use display-message-or-buffer (see below).

Macro: with-temp-message message &rest body

This construct displays a message in the echo area temporarily, during the execution of body. It displays message, executes body, then returns the value of the last body form while restoring the previous echo area contents.

Function: message-or-box format-string &rest arguments

This function displays a message like message, but may display it in a dialog box instead of the echo area. If this function is called in a command that was invoked using the mouse—more precisely, if last-nonmenu-event (see section Information from the Command Loop) is either nil or a list—then it uses a dialog box or pop-up menu to display the message. Otherwise, it uses the echo area. (This is the same criterion that y-or-n-p uses to make a similar decision; see Yes-or-No Queries.)

You can force use of the mouse or of the echo area by binding last-nonmenu-event to a suitable value around the call.

Function: message-box format-string &rest arguments

This function displays a message like message, but uses a dialog box (or a pop-up menu) whenever that is possible. If it is impossible to use a dialog box or pop-up menu, because the terminal does not support them, then message-box uses the echo area, like message.

Function: display-message-or-buffer message &optional buffer-name not-this-window frame

This function displays the message message, which may be either a string or a buffer. If it is shorter than the maximum height of the echo area, as defined by max-mini-window-height, it is displayed in the echo area, using message. Otherwise, display-buffer is used to show it in a pop-up buffer.

Returns either the string shown in the echo area, or when a pop-up buffer is used, the window used to display it.

If message is a string, then the optional argument buffer-name is the name of the buffer used to display it when a pop-up buffer is used, defaulting to *Message*. In the case where message is a string and displayed in the echo area, it is not specified whether the contents are inserted into the buffer anyway.

The optional arguments not-this-window and frame are as for display-buffer, and only used if a buffer is displayed.

Function: current-message

This function returns the message currently being displayed in the echo area, or nil if there is none.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4.2 Reporting Operation Progress

When an operation can take a while to finish, you should inform the user about the progress it makes. This way the user can estimate remaining time and clearly see that Emacs is busy working, not hung. A convenient way to do this is to use a progress reporter.

Here is a working example that does nothing useful:

(let ((progress-reporter
       (make-progress-reporter "Collecting mana for Emacs..."
                               0  500)))
  (dotimes (k 500)
    (sit-for 0.01)
    (progress-reporter-update progress-reporter k))
  (progress-reporter-done progress-reporter))
Function: make-progress-reporter message &optional min-value max-value current-value min-change min-time

This function creates and returns a progress reporter object, which you will use as an argument for the other functions listed below. The idea is to precompute as much data as possible to make progress reporting very fast.

When this progress reporter is subsequently used, it will display message in the echo area, followed by progress percentage. message is treated as a simple string. If you need it to depend on a filename, for instance, use format before calling this function.

The arguments min-value and max-value should be numbers standing for the starting and final states of the operation. For instance, an operation that “scans” a buffer should set these to the results of point-min and point-max correspondingly. max-value should be greater than min-value.

Alternatively, you can set min-value and max-value to nil. In that case, the progress reporter does not report process percentages; it instead displays a “spinner” that rotates a notch each time you update the progress reporter.

If min-value and max-value are numbers, you can give the argument current-value a numerical value specifying the initial progress; if omitted, this defaults to min-value.

The remaining arguments control the rate of echo area updates. The progress reporter will wait for at least min-change more percents of the operation to be completed before printing next message; the default is one percent. min-time specifies the minimum time in seconds to pass between successive prints; the default is 0.2 seconds. (On some operating systems, the progress reporter may handle fractions of seconds with varying precision).

This function calls progress-reporter-update, so the first message is printed immediately.

Function: progress-reporter-update reporter &optional value

This function does the main work of reporting progress of your operation. It displays the message of reporter, followed by progress percentage determined by value. If percentage is zero, or close enough according to the min-change and min-time arguments, then it is omitted from the output.

reporter must be the result of a call to make-progress-reporter. value specifies the current state of your operation and must be between min-value and max-value (inclusive) as passed to make-progress-reporter. For instance, if you scan a buffer, then value should be the result of a call to point.

This function respects min-change and min-time as passed to make-progress-reporter and so does not output new messages on every invocation. It is thus very fast and normally you should not try to reduce the number of calls to it: resulting overhead will most likely negate your effort.

Function: progress-reporter-force-update reporter &optional value new-message

This function is similar to progress-reporter-update except that it prints a message in the echo area unconditionally.

The first two arguments have the same meaning as for progress-reporter-update. Optional new-message allows you to change the message of the reporter. Since this function always updates the echo area, such a change will be immediately presented to the user.

Function: progress-reporter-done reporter

This function should be called when the operation is finished. It prints the message of reporter followed by word “done” in the echo area.

You should always call this function and not hope for progress-reporter-update to print “100%”. Firstly, it may never print it, there are many good reasons for this not to happen. Secondly, “done” is more explicit.

Macro: dotimes-with-progress-reporter (var count [result]) message body…

This is a convenience macro that works the same way as dotimes does, but also reports loop progress using the functions described above. It allows you to save some typing.

You can rewrite the example in the beginning of this node using this macro this way:

(dotimes-with-progress-reporter
    (k 500)
    "Collecting some mana for Emacs..."
  (sit-for 0.01))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4.3 Logging Messages in *Messages*

Almost all the messages displayed in the echo area are also recorded in the *Messages* buffer so that the user can refer back to them. This includes all the messages that are output with message. By default, this buffer is read-only and uses the major mode messages-buffer-mode. Nothing prevents the user from killing the *Messages* buffer, but the next display of a message recreates it. Any Lisp code that needs to access the *Messages* buffer directly and wants to ensure that it exists should use the function messages-buffer.

Function: messages-buffer

This function returns the *Messages* buffer. If it does not exist, it creates it, and switches it to messages-buffer-mode.

User Option: message-log-max

This variable specifies how many lines to keep in the *Messages* buffer. The value t means there is no limit on how many lines to keep. The value nil disables message logging entirely. Here’s how to display a message and prevent it from being logged:

(let (message-log-max)
  (message …))

To make *Messages* more convenient for the user, the logging facility combines successive identical messages. It also combines successive related messages for the sake of two cases: question followed by answer, and a series of progress messages.

A “question followed by an answer” means two messages like the ones produced by y-or-n-p: the first is ‘question’, and the second is ‘question...answer’. The first message conveys no additional information beyond what’s in the second, so logging the second message discards the first from the log.

A “series of progress messages” means successive messages like those produced by make-progress-reporter. They have the form ‘base...how-far’, where base is the same each time, while how-far varies. Logging each message in the series discards the previous one, provided they are consecutive.

The functions make-progress-reporter and y-or-n-p don’t have to do anything special to activate the message log combination feature. It operates whenever two consecutive messages are logged that share a common prefix ending in ‘...’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.4.4 Echo Area Customization

These variables control details of how the echo area works.

Variable: cursor-in-echo-area

This variable controls where the cursor appears when a message is displayed in the echo area. If it is non-nil, then the cursor appears at the end of the message. Otherwise, the cursor appears at point—not in the echo area at all.

The value is normally nil; Lisp programs bind it to t for brief periods of time.

Variable: echo-area-clear-hook

This normal hook is run whenever the echo area is cleared—either by (message nil) or for any other reason.

User Option: echo-keystrokes

This variable determines how much time should elapse before command characters echo. Its value must be a number, and specifies the number of seconds to wait before echoing. If the user types a prefix key (such as C-x) and then delays this many seconds before continuing, the prefix key is echoed in the echo area. (Once echoing begins in a key sequence, all subsequent characters in the same key sequence are echoed immediately.)

If the value is zero, then command input is not echoed.

Variable: message-truncate-lines

Normally, displaying a long message resizes the echo area to display the entire message. But if the variable message-truncate-lines is non-nil, the echo area does not resize, and the message is truncated to fit it.

The variable max-mini-window-height, which specifies the maximum height for resizing minibuffer windows, also applies to the echo area (which is really a special use of the minibuffer window; see section Minibuffer Miscellany).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5 Reporting Warnings

Warnings are a facility for a program to inform the user of a possible problem, but continue running.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5.1 Warning Basics

Every warning has a textual message, which explains the problem for the user, and a severity level which is a symbol. Here are the possible severity levels, in order of decreasing severity, and their meanings:

:emergency

A problem that will seriously impair Emacs operation soon if you do not attend to it promptly.

:error

A report of data or circumstances that are inherently wrong.

:warning

A report of data or circumstances that are not inherently wrong, but raise suspicion of a possible problem.

:debug

A report of information that may be useful if you are debugging.

When your program encounters invalid input data, it can either signal a Lisp error by calling error or signal or report a warning with severity :error. Signaling a Lisp error is the easiest thing to do, but it means the program cannot continue processing. If you want to take the trouble to implement a way to continue processing despite the bad data, then reporting a warning of severity :error is the right way to inform the user of the problem. For instance, the Emacs Lisp byte compiler can report an error that way and continue compiling other functions. (If the program signals a Lisp error and then handles it with condition-case, the user won’t see the error message; it could show the message to the user by reporting it as a warning.)

Each warning has a warning type to classify it. The type is a list of symbols. The first symbol should be the custom group that you use for the program’s user options. For example, byte compiler warnings use the warning type (bytecomp). You can also subcategorize the warnings, if you wish, by using more symbols in the list.

Function: display-warning type message &optional level buffer-name

This function reports a warning, using message as the message and type as the warning type. level should be the severity level, with :warning being the default.

buffer-name, if non-nil, specifies the name of the buffer for logging the warning. By default, it is *Warnings*.

Function: lwarn type level message &rest args

This function reports a warning using the value of (format message args...) as the message in the *Warnings* buffer. In other respects it is equivalent to display-warning.

Function: warn message &rest args

This function reports a warning using the value of (format message args...) as the message, (emacs) as the type, and :warning as the severity level. It exists for compatibility only; we recommend not using it, because you should specify a specific warning type.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5.2 Warning Variables

Programs can customize how their warnings appear by binding the variables described in this section.

Variable: warning-levels

This list defines the meaning and severity order of the warning severity levels. Each element defines one severity level, and they are arranged in order of decreasing severity.

Each element has the form (level string function), where level is the severity level it defines. string specifies the textual description of this level. string should use ‘%s’ to specify where to put the warning type information, or it can omit the ‘%s’ so as not to include that information.

The optional function, if non-nil, is a function to call with no arguments, to get the user’s attention.

Normally you should not change the value of this variable.

Variable: warning-prefix-function

If non-nil, the value is a function to generate prefix text for warnings. Programs can bind the variable to a suitable function. display-warning calls this function with the warnings buffer current, and the function can insert text in it. That text becomes the beginning of the warning message.

The function is called with two arguments, the severity level and its entry in warning-levels. It should return a list to use as the entry (this value need not be an actual member of warning-levels). By constructing this value, the function can change the severity of the warning, or specify different handling for a given severity level.

If the variable’s value is nil then there is no function to call.

Variable: warning-series

Programs can bind this variable to t to say that the next warning should begin a series. When several warnings form a series, that means to leave point on the first warning of the series, rather than keep moving it for each warning so that it appears on the last one. The series ends when the local binding is unbound and warning-series becomes nil again.

The value can also be a symbol with a function definition. That is equivalent to t, except that the next warning will also call the function with no arguments with the warnings buffer current. The function can insert text which will serve as a header for the series of warnings.

Once a series has begun, the value is a marker which points to the buffer position in the warnings buffer of the start of the series.

The variable’s normal value is nil, which means to handle each warning separately.

Variable: warning-fill-prefix

When this variable is non-nil, it specifies a fill prefix to use for filling each warning’s text.

Variable: warning-type-format

This variable specifies the format for displaying the warning type in the warning message. The result of formatting the type this way gets included in the message under the control of the string in the entry in warning-levels. The default value is " (%s)". If you bind it to "" then the warning type won’t appear at all.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5.3 Warning Options

These variables are used by users to control what happens when a Lisp program reports a warning.

User Option: warning-minimum-level

This user option specifies the minimum severity level that should be shown immediately to the user. The default is :warning, which means to immediately display all warnings except :debug warnings.

User Option: warning-minimum-log-level

This user option specifies the minimum severity level that should be logged in the warnings buffer. The default is :warning, which means to log all warnings except :debug warnings.

User Option: warning-suppress-types

This list specifies which warning types should not be displayed immediately for the user. Each element of the list should be a list of symbols. If its elements match the first elements in a warning type, then that warning is not displayed immediately.

User Option: warning-suppress-log-types

This list specifies which warning types should not be logged in the warnings buffer. Each element of the list should be a list of symbols. If it matches the first few elements in a warning type, then that warning is not logged.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.5.4 Delayed Warnings

Sometimes, you may wish to avoid showing a warning while a command is running, and only show it only after the end of the command. You can use the variable delayed-warnings-list for this.

Variable: delayed-warnings-list

The value of this variable is a list of warnings to be displayed after the current command has finished. Each element must be a list

(type message [level [buffer-name]])

with the same form, and the same meanings, as the argument list of display-warning (see section Warning Basics). Immediately after running post-command-hook (see section Command Loop Overview), the Emacs command loop displays all the warnings specified by this variable, then resets it to nil.

Programs which need to further customize the delayed warnings mechanism can change the variable delayed-warnings-hook:

Variable: delayed-warnings-hook

This is a normal hook which is run by the Emacs command loop, after post-command-hook, in order to to process and display delayed warnings.

Its default value is a list of two functions:

(collapse-delayed-warnings display-delayed-warnings)

The function collapse-delayed-warnings removes repeated entries from delayed-warnings-list. The function display-delayed-warnings calls display-warning on each of the entries in delayed-warnings-list, in turn, and then sets delayed-warnings-list to nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.6 Invisible Text

You can make characters invisible, so that they do not appear on the screen, with the invisible property. This can be either a text property (see section Text Properties) or an overlay property (see section Overlays). Cursor motion also partly ignores these characters; if the command loop finds that point is inside a range of invisible text after a command, it relocates point to the other side of the text.

In the simplest case, any non-nil invisible property makes a character invisible. This is the default case—if you don’t alter the default value of buffer-invisibility-spec, this is how the invisible property works. You should normally use t as the value of the invisible property if you don’t plan to set buffer-invisibility-spec yourself.

More generally, you can use the variable buffer-invisibility-spec to control which values of the invisible property make text invisible. This permits you to classify the text into different subsets in advance, by giving them different invisible values, and subsequently make various subsets visible or invisible by changing the value of buffer-invisibility-spec.

Controlling visibility with buffer-invisibility-spec is especially useful in a program to display the list of entries in a database. It permits the implementation of convenient filtering commands to view just a part of the entries in the database. Setting this variable is very fast, much faster than scanning all the text in the buffer looking for properties to change.

Variable: buffer-invisibility-spec

This variable specifies which kinds of invisible properties actually make a character invisible. Setting this variable makes it buffer-local.

t

A character is invisible if its invisible property is non-nil. This is the default.

a list

Each element of the list specifies a criterion for invisibility; if a character’s invisible property fits any one of these criteria, the character is invisible. The list can have two kinds of elements:

atom

A character is invisible if its invisible property value is atom or if it is a list with atom as a member; comparison is done with eq.

(atom . t)

A character is invisible if its invisible property value is atom or if it is a list with atom as a member; comparison is done with eq. Moreover, a sequence of such characters displays as an ellipsis.

Two functions are specifically provided for adding elements to buffer-invisibility-spec and removing elements from it.

Function: add-to-invisibility-spec element

This function adds the element element to buffer-invisibility-spec. If buffer-invisibility-spec was t, it changes to a list, (t), so that text whose invisible property is t remains invisible.

Function: remove-from-invisibility-spec element

This removes the element element from buffer-invisibility-spec. This does nothing if element is not in the list.

A convention for use of buffer-invisibility-spec is that a major mode should use the mode’s own name as an element of buffer-invisibility-spec and as the value of the invisible property:

;; If you want to display an ellipsis:
(add-to-invisibility-spec '(my-symbol . t))
;; If you don’t want ellipsis:
(add-to-invisibility-spec 'my-symbol)

(overlay-put (make-overlay beginning end)
             'invisible 'my-symbol)

;; When done with the invisibility:
(remove-from-invisibility-spec '(my-symbol . t))
;; Or respectively:
(remove-from-invisibility-spec 'my-symbol)

You can check for invisibility using the following function:

Function: invisible-p pos-or-prop

If pos-or-prop is a marker or number, this function returns a non-nil value if the text at that position is invisible.

If pos-or-prop is any other kind of Lisp object, that is taken to mean a possible value of the invisible text or overlay property. In that case, this function returns a non-nil value if that value would cause text to become invisible, based on the current value of buffer-invisibility-spec.

Ordinarily, functions that operate on text or move point do not care whether the text is invisible, they process invisible characters and visible characters alike. The user-level line motion commands, such as next-line, previous-line, ignore invisible newlines if line-move-ignore-invisible is non-nil (the default), i.e., behave like these invisible newlines didn’t exist in the buffer, but only because they are explicitly programmed to do so.

If a command ends with point inside or at the boundary of invisible text, the main editing loop relocates point to one of the two ends of the invisible text. Emacs chooses the direction of relocation so that it is the same as the overall movement direction of the command; if in doubt, it prefers a position where an inserted char would not inherit the invisible property. Additionally, if the text is not replaced by an ellipsis and the command only moved within the invisible text, then point is moved one extra character so as to try and reflect the command’s movement by a visible movement of the cursor.

Thus, if the command moved point back to an invisible range (with the usual stickiness), Emacs moves point back to the beginning of that range. If the command moved point forward into an invisible range, Emacs moves point forward to the first visible character that follows the invisible text and then forward one more character.

These adjustments of point that ended up in the middle of invisible text can be disabled by setting disable-point-adjustment to a non-nil value. See section Adjusting Point After Commands.

Incremental search can make invisible overlays visible temporarily and/or permanently when a match includes invisible text. To enable this, the overlay should have a non-nil isearch-open-invisible property. The property value should be a function to be called with the overlay as an argument. This function should make the overlay visible permanently; it is used when the match overlaps the overlay on exit from the search.

During the search, such overlays are made temporarily visible by temporarily modifying their invisible and intangible properties. If you want this to be done differently for a certain overlay, give it an isearch-open-invisible-temporary property which is a function. The function is called with two arguments: the first is the overlay, and the second is nil to make the overlay visible, or t to make it invisible again.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.7 Selective Display

Selective display refers to a pair of related features for hiding certain lines on the screen.

The first variant, explicit selective display, was designed for use in a Lisp program: it controls which lines are hidden by altering the text. This kind of hiding is now obsolete; instead you can get the same effect with the invisible property (see section Invisible Text).

In the second variant, the choice of lines to hide is made automatically based on indentation. This variant is designed to be a user-level feature.

The way you control explicit selective display is by replacing a newline (control-j) with a carriage return (control-m). The text that was formerly a line following that newline is now hidden. Strictly speaking, it is temporarily no longer a line at all, since only newlines can separate lines; it is now part of the previous line.

Selective display does not directly affect editing commands. For example, C-f (forward-char) moves point unhesitatingly into hidden text. However, the replacement of newline characters with carriage return characters affects some editing commands. For example, next-line skips hidden lines, since it searches only for newlines. Modes that use selective display can also define commands that take account of the newlines, or that control which parts of the text are hidden.

When you write a selectively displayed buffer into a file, all the control-m’s are output as newlines. This means that when you next read in the file, it looks OK, with nothing hidden. The selective display effect is seen only within Emacs.

Variable: selective-display

This buffer-local variable enables selective display. This means that lines, or portions of lines, may be made hidden.

When some portion of a buffer is hidden, the vertical movement commands operate as if that portion did not exist, allowing a single next-line command to skip any number of hidden lines. However, character movement commands (such as forward-char) do not skip the hidden portion, and it is possible (if tricky) to insert or delete text in an hidden portion.

In the examples below, we show the display appearance of the buffer foo, which changes with the value of selective-display. The contents of the buffer do not change.

(setq selective-display nil)
     ⇒ nil

---------- Buffer: foo ----------
1 on this column
 2on this column
  3n this column
  3n this column
 2on this column
1 on this column
---------- Buffer: foo ----------

(setq selective-display 2)
     ⇒ 2

---------- Buffer: foo ----------
1 on this column
 2on this column
 2on this column
1 on this column
---------- Buffer: foo ----------
User Option: selective-display-ellipses

If this buffer-local variable is non-nil, then Emacs displays ‘’ at the end of a line that is followed by hidden text. This example is a continuation of the previous one.

(setq selective-display-ellipses t)
     ⇒ t

---------- Buffer: foo ----------
1 on this column
 2on this column ...
 2on this column
1 on this column
---------- Buffer: foo ----------

You can use a display table to substitute other text for the ellipsis (‘’). See section Display Tables.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.8 Temporary Displays

Temporary displays are used by Lisp programs to put output into a buffer and then present it to the user for perusal rather than for editing. Many help commands use this feature.

Macro: with-output-to-temp-buffer buffer-name body…

This function executes the forms in body while arranging to insert any output they print into the buffer named buffer-name, which is first created if necessary, and put into Help mode. (See the similar form with-temp-buffer-window below.) Finally, the buffer is displayed in some window, but that window is not selected.

If the forms in body do not change the major mode in the output buffer, so that it is still Help mode at the end of their execution, then with-output-to-temp-buffer makes this buffer read-only at the end, and also scans it for function and variable names to make them into clickable cross-references. See Tips for Documentation Strings, in particular the item on hyperlinks in documentation strings, for more details.

The string buffer-name specifies the temporary buffer, which need not already exist. The argument must be a string, not a buffer. The buffer is erased initially (with no questions asked), and it is marked as unmodified after with-output-to-temp-buffer exits.

with-output-to-temp-buffer binds standard-output to the temporary buffer, then it evaluates the forms in body. Output using the Lisp output functions within body goes by default to that buffer (but screen display and messages in the echo area, although they are “output” in the general sense of the word, are not affected). See section Output Functions.

Several hooks are available for customizing the behavior of this construct; they are listed below.

The value of the last form in body is returned.

---------- Buffer: foo ----------
 This is the contents of foo.
---------- Buffer: foo ----------

(with-output-to-temp-buffer "foo"
    (print 20)
    (print standard-output))
⇒ #<buffer foo>

---------- Buffer: foo ----------

20

#<buffer foo>

---------- Buffer: foo ----------
User Option: temp-buffer-show-function

If this variable is non-nil, with-output-to-temp-buffer calls it as a function to do the job of displaying a help buffer. The function gets one argument, which is the buffer it should display.

It is a good idea for this function to run temp-buffer-show-hook just as with-output-to-temp-buffer normally would, inside of save-selected-window and with the chosen window and buffer selected.

Variable: temp-buffer-setup-hook

This normal hook is run by with-output-to-temp-buffer before evaluating body. When the hook runs, the temporary buffer is current. This hook is normally set up with a function to put the buffer in Help mode.

Variable: temp-buffer-show-hook

This normal hook is run by with-output-to-temp-buffer after displaying the temporary buffer. When the hook runs, the temporary buffer is current, and the window it was displayed in is selected.

Macro: with-temp-buffer-window buffer-or-name action quit-function body…

This macro is similar to with-output-to-temp-buffer. Like that construct, it executes body while arranging to insert any output it prints into the buffer named buffer-or-name and displays that buffer in some window. Unlike with-output-to-temp-buffer, however, it does not automatically switch that buffer to Help mode.

Like with-output-to-temp-buffer it neither makes the buffer specified by buffer-or-name current when executing body. The otherwise identical macro with-current-buffer-window can be used to execute body with that buffer current.

The argument buffer-or-name specifies the temporary buffer. It can be either a buffer, which must already exist, or a string, in which case a buffer of that name is created, if necessary. The buffer is marked as unmodified and read-only when with-temp-buffer-window exits.

This macro does not call temp-buffer-show-function. Rather, it passes the action argument to display-buffer in order to display the buffer.

The value of the last form in body is returned, unless the argument quit-function is specified. In that case, it is called with two arguments: the window showing the buffer and the result of body. The final return value is then whatever quit-function returns.

This macro uses the normal hooks temp-buffer-window-setup-hook and temp-buffer-window-show-hook in place of the analogous hooks run by with-output-to-temp-buffer.

Function: momentary-string-display string position &optional char message

This function momentarily displays string in the current buffer at position. It has no effect on the undo list or on the buffer’s modification status.

The momentary display remains until the next input event. If the next input event is char, momentary-string-display ignores it and returns. Otherwise, that event remains buffered for subsequent use as input. Thus, typing char will simply remove the string from the display, while typing (say) C-f will remove the string from the display and later (presumably) move point forward. The argument char is a space by default.

The return value of momentary-string-display is not meaningful.

If the string string does not contain control characters, you can do the same job in a more general way by creating (and then subsequently deleting) an overlay with a before-string property. See section Overlay Properties.

If message is non-nil, it is displayed in the echo area while string is displayed in the buffer. If it is nil, a default message says to type char to continue.

In this example, point is initially located at the beginning of the second line:

---------- Buffer: foo ----------
This is the contents of foo.
∗Second line.
---------- Buffer: foo ----------

(momentary-string-display
  "**** Important Message! ****"
  (point) ?\r
  "Type RET when done reading")
⇒ t

---------- Buffer: foo ----------
This is the contents of foo.
**** Important Message! ****Second line.
---------- Buffer: foo ----------

---------- Echo Area ----------
Type RET when done reading
---------- Echo Area ----------

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.9 Overlays

You can use overlays to alter the appearance of a buffer’s text on the screen, for the sake of presentation features. An overlay is an object that belongs to a particular buffer, and has a specified beginning and end. It also has properties that you can examine and set; these affect the display of the text within the overlay.

The visual effect of an overlay is the same as of the corresponding text property (see section Text Properties). However, due to a different implementation, overlays generally don’t scale well (many operations take a time that is proportional to the number of overlays in the buffer). If you need to affect the visual appearance of many portions in the buffer, we recommend using text properties.

An overlay uses markers to record its beginning and end; thus, editing the text of the buffer adjusts the beginning and end of each overlay so that it stays with the text. When you create the overlay, you can specify whether text inserted at the beginning should be inside the overlay or outside, and likewise for the end of the overlay.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.9.1 Managing Overlays

This section describes the functions to create, delete and move overlays, and to examine their contents. Overlay changes are not recorded in the buffer’s undo list, since the overlays are not part of the buffer’s contents.

Function: overlayp object

This function returns t if object is an overlay.

Function: make-overlay start end &optional buffer front-advance rear-advance

This function creates and returns an overlay that belongs to buffer and ranges from start to end. Both start and end must specify buffer positions; they may be integers or markers. If buffer is omitted, the overlay is created in the current buffer.

The arguments front-advance and rear-advance specify the marker insertion type for the start of the overlay and for the end of the overlay, respectively. See section Marker Insertion Types. If they are both nil, the default, then the overlay extends to include any text inserted at the beginning, but not text inserted at the end. If front-advance is non-nil, text inserted at the beginning of the overlay is excluded from the overlay. If rear-advance is non-nil, text inserted at the end of the overlay is included in the overlay.

Function: overlay-start overlay

This function returns the position at which overlay starts, as an integer.

Function: overlay-end overlay

This function returns the position at which overlay ends, as an integer.

Function: overlay-buffer overlay

This function returns the buffer that overlay belongs to. It returns nil if overlay has been deleted.

Function: delete-overlay overlay

This function deletes overlay. The overlay continues to exist as a Lisp object, and its property list is unchanged, but it ceases to be attached to the buffer it belonged to, and ceases to have any effect on display.

A deleted overlay is not permanently disconnected. You can give it a position in a buffer again by calling move-overlay.

Function: move-overlay overlay start end &optional buffer

This function moves overlay to buffer, and places its bounds at start and end. Both arguments start and end must specify buffer positions; they may be integers or markers.

If buffer is omitted, overlay stays in the same buffer it was already associated with; if overlay was deleted, it goes into the current buffer.

The return value is overlay.

This is the only valid way to change the endpoints of an overlay. Do not try modifying the markers in the overlay by hand, as that fails to update other vital data structures and can cause some overlays to be “lost”.

Function: remove-overlays &optional start end name value

This function removes all the overlays between start and end whose property name has the value value. It can move the endpoints of the overlays in the region, or split them.

If name is omitted or nil, it means to delete all overlays in the specified region. If start and/or end are omitted or nil, that means the beginning and end of the buffer respectively. Therefore, (remove-overlays) removes all the overlays in the current buffer.

Function: copy-overlay overlay

This function returns a copy of overlay. The copy has the same endpoints and properties as overlay. However, the marker insertion type for the start of the overlay and for the end of the overlay are set to their default values (see section Marker Insertion Types).

Here are some examples:

;; Create an overlay.
(setq foo (make-overlay 1 10))
     ⇒ #<overlay from 1 to 10 in display.texi>
(overlay-start foo)
     ⇒ 1
(overlay-end foo)
     ⇒ 10
(overlay-buffer foo)
     ⇒ #<buffer display.texi>
;; Give it a property we can check later.
(overlay-put foo 'happy t)
     ⇒ t
;; Verify the property is present.
(overlay-get foo 'happy)
     ⇒ t
;; Move the overlay.
(move-overlay foo 5 20)
     ⇒ #<overlay from 5 to 20 in display.texi>
(overlay-start foo)
     ⇒ 5
(overlay-end foo)
     ⇒ 20
;; Delete the overlay.
(delete-overlay foo)
     ⇒ nil
;; Verify it is deleted.
foo
     ⇒ #<overlay in no buffer>
;; A deleted overlay has no position.
(overlay-start foo)
     ⇒ nil
(overlay-end foo)
     ⇒ nil
(overlay-buffer foo)
     ⇒ nil
;; Undelete the overlay.
(move-overlay foo 1 20)
     ⇒ #<overlay from 1 to 20 in display.texi>
;; Verify the results.
(overlay-start foo)
     ⇒ 1
(overlay-end foo)
     ⇒ 20
(overlay-buffer foo)
     ⇒ #<buffer display.texi>
;; Moving and deleting the overlay does not change its properties.
(overlay-get foo 'happy)
     ⇒ t

Emacs stores the overlays of each buffer in two lists, divided around an arbitrary “center position”. One list extends backwards through the buffer from that center position, and the other extends forwards from that center position. The center position can be anywhere in the buffer.

Function: overlay-recenter pos

This function recenters the overlays of the current buffer around position pos. That makes overlay lookup faster for positions near pos, but slower for positions far away from pos.

A loop that scans the buffer forwards, creating overlays, can run faster if you do (overlay-recenter (point-max)) first.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.9.2 Overlay Properties

Overlay properties are like text properties in that the properties that alter how a character is displayed can come from either source. But in most respects they are different. See section Text Properties, for comparison.

Text properties are considered a part of the text; overlays and their properties are specifically considered not to be part of the text. Thus, copying text between various buffers and strings preserves text properties, but does not try to preserve overlays. Changing a buffer’s text properties marks the buffer as modified, while moving an overlay or changing its properties does not. Unlike text property changes, overlay property changes are not recorded in the buffer’s undo list.

Since more than one overlay can specify a property value for the same character, Emacs lets you specify a priority value of each overlay. In case two overlays have the same priority value, and one is nested in the other, then the inner one will have priority over the outer one. If neither is nested in the other then you should not make assumptions about which overlay will prevail.

These functions read and set the properties of an overlay:

Function: overlay-get overlay prop

This function returns the value of property prop recorded in overlay, if any. If overlay does not record any value for that property, but it does have a category property which is a symbol, that symbol’s prop property is used. Otherwise, the value is nil.

Function: overlay-put overlay prop value

This function sets the value of property prop recorded in overlay to value. It returns value.

Function: overlay-properties overlay

This returns a copy of the property list of overlay.

See also the function get-char-property which checks both overlay properties and text properties for a given character. See section Examining Text Properties.

Many overlay properties have special meanings; here is a table of them:

priority

This property’s value determines the priority of the overlay. If you want to specify a priority value, use either nil (or zero), or a positive integer. Any other value has undefined behavior.

The priority matters when two or more overlays cover the same character and both specify the same property; the one whose priority value is larger overrides the other. For the face property, the higher priority overlay’s value does not completely override the other value; instead, its face attributes override the face attributes of the lower priority face property.

Currently, all overlays take priority over text properties.

Note that Emacs sometimes uses non-numeric priority values for some of its internal overlays, so do not try to do arithmetic on the priority of an overlay (unless it is one that you created). If you need to put overlays in priority order, use the sorted argument of overlays-at. See section Searching for Overlays.

window

If the window property is non-nil, then the overlay applies only on that window.

category

If an overlay has a category property, we call it the category of the overlay. It should be a symbol. The properties of the symbol serve as defaults for the properties of the overlay.

face

This property controls the appearance of the text (see section Faces). The value of the property can be the following:

mouse-face

This property is used instead of face when the mouse is within the range of the overlay. However, Emacs ignores all face attributes from this property that alter the text size (e.g., :height, :weight, and :slant). Those attributes are always the same as in the unhighlighted text.

display

This property activates various features that change the way text is displayed. For example, it can make text appear taller or shorter, higher or lower, wider or narrower, or replaced with an image. See section The display Property.

help-echo

If an overlay has a help-echo property, then when you move the mouse onto the text in the overlay, Emacs displays a help string in the echo area, or in the tooltip window. For details see Text help-echo.

field

Consecutive characters with the same field property constitute a field. Some motion functions including forward-word and beginning-of-line stop moving at a field boundary. See section Defining and Using Fields.

modification-hooks

This property’s value is a list of functions to be called if any character within the overlay is changed or if text is inserted strictly within the overlay.

The hook functions are called both before and after each change. If the functions save the information they receive, and compare notes between calls, they can determine exactly what change has been made in the buffer text.

When called before a change, each function receives four arguments: the overlay, nil, and the beginning and end of the text range to be modified.

When called after a change, each function receives five arguments: the overlay, t, the beginning and end of the text range just modified, and the length of the pre-change text replaced by that range. (For an insertion, the pre-change length is zero; for a deletion, that length is the number of characters deleted, and the post-change beginning and end are equal.)

If these functions modify the buffer, they should bind inhibit-modification-hooks to t around doing so, to avoid confusing the internal mechanism that calls these hooks.

Text properties also support the modification-hooks property, but the details are somewhat different (see section Properties with Special Meanings).

insert-in-front-hooks

This property’s value is a list of functions to be called before and after inserting text right at the beginning of the overlay. The calling conventions are the same as for the modification-hooks functions.

insert-behind-hooks

This property’s value is a list of functions to be called before and after inserting text right at the end of the overlay. The calling conventions are the same as for the modification-hooks functions.

invisible

The invisible property can make the text in the overlay invisible, which means that it does not appear on the screen. See section Invisible Text, for details.

intangible

The intangible property on an overlay works just like the intangible text property. See section Properties with Special Meanings, for details.

isearch-open-invisible

This property tells incremental search how to make an invisible overlay visible, permanently, if the final match overlaps it. See section Invisible Text.

isearch-open-invisible-temporary

This property tells incremental search how to make an invisible overlay visible, temporarily, during the search. See section Invisible Text.

before-string

This property’s value is a string to add to the display at the beginning of the overlay. The string does not appear in the buffer in any sense—only on the screen.

after-string

This property’s value is a string to add to the display at the end of the overlay. The string does not appear in the buffer in any sense—only on the screen.

line-prefix

This property specifies a display spec to prepend to each non-continuation line at display-time. See section Truncation.

wrap-prefix

This property specifies a display spec to prepend to each continuation line at display-time. See section Truncation.

evaporate

If this property is non-nil, the overlay is deleted automatically if it becomes empty (i.e., if its length becomes zero). If you give an empty overlay a non-nil evaporate property, that deletes it immediately.

keymap

If this property is non-nil, it specifies a keymap for a portion of the text. This keymap is used when the character after point is within the overlay, and takes precedence over most other keymaps. See section Active Keymaps.

local-map

The local-map property is similar to keymap but replaces the buffer’s local map rather than augmenting existing keymaps. This also means it has lower precedence than minor mode keymaps.

The keymap and local-map properties do not affect a string displayed by the before-string, after-string, or display properties. This is only relevant for mouse clicks and other mouse events that fall on the string, since point is never on the string. To bind special mouse events for the string, assign it a keymap or local-map text property. See section Properties with Special Meanings.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.9.3 Searching for Overlays

Function: overlays-at pos &optional sorted

This function returns a list of all the overlays that cover the character at position pos in the current buffer. If sorted is non-nil, the list is in decreasing order of priority, otherwise it is in no particular order. An overlay contains position pos if it begins at or before pos, and ends after pos.

To illustrate usage, here is a Lisp function that returns a list of the overlays that specify property prop for the character at point:

(defun find-overlays-specifying (prop)
  (let ((overlays (overlays-at (point)))
        found)
    (while overlays
      (let ((overlay (car overlays)))
        (if (overlay-get overlay prop)
            (setq found (cons overlay found))))
      (setq overlays (cdr overlays)))
    found))
Function: overlays-in beg end

This function returns a list of the overlays that overlap the region beg through end. “Overlap” means that at least one character is contained within the overlay and also contained within the specified region; however, empty overlays are included in the result if they are located at beg, strictly between beg and end, or at end when end denotes the position at the end of the buffer.

Function: next-overlay-change pos

This function returns the buffer position of the next beginning or end of an overlay, after pos. If there is none, it returns (point-max).

Function: previous-overlay-change pos

This function returns the buffer position of the previous beginning or end of an overlay, before pos. If there is none, it returns (point-min).

As an example, here’s a simplified (and inefficient) version of the primitive function next-single-char-property-change (see section Text Property Search Functions). It searches forward from position pos for the next position where the value of a given property prop, as obtained from either overlays or text properties, changes.

(defun next-single-char-property-change (position prop)
  (save-excursion
    (goto-char position)
    (let ((propval (get-char-property (point) prop)))
      (while (and (not (eobp))
                  (eq (get-char-property (point) prop) propval))
        (goto-char (min (next-overlay-change (point))
                        (next-single-property-change (point) prop)))))
    (point)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.10 Size of Displayed Text

Since not all characters have the same width, these functions let you check the width of a character. See section Indentation Primitives, and Motion by Screen Lines, for related functions.

Function: char-width char

This function returns the width in columns of the character char, if it were displayed in the current buffer (i.e., taking into account the buffer’s display table, if any; see section Display Tables). The width of a tab character is usually tab-width (see section Usual Display Conventions).

Function: string-width string

This function returns the width in columns of the string string, if it were displayed in the current buffer and the selected window.

Function: truncate-string-to-width string width &optional start-column padding ellipsis

This function returns the part of string that fits within width columns, as a new string.

If string does not reach width, then the result ends where string ends. If one multi-column character in string extends across the column width, that character is not included in the result. Thus, the result can fall short of width but cannot go beyond it.

The optional argument start-column specifies the starting column. If this is non-nil, then the first start-column columns of the string are omitted from the value. If one multi-column character in string extends across the column start-column, that character is not included.

The optional argument padding, if non-nil, is a padding character added at the beginning and end of the result string, to extend it to exactly width columns. The padding character is used at the end of the result if it falls short of width. It is also used at the beginning of the result if one multi-column character in string extends across the column start-column.

If ellipsis is non-nil, it should be a string which will replace the end of string (including any padding) if it extends beyond width, unless the display width of string is equal to or less than the display width of ellipsis. If ellipsis is non-nil and not a string, it stands for "...".

(truncate-string-to-width "\tab\t" 12 4)
     ⇒ "ab"
(truncate-string-to-width "\tab\t" 12 4 ?\s)
     ⇒ "    ab  "

The following function returns the size in pixels of text as if it were displayed in a given window. This function is used by fit-window-to-buffer (see section Resizing Windows) and fit-frame-to-buffer (see section Frame Size And Position) to make a window exactly as large as the text it contains.

Function: window-text-pixel-size &optional window from to x-limit y-limit mode-and-header-line

This function returns the size of the text of window’s buffer in pixels. window must be a live window and defaults to the selected one. The return value is a cons of the maximum pixel-width of any text line and the maximum pixel-height of all text lines.

The optional argument from, if non-nil, specifies the first text position to consider and defaults to the minimum accessible position of the buffer. If from is t, it uses the minimum accessible position that is not a newline character. The optional argument to, if non-nil, specifies the last text position to consider and defaults to the maximum accessible position of the buffer. If to is t, it uses the maximum accessible position that is not a newline character.

The optional argument x-limit, if non-nil, specifies the maximum pixel-width that can be returned. x-limit nil or omitted, means to use the pixel-width of window’s body (see section Window Sizes); this is useful when the caller does not intend to change the width of window. Otherwise, the caller should specify here the maximum width window’s body may assume. Text whose x-coordinate is beyond x-limit is ignored. Since calculating the width of long lines can take some time, it’s always a good idea to make this argument as small as needed; in particular, if the buffer might contain long lines that will be truncated anyway.

The optional argument y-limit, if non-nil, specifies the maximum pixel-height that can be returned. Text lines whose y-coordinate is beyond y-limit are ignored. Since calculating the pixel-height of a large buffer can take some time, it makes sense to specify this argument; in particular, if the caller does not know the size of the buffer.

The optional argument mode-and-header-line nil or omitted means to not include the height of the mode- or header-line of window in the return value. If it is either the symbol mode-line or header-line, include only the height of that line, if present, in the return value. If it is t, include the height of both, if present, in the return value.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.11 Line Height

The total height of each display line consists of the height of the contents of the line, plus optional additional vertical line spacing above or below the display line.

The height of the line contents is the maximum height of any character or image on that display line, including the final newline if there is one. (A display line that is continued doesn’t include a final newline.) That is the default line height, if you do nothing to specify a greater height. (In the most common case, this equals the height of the default frame font.)

There are several ways to explicitly specify a larger line height, either by specifying an absolute height for the display line, or by specifying vertical space. However, no matter what you specify, the actual line height can never be less than the default.

A newline can have a line-height text or overlay property that controls the total height of the display line ending in that newline.

If the property value is t, the newline character has no effect on the displayed height of the line—the visible contents alone determine the height. This is useful for tiling small images (or image slices) without adding blank areas between the images.

If the property value is a list of the form (height total), that adds extra space below the display line. First Emacs uses height as a height spec to control extra space above the line; then it adds enough space below the line to bring the total line height up to total. In this case, the other ways to specify the line spacing are ignored.

Any other kind of property value is a height spec, which translates into a number—the specified line height. There are several ways to write a height spec; here’s how each of them translates into a number:

integer

If the height spec is a positive integer, the height value is that integer.

float

If the height spec is a float, float, the numeric height value is float times the frame’s default line height.

(face . ratio)

If the height spec is a cons of the format shown, the numeric height is ratio times the height of face face. ratio can be any type of number, or nil which means a ratio of 1. If face is t, it refers to the current face.

(nil . ratio)

If the height spec is a cons of the format shown, the numeric height is ratio times the height of the contents of the line.

Thus, any valid height spec determines the height in pixels, one way or another. If the line contents’ height is less than that, Emacs adds extra vertical space above the line to achieve the specified total height.

If you don’t specify the line-height property, the line’s height consists of the contents’ height plus the line spacing. There are several ways to specify the line spacing for different parts of Emacs text.

On graphical terminals, you can specify the line spacing for all lines in a frame, using the line-spacing frame parameter (see section Layout Parameters). However, if the default value of line-spacing is non-nil, it overrides the frame’s line-spacing parameter. An integer specifies the number of pixels put below lines. A floating-point number specifies the spacing relative to the frame’s default line height.

You can specify the line spacing for all lines in a buffer via the buffer-local line-spacing variable. An integer specifies the number of pixels put below lines. A floating-point number specifies the spacing relative to the default frame line height. This overrides line spacings specified for the frame.

Finally, a newline can have a line-spacing text or overlay property that overrides the default frame line spacing and the buffer local line-spacing variable, for the display line ending in that newline.

One way or another, these mechanisms specify a Lisp value for the spacing of each line. The value is a height spec, and it translates into a Lisp value as described above. However, in this case the numeric height value specifies the line spacing, rather than the line height.

On text terminals, the line spacing cannot be altered.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12 Faces

A face is a collection of graphical attributes for displaying text: font, foreground color, background color, optional underlining, etc. Faces control how Emacs displays text in buffers, as well as other parts of the frame such as the mode line.

One way to represent a face is as a property list of attributes, like (:foreground "red" :weight bold). Such a list is called an anonymous face. For example, you can assign an anonymous face as the value of the face text property, and Emacs will display the underlying text with the specified attributes. See section Properties with Special Meanings.

More commonly, a face is referred to via a face name: a Lisp symbol associated with a set of face attributes19. Named faces are defined using the defface macro (see section Defining Faces). Emacs comes with several standard named faces (see section Basic Faces).

Many parts of Emacs required named faces, and do not accept anonymous faces. These include the functions documented in Face Attribute Functions, and the variable font-lock-keywords (see section Search-based Fontification). Unless otherwise stated, we will use the term face to refer only to named faces.

Function: facep object

This function returns a non-nil value if object is a named face: a Lisp symbol or string which serves as a face name. Otherwise, it returns nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.1 Face Attributes

Face attributes determine the visual appearance of a face. The following table lists all the face attributes, their possible values, and their effects.

Apart from the values given below, each face attribute can have the value unspecified. This special value means that the face doesn’t specify that attribute directly. An unspecified attribute tells Emacs to refer instead to a parent face (see the description :inherit attribute below); or, failing that, to an underlying face (see section Displaying Faces). The default face must specify all attributes.

Some of these attributes are meaningful only on certain kinds of displays. If your display cannot handle a certain attribute, the attribute is ignored.

:family

Font family or fontset (a string). See Fonts in The GNU Emacs Manual, for more information about font families. The function font-family-list (see below) returns a list of available family names. See section Fontsets, for information about fontsets.

:foundry

The name of the font foundry for the font family specified by the :family attribute (a string). See Fonts in The GNU Emacs Manual.

:width

Relative character width. This should be one of the symbols ultra-condensed, extra-condensed, condensed, semi-condensed, normal, semi-expanded, expanded, extra-expanded, or ultra-expanded.

:height

The height of the font. In the simplest case, this is an integer in units of 1/10 point.

The value can also be floating point or a function, which specifies the height relative to an underlying face (see section Displaying Faces). A floating-point value specifies the amount by which to scale the height of the underlying face. A function value is called with one argument, the height of the underlying face, and returns the height of the new face. If the function is passed an integer argument, it must return an integer.

The height of the default face must be specified using an integer; floating point and function values are not allowed.

:weight

Font weight—one of the symbols (from densest to faintest) ultra-bold, extra-bold, bold, semi-bold, normal, semi-light, light, extra-light, or ultra-light. On text terminals which support variable-brightness text, any weight greater than normal is displayed as extra bright, and any weight less than normal is displayed as half-bright.

:slant

Font slant—one of the symbols italic, oblique, normal, reverse-italic, or reverse-oblique. On text terminals that support variable-brightness text, slanted text is displayed as half-bright.

:foreground

Foreground color, a string. The value can be a system-defined color name, or a hexadecimal color specification. See section Color Names. On black-and-white displays, certain shades of gray are implemented by stipple patterns.

:distant-foreground

Alternative foreground color, a string. This is like :foreground but the color is only used as a foreground when the background color is near to the foreground that would have been used. This is useful for example when marking text (i.e. the region face). If the text has a foreground that is visible with the region face, that foreground is used. If the foreground is near the region face background, :distant-foreground is used instead so the text is readable.

:background

Background color, a string. The value can be a system-defined color name, or a hexadecimal color specification. See section Color Names.

:underline

Whether or not characters should be underlined, and in what way. The possible values of the :underline attribute are:

nil

Don’t underline.

t

Underline with the foreground color of the face.

color

Underline in color color, a string specifying a color.

(:color color :style style)

color is either a string, or the symbol foreground-color, meaning the foreground color of the face. Omitting the attribute :color means to use the foreground color of the face. style should be a symbol line or wave, meaning to use a straight or wavy line. Omitting the attribute :style means to use a straight line.

:overline

Whether or not characters should be overlined, and in what color. If the value is t, overlining uses the foreground color of the face. If the value is a string, overlining uses that color. The value nil means do not overline.

:strike-through

Whether or not characters should be strike-through, and in what color. The value is used like that of :overline.

:box

Whether or not a box should be drawn around characters, its color, the width of the box lines, and 3D appearance. Here are the possible values of the :box attribute, and what they mean:

nil

Don’t draw a box.

t

Draw a box with lines of width 1, in the foreground color.

color

Draw a box with lines of width 1, in color color.

(:line-width width :color color :style style)

This way you can explicitly specify all aspects of the box. The value width specifies the width of the lines to draw; it defaults to 1. A negative width -n means to draw a line of width n that occupies the space of the underlying text, thus avoiding any increase in the character height or width.

The value color specifies the color to draw with. The default is the foreground color of the face for simple boxes, and the background color of the face for 3D boxes.

The value style specifies whether to draw a 3D box. If it is released-button, the box looks like a 3D button that is not being pressed. If it is pressed-button, the box looks like a 3D button that is being pressed. If it is nil or omitted, a plain 2D box is used.

:inverse-video

Whether or not characters should be displayed in inverse video. The value should be t (yes) or nil (no).

:stipple

The background stipple, a bitmap.

The value can be a string; that should be the name of a file containing external-format X bitmap data. The file is found in the directories listed in the variable x-bitmap-file-path.

Alternatively, the value can specify the bitmap directly, with a list of the form (width height data). Here, width and height specify the size in pixels, and data is a string containing the raw bits of the bitmap, row by row. Each row occupies (width + 7) / 8 consecutive bytes in the string (which should be a unibyte string for best results). This means that each row always occupies at least one whole byte.

If the value is nil, that means use no stipple pattern.

Normally you do not need to set the stipple attribute, because it is used automatically to handle certain shades of gray.

:font

The font used to display the face. Its value should be a font object. See section Low-Level Font Representation, for information about font objects, font specs, and font entities.

When specifying this attribute using set-face-attribute (see section Face Attribute Functions), you may also supply a font spec, a font entity, or a string. Emacs converts such values to an appropriate font object, and stores that font object as the actual attribute value. If you specify a string, the contents of the string should be a font name (see Fonts in The GNU Emacs Manual); if the font name is an XLFD containing wildcards, Emacs chooses the first font matching those wildcards. Specifying this attribute also changes the values of the :family, :foundry, :width, :height, :weight, and :slant attributes.

:inherit

The name of a face from which to inherit attributes, or a list of face names. Attributes from inherited faces are merged into the face like an underlying face would be, with higher priority than underlying faces (see section Displaying Faces). If a list of faces is used, attributes from faces earlier in the list override those from later faces.

Function: font-family-list &optional frame

This function returns a list of available font family names. The optional argument frame specifies the frame on which the text is to be displayed; if it is nil, the selected frame is used.

User Option: underline-minimum-offset

This variable specifies the minimum distance between the baseline and the underline, in pixels, when displaying underlined text.

User Option: x-bitmap-file-path

This variable specifies a list of directories for searching for bitmap files, for the :stipple attribute.

Function: bitmap-spec-p object

This returns t if object is a valid bitmap specification, suitable for use with :stipple (see above). It returns nil otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.2 Defining Faces

The usual way to define a face is through the defface macro. This macro associates a face name (a symbol) with a default face spec. A face spec is a construct which specifies what attributes a face should have on any given terminal; for example, a face spec might specify one foreground color on high-color terminals, and a different foreground color on low-color terminals.

People are sometimes tempted to create a variable whose value is a face name. In the vast majority of cases, this is not necessary; the usual procedure is to define a face with defface, and then use its name directly.

Macro: defface face spec doc [keyword value]…

This macro declares face as a named face whose default face spec is given by spec. You should not quote the symbol face, and it should not end in ‘-face’ (that would be redundant). The argument doc is a documentation string for the face. The additional keyword arguments have the same meanings as in defgroup and defcustom (see section Common Item Keywords).

If face already has a default face spec, this macro does nothing.

The default face spec determines face’s appearance when no customizations are in effect (see section Customization Settings). If face has already been customized (via Custom themes or via customizations read from the init file), its appearance is determined by the custom face spec(s), which override the default face spec spec. However, if the customizations are subsequently removed, the appearance of face will again be determined by its default face spec.

As an exception, if you evaluate a defface form with C-M-x in Emacs Lisp mode (eval-defun), a special feature of eval-defun overrides any custom face specs on the face, causing the face to reflect exactly what the defface says.

The spec argument is a face spec, which states how the face should appear on different kinds of terminals. It should be an alist whose elements each have the form

(display . plist)

display specifies a class of terminals (see below). plist is a property list of face attributes and their values, specifying how the face appears on such terminals. For backward compatibility, you can also write an element as (display plist).

The display part of an element of spec determines which terminals the element matches. If more than one element of spec matches a given terminal, the first element that matches is the one used for that terminal. There are three possibilities for display:

default

This element of spec doesn’t match any terminal; instead, it specifies defaults that apply to all terminals. This element, if used, must be the first element of spec. Each of the following elements can override any or all of these defaults.

t

This element of spec matches all terminals. Therefore, any subsequent elements of spec are never used. Normally t is used in the last (or only) element of spec.

a list

If display is a list, each element should have the form (characteristic value…). Here characteristic specifies a way of classifying terminals, and the values are possible classifications which display should apply to. Here are the possible values of characteristic:

type

The kind of window system the terminal uses—either graphic (any graphics-capable display), x, pc (for the MS-DOS console), w32 (for MS Windows 9X/NT/2K/XP), or tty (a non-graphics-capable display). See section window-system.

class

What kinds of colors the terminal supports—either color, grayscale, or mono.

background

The kind of background—either light or dark.

min-colors

An integer that represents the minimum number of colors the terminal should support. This matches a terminal if its display-color-cells value is at least the specified integer.

supports

Whether or not the terminal can display the face attributes given in value… (see section Face Attributes). See Display Face Attribute Testing, for more information on exactly how this testing is done.

If an element of display specifies more than one value for a given characteristic, any of those values is acceptable. If display has more than one element, each element should specify a different characteristic; then each characteristic of the terminal must match one of the values specified for it in display.

For example, here’s the definition of the standard face highlight:

(defface highlight
  '((((class color) (min-colors 88) (background light))
     :background "darkseagreen2")
    (((class color) (min-colors 88) (background dark))
     :background "darkolivegreen")
    (((class color) (min-colors 16) (background light))
     :background "darkseagreen2")
    (((class color) (min-colors 16) (background dark))
     :background "darkolivegreen")
    (((class color) (min-colors 8))
     :background "green" :foreground "black")
    (t :inverse-video t))
  "Basic face for highlighting."
  :group 'basic-faces)

Internally, Emacs stores each face’s default spec in its face-defface-spec symbol property (see section Symbol Properties). The saved-face property stores any face spec saved by the user using the customization buffer; the customized-face property stores the face spec customized for the current session, but not saved; and the theme-face property stores an alist associating the active customization settings and Custom themes with the face specs for that face. The face’s documentation string is stored in the face-documentation property.

Normally, a face is declared just once, using defface, and any further changes to its appearance are applied using the Customize framework (e.g., via the Customize user interface or via the custom-set-faces function; see section Applying Customizations), or by face remapping (see section Face Remapping). In the rare event that you need to change a face spec directly from Lisp, you can use the face-spec-set function.

Function: face-spec-set face spec &optional spec-type

This function applies spec as a face spec for face. spec should be a face spec, as described in the above documentation for defface.

This function also defines face as a valid face name if it is not already one, and (re)calculates its attributes on existing frames.

The argument spec-type determines which spec to set. If it is nil or face-override-spec, this function sets the override spec, which overrides over all other face specs on face. If it is customized-face or saved-face, this function sets the customized spec or the saved custom spec. If it is face-defface-spec, this function sets the default face spec (the same one set by defface). If it is reset, this function clears out all customization specs and override specs from face (in this case, the value of spec is ignored). Any other value of spec-type is reserved for internal use.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.3 Face Attribute Functions

This section describes functions for directly accessing and modifying the attributes of a named face.

Function: face-attribute face attribute &optional frame inherit

This function returns the value of the attribute attribute for face on frame.

If frame is nil, that means the selected frame (see section Input Focus). If frame is t, this function returns the value of the specified attribute for newly-created frames (this is normally unspecified, unless you have specified some value using set-face-attribute; see below).

If inherit is nil, only attributes directly defined by face are considered, so the return value may be unspecified, or a relative value. If inherit is non-nil, face’s definition of attribute is merged with the faces specified by its :inherit attribute; however the return value may still be unspecified or relative. If inherit is a face or a list of faces, then the result is further merged with that face (or faces), until it becomes specified and absolute.

To ensure that the return value is always specified and absolute, use a value of default for inherit; this will resolve any unspecified or relative values by merging with the default face (which is always completely specified).

For example,

(face-attribute 'bold :weight)
     ⇒ bold
Function: face-attribute-relative-p attribute value

This function returns non-nil if value, when used as the value of the face attribute attribute, is relative. This means it would modify, rather than completely override, any value that comes from a subsequent face in the face list or that is inherited from another face.

unspecified is a relative value for all attributes. For :height, floating point and function values are also relative.

For example:

(face-attribute-relative-p :height 2.0)
     ⇒ t
Function: face-all-attributes face &optional frame

This function returns an alist of attributes of face. The elements of the result are name-value pairs of the form (attr-name . attr-value). Optional argument frame specifies the frame whose definition of face to return; if omitted or nil, the returned value describes the default attributes of face for newly created frames.

Function: merge-face-attribute attribute value1 value2

If value1 is a relative value for the face attribute attribute, returns it merged with the underlying value value2; otherwise, if value1 is an absolute value for the face attribute attribute, returns value1 unchanged.

Normally, Emacs uses the face specs of each face to automatically calculate its attributes on each frame (see section Defining Faces). The function set-face-attribute can override this calculation by directly assigning attributes to a face, either on a specific frame or for all frames. This function is mostly intended for internal usage.

Function: set-face-attribute face frame &rest arguments

This function sets one or more attributes of face for frame. The attributes specifies in this way override the face spec(s) belonging to face.

The extra arguments arguments specify the attributes to set, and the values for them. They should consist of alternating attribute names (such as :family or :underline) and values. Thus,

(set-face-attribute 'foo nil :weight 'bold :slant 'italic)

sets the attribute :weight to bold and the attribute :slant to italic.

If frame is t, this function sets the default attributes for newly created frames. If frame is nil, this function sets the attributes for all existing frames, as well as for newly created frames.

The following commands and functions mostly provide compatibility with old versions of Emacs. They work by calling set-face-attribute. Values of t and nil for their frame argument are handled just like set-face-attribute and face-attribute. The commands read their arguments using the minibuffer, if called interactively.

Command: set-face-foreground face color &optional frame
Command: set-face-background face color &optional frame

These set the :foreground attribute (or :background attribute, respectively) of face to color.

Command: set-face-stipple face pattern &optional frame

This sets the :stipple attribute of face to pattern.

Command: set-face-font face font &optional frame

This sets the :font attribute of face to font.

Function: set-face-bold face bold-p &optional frame

This sets the :weight attribute of face to normal if bold-p is nil, and to bold otherwise.

Function: set-face-italic face italic-p &optional frame

This sets the :slant attribute of face to normal if italic-p is nil, and to italic otherwise.

Function: set-face-underline face underline &optional frame

This sets the :underline attribute of face to underline.

Function: set-face-inverse-video face inverse-video-p &optional frame

This sets the :inverse-video attribute of face to inverse-video-p.

Command: invert-face face &optional frame

This swaps the foreground and background colors of face face.

The following functions examine the attributes of a face. They mostly provide compatibility with old versions of Emacs. If you don’t specify frame, they refer to the selected frame; t refers to the default data for new frames. They return unspecified if the face doesn’t define any value for that attribute. If inherit is nil, only an attribute directly defined by the face is returned. If inherit is non-nil, any faces specified by its :inherit attribute are considered as well, and if inherit is a face or a list of faces, then they are also considered, until a specified attribute is found. To ensure that the return value is always specified, use a value of default for inherit.

Function: face-font face &optional frame

This function returns the name of the font of face face.

Function: face-foreground face &optional frame inherit
Function: face-background face &optional frame inherit

These functions return the foreground color (or background color, respectively) of face face, as a string.

Function: face-stipple face &optional frame inherit

This function returns the name of the background stipple pattern of face face, or nil if it doesn’t have one.

Function: face-bold-p face &optional frame inherit

This function returns a non-nil value if the :weight attribute of face is bolder than normal (i.e., one of semi-bold, bold, extra-bold, or ultra-bold). Otherwise, it returns nil.

Function: face-italic-p face &optional frame inherit

This function returns a non-nil value if the :slant attribute of face is italic or oblique, and nil otherwise.

Function: face-underline-p face &optional frame inherit

This function returns non-nil if face face specifies a non-nil :underline attribute.

Function: face-inverse-video-p face &optional frame inherit

This function returns non-nil if face face specifies a non-nil :inverse-video attribute.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.4 Displaying Faces

When Emacs displays a given piece of text, the visual appearance of the text may be determined by faces drawn from different sources. If these various sources together specify more than one face for a particular character, Emacs merges the attributes of the various faces. Here is the order in which Emacs merges the faces, from highest to lowest priority:

At each stage, if a face has a valid :inherit attribute, Emacs treats any attribute with an unspecified value as having the corresponding value drawn from the parent face(s). see section Face Attributes. Note that the parent face(s) may also leave the attribute unspecified; in that case, the attribute remains unspecified at the next level of face merging.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.5 Face Remapping

The variable face-remapping-alist is used for buffer-local or global changes in the appearance of a face. For instance, it is used to implement the text-scale-adjust command (see Text Scale in The GNU Emacs Manual).

Variable: face-remapping-alist

The value of this variable is an alist whose elements have the form (face . remapping). This causes Emacs to display any text having the face face with remapping, rather than the ordinary definition of face.

remapping may be any face spec suitable for a face text property: either a face (i.e., a face name or a property list of attribute/value pairs), or a list of faces. For details, see the description of the face text property in Properties with Special Meanings. remapping serves as the complete specification for the remapped face—it replaces the normal definition of face, instead of modifying it.

If face-remapping-alist is buffer-local, its local value takes effect only within that buffer.

Note: face remapping is non-recursive. If remapping references the same face name face, either directly or via the :inherit attribute of some other face in remapping, that reference uses the normal definition of face. For instance, if the mode-line face is remapped using this entry in face-remapping-alist:

(mode-line italic mode-line)

then the new definition of the mode-line face inherits from the italic face, and the normal (non-remapped) definition of mode-line face.

The following functions implement a higher-level interface to face-remapping-alist. Most Lisp code should use these functions instead of setting face-remapping-alist directly, to avoid trampling on remappings applied elsewhere. These functions are intended for buffer-local remappings, so they all make face-remapping-alist buffer-local as a side-effect. They manage face-remapping-alist entries of the form

  (face relative-spec-1 relative-spec-2 ... base-spec)

where, as explained above, each of the relative-spec-N and base-spec is either a face name, or a property list of attribute/value pairs. Each of the relative remapping entries, relative-spec-N, is managed by the face-remap-add-relative and face-remap-remove-relative functions; these are intended for simple modifications like changing the text size. The base remapping entry, base-spec, has the lowest priority and is managed by the face-remap-set-base and face-remap-reset-base functions; it is intended for major modes to remap faces in the buffers they control.

Function: face-remap-add-relative face &rest specs

This function adds the face spec in specs as relative remappings for face face in the current buffer. The remaining arguments, specs, should form either a list of face names, or a property list of attribute/value pairs.

The return value is a Lisp object that serves as a “cookie”; you can pass this object as an argument to face-remap-remove-relative if you need to remove the remapping later.

;; Remap the `escape-glyph' face into a combination
;; of the `highlight' and `italic' faces:
(face-remap-add-relative 'escape-glyph 'highlight 'italic)

;; Increase the size of the `default' face by 50%:
(face-remap-add-relative 'default :height 1.5)
Function: face-remap-remove-relative cookie

This function removes a relative remapping previously added by face-remap-add-relative. cookie should be the Lisp object returned by face-remap-add-relative when the remapping was added.

Function: face-remap-set-base face &rest specs

This function sets the base remapping of face in the current buffer to specs. If specs is empty, the default base remapping is restored, similar to calling face-remap-reset-base (see below); note that this is different from specs containing a single value nil, which has the opposite result (the global definition of face is ignored).

This overwrites the default base-spec, which inherits the global face definition, so it is up to the caller to add such inheritance if so desired.

Function: face-remap-reset-base face

This function sets the base remapping of face to its default value, which inherits from face’s global definition.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.6 Functions for Working with Faces

Here are additional functions for creating and working with faces.

Function: face-list

This function returns a list of all defined face names.

Function: face-id face

This function returns the face number of face face. This is a number that uniquely identifies a face at low levels within Emacs. It is seldom necessary to refer to a face by its face number.

Function: face-documentation face

This function returns the documentation string of face face, or nil if none was specified for it.

Function: face-equal face1 face2 &optional frame

This returns t if the faces face1 and face2 have the same attributes for display.

Function: face-differs-from-default-p face &optional frame

This returns non-nil if the face face displays differently from the default face.

A face alias provides an equivalent name for a face. You can define a face alias by giving the alias symbol the face-alias property, with a value of the target face name. The following example makes modeline an alias for the mode-line face.

(put 'modeline 'face-alias 'mode-line)
Macro: define-obsolete-face-alias obsolete-face current-face when

This macro defines obsolete-face as an alias for current-face, and also marks it as obsolete, indicating that it may be removed in future. when should be a string indicating when obsolete-face was made obsolete (usually a version number string).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.7 Automatic Face Assignment

This hook is used for automatically assigning faces to text in the buffer. It is part of the implementation of Jit-Lock mode, used by Font-Lock.

Variable: fontification-functions

This variable holds a list of functions that are called by Emacs redisplay as needed, just before doing redisplay. They are called even when Font Lock Mode isn’t enabled. When Font Lock Mode is enabled, this variable usually holds just one function, jit-lock-function.

The functions are called in the order listed, with one argument, a buffer position pos. Collectively they should attempt to assign faces to the text in the current buffer starting at pos.

The functions should record the faces they assign by setting the face property. They should also add a non-nil fontified property to all the text they have assigned faces to. That property tells redisplay that faces have been assigned to that text already.

It is probably a good idea for the functions to do nothing if the character after pos already has a non-nil fontified property, but this is not required. If one function overrides the assignments made by a previous one, the properties after the last function finishes are the ones that really matter.

For efficiency, we recommend writing these functions so that they usually assign faces to around 400 to 600 characters at each call.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.8 Basic Faces

If your Emacs Lisp program needs to assign some faces to text, it is often a good idea to use certain existing faces or inherit from them, rather than defining entirely new faces. This way, if other users have customized the basic faces to give Emacs a certain look, your program will “fit in” without additional customization.

Some of the basic faces defined in Emacs are listed below. In addition to these, you might want to make use of the Font Lock faces for syntactic highlighting, if highlighting is not already handled by Font Lock mode, or if some Font Lock faces are not in use. See section Faces for Font Lock.

default

The default face, whose attributes are all specified. All other faces implicitly inherit from it: any unspecified attribute defaults to the attribute on this face (see section Face Attributes).

bold
italic
bold-italic
underline
fixed-pitch
variable-pitch

These have the attributes indicated by their names (e.g., bold has a bold :weight attribute), with all other attributes unspecified (and so given by default).

shadow

For “dimmed out” text. For example, it is used for the ignored part of a filename in the minibuffer (see Minibuffers for File Names in The GNU Emacs Manual).

link
link-visited

For clickable text buttons that send the user to a different buffer or “location”.

highlight

For stretches of text that should temporarily stand out. For example, it is commonly assigned to the mouse-face property for cursor highlighting (see section Properties with Special Meanings).

match

For text matching a search command.

error
warning
success

For text concerning errors, warnings, or successes. For example, these are used for messages in *Compilation* buffers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.9 Font Selection

Before Emacs can draw a character on a graphical display, it must select a font for that character20. See Fonts in The GNU Emacs Manual. Normally, Emacs automatically chooses a font based on the faces assigned to that character—specifically, the face attributes :family, :weight, :slant, and :width (see section Face Attributes). The choice of font also depends on the character to be displayed; some fonts can only display a limited set of characters. If no available font exactly fits the requirements, Emacs looks for the closest matching font. The variables in this section control how Emacs makes this selection.

User Option: face-font-family-alternatives

If a given family is specified but does not exist, this variable specifies alternative font families to try. Each element should have this form:

(family alternate-families…)

If family is specified but not available, Emacs will try the other families given in alternate-families, one by one, until it finds a family that does exist.

User Option: face-font-selection-order

If there is no font that exactly matches all desired face attributes (:width, :height, :weight, and :slant), this variable specifies the order in which these attributes should be considered when selecting the closest matching font. The value should be a list containing those four attribute symbols, in order of decreasing importance. The default is (:width :height :weight :slant).

Font selection first finds the best available matches for the first attribute in the list; then, among the fonts which are best in that way, it searches for the best matches in the second attribute, and so on.

The attributes :weight and :width have symbolic values in a range centered around normal. Matches that are more extreme (farther from normal) are somewhat preferred to matches that are less extreme (closer to normal); this is designed to ensure that non-normal faces contrast with normal ones, whenever possible.

One example of a case where this variable makes a difference is when the default font has no italic equivalent. With the default ordering, the italic face will use a non-italic font that is similar to the default one. But if you put :slant before :height, the italic face will use an italic font, even if its height is not quite right.

User Option: face-font-registry-alternatives

This variable lets you specify alternative font registries to try, if a given registry is specified and doesn’t exist. Each element should have this form:

(registry alternate-registries…)

If registry is specified but not available, Emacs will try the other registries given in alternate-registries, one by one, until it finds a registry that does exist.

Emacs can make use of scalable fonts, but by default it does not use them.

User Option: scalable-fonts-allowed

This variable controls which scalable fonts to use. A value of nil, the default, means do not use scalable fonts. t means to use any scalable font that seems appropriate for the text.

Otherwise, the value must be a list of regular expressions. Then a scalable font is enabled for use if its name matches any regular expression in the list. For example,

(setq scalable-fonts-allowed '("iso10646-1$"))

allows the use of scalable fonts with registry iso10646-1.

Variable: face-font-rescale-alist

This variable specifies scaling for certain faces. Its value should be a list of elements of the form

(fontname-regexp . scale-factor)

If fontname-regexp matches the font name that is about to be used, this says to choose a larger similar font according to the factor scale-factor. You would use this feature to normalize the font size if certain fonts are bigger or smaller than their nominal heights and widths would suggest.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.10 Looking Up Fonts

Function: x-list-fonts name &optional reference-face frame maximum width

This function returns a list of available font names that match name. name should be a string containing a font name in either the Fontconfig, GTK, or XLFD format (see Fonts in The GNU Emacs Manual). Within an XLFD string, wildcard characters may be used: the ‘*’ character matches any substring, and the ‘?’ character matches any single character. Case is ignored when matching font names.

If the optional arguments reference-face and frame are specified, the returned list includes only fonts that are the same size as reference-face (a face name) currently is on the frame frame.

The optional argument maximum sets a limit on how many fonts to return. If it is non-nil, then the return value is truncated after the first maximum matching fonts. Specifying a small value for maximum can make this function much faster, in cases where many fonts match the pattern.

The optional argument width specifies a desired font width. If it is non-nil, the function only returns those fonts whose characters are (on average) width times as wide as reference-face.

Function: x-family-fonts &optional family frame

This function returns a list describing the available fonts for family family on frame. If family is omitted or nil, this list applies to all families, and therefore, it contains all available fonts. Otherwise, family must be a string; it may contain the wildcards ‘?’ and ‘*’.

The list describes the display that frame is on; if frame is omitted or nil, it applies to the selected frame’s display (see section Input Focus).

Each element in the list is a vector of the following form:

[family width point-size weight slant
 fixed-p full registry-and-encoding]

The first five elements correspond to face attributes; if you specify these attributes for a face, it will use this font.

The last three elements give additional information about the font. fixed-p is non-nil if the font is fixed-pitch. full is the full name of the font, and registry-and-encoding is a string giving the registry and encoding of the font.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.11 Fontsets

A fontset is a list of fonts, each assigned to a range of character codes. An individual font cannot display the whole range of characters that Emacs supports, but a fontset can. Fontsets have names, just as fonts do, and you can use a fontset name in place of a font name when you specify the “font” for a frame or a face. Here is information about defining a fontset under Lisp program control.

Function: create-fontset-from-fontset-spec fontset-spec &optional style-variant-p noerror

This function defines a new fontset according to the specification string fontset-spec. The string should have this format:

fontpattern, [charset:font]…

Whitespace characters before and after the commas are ignored.

The first part of the string, fontpattern, should have the form of a standard X font name, except that the last two fields should be ‘fontset-alias’.

The new fontset has two names, one long and one short. The long name is fontpattern in its entirety. The short name is ‘fontset-alias’. You can refer to the fontset by either name. If a fontset with the same name already exists, an error is signaled, unless noerror is non-nil, in which case this function does nothing.

If optional argument style-variant-p is non-nil, that says to create bold, italic and bold-italic variants of the fontset as well. These variant fontsets do not have a short name, only a long one, which is made by altering fontpattern to indicate the bold and/or italic status.

The specification string also says which fonts to use in the fontset. See below for the details.

The construct ‘charset:font’ specifies which font to use (in this fontset) for one particular character set. Here, charset is the name of a character set, and font is the font to use for that character set. You can use this construct any number of times in the specification string.

For the remaining character sets, those that you don’t specify explicitly, Emacs chooses a font based on fontpattern: it replaces ‘fontset-alias’ with a value that names one character set. For the ASCII character set, ‘fontset-alias’ is replaced with ‘ISO8859-1’.

In addition, when several consecutive fields are wildcards, Emacs collapses them into a single wildcard. This is to prevent use of auto-scaled fonts. Fonts made by scaling larger fonts are not usable for editing, and scaling a smaller font is not useful because it is better to use the smaller font in its own size, which Emacs does.

Thus if fontpattern is this,

-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24

the font specification for ASCII characters would be this:

-*-fixed-medium-r-normal-*-24-*-ISO8859-1

and the font specification for Chinese GB2312 characters would be this:

-*-fixed-medium-r-normal-*-24-*-gb2312*-*

You may not have any Chinese font matching the above font specification. Most X distributions include only Chinese fonts that have ‘song ti’ or ‘fangsong ti’ in the family field. In such a case, ‘Fontset-n’ can be specified as below:

Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\
        chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*

Then, the font specifications for all but Chinese GB2312 characters have ‘fixed’ in the family field, and the font specification for Chinese GB2312 characters has a wild card ‘*’ in the family field.

Function: set-fontset-font name character font-spec &optional frame add

This function modifies the existing fontset name to use the font matching with font-spec for the character character.

If name is nil, this function modifies the fontset of the selected frame or that of frame if frame is not nil.

If name is t, this function modifies the default fontset, whose short name is ‘fontset-default’.

character may be a cons; (from . to), where from and to are character codepoints. In that case, use font-spec for all characters in the range from and to (inclusive).

character may be a charset. In that case, use font-spec for all character in the charsets.

character may be a script name. In that case, use font-spec for all character in the charsets.

font-spec may be a cons; (family . registry), where family is a family name of a font (possibly including a foundry name at the head), registry is a registry name of a font (possibly including an encoding name at the tail).

font-spec may be a font name string.

The optional argument add, if non-nil, specifies how to add font-spec to the font specifications previously set. If it is prepend, font-spec is prepended. If it is append, font-spec is appended. By default, font-spec overrides the previous settings.

For instance, this changes the default fontset to use a font of which family name is ‘Kochi Gothic’ for all characters belonging to the charset japanese-jisx0208.

(set-fontset-font t 'japanese-jisx0208
                  (font-spec :family "Kochi Gothic"))
Function: char-displayable-p char

This function returns t if Emacs ought to be able to display char. More precisely, if the selected frame’s fontset has a font to display the character set that char belongs to.

Fontsets can specify a font on a per-character basis; when the fontset does that, this function’s value may not be accurate.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.12.12 Low-Level Font Representation

Normally, it is not necessary to manipulate fonts directly. In case you need to do so, this section explains how.

In Emacs Lisp, fonts are represented using three different Lisp object types: font objects, font specs, and font entities.

Function: fontp object &optional type

Return t if object is a font object, font spec, or font entity. Otherwise, return nil.

The optional argument type, if non-nil, determines the exact type of Lisp object to check for. In that case, type should be one of font-object, font-spec, or font-entity.

A font object is a Lisp object that represents a font that Emacs has opened. Font objects cannot be modified in Lisp, but they can be inspected.

Function: font-at position &optional window string

Return the font object that is being used to display the character at position position in the window window. If window is nil, it defaults to the selected window. If string is nil, position specifies a position in the current buffer; otherwise, string should be a string, and position specifies a position in that string.

A font spec is a Lisp object that contains a set of specifications that can be used to find a font. More than one font may match the specifications in a font spec.

Function: font-spec &rest arguments

Return a new font spec using the specifications in arguments, which should come in property-value pairs. The possible specifications are as follows:

:name

The font name (a string), in either XLFD, Fontconfig, or GTK format. See Fonts in The GNU Emacs Manual.

:family
:foundry
:weight
:slant
:width

These have the same meanings as the face attributes of the same name. See section Face Attributes.

:size

The font size—either a non-negative integer that specifies the pixel size, or a floating-point number that specifies the point size.

:adstyle

Additional typographic style information for the font, such as ‘sans’. The value should be a string or a symbol.

:registry

The charset registry and encoding of the font, such as ‘iso8859-1’. The value should be a string or a symbol.

:script

The script that the font must support (a symbol).

:otf

The font must be an OpenType font that supports these OpenType features, provided Emacs is compiled with support for ‘libotf’ (a library for performing complex text layout in certain scripts). The value must be a list of the form

(script-tag langsys-tag gsub gpos)

where script-tag is the OpenType script tag symbol; langsys-tag is the OpenType language system tag symbol, or nil to use the default language system; gsub is a list of OpenType GSUB feature tag symbols, or nil if none is required; and gpos is a list of OpenType GPOS feature tag symbols, or nil if none is required. If gsub or gpos is a list, a nil element in that list means that the font must not match any of the remaining tag symbols. The gpos element may be omitted.

Function: font-put font-spec property value

Set the font property property in the font-spec font-spec to value.

A font entity is a reference to a font that need not be open. Its properties are intermediate between a font object and a font spec: like a font object, and unlike a font spec, it refers to a single, specific font. Unlike a font object, creating a font entity does not load the contents of that font into computer memory. Emacs may open multiple font objects of different sizes from a single font entity referring to a scalable font.

Function: find-font font-spec &optional frame

This function returns a font entity that best matches the font spec font-spec on frame frame. If frame is nil, it defaults to the selected frame.

Function: list-fonts font-spec &optional frame num prefer

This function returns a list of all font entities that match the font spec font-spec.

The optional argument frame, if non-nil, specifies the frame on which the fonts are to be displayed. The optional argument num, if non-nil, should be an integer that specifies the maximum length of the returned list. The optional argument prefer, if non-nil, should be another font spec, which is used to control the order of the returned list; the returned font entities are sorted in order of decreasing “closeness” to that font spec.

If you call set-face-attribute and pass a font spec, font entity, or font name string as the value of the :font attribute, Emacs opens the best “matching” font that is available for display. It then stores the corresponding font object as the actual value of the :font attribute for that face.

The following functions can be used to obtain information about a font. For these functions, the font argument can be a font object, a font entity, or a font spec.

Function: font-get font property

This function returns the value of the font property property for font.

If font is a font spec and the font spec does not specify property, the return value is nil. If font is a font object or font entity, the value for the :script property may be a list of scripts supported by the font.

Function: font-face-attributes font &optional frame

This function returns a list of face attributes corresponding to font. The optional argument frame specifies the frame on which the font is to be displayed. If it is nil, the selected frame is used. The return value has the form

(:family family :height height :weight weight
   :slant slant :width width)

where the values of family, height, weight, slant, and width are face attribute values. Some of these key-attribute pairs may be omitted from the list if they are not specified by font.

Function: font-xlfd-name font &optional fold-wildcards

This function returns the XLFD (X Logical Font Descriptor), a string, matching font. See Fonts in The GNU Emacs Manual, for information about XLFDs. If the name is too long for an XLFD (which can contain at most 255 characters), the function returns nil.

If the optional argument fold-wildcards is non-nil, consecutive wildcards in the XLFD are folded into one.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13 Fringes

On graphical displays, Emacs draws fringes next to each window: thin vertical strips down the sides which can display bitmaps indicating truncation, continuation, horizontal scrolling, and so on.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.1 Fringe Size and Position

The following buffer-local variables control the position and width of fringes in windows showing that buffer.

Variable: fringes-outside-margins

The fringes normally appear between the display margins and the window text. If the value is non-nil, they appear outside the display margins. See section Displaying in the Margins.

Variable: left-fringe-width

This variable, if non-nil, specifies the width of the left fringe in pixels. A value of nil means to use the left fringe width from the window’s frame.

Variable: right-fringe-width

This variable, if non-nil, specifies the width of the right fringe in pixels. A value of nil means to use the right fringe width from the window’s frame.

Any buffer which does not specify values for these variables uses the values specified by the left-fringe and right-fringe frame parameters (see section Layout Parameters).

The above variables actually take effect via the function set-window-buffer (see section Buffers and Windows), which calls set-window-fringes as a subroutine. If you change one of these variables, the fringe display is not updated in existing windows showing the buffer, unless you call set-window-buffer again in each affected window. You can also use set-window-fringes to control the fringe display in individual windows.

Function: set-window-fringes window left &optional right outside-margins

This function sets the fringe widths of window window. If window is nil, the selected window is used.

The argument left specifies the width in pixels of the left fringe, and likewise right for the right fringe. A value of nil for either one stands for the default width. If outside-margins is non-nil, that specifies that fringes should appear outside of the display margins.

Function: window-fringes &optional window

This function returns information about the fringes of a window window. If window is omitted or nil, the selected window is used. The value has the form (left-width right-width outside-margins).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.2 Fringe Indicators

Fringe indicators are tiny icons displayed in the window fringe to indicate truncated or continued lines, buffer boundaries, etc.

User Option: indicate-empty-lines

When this is non-nil, Emacs displays a special glyph in the fringe of each empty line at the end of the buffer, on graphical displays. See section Fringes. This variable is automatically buffer-local in every buffer.

User Option: indicate-buffer-boundaries

This buffer-local variable controls how the buffer boundaries and window scrolling are indicated in the window fringes.

Emacs can indicate the buffer boundaries—that is, the first and last line in the buffer—with angle icons when they appear on the screen. In addition, Emacs can display an up-arrow in the fringe to show that there is text above the screen, and a down-arrow to show there is text below the screen.

There are three kinds of basic values:

nil

Don’t display any of these fringe icons.

left

Display the angle icons and arrows in the left fringe.

right

Display the angle icons and arrows in the right fringe.

any non-alist

Display the angle icons in the left fringe and don’t display the arrows.

Otherwise the value should be an alist that specifies which fringe indicators to display and where. Each element of the alist should have the form (indicator . position). Here, indicator is one of top, bottom, up, down, and t (which covers all the icons not yet specified), while position is one of left, right and nil.

For example, ((top . left) (t . right)) places the top angle bitmap in left fringe, and the bottom angle bitmap as well as both arrow bitmaps in right fringe. To show the angle bitmaps in the left fringe, and no arrow bitmaps, use ((top . left) (bottom . left)).

Variable: fringe-indicator-alist

This buffer-local variable specifies the mapping from logical fringe indicators to the actual bitmaps displayed in the window fringes. The value is an alist of elements (indicator . bitmaps), where indicator specifies a logical indicator type and bitmaps specifies the fringe bitmaps to use for that indicator.

Each indicator should be one of the following symbols:

truncation, continuation.

Used for truncation and continuation lines.

up, down, top, bottom, top-bottom

Used when indicate-buffer-boundaries is non-nil: up and down indicate a buffer boundary lying above or below the window edge; top and bottom indicate the topmost and bottommost buffer text line; and top-bottom indicates where there is just one line of text in the buffer.

empty-line

Used to indicate empty lines when indicate-empty-lines is non-nil.

overlay-arrow

Used for overlay arrows (see section The Overlay Arrow).

Each bitmaps value may be a list of symbols (left right [left1 right1]). The left and right symbols specify the bitmaps shown in the left and/or right fringe, for the specific indicator. left1 and right1 are specific to the bottom and top-bottom indicators, and are used to indicate that the last text line has no final newline. Alternatively, bitmaps may be a single symbol which is used in both left and right fringes.

See section Fringe Bitmaps, for a list of standard bitmap symbols and how to define your own. In addition, nil represents the empty bitmap (i.e., an indicator that is not shown).

When fringe-indicator-alist has a buffer-local value, and there is no bitmap defined for a logical indicator, or the bitmap is t, the corresponding value from the default value of fringe-indicator-alist is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.3 Fringe Cursors

When a line is exactly as wide as the window, Emacs displays the cursor in the right fringe instead of using two lines. Different bitmaps are used to represent the cursor in the fringe depending on the current buffer’s cursor type.

User Option: overflow-newline-into-fringe

If this is non-nil, lines exactly as wide as the window (not counting the final newline character) are not continued. Instead, when point is at the end of the line, the cursor appears in the right fringe.

Variable: fringe-cursor-alist

This variable specifies the mapping from logical cursor type to the actual fringe bitmaps displayed in the right fringe. The value is an alist where each element has the form (cursor-type . bitmap), which means to use the fringe bitmap bitmap to display cursors of type cursor-type.

Each cursor-type should be one of box, hollow, bar, hbar, or hollow-small. The first four have the same meanings as in the cursor-type frame parameter (see section Cursor Parameters). The hollow-small type is used instead of hollow when the normal hollow-rectangle bitmap is too tall to fit on a specific display line.

Each bitmap should be a symbol specifying the fringe bitmap to be displayed for that logical cursor type. See section Fringe Bitmaps.

When fringe-cursor-alist has a buffer-local value, and there is no bitmap defined for a cursor type, the corresponding value from the default value of fringes-indicator-alist is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.4 Fringe Bitmaps

The fringe bitmaps are the actual bitmaps which represent the logical fringe indicators for truncated or continued lines, buffer boundaries, overlay arrows, etc. Each bitmap is represented by a symbol. These symbols are referred to by the variable fringe-indicator-alist, which maps fringe indicators to bitmaps (see section Fringe Indicators), and the variable fringe-cursor-alist, which maps fringe cursors to bitmaps (see section Fringe Cursors).

Lisp programs can also directly display a bitmap in the left or right fringe, by using a display property for one of the characters appearing in the line (see section Other Display Specifications). Such a display specification has the form

(fringe bitmap [face])

fringe is either the symbol left-fringe or right-fringe. bitmap is a symbol identifying the bitmap to display. The optional face names a face whose foreground color is used to display the bitmap; this face is automatically merged with the fringe face.

Here is a list of the standard fringe bitmaps defined in Emacs, and how they are currently used in Emacs (via fringe-indicator-alist and fringe-cursor-alist):

left-arrow, right-arrow

Used to indicate truncated lines.

left-curly-arrow, right-curly-arrow

Used to indicate continued lines.

right-triangle, left-triangle

The former is used by overlay arrows. The latter is unused.

up-arrow, down-arrow, top-left-angle top-right-angle
bottom-left-angle, bottom-right-angle
top-right-angle, top-left-angle
left-bracket, right-bracket, top-right-angle, top-left-angle

Used to indicate buffer boundaries.

filled-rectangle, hollow-rectangle
filled-square, hollow-square
vertical-bar, horizontal-bar

Used for different types of fringe cursors.

empty-line, exclamation-mark, question-mark, exclamation-mark

Not used by core Emacs features.

The next subsection describes how to define your own fringe bitmaps.

Function: fringe-bitmaps-at-pos &optional pos window

This function returns the fringe bitmaps of the display line containing position pos in window window. The return value has the form (left right ov), where left is the symbol for the fringe bitmap in the left fringe (or nil if no bitmap), right is similar for the right fringe, and ov is non-nil if there is an overlay arrow in the left fringe.

The value is nil if pos is not visible in window. If window is nil, that stands for the selected window. If pos is nil, that stands for the value of point in window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.5 Customizing Fringe Bitmaps

Function: define-fringe-bitmap bitmap bits &optional height width align

This function defines the symbol bitmap as a new fringe bitmap, or replaces an existing bitmap with that name.

The argument bits specifies the image to use. It should be either a string or a vector of integers, where each element (an integer) corresponds to one row of the bitmap. Each bit of an integer corresponds to one pixel of the bitmap, where the low bit corresponds to the rightmost pixel of the bitmap.

The height is normally the length of bits. However, you can specify a different height with non-nil height. The width is normally 8, but you can specify a different width with non-nil width. The width must be an integer between 1 and 16.

The argument align specifies the positioning of the bitmap relative to the range of rows where it is used; the default is to center the bitmap. The allowed values are top, center, or bottom.

The align argument may also be a list (align periodic) where align is interpreted as described above. If periodic is non-nil, it specifies that the rows in bits should be repeated enough times to reach the specified height.

Function: destroy-fringe-bitmap bitmap

This function destroy the fringe bitmap identified by bitmap. If bitmap identifies a standard fringe bitmap, it actually restores the standard definition of that bitmap, instead of eliminating it entirely.

Function: set-fringe-bitmap-face bitmap &optional face

This sets the face for the fringe bitmap bitmap to face. If face is nil, it selects the fringe face. The bitmap’s face controls the color to draw it in.

face is merged with the fringe face, so normally face should specify only the foreground color.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.13.6 The Overlay Arrow

The overlay arrow is useful for directing the user’s attention to a particular line in a buffer. For example, in the modes used for interface to debuggers, the overlay arrow indicates the line of code about to be executed. This feature has nothing to do with overlays (see section Overlays).

Variable: overlay-arrow-string

This variable holds the string to display to call attention to a particular line, or nil if the arrow feature is not in use. On a graphical display the contents of the string are ignored; instead a glyph is displayed in the fringe area to the left of the display area.

Variable: overlay-arrow-position

This variable holds a marker that indicates where to display the overlay arrow. It should point at the beginning of a line. On a non-graphical display the arrow text appears at the beginning of that line, overlaying any text that would otherwise appear. Since the arrow is usually short, and the line usually begins with indentation, normally nothing significant is overwritten.

The overlay-arrow string is displayed in any given buffer if the value of overlay-arrow-position in that buffer points into that buffer. Thus, it is possible to display multiple overlay arrow strings by creating buffer-local bindings of overlay-arrow-position. However, it is usually cleaner to use overlay-arrow-variable-list to achieve this result.

You can do a similar job by creating an overlay with a before-string property. See section Overlay Properties.

You can define multiple overlay arrows via the variable overlay-arrow-variable-list.

Variable: overlay-arrow-variable-list

This variable’s value is a list of variables, each of which specifies the position of an overlay arrow. The variable overlay-arrow-position has its normal meaning because it is on this list.

Each variable on this list can have properties overlay-arrow-string and overlay-arrow-bitmap that specify an overlay arrow string (for text terminals) or fringe bitmap (for graphical terminals) to display at the corresponding overlay arrow position. If either property is not set, the default overlay-arrow-string or overlay-arrow fringe indicator is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.14 Scroll Bars

Normally the frame parameter vertical-scroll-bars controls whether the windows in the frame have vertical scroll bars, and whether they are on the left or right. The frame parameter scroll-bar-width specifies how wide they are (nil meaning the default). See section Layout Parameters.

Function: frame-current-scroll-bars &optional frame

This function reports the scroll bar type settings for frame frame. The value is a cons cell (vertical-type . horizontal-type), where vertical-type is either left, right, or nil (which means no scroll bar.) horizontal-type is meant to specify the horizontal scroll bar type, but since they are not implemented, it is always nil.

You can enable or disable scroll bars for a particular buffer, by setting the variable vertical-scroll-bar. This variable automatically becomes buffer-local when set. The possible values are left, right, t, which means to use the frame’s default, and nil for no scroll bar.

You can also control this for individual windows. Call the function set-window-scroll-bars to specify what to do for a specific window:

Function: set-window-scroll-bars window width &optional vertical-type horizontal-type

This function sets the width and type of scroll bars for window window.

width specifies the scroll bar width in pixels (nil means use the width specified for the frame). vertical-type specifies whether to have a vertical scroll bar and, if so, where. The possible values are left, right and nil, just like the values of the vertical-scroll-bars frame parameter.

The argument horizontal-type is meant to specify whether and where to have horizontal scroll bars, but since they are not implemented, it has no effect. If window is nil, the selected window is used.

Function: window-scroll-bars &optional window

Report the width and type of scroll bars specified for window. If window is omitted or nil, the selected window is used. The value is a list of the form (width cols vertical-type horizontal-type). The value width is the value that was specified for the width (which may be nil); cols is the number of columns that the scroll bar actually occupies.

horizontal-type is not actually meaningful.

Function: window-scroll-bar-width &optional window

This function returns the width in pixels of window’s vertical scrollbar. window must be a live window, and defaults to the selected window.

If you don’t specify these values for a window with set-window-scroll-bars, the buffer-local variables scroll-bar-mode and scroll-bar-width in the buffer being displayed control the window’s vertical scroll bars. The function set-window-buffer examines these variables. If you change them in a buffer that is already visible in a window, you can make the window take note of the new values by calling set-window-buffer specifying the same buffer that is already displayed.

User Option: scroll-bar-mode

This variable, always local in all buffers, controls whether and where to put scroll bars in windows displaying the buffer. The possible values are nil for no scroll bar, left to put a scroll bar on the left, and right to put a scroll bar on the right.

Function: window-current-scroll-bars &optional window

This function reports the scroll bar type for window window. If window is omitted or nil, the selected window is used. The value is a cons cell (vertical-type . horizontal-type). Unlike window-scroll-bars, this reports the scroll bar type actually used, once frame defaults and scroll-bar-mode are taken into account.

Variable: scroll-bar-width

This variable, always local in all buffers, specifies the width of the buffer’s scroll bars, measured in pixels. A value of nil means to use the value specified by the frame.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.15 Window Dividers

Window dividers are bars drawn between a frame’s windows. A “right” divider is drawn between a window and any adjacent windows on the right. Its width (thickness) is specified by the frame parameter right-divider-width. A “bottom” divider is drawn between a window and adjacent windows on the bottom or the echo area. Its width is specified by the frame parameter bottom-divider-width. In either case, specifying a width of zero means to not draw such dividers. See section Layout Parameters.

Technically, a right divider “belongs” to the window on its left, which means that its width contributes to the total width of that window. A bottom divider “belongs” to the window above it, which means that its width contributes to the total height of that window. See section Window Sizes. When a window has both, a right and a bottom divider, the bottom divider “prevails”. This means that a bottom divider is drawn over the full total width of its window while the right divider ends above the bottom divider.

Dividers can be dragged with the mouse and are therefore useful for adjusting the sizes of adjacent windows with the mouse. They also serve to visually set apart adjacent windows when no scroll bars or mode lines are present. The following three faces allow to customize the appearance of dividers:

window-divider

When a divider is less than three pixels wide, it is drawn solidly with the foreground of this face. For larger dividers this face is used for the inner part only, excluding the first and last pixel.

window-divider-first-pixel

This is the face used for drawing the first pixel of a divider that is at least three pixels wide. To obtain a solid appearance, set this to the same value used for the window-divider face.

window-divider-last-pixel

This is the face used for drawing the last pixel of a divider that is at least three pixels wide. To obtain a solid appearance, set this to the same value used for the window-divider face.

You can get the sizes of the dividers of a specific window with the following two functions.

Function: window-right-divider-width &optional window

Return the width (thickness) in pixels of window’s right divider. window must be a live window and defaults to the selected one. The return value is always zero for a rightmost window.

Function: window-bottom-divider-width &optional window

Return the width (thickness) in pixels of window’s bottom divider. window must be a live window and defaults to the selected one. The return value is zero for the minibuffer window or a bottommost window on a minibuffer-less frame.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16 The display Property

The display text property (or overlay property) is used to insert images into text, and to control other aspects of how text displays. The value of the display property should be a display specification, or a list or vector containing several display specifications. Display specifications in the same display property value generally apply in parallel to the text they cover.

If several sources (overlays and/or a text property) specify values for the display property, only one of the values takes effect, following the rules of get-char-property. See section Examining Text Properties.

The rest of this section describes several kinds of display specifications and what they mean.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.1 Display Specs That Replace The Text

Some kinds of display specifications specify something to display instead of the text that has the property. These are called replacing display specifications. Emacs does not allow the user to interactively move point into the middle of buffer text that is replaced in this way.

If a list of display specifications includes more than one replacing display specification, the first overrides the rest. Replacing display specifications make most other display specifications irrelevant, since those don’t apply to the replacement.

For replacing display specifications, “the text that has the property” means all the consecutive characters that have the same Lisp object as their display property; these characters are replaced as a single unit. If two characters have different Lisp objects as their display properties (i.e., objects which are not eq), they are handled separately.

Here is an example which illustrates this point. A string serves as a replacing display specification, which replaces the text that has the property with the specified string (see section Other Display Specifications). Consider the following function:

(defun foo ()
  (dotimes (i 5)
    (let ((string (concat "A"))
          (start (+ i i (point-min))))
      (put-text-property start (1+ start) 'display string)
      (put-text-property start (+ 2 start) 'display string))))

This function gives each of the first ten characters in the buffer a display property which is a string "A", but they don’t all get the same string object. The first two characters get the same string object, so they are replaced with one ‘A’; the fact that the display property was assigned in two separate calls to put-text-property is irrelevant. Similarly, the next two characters get a second string (concat creates a new string object), so they are replaced with one ‘A’; and so on. Thus, the ten characters appear as five A’s.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.2 Specified Spaces

To display a space of specified width and/or height, use a display specification of the form (space . props), where props is a property list (a list of alternating properties and values). You can put this property on one or more consecutive characters; a space of the specified height and width is displayed in place of all of those characters. These are the properties you can use in props to specify the weight of the space:

:width width

If width is a number, it specifies that the space width should be width times the normal character width. width can also be a pixel width specification (see section Pixel Specification for Spaces).

:relative-width factor

Specifies that the width of the stretch should be computed from the first character in the group of consecutive characters that have the same display property. The space width is the width of that character, multiplied by factor.

:align-to hpos

Specifies that the space should be wide enough to reach hpos. If hpos is a number, it is measured in units of the normal character width. hpos can also be a pixel width specification (see section Pixel Specification for Spaces).

You should use one and only one of the above properties. You can also specify the height of the space, with these properties:

:height height

Specifies the height of the space. If height is a number, it specifies that the space height should be height times the normal character height. The height may also be a pixel height specification (see section Pixel Specification for Spaces).

:relative-height factor

Specifies the height of the space, multiplying the ordinary height of the text having this display specification by factor.

:ascent ascent

If the value of ascent is a non-negative number no greater than 100, it specifies that ascent percent of the height of the space should be considered as the ascent of the space—that is, the part above the baseline. The ascent may also be specified in pixel units with a pixel ascent specification (see section Pixel Specification for Spaces).

Don’t use both :height and :relative-height together.

The :width and :align-to properties are supported on non-graphic terminals, but the other space properties in this section are not.

Note that space properties are treated as paragraph separators for the purposes of reordering bidirectional text for display. See section Bidirectional Display, for the details.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.3 Pixel Specification for Spaces

The value of the :width, :align-to, :height, and :ascent properties can be a special kind of expression that is evaluated during redisplay. The result of the evaluation is used as an absolute number of pixels.

The following expressions are supported:

  expr ::= num | (num) | unit | elem | pos | image | form
  num  ::= integer | float | symbol
  unit ::= in | mm | cm | width | height
  elem ::= left-fringe | right-fringe | left-margin | right-margin
        |  scroll-bar | text
  pos  ::= left | center | right
  form ::= (num . expr) | (op expr ...)
  op   ::= + | -

The form num specifies a fraction of the default frame font height or width. The form (num) specifies an absolute number of pixels. If num is a symbol, symbol, its buffer-local variable binding is used.

The in, mm, and cm units specify the number of pixels per inch, millimeter, and centimeter, respectively. The width and height units correspond to the default width and height of the current face. An image specification image corresponds to the width or height of the image.

The elements left-fringe, right-fringe, left-margin, right-margin, scroll-bar, and text specify to the width of the corresponding area of the window.

The left, center, and right positions can be used with :align-to to specify a position relative to the left edge, center, or right edge of the text area.

Any of the above window elements (except text) can also be used with :align-to to specify that the position is relative to the left edge of the given area. Once the base offset for a relative position has been set (by the first occurrence of one of these symbols), further occurrences of these symbols are interpreted as the width of the specified area. For example, to align to the center of the left-margin, use

:align-to (+ left-margin (0.5 . left-margin))

If no specific base offset is set for alignment, it is always relative to the left edge of the text area. For example, ‘:align-to 0’ in a header-line aligns with the first text column in the text area.

A value of the form (num . expr) stands for the product of the values of num and expr. For example, (2 . in) specifies a width of 2 inches, while (0.5 . image) specifies half the width (or height) of the specified image.

The form (+ expr ...) adds up the value of the expressions. The form (- expr ...) negates or subtracts the value of the expressions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.4 Other Display Specifications

Here are the other sorts of display specifications that you can use in the display text property.

string

Display string instead of the text that has this property.

Recursive display specifications are not supported—string’s display properties, if any, are not used.

(image . image-props)

This kind of display specification is an image descriptor (see section Images). When used as a display specification, it means to display the image instead of the text that has the display specification.

(slice x y width height)

This specification together with image specifies a slice (a partial area) of the image to display. The elements y and x specify the top left corner of the slice, within the image; width and height specify the width and height of the slice. Integers are numbers of pixels. A floating-point number in the range 0.0–1.0 stands for that fraction of the width or height of the entire image.

((margin nil) string)

A display specification of this form means to display string instead of the text that has the display specification, at the same position as that text. It is equivalent to using just string, but it is done as a special case of marginal display (see section Displaying in the Margins).

(left-fringe bitmap [face])
(right-fringe bitmap [face])

This display specification on any character of a line of text causes the specified bitmap be displayed in the left or right fringes for that line, instead of the characters that have the display specification. The optional face specifies the colors to be used for the bitmap. See section Fringe Bitmaps, for the details.

(space-width factor)

This display specification affects all the space characters within the text that has the specification. It displays all of these spaces factor times as wide as normal. The element factor should be an integer or float. Characters other than spaces are not affected at all; in particular, this has no effect on tab characters.

(height height)

This display specification makes the text taller or shorter. Here are the possibilities for height:

(+ n)

This means to use a font that is n steps larger. A “step” is defined by the set of available fonts—specifically, those that match what was otherwise specified for this text, in all attributes except height. Each size for which a suitable font is available counts as another step. n should be an integer.

(- n)

This means to use a font that is n steps smaller.

a number, factor

A number, factor, means to use a font that is factor times as tall as the default font.

a symbol, function

A symbol is a function to compute the height. It is called with the current height as argument, and should return the new height to use.

anything else, form

If the height value doesn’t fit the previous possibilities, it is a form. Emacs evaluates it to get the new height, with the symbol height bound to the current specified font height.

(raise factor)

This kind of display specification raises or lowers the text it applies to, relative to the baseline of the line.

factor must be a number, which is interpreted as a multiple of the height of the affected text. If it is positive, that means to display the characters raised. If it is negative, that means to display them lower down.

If the text also has a height display specification, that does not affect the amount of raising or lowering, which is based on the faces used for the text.

You can make any display specification conditional. To do that, package it in another list of the form (when condition . spec). Then the specification spec applies only when condition evaluates to a non-nil value. During the evaluation, object is bound to the string or buffer having the conditional display property. position and buffer-position are bound to the position within object and the buffer position where the display property was found, respectively. Both positions can be different when object is a string.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.16.5 Displaying in the Margins

A buffer can have blank areas called display margins on the left and on the right. Ordinary text never appears in these areas, but you can put things into the display margins using the display property. There is currently no way to make text or images in the margin mouse-sensitive.

The way to display something in the margins is to specify it in a margin display specification in the display property of some text. This is a replacing display specification, meaning that the text you put it on does not get displayed; the margin display appears, but that text does not.

A margin display specification looks like ((margin right-margin) spec) or ((margin left-margin) spec). Here, spec is another display specification that says what to display in the margin. Typically it is a string of text to display, or an image descriptor.

To display something in the margin in association with certain buffer text, without altering or preventing the display of that text, put a before-string property on the text and put the margin display specification on the contents of the before-string.

Before the display margins can display anything, you must give them a nonzero width. The usual way to do that is to set these variables:

Variable: left-margin-width

This variable specifies the width of the left margin, in character cell (a.k.a. “column”) units. It is buffer-local in all buffers. A value of nil means no left marginal area.

Variable: right-margin-width

This variable specifies the width of the right margin, in character cell units. It is buffer-local in all buffers. A value of nil means no right marginal area.

Setting these variables does not immediately affect the window. These variables are checked when a new buffer is displayed in the window. Thus, you can make changes take effect by calling set-window-buffer.

You can also set the margin widths immediately.

Function: set-window-margins window left &optional right

This function specifies the margin widths for window window, in character cell units. The argument left controls the left margin, and right controls the right margin (default 0).

Function: window-margins &optional window

This function returns the width of the left and right margins of window as a cons cell of the form (left . right). If one of the two marginal areas does not exist, its width is returned as nil; if neither of the two margins exist, the function returns (nil). If window is nil, the selected window is used.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17 Images

To display an image in an Emacs buffer, you must first create an image descriptor, then use it as a display specifier in the display property of text that is displayed (see section The display Property).

Emacs is usually able to display images when it is run on a graphical terminal. Images cannot be displayed in a text terminal, on certain graphical terminals that lack the support for this, or if Emacs is compiled without image support. You can use the function display-images-p to determine if images can in principle be displayed (see section Display Feature Testing).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.1 Image Formats

Emacs can display a number of different image formats. Some of these image formats are supported only if particular support libraries are installed. On some platforms, Emacs can load support libraries on demand; if so, the variable dynamic-library-alist can be used to modify the set of known names for these dynamic libraries. See section Dynamically Loaded Libraries.

Supported image formats (and the required support libraries) include PBM and XBM (which do not depend on support libraries and are always available), XPM (libXpm), GIF (libgif or libungif), PostScript (gs), JPEG (libjpeg), TIFF (libtiff), PNG (libpng), and SVG (librsvg).

Each of these image formats is associated with an image type symbol. The symbols for the above formats are, respectively, pbm, xbm, xpm, gif, postscript, jpeg, tiff, png, and svg.

Furthermore, if you build Emacs with ImageMagick (libMagickWand) support, Emacs can display any image format that ImageMagick can. See section ImageMagick Images. All images displayed via ImageMagick have type symbol imagemagick.

Variable: image-types

This variable contains a list of type symbols for image formats which are potentially supported in the current configuration.

“Potentially” means that Emacs knows about the image types, not necessarily that they can be used (for example, they could depend on unavailable dynamic libraries). To know which image types are really available, use image-type-available-p.

Function: image-type-available-p type

This function returns non-nil if images of type type can be loaded and displayed. type must be an image type symbol.

For image types whose support libraries are statically linked, this function always returns t. For image types whose support libraries are dynamically loaded, it returns t if the library could be loaded and nil otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.2 Image Descriptors

An image descriptor is a list which specifies the underlying data for an image, and how to display it. It is typically used as the value of a display overlay or text property (see section Other Display Specifications); but See section Showing Images, for convenient helper functions to insert images into buffers.

Each image descriptor has the form (image . props), where props is a property list of alternating keyword symbols and values, including at least the pair :type type that specifies the image type.

The following is a list of properties that are meaningful for all image types (there are also properties which are meaningful only for certain image types, as documented in the following subsections):

:type type

The image type. See section Image Formats. Every image descriptor must include this property.

:file file

This says to load the image from file file. If file is not an absolute file name, it is expanded in data-directory.

:data data

This specifies the raw image data. Each image descriptor must have either :data or :file, but not both.

For most image types, the value of a :data property should be a string containing the image data. Some image types do not support :data; for some others, :data alone is not enough, so you need to use other image properties along with :data. See the following subsections for details.

:margin margin

This specifies how many pixels to add as an extra margin around the image. The value, margin, must be a non-negative number, or a pair (x . y) of such numbers. If it is a pair, x specifies how many pixels to add horizontally, and y specifies how many pixels to add vertically. If :margin is not specified, the default is zero.

:ascent ascent

This specifies the amount of the image’s height to use for its ascent—that is, the part above the baseline. The value, ascent, must be a number in the range 0 to 100, or the symbol center.

If ascent is a number, that percentage of the image’s height is used for its ascent.

If ascent is center, the image is vertically centered around a centerline which would be the vertical centerline of text drawn at the position of the image, in the manner specified by the text properties and overlays that apply to the image.

If this property is omitted, it defaults to 50.

:relief relief

This adds a shadow rectangle around the image. The value, relief, specifies the width of the shadow lines, in pixels. If relief is negative, shadows are drawn so that the image appears as a pressed button; otherwise, it appears as an unpressed button.

:conversion algorithm

This specifies a conversion algorithm that should be applied to the image before it is displayed; the value, algorithm, specifies which algorithm.

laplace
emboss

Specifies the Laplace edge detection algorithm, which blurs out small differences in color while highlighting larger differences. People sometimes consider this useful for displaying the image for a “disabled” button.

(edge-detection :matrix matrix :color-adjust adjust)

Specifies a general edge-detection algorithm. matrix must be either a nine-element list or a nine-element vector of numbers. A pixel at position x/y in the transformed image is computed from original pixels around that position. matrix specifies, for each pixel in the neighborhood of x/y, a factor with which that pixel will influence the transformed pixel; element 0 specifies the factor for the pixel at x-1/y-1, element 1 the factor for the pixel at x/y-1 etc., as shown below:

  (x-1/y-1  x/y-1  x+1/y-1
   x-1/y    x/y    x+1/y
   x-1/y+1  x/y+1  x+1/y+1)

The resulting pixel is computed from the color intensity of the color resulting from summing up the RGB values of surrounding pixels, multiplied by the specified factors, and dividing that sum by the sum of the factors’ absolute values.

Laplace edge-detection currently uses a matrix of

  (1  0  0
   0  0  0
   0  0 -1)

Emboss edge-detection uses a matrix of

  ( 2 -1  0
   -1  0  1
    0  1 -2)
disabled

Specifies transforming the image so that it looks “disabled”.

:mask mask

If mask is heuristic or (heuristic bg), build a clipping mask for the image, so that the background of a frame is visible behind the image. If bg is not specified, or if bg is t, determine the background color of the image by looking at the four corners of the image, assuming the most frequently occurring color from the corners is the background color of the image. Otherwise, bg must be a list (red green blue) specifying the color to assume for the background of the image.

If mask is nil, remove a mask from the image, if it has one. Images in some formats include a mask which can be removed by specifying :mask nil.

:pointer shape

This specifies the pointer shape when the mouse pointer is over this image. See section Pointer Shape, for available pointer shapes.

:map map

This associates an image map of hot spots with this image.

An image map is an alist where each element has the format (area id plist). An area is specified as either a rectangle, a circle, or a polygon.

A rectangle is a cons (rect . ((x0 . y0) . (x1 . y1))) which specifies the pixel coordinates of the upper left and bottom right corners of the rectangle area.

A circle is a cons (circle . ((x0 . y0) . r)) which specifies the center and the radius of the circle; r may be a float or integer.

A polygon is a cons (poly . [x0 y0 x1 y1 ...]) where each pair in the vector describes one corner in the polygon.

When the mouse pointer lies on a hot-spot area of an image, the plist of that hot-spot is consulted; if it contains a help-echo property, that defines a tool-tip for the hot-spot, and if it contains a pointer property, that defines the shape of the mouse cursor when it is on the hot-spot. See section Pointer Shape, for available pointer shapes.

When you click the mouse when the mouse pointer is over a hot-spot, an event is composed by combining the id of the hot-spot with the mouse event; for instance, [area4 mouse-1] if the hot-spot’s id is area4.

Function: image-mask-p spec &optional frame

This function returns t if image spec has a mask bitmap. frame is the frame on which the image will be displayed. frame nil or omitted means to use the selected frame (see section Input Focus).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.3 XBM Images

To use XBM format, specify xbm as the image type. This image format doesn’t require an external library, so images of this type are always supported.

Additional image properties supported for the xbm image type are:

:foreground foreground

The value, foreground, should be a string specifying the image foreground color, or nil for the default color. This color is used for each pixel in the XBM that is 1. The default is the frame’s foreground color.

:background background

The value, background, should be a string specifying the image background color, or nil for the default color. This color is used for each pixel in the XBM that is 0. The default is the frame’s background color.

If you specify an XBM image using data within Emacs instead of an external file, use the following three properties:

:data data

The value, data, specifies the contents of the image. There are three formats you can use for data:

:width width

The value, width, specifies the width of the image, in pixels.

:height height

The value, height, specifies the height of the image, in pixels.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.4 XPM Images

To use XPM format, specify xpm as the image type. The additional image property :color-symbols is also meaningful with the xpm image type:

:color-symbols symbols

The value, symbols, should be an alist whose elements have the form (name . color). In each element, name is the name of a color as it appears in the image file, and color specifies the actual color to use for displaying that name.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.5 PostScript Images

To use PostScript for an image, specify image type postscript. This works only if you have Ghostscript installed. You must always use these three properties:

:pt-width width

The value, width, specifies the width of the image measured in points (1/72 inch). width must be an integer.

:pt-height height

The value, height, specifies the height of the image in points (1/72 inch). height must be an integer.

:bounding-box box

The value, box, must be a list or vector of four integers, which specifying the bounding box of the PostScript image, analogous to the ‘BoundingBox’ comment found in PostScript files.

%%BoundingBox: 22 171 567 738

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.6 ImageMagick Images

If you build Emacs with ImageMagick support, you can use the ImageMagick library to load many image formats (see File Conveniences in The GNU Emacs Manual). The image type symbol for images loaded via ImageMagick is imagemagick, regardless of the actual underlying image format.

Function: imagemagick-types

This function returns a list of image file extensions supported by the current ImageMagick installation. Each list element is a symbol representing an internal ImageMagick name for an image type, such as BMP for .bmp images.

User Option: imagemagick-enabled-types

The value of this variable is a list of ImageMagick image types which Emacs may attempt to render using ImageMagick. Each list element should be one of the symbols in the list returned by imagemagick-types, or an equivalent string. Alternatively, a value of t enables ImageMagick for all possible image types. Regardless of the value of this variable, imagemagick-types-inhibit (see below) takes precedence.

User Option: imagemagick-types-inhibit

The value of this variable lists the ImageMagick image types which should never be rendered using ImageMagick, regardless of the value of imagemagick-enabled-types. A value of t disables ImageMagick entirely.

Variable: image-format-suffixes

This variable is an alist mapping image types to file name extensions. Emacs uses this in conjunction with the :format image property (see below) to give a hint to the ImageMagick library as to the type of an image. Each element has the form (type extension), where type is a symbol specifying an image content-type, and extension is a string that specifies the associated file name extension.

Images loaded with ImageMagick support the following additional image descriptor properties:

:background background

background, if non-nil, should be a string specifying a color, which is used as the image’s background color if the image supports transparency. If the value is nil, it defaults to the frame’s background color.

:width width, :height height

The :width and :height keywords are used for scaling the image. If only one of them is specified, the other one will be calculated so as to preserve the aspect ratio. If both are specified, aspect ratio may not be preserved.

:max-width max-width, :max-height max-height

The :max-width and :max-height keywords are used for scaling if the size of the image of the image exceeds these values. If :width is set it will have precedence over max-width, and if :height is set it will have precedence over max-height, but you can otherwise mix these keywords as you wish. :max-width and :max-height will always preserve the aspect ratio.

:format type

The value, type, should be a symbol specifying the type of the image data, as found in image-format-suffixes. This is used when the image does not have an associated file name, to provide a hint to ImageMagick to help it detect the image type.

:rotation angle

Specifies a rotation angle in degrees.

:index frame

See section Multi-Frame Images.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.7 Other Image Types

For PBM images, specify image type pbm. Color, gray-scale and monochromatic images are supported. For mono PBM images, two additional image properties are supported.

:foreground foreground

The value, foreground, should be a string specifying the image foreground color, or nil for the default color. This color is used for each pixel in the PBM that is 1. The default is the frame’s foreground color.

:background background

The value, background, should be a string specifying the image background color, or nil for the default color. This color is used for each pixel in the PBM that is 0. The default is the frame’s background color.

The remaining image types that Emacs can support are:

GIF

Image type gif. Supports the :index property. See section Multi-Frame Images.

JPEG

Image type jpeg.

PNG

Image type png.

SVG

Image type svg.

TIFF

Image type tiff. Supports the :index property. See section Multi-Frame Images.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.8 Defining Images

The functions create-image, defimage and find-image provide convenient ways to create image descriptors.

Function: create-image file-or-data &optional type data-p &rest props

This function creates and returns an image descriptor which uses the data in file-or-data. file-or-data can be a file name or a string containing the image data; data-p should be nil for the former case, non-nil for the latter case.

The optional argument type is a symbol specifying the image type. If type is omitted or nil, create-image tries to determine the image type from the file’s first few bytes, or else from the file’s name.

The remaining arguments, props, specify additional image properties—for example,

(create-image "foo.xpm" 'xpm nil :heuristic-mask t)

The function returns nil if images of this type are not supported. Otherwise it returns an image descriptor.

Macro: defimage symbol specs &optional doc

This macro defines symbol as an image name. The arguments specs is a list which specifies how to display the image. The third argument, doc, is an optional documentation string.

Each argument in specs has the form of a property list, and each one should specify at least the :type property and either the :file or the :data property. The value of :type should be a symbol specifying the image type, the value of :file is the file to load the image from, and the value of :data is a string containing the actual image data. Here is an example:

(defimage test-image
  ((:type xpm :file "~/test1.xpm")
   (:type xbm :file "~/test1.xbm")))

defimage tests each argument, one by one, to see if it is usable—that is, if the type is supported and the file exists. The first usable argument is used to make an image descriptor which is stored in symbol.

If none of the alternatives will work, then symbol is defined as nil.

Function: find-image specs

This function provides a convenient way to find an image satisfying one of a list of image specifications specs.

Each specification in specs is a property list with contents depending on image type. All specifications must at least contain the properties :type type and either :file file or :data data, where type is a symbol specifying the image type, e.g., xbm, file is the file to load the image from, and data is a string containing the actual image data. The first specification in the list whose type is supported, and file exists, is used to construct the image specification to be returned. If no specification is satisfied, nil is returned.

The image is looked for in image-load-path.

Variable: image-load-path

This variable’s value is a list of locations in which to search for image files. If an element is a string or a variable symbol whose value is a string, the string is taken to be the name of a directory to search. If an element is a variable symbol whose value is a list, that is taken to be a list of directory names to search.

The default is to search in the images subdirectory of the directory specified by data-directory, then the directory specified by data-directory, and finally in the directories in load-path. Subdirectories are not automatically included in the search, so if you put an image file in a subdirectory, you have to supply the subdirectory name explicitly. For example, to find the image images/foo/bar.xpm within data-directory, you should specify the image as follows:

(defimage foo-image '((:type xpm :file "foo/bar.xpm")))
Function: image-load-path-for-library library image &optional path no-error

This function returns a suitable search path for images used by the Lisp package library.

The function searches for image first using image-load-path, excluding data-directory/images, and then in load-path, followed by a path suitable for library, which includes ../../etc/images and ../etc/images relative to the library file itself, and finally in data-directory/images.

Then this function returns a list of directories which contains first the directory in which image was found, followed by the value of load-path. If path is given, it is used instead of load-path.

If no-error is non-nil and a suitable path can’t be found, don’t signal an error. Instead, return a list of directories as before, except that nil appears in place of the image directory.

Here is an example of using image-load-path-for-library:

(defvar image-load-path) ; shush compiler
(let* ((load-path (image-load-path-for-library
                    "mh-e" "mh-logo.xpm"))
       (image-load-path (cons (car load-path)
                              image-load-path)))
  (mh-tool-bar-folder-buttons-init))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.9 Showing Images

You can use an image descriptor by setting up the display property yourself, but it is easier to use the functions in this section.

Function: insert-image image &optional string area slice

This function inserts image in the current buffer at point. The value image should be an image descriptor; it could be a value returned by create-image, or the value of a symbol defined with defimage. The argument string specifies the text to put in the buffer to hold the image. If it is omitted or nil, insert-image uses " " by default.

The argument area specifies whether to put the image in a margin. If it is left-margin, the image appears in the left margin; right-margin specifies the right margin. If area is nil or omitted, the image is displayed at point within the buffer’s text.

The argument slice specifies a slice of the image to insert. If slice is nil or omitted the whole image is inserted. Otherwise, slice is a list (x y width height) which specifies the x and y positions and width and height of the image area to insert. Integer values are in units of pixels. A floating-point number in the range 0.0–1.0 stands for that fraction of the width or height of the entire image.

Internally, this function inserts string in the buffer, and gives it a display property which specifies image. See section The display Property.

Function: insert-sliced-image image &optional string area rows cols

This function inserts image in the current buffer at point, like insert-image, but splits the image into rowsxcols equally sized slices.

If an image is inserted “sliced”, Emacs displays each slice as a separate image, and allow more intuitive scrolling up/down, instead of jumping up/down the entire image when paging through a buffer that displays (large) images.

Function: put-image image pos &optional string area

This function puts image image in front of pos in the current buffer. The argument pos should be an integer or a marker. It specifies the buffer position where the image should appear. The argument string specifies the text that should hold the image as an alternative to the default.

The argument image must be an image descriptor, perhaps returned by create-image or stored by defimage.

The argument area specifies whether to put the image in a margin. If it is left-margin, the image appears in the left margin; right-margin specifies the right margin. If area is nil or omitted, the image is displayed at point within the buffer’s text.

Internally, this function creates an overlay, and gives it a before-string property containing text that has a display property whose value is the image. (Whew!)

Function: remove-images start end &optional buffer

This function removes images in buffer between positions start and end. If buffer is omitted or nil, images are removed from the current buffer.

This removes only images that were put into buffer the way put-image does it, not images that were inserted with insert-image or in other ways.

Function: image-size spec &optional pixels frame

This function returns the size of an image as a pair (width . height). spec is an image specification. pixels non-nil means return sizes measured in pixels, otherwise return sizes measured in canonical character units (fractions of the width/height of the frame’s default font). frame is the frame on which the image will be displayed. frame null or omitted means use the selected frame (see section Input Focus).

Variable: max-image-size

This variable is used to define the maximum size of image that Emacs will load. Emacs will refuse to load (and display) any image that is larger than this limit.

If the value is an integer, it directly specifies the maximum image height and width, measured in pixels. If it is floating point, it specifies the maximum image height and width as a ratio to the frame height and width. If the value is non-numeric, there is no explicit limit on the size of images.

The purpose of this variable is to prevent unreasonably large images from accidentally being loaded into Emacs. It only takes effect the first time an image is loaded. Once an image is placed in the image cache, it can always be displayed, even if the value of max-image-size is subsequently changed (see section Image Cache).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.10 Multi-Frame Images

Some image files can contain more than one image. We say that there are multiple “frames” in the image. At present, Emacs supports multiple frames for GIF, TIFF, and certain ImageMagick formats such as DJVM.

The frames can be used either to represent multiple “pages” (this is usually the case with multi-frame TIFF files, for example), or to create animation (usually the case with multi-frame GIF files).

A multi-frame image has a property :index, whose value is an integer (counting from 0) that specifies which frame is being displayed.

Function: image-multi-frame-p image

This function returns non-nil if image contains more than one frame. The actual return value is a cons (nimages . delay), where nimages is the number of frames and delay is the delay in seconds between them, or nil if the image does not specify a delay. Images that are intended to be animated usually specify a frame delay, whereas ones that are intended to be treated as multiple pages do not.

Function: image-current-frame image

This function returns the index of the current frame number for image, counting from 0.

Function: image-show-frame image n &optional nocheck

This function switches image to frame number n. It replaces a frame number outside the valid range with that of the end of the range, unless nocheck is non-nil. If image does not contain a frame with the specified number, the image displays as a hollow box.

Function: image-animate image &optional index limit

This function animates image. The optional integer index specifies the frame from which to start (default 0). The optional argument limit controls the length of the animation. If omitted or nil, the image animates once only; if t it loops forever; if a number animation stops after that many seconds.

Animation operates by means of a timer. Note that Emacs imposes a minimum frame delay of 0.01 (image-minimum-frame-delay) seconds. If the image itself does not specify a delay, Emacs uses image-default-frame-delay.

Function: image-animate-timer image

This function returns the timer responsible for animating image, if there is one.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.17.11 Image Cache

Emacs caches images so that it can display them again more efficiently. When Emacs displays an image, it searches the image cache for an existing image specification equal to the desired specification. If a match is found, the image is displayed from the cache. Otherwise, Emacs loads the image normally.

Function: image-flush spec &optional frame

This function removes the image with specification spec from the image cache of frame frame. Image specifications are compared using equal. If frame is nil, it defaults to the selected frame. If frame is t, the image is flushed on all existing frames.

In Emacs’s current implementation, each graphical terminal possesses an image cache, which is shared by all the frames on that terminal (see section Multiple Terminals). Thus, refreshing an image in one frame also refreshes it in all other frames on the same terminal.

One use for image-flush is to tell Emacs about a change in an image file. If an image specification contains a :file property, the image is cached based on the file’s contents when the image is first displayed. Even if the file subsequently changes, Emacs continues displaying the old version of the image. Calling image-flush flushes the image from the cache, forcing Emacs to re-read the file the next time it needs to display that image.

Another use for image-flush is for memory conservation. If your Lisp program creates a large number of temporary images over a period much shorter than image-cache-eviction-delay (see below), you can opt to flush unused images yourself, instead of waiting for Emacs to do it automatically.

Function: clear-image-cache &optional filter

This function clears an image cache, removing all the images stored in it. If filter is omitted or nil, it clears the cache for the selected frame. If filter is a frame, it clears the cache for that frame. If filter is t, all image caches are cleared. Otherwise, filter is taken to be a file name, and all images associated with that file name are removed from all image caches.

If an image in the image cache has not been displayed for a specified period of time, Emacs removes it from the cache and frees the associated memory.

Variable: image-cache-eviction-delay

This variable specifies the number of seconds an image can remain in the cache without being displayed. When an image is not displayed for this length of time, Emacs removes it from the image cache.

Under some circumstances, if the number of images in the cache grows too large, the actual eviction delay may be shorter than this.

If the value is nil, Emacs does not remove images from the cache except when you explicitly clear it. This mode can be useful for debugging.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18 Buttons

The Button package defines functions for inserting and manipulating buttons that can be activated with the mouse or via keyboard commands. These buttons are typically used for various kinds of hyperlinks.

A button is essentially a set of text or overlay properties, attached to a stretch of text in a buffer. These properties are called button properties. One of these properties, the action property, specifies a function which is called when the user invokes the button using the keyboard or the mouse. The action function may examine the button and use its other properties as desired.

In some ways, the Button package duplicates the functionality in the Widget package. See Introduction in The Emacs Widget Library. The advantage of the Button package is that it is faster, smaller, and simpler to program. From the point of view of the user, the interfaces produced by the two packages are very similar.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.1 Button Properties

Each button has an associated list of properties defining its appearance and behavior, and other arbitrary properties may be used for application specific purposes. The following properties have special meaning to the Button package:

action

The function to call when the user invokes the button, which is passed the single argument button. By default this is ignore, which does nothing.

mouse-action

This is similar to action, and when present, will be used instead of action for button invocations resulting from mouse-clicks (instead of the user hitting RET). If not present, mouse-clicks use action instead.

face

This is an Emacs face controlling how buttons of this type are displayed; by default this is the button face.

mouse-face

This is an additional face which controls appearance during mouse-overs (merged with the usual button face); by default this is the usual Emacs highlight face.

keymap

The button’s keymap, defining bindings active within the button region. By default this is the usual button region keymap, stored in the variable button-map, which defines RET and mouse-2 to invoke the button.

type

The button type. See section Button Types.

help-echo

A string displayed by the Emacs tool-tip help system; by default, "mouse-2, RET: Push this button".

follow-link

The follow-link property, defining how a Mouse-1 click behaves on this button, See section Defining Clickable Text.

button

All buttons have a non-nil button property, which may be useful in finding regions of text that comprise buttons (which is what the standard button functions do).

There are other properties defined for the regions of text in a button, but these are not generally interesting for typical uses.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.2 Button Types

Every button has a button type, which defines default values for the button’s properties. Button types are arranged in a hierarchy, with specialized types inheriting from more general types, so that it’s easy to define special-purpose types of buttons for specific tasks.

Function: define-button-type name &rest properties

Define a ‘button type’ called name (a symbol). The remaining arguments form a sequence of property value pairs, specifying default property values for buttons with this type (a button’s type may be set by giving it a type property when creating the button, using the :type keyword argument).

In addition, the keyword argument :supertype may be used to specify a button-type from which name inherits its default property values. Note that this inheritance happens only when name is defined; subsequent changes to a supertype are not reflected in its subtypes.

Using define-button-type to define default properties for buttons is not necessary—buttons without any specified type use the built-in button-type button—but it is encouraged, since doing so usually makes the resulting code clearer and more efficient.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.3 Making Buttons

Buttons are associated with a region of text, using an overlay or text properties to hold button-specific information, all of which are initialized from the button’s type (which defaults to the built-in button type button). Like all Emacs text, the appearance of the button is governed by the face property; by default (via the face property inherited from the button button-type) this is a simple underline, like a typical web-page link.

For convenience, there are two sorts of button-creation functions, those that add button properties to an existing region of a buffer, called make-...button, and those that also insert the button text, called insert-...button.

The button-creation functions all take the &rest argument properties, which should be a sequence of property value pairs, specifying properties to add to the button; see Button Properties. In addition, the keyword argument :type may be used to specify a button-type from which to inherit other properties; see Button Types. Any properties not explicitly specified during creation will be inherited from the button’s type (if the type defines such a property).

The following functions add a button using an overlay (see section Overlays) to hold the button properties:

Function: make-button beg end &rest properties

This makes a button from beg to end in the current buffer, and returns it.

Function: insert-button label &rest properties

This insert a button with the label label at point, and returns it.

The following functions are similar, but using text properties (see section Text Properties) to hold the button properties. Such buttons do not add markers to the buffer, so editing in the buffer does not slow down if there is an extremely large numbers of buttons. However, if there is an existing face text property on the text (e.g., a face assigned by Font Lock mode), the button face may not be visible. Both of these functions return the starting position of the new button.

Function: make-text-button beg end &rest properties

This makes a button from beg to end in the current buffer, using text properties.

Function: insert-text-button label &rest properties

This inserts a button with the label label at point, using text properties.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.4 Manipulating Buttons

These are functions for getting and setting properties of buttons. Often these are used by a button’s invocation function to determine what to do.

Where a button parameter is specified, it means an object referring to a specific button, either an overlay (for overlay buttons), or a buffer-position or marker (for text property buttons). Such an object is passed as the first argument to a button’s invocation function when it is invoked.

Function: button-start button

Return the position at which button starts.

Function: button-end button

Return the position at which button ends.

Function: button-get button prop

Get the property of button button named prop.

Function: button-put button prop val

Set button’s prop property to val.

Function: button-activate button &optional use-mouse-action

Call button’s action property (i.e., invoke the function that is the value of that property, passing it the single argument button). If use-mouse-action is non-nil, try to invoke the button’s mouse-action property instead of action; if the button has no mouse-action property, use action as normal.

Function: button-label button

Return button’s text label.

Function: button-type button

Return button’s button-type.

Function: button-has-type-p button type

Return t if button has button-type type, or one of type’s subtypes.

Function: button-at pos

Return the button at position pos in the current buffer, or nil. If the button at pos is a text property button, the return value is a marker pointing to pos.

Function: button-type-put type prop val

Set the button-type type’s prop property to val.

Function: button-type-get type prop

Get the property of button-type type named prop.

Function: button-type-subtype-p type supertype

Return t if button-type type is a subtype of supertype.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.18.5 Button Buffer Commands

These are commands and functions for locating and operating on buttons in an Emacs buffer.

push-button is the command that a user uses to actually ‘push’ a button, and is bound by default in the button itself to RET and to mouse-2 using a local keymap in the button’s overlay or text properties. Commands that are useful outside the buttons itself, such as forward-button and backward-button are additionally available in the keymap stored in button-buffer-map; a mode which uses buttons may want to use button-buffer-map as a parent keymap for its keymap.

If the button has a non-nil follow-link property, and mouse-1-click-follows-link is set, a quick Mouse-1 click will also activate the push-button command. See section Defining Clickable Text.

Command: push-button &optional pos use-mouse-action

Perform the action specified by a button at location pos. pos may be either a buffer position or a mouse-event. If use-mouse-action is non-nil, or pos is a mouse-event (see section Mouse Events), try to invoke the button’s mouse-action property instead of action; if the button has no mouse-action property, use action as normal. pos defaults to point, except when push-button is invoked interactively as the result of a mouse-event, in which case, the mouse event’s position is used. If there’s no button at pos, do nothing and return nil, otherwise return t.

Command: forward-button n &optional wrap display-message

Move to the nth next button, or nth previous button if n is negative. If n is zero, move to the start of any button at point. If wrap is non-nil, moving past either end of the buffer continues from the other end. If display-message is non-nil, the button’s help-echo string is displayed. Any button with a non-nil skip property is skipped over. Returns the button found.

Command: backward-button n &optional wrap display-message

Move to the nth previous button, or nth next button if n is negative. If n is zero, move to the start of any button at point. If wrap is non-nil, moving past either end of the buffer continues from the other end. If display-message is non-nil, the button’s help-echo string is displayed. Any button with a non-nil skip property is skipped over. Returns the button found.

Function: next-button pos &optional count-current
Function: previous-button pos &optional count-current

Return the next button after (for next-button) or before (for previous-button) position pos in the current buffer. If count-current is non-nil, count any button at pos in the search, instead of starting at the next button.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.19 Abstract Display

The Ewoc package constructs buffer text that represents a structure of Lisp objects, and updates the text to follow changes in that structure. This is like the “view” component in the “model/view/controller” design paradigm. Ewoc means “Emacs’s Widget for Object Collections”.

An ewoc is a structure that organizes information required to construct buffer text that represents certain Lisp data. The buffer text of the ewoc has three parts, in order: first, fixed header text; next, textual descriptions of a series of data elements (Lisp objects that you specify); and last, fixed footer text. Specifically, an ewoc contains information on:

Typically, you define an ewoc with ewoc-create, and then pass the resulting ewoc structure to other functions in the Ewoc package to build nodes within it, and display it in the buffer. Once it is displayed in the buffer, other functions determine the correspondence between buffer positions and nodes, move point from one node’s textual representation to another, and so forth. See section Abstract Display Functions.

A node encapsulates a data element much the way a variable holds a value. Normally, encapsulation occurs as a part of adding a node to the ewoc. You can retrieve the data element value and place a new value in its place, like so:

(ewoc-data node)
⇒ value

(ewoc-set-data node new-value)
⇒ new-value

You can also use, as the data element value, a Lisp object (list or vector) that is a container for the “real” value, or an index into some other structure. The example (see section Abstract Display Example) uses the latter approach.

When the data changes, you will want to update the text in the buffer. You can update all nodes by calling ewoc-refresh, or just specific nodes using ewoc-invalidate, or all nodes satisfying a predicate using ewoc-map. Alternatively, you can delete invalid nodes using ewoc-delete or ewoc-filter, and add new nodes in their place. Deleting a node from an ewoc deletes its associated textual description from buffer, as well.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.19.1 Abstract Display Functions

In this subsection, ewoc and node stand for the structures described above (see section Abstract Display), while data stands for an arbitrary Lisp object used as a data element.

Function: ewoc-create pretty-printer &optional header footer nosep

This constructs and returns a new ewoc, with no nodes (and thus no data elements). pretty-printer should be a function that takes one argument, a data element of the sort you plan to use in this ewoc, and inserts its textual description at point using insert (and never insert-before-markers, because that would interfere with the Ewoc package’s internal mechanisms).

Normally, a newline is automatically inserted after the header, the footer and every node’s textual description. If nosep is non-nil, no newline is inserted. This may be useful for displaying an entire ewoc on a single line, for example, or for making nodes “invisible” by arranging for pretty-printer to do nothing for those nodes.

An ewoc maintains its text in the buffer that is current when you create it, so switch to the intended buffer before calling ewoc-create.

Function: ewoc-buffer ewoc

This returns the buffer where ewoc maintains its text.

Function: ewoc-get-hf ewoc

This returns a cons cell (header . footer) made from ewoc’s header and footer.

Function: ewoc-set-hf ewoc header footer

This sets the header and footer of ewoc to the strings header and footer, respectively.

Function: ewoc-enter-first ewoc data
Function: ewoc-enter-last ewoc data

These add a new node encapsulating data, putting it, respectively, at the beginning or end of ewoc’s chain of nodes.

Function: ewoc-enter-before ewoc node data
Function: ewoc-enter-after ewoc node data

These add a new node encapsulating data, adding it to ewoc before or after node, respectively.

Function: ewoc-prev ewoc node
Function: ewoc-next ewoc node

These return, respectively, the previous node and the next node of node in ewoc.

Function: ewoc-nth ewoc n

This returns the node in ewoc found at zero-based index n. A negative n means count from the end. ewoc-nth returns nil if n is out of range.

Function: ewoc-data node

This extracts the data encapsulated by node and returns it.

Function: ewoc-set-data node data

This sets the data encapsulated by node to data.

Function: ewoc-locate ewoc &optional pos guess

This determines the node in ewoc which contains point (or pos if specified), and returns that node. If ewoc has no nodes, it returns nil. If pos is before the first node, it returns the first node; if pos is after the last node, it returns the last node. The optional third arg guess should be a node that is likely to be near pos; this doesn’t alter the result, but makes the function run faster.

Function: ewoc-location node

This returns the start position of node.

Function: ewoc-goto-prev ewoc arg
Function: ewoc-goto-next ewoc arg

These move point to the previous or next, respectively, argth node in ewoc. ewoc-goto-prev does not move if it is already at the first node or if ewoc is empty, whereas ewoc-goto-next moves past the last node, returning nil. Excepting this special case, these functions return the node moved to.

Function: ewoc-goto-node ewoc node

This moves point to the start of node in ewoc.

Function: ewoc-refresh ewoc

This function regenerates the text of ewoc. It works by deleting the text between the header and the footer, i.e., all the data elements’ representations, and then calling the pretty-printer function for each node, one by one, in order.

Function: ewoc-invalidate ewoc &rest nodes

This is similar to ewoc-refresh, except that only nodes in ewoc are updated instead of the entire set.

Function: ewoc-delete ewoc &rest nodes

This deletes each node in nodes from ewoc.

Function: ewoc-filter ewoc predicate &rest args

This calls predicate for each data element in ewoc and deletes those nodes for which predicate returns nil. Any args are passed to predicate.

Function: ewoc-collect ewoc predicate &rest args

This calls predicate for each data element in ewoc and returns a list of those elements for which predicate returns non-nil. The elements in the list are ordered as in the buffer. Any args are passed to predicate.

Function: ewoc-map map-function ewoc &rest args

This calls map-function for each data element in ewoc and updates those nodes for which map-function returns non-nil. Any args are passed to map-function.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.19.2 Abstract Display Example

Here is a simple example using functions of the ewoc package to implement a “color components display”, an area in a buffer that represents a vector of three integers (itself representing a 24-bit RGB value) in various ways.

(setq colorcomp-ewoc nil
      colorcomp-data nil
      colorcomp-mode-map nil
      colorcomp-labels ["Red" "Green" "Blue"])

(defun colorcomp-pp (data)
  (if data
      (let ((comp (aref colorcomp-data data)))
        (insert (aref colorcomp-labels data) "\t: #x"
                (format "%02X" comp) " "
                (make-string (ash comp -2) ?#) "\n"))
    (let ((cstr (format "#%02X%02X%02X"
                        (aref colorcomp-data 0)
                        (aref colorcomp-data 1)
                        (aref colorcomp-data 2)))
          (samp " (sample text) "))
      (insert "Color\t: "
              (propertize samp 'face
                          `(foreground-color . ,cstr))
              (propertize samp 'face
                          `(background-color . ,cstr))
              "\n"))))

(defun colorcomp (color)
  "Allow fiddling with COLOR in a new buffer.
The buffer is in Color Components mode."
  (interactive "sColor (name or #RGB or #RRGGBB): ")
  (when (string= "" color)
    (setq color "green"))
  (unless (color-values color)
    (error "No such color: %S" color))
  (switch-to-buffer
   (generate-new-buffer (format "originally: %s" color)))
  (kill-all-local-variables)
  (setq major-mode 'colorcomp-mode
        mode-name "Color Components")
  (use-local-map colorcomp-mode-map)
  (erase-buffer)
  (buffer-disable-undo)
  (let ((data (apply 'vector (mapcar (lambda (n) (ash n -8))
                                     (color-values color))))
        (ewoc (ewoc-create 'colorcomp-pp
                           "\nColor Components\n\n"
                           (substitute-command-keys
                            "\n\\{colorcomp-mode-map}"))))
    (set (make-local-variable 'colorcomp-data) data)
    (set (make-local-variable 'colorcomp-ewoc) ewoc)
    (ewoc-enter-last ewoc 0)
    (ewoc-enter-last ewoc 1)
    (ewoc-enter-last ewoc 2)
    (ewoc-enter-last ewoc nil)))

This example can be extended to be a “color selection widget” (in other words, the controller part of the “model/view/controller” design paradigm) by defining commands to modify colorcomp-data and to “finish” the selection process, and a keymap to tie it all together conveniently.

(defun colorcomp-mod (index limit delta)
  (let ((cur (aref colorcomp-data index)))
    (unless (= limit cur)
      (aset colorcomp-data index (+ cur delta)))
    (ewoc-invalidate
     colorcomp-ewoc
     (ewoc-nth colorcomp-ewoc index)
     (ewoc-nth colorcomp-ewoc -1))))

(defun colorcomp-R-more () (interactive) (colorcomp-mod 0 255 1))
(defun colorcomp-G-more () (interactive) (colorcomp-mod 1 255 1))
(defun colorcomp-B-more () (interactive) (colorcomp-mod 2 255 1))
(defun colorcomp-R-less () (interactive) (colorcomp-mod 0 0 -1))
(defun colorcomp-G-less () (interactive) (colorcomp-mod 1 0 -1))
(defun colorcomp-B-less () (interactive) (colorcomp-mod 2 0 -1))

(defun colorcomp-copy-as-kill-and-exit ()
  "Copy the color components into the kill ring and kill the buffer.
The string is formatted #RRGGBB (hash followed by six hex digits)."
  (interactive)
  (kill-new (format "#%02X%02X%02X"
                    (aref colorcomp-data 0)
                    (aref colorcomp-data 1)
                    (aref colorcomp-data 2)))
  (kill-buffer nil))

(setq colorcomp-mode-map
      (let ((m (make-sparse-keymap)))
        (suppress-keymap m)
        (define-key m "i" 'colorcomp-R-less)
        (define-key m "o" 'colorcomp-R-more)
        (define-key m "k" 'colorcomp-G-less)
        (define-key m "l" 'colorcomp-G-more)
        (define-key m "," 'colorcomp-B-less)
        (define-key m "." 'colorcomp-B-more)
        (define-key m " " 'colorcomp-copy-as-kill-and-exit)
        m))

Note that we never modify the data in each node, which is fixed when the ewoc is created to be either nil or an index into the vector colorcomp-data, the actual color components.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.20 Blinking Parentheses

This section describes the mechanism by which Emacs shows a matching open parenthesis when the user inserts a close parenthesis.

Variable: blink-paren-function

The value of this variable should be a function (of no arguments) to be called whenever a character with close parenthesis syntax is inserted. The value of blink-paren-function may be nil, in which case nothing is done.

User Option: blink-matching-paren

If this variable is nil, then blink-matching-open does nothing.

User Option: blink-matching-paren-distance

This variable specifies the maximum distance to scan for a matching parenthesis before giving up.

User Option: blink-matching-delay

This variable specifies the number of seconds to keep indicating the matching parenthesis. A fraction of a second often gives good results, but the default is 1, which works on all systems.

Command: blink-matching-open

This function is the default value of blink-paren-function. It assumes that point follows a character with close parenthesis syntax and applies the appropriate effect momentarily to the matching opening character. If that character is not already on the screen, it displays the character’s context in the echo area. To avoid long delays, this function does not search farther than blink-matching-paren-distance characters.

Here is an example of calling this function explicitly.

(defun interactive-blink-matching-open ()
  "Indicate momentarily the start of parenthesized sexp before point."
  (interactive)
  (let ((blink-matching-paren-distance
         (buffer-size))
        (blink-matching-paren t))
    (blink-matching-open)))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21 Character Display

This section describes how characters are actually displayed by Emacs. Typically, a character is displayed as a glyph (a graphical symbol which occupies one character position on the screen), whose appearance corresponds to the character itself. For example, the character ‘a’ (character code 97) is displayed as ‘a’. Some characters, however, are displayed specially. For example, the formfeed character (character code 12) is usually displayed as a sequence of two glyphs, ‘^L’, while the newline character (character code 10) starts a new screen line.

You can modify how each character is displayed by defining a display table, which maps each character code into a sequence of glyphs. See section Display Tables.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.1 Usual Display Conventions

Here are the conventions for displaying each character code (in the absence of a display table, which can override these conventions; see section Display Tables).

The above display conventions apply even when there is a display table, for any character whose entry in the active display table is nil. Thus, when you set up a display table, you need only specify the characters for which you want special behavior.

The following variables affect how certain characters are displayed on the screen. Since they change the number of columns the characters occupy, they also affect the indentation functions. They also affect how the mode line is displayed; if you want to force redisplay of the mode line using the new values, call the function force-mode-line-update (see section Mode Line Format).

User Option: ctl-arrow

This buffer-local variable controls how control characters are displayed. If it is non-nil, they are displayed as a caret followed by the character: ‘^A’. If it is nil, they are displayed as octal escapes: a backslash followed by three octal digits, as in ‘\001’.

User Option: tab-width

The value of this buffer-local variable is the spacing between tab stops used for displaying tab characters in Emacs buffers. The value is in units of columns, and the default is 8. Note that this feature is completely independent of the user-settable tab stops used by the command tab-to-tab-stop. See section Adjustable “Tab Stops”.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.2 Display Tables

A display table is a special-purpose char-table (see section Char-Tables), with display-table as its subtype, which is used to override the usual character display conventions. This section describes how to make, inspect, and assign elements to a display table object.

Function: make-display-table

This creates and returns a display table. The table initially has nil in all elements.

The ordinary elements of the display table are indexed by character codes; the element at index c says how to display the character code c. The value should be nil (which means to display the character c according to the usual display conventions; see section Usual Display Conventions), or a vector of glyph codes (which means to display the character c as those glyphs; see section Glyphs).

Warning: if you use the display table to change the display of newline characters, the whole buffer will be displayed as one long “line”.

The display table also has six “extra slots” which serve special purposes. Here is a table of their meanings; nil in any slot means to use the default for that slot, as stated below.

0

The glyph for the end of a truncated screen line (the default for this is ‘$’). See section Glyphs. On graphical terminals, Emacs uses arrows in the fringes to indicate truncation, so the display table has no effect.

1

The glyph for the end of a continued line (the default is ‘\’). On graphical terminals, Emacs uses curved arrows in the fringes to indicate continuation, so the display table has no effect.

2

The glyph for indicating a character displayed as an octal character code (the default is ‘\’).

3

The glyph for indicating a control character (the default is ‘^’).

4

A vector of glyphs for indicating the presence of invisible lines (the default is ‘...’). See section Selective Display.

5

The glyph used to draw the border between side-by-side windows (the default is ‘|’). See section Splitting Windows. This takes effect only when there are no scroll bars; if scroll bars are supported and in use, a scroll bar separates the two windows.

For example, here is how to construct a display table that mimics the effect of setting ctl-arrow to a non-nil value (see section Glyphs, for the function make-glyph-code):

(setq disptab (make-display-table))
(dotimes (i 32)
  (or (= i ?\t)
      (= i ?\n)
      (aset disptab i
            (vector (make-glyph-code ?^ 'escape-glyph)
                    (make-glyph-code (+ i 64) 'escape-glyph)))))
(aset disptab 127
      (vector (make-glyph-code ?^ 'escape-glyph)
              (make-glyph-code ?? 'escape-glyph)))))
Function: display-table-slot display-table slot

This function returns the value of the extra slot slot of display-table. The argument slot may be a number from 0 to 5 inclusive, or a slot name (symbol). Valid symbols are truncation, wrap, escape, control, selective-display, and vertical-border.

Function: set-display-table-slot display-table slot value

This function stores value in the extra slot slot of display-table. The argument slot may be a number from 0 to 5 inclusive, or a slot name (symbol). Valid symbols are truncation, wrap, escape, control, selective-display, and vertical-border.

Function: describe-display-table display-table

This function displays a description of the display table display-table in a help buffer.

Command: describe-current-display-table

This command displays a description of the current display table in a help buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.3 Active Display Table

Each window can specify a display table, and so can each buffer. The window’s display table, if there is one, takes precedence over the buffer’s display table. If neither exists, Emacs tries to use the standard display table; if that is nil, Emacs uses the usual character display conventions (see section Usual Display Conventions).

Note that display tables affect how the mode line is displayed, so if you want to force redisplay of the mode line using a new display table, call force-mode-line-update (see section Mode Line Format).

Function: window-display-table &optional window

This function returns window’s display table, or nil if there is none. The default for window is the selected window.

Function: set-window-display-table window table

This function sets the display table of window to table. The argument table should be either a display table or nil.

Variable: buffer-display-table

This variable is automatically buffer-local in all buffers; its value specifies the buffer’s display table. If it is nil, there is no buffer display table.

Variable: standard-display-table

The value of this variable is the standard display table, which is used when Emacs is displaying a buffer in a window with neither a window display table nor a buffer display table defined. Its default is nil.

The disp-table library defines several functions for changing the standard display table.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.4 Glyphs

A glyph is a graphical symbol which occupies a single character position on the screen. Each glyph is represented in Lisp as a glyph code, which specifies a character and optionally a face to display it in (see section Faces). The main use of glyph codes is as the entries of display tables (see section Display Tables). The following functions are used to manipulate glyph codes:

Function: make-glyph-code char &optional face

This function returns a glyph code representing char char with face face. If face is omitted or nil, the glyph uses the default face; in that case, the glyph code is an integer. If face is non-nil, the glyph code is not necessarily an integer object.

Function: glyph-char glyph

This function returns the character of glyph code glyph.

Function: glyph-face glyph

This function returns face of glyph code glyph, or nil if glyph uses the default face.

You can set up a glyph table to change how glyph codes are actually displayed on text terminals. This feature is semi-obsolete; use glyphless-char-display instead (see section Glyphless Character Display).

Variable: glyph-table

The value of this variable, if non-nil, is the current glyph table. It takes effect only on character terminals; on graphical displays, all glyphs are displayed literally. The glyph table should be a vector whose gth element specifies how to display glyph code g, where g is the glyph code for a glyph whose face is unspecified. Each element should be one of the following:

nil

Display this glyph literally.

a string

Display this glyph by sending the specified string to the terminal.

a glyph code

Display the specified glyph code instead.

Any integer glyph code greater than or equal to the length of the glyph table is displayed literally.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.21.5 Glyphless Character Display

Glyphless characters are characters which are displayed in a special way, e.g., as a box containing a hexadecimal code, instead of being displayed literally. These include characters which are explicitly defined to be glyphless, as well as characters for which there is no available font (on a graphical display), and characters which cannot be encoded by the terminal’s coding system (on a text terminal).

Variable: glyphless-char-display

The value of this variable is a char-table which defines glyphless characters and how they are displayed. Each entry must be one of the following display methods:

nil

Display the character in the usual way.

zero-width

Don’t display the character.

thin-space

Display a thin space, 1-pixel wide on graphical displays, or 1-character wide on text terminals.

empty-box

Display an empty box.

hex-code

Display a box containing the Unicode codepoint of the character, in hexadecimal notation.

an ASCII string

Display a box containing that string.

a cons cell (graphical . text)

Display with graphical on graphical displays, and with text on text terminals. Both graphical and text must be one of the display methods described above.

The thin-space, empty-box, hex-code, and ASCII string display methods are drawn with the glyphless-char face.

The char-table has one extra slot, which determines how to display any character that cannot be displayed with any available font, or cannot be encoded by the terminal’s coding system. Its value should be one of the above display methods, except zero-width or a cons cell.

If a character has a non-nil entry in an active display table, the display table takes effect; in this case, Emacs does not consult glyphless-char-display at all.

User Option: glyphless-char-display-control

This user option provides a convenient way to set glyphless-char-display for groups of similar characters. Do not set its value directly from Lisp code; the value takes effect only via a custom :set function (see section Defining Customization Variables), which updates glyphless-char-display.

Its value should be an alist of elements (group . method), where group is a symbol specifying a group of characters, and method is a symbol specifying how to display them.

group should be one of the following:

c0-control

ASCII control characters U+0000 to U+001F, excluding the newline and tab characters (normally displayed as escape sequences like ‘^A’; see How Text Is Displayed in The GNU Emacs Manual).

c1-control

Non-ASCII, non-printing characters U+0080 to U+009F (normally displayed as octal escape sequences like ‘\230’).

format-control

Characters of Unicode General Category ‘Cf’, such as ‘U+200E’ (Left-to-Right Mark), but excluding characters that have graphic images, such as ‘U+00AD’ (Soft Hyphen).

no-font

Characters for there is no suitable font, or which cannot be encoded by the terminal’s coding system.

The method symbol should be one of zero-width, thin-space, empty-box, or hex-code. These have the same meanings as in glyphless-char-display, above.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.22 Beeping

This section describes how to make Emacs ring the bell (or blink the screen) to attract the user’s attention. Be conservative about how often you do this; frequent bells can become irritating. Also be careful not to use just beeping when signaling an error is more appropriate (see section Errors).

Function: ding &optional do-not-terminate

This function beeps, or flashes the screen (see visible-bell below). It also terminates any keyboard macro currently executing unless do-not-terminate is non-nil.

Function: beep &optional do-not-terminate

This is a synonym for ding.

User Option: visible-bell

This variable determines whether Emacs should flash the screen to represent a bell. Non-nil means yes, nil means no. This is effective on graphical displays, and on text terminals provided the terminal’s Termcap entry defines the visible bell capability (‘vb’).

Variable: ring-bell-function

If this is non-nil, it specifies how Emacs should “ring the bell”. Its value should be a function of no arguments. If this is non-nil, it takes precedence over the visible-bell variable.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.23 Window Systems

Emacs works with several window systems, most notably the X Window System. Both Emacs and X use the term “window”, but use it differently. An Emacs frame is a single window as far as X is concerned; the individual Emacs windows are not known to X at all.

Variable: window-system

This terminal-local variable tells Lisp programs what window system Emacs is using for displaying the frame. The possible values are

x

Emacs is displaying the frame using X.

w32

Emacs is displaying the frame using native MS-Windows GUI.

ns

Emacs is displaying the frame using the Nextstep interface (used on GNUstep and Mac OS X).

pc

Emacs is displaying the frame using MS-DOS direct screen writes.

nil

Emacs is displaying the frame on a character-based terminal.

Variable: initial-window-system

This variable holds the value of window-system used for the first frame created by Emacs during startup. (When Emacs is invoked with the --daemon option, it does not create any initial frames, so initial-window-system is nil. See daemon in The GNU Emacs Manual.)

Function: window-system &optional frame

This function returns a symbol whose name tells what window system is used for displaying frame (which defaults to the currently selected frame). The list of possible symbols it returns is the same one documented for the variable window-system above.

Do not use window-system and initial-window-system as predicates or boolean flag variables, if you want to write code that works differently on text terminals and graphic displays. That is because window-system is not a good indicator of Emacs capabilities on a given display type. Instead, use display-graphic-p or any of the other display-*-p predicates described in Display Feature Testing.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

37.24 Bidirectional Display

Emacs can display text written in scripts, such as Arabic, Farsi, and Hebrew, whose natural ordering for horizontal text display runs from right to left. Furthermore, segments of Latin script and digits embedded in right-to-left text are displayed left-to-right, while segments of right-to-left script embedded in left-to-right text (e.g., Arabic or Hebrew text in comments or strings in a program source file) are appropriately displayed right-to-left. We call such mixtures of left-to-right and right-to-left text bidirectional text. This section describes the facilities and options for editing and displaying bidirectional text.

Text is stored in Emacs buffers and strings in logical (or reading) order, i.e., the order in which a human would read each character. In right-to-left and bidirectional text, the order in which characters are displayed on the screen (called visual order) is not the same as logical order; the characters’ screen positions do not increase monotonically with string or buffer position. In performing this bidirectional reordering, Emacs follows the Unicode Bidirectional Algorithm (a.k.a. UBA), which is described in Annex #9 of the Unicode standard (http://www.unicode.org/reports/tr9/). Emacs currently provides a “Non-isolate Bidirectionality” class implementation of the UBA: it does not yet support the isolate directional formatting characters introduced with Unicode Standard v6.3.0.

Variable: bidi-display-reordering

If the value of this buffer-local variable is non-nil (the default), Emacs performs bidirectional reordering for display. The reordering affects buffer text, as well as display strings and overlay strings from text and overlay properties in the buffer (see section Overlay Properties, and see section The display Property). If the value is nil, Emacs does not perform bidirectional reordering in the buffer.

The default value of bidi-display-reordering controls the reordering of strings which are not directly supplied by a buffer, including the text displayed in mode lines (see section Mode Line Format) and header lines (see section Window Header Lines).

Emacs never reorders the text of a unibyte buffer, even if bidi-display-reordering is non-nil in the buffer. This is because unibyte buffers contain raw bytes, not characters, and thus lack the directionality properties required for reordering. Therefore, to test whether text in a buffer will be reordered for display, it is not enough to test the value of bidi-display-reordering alone. The correct test is this:

 (if (and enable-multibyte-characters
          bidi-display-reordering)
     ;; Buffer is being reordered for display
   )

However, unibyte display and overlay strings are reordered if their parent buffer is reordered. This is because plain-ASCII strings are stored by Emacs as unibyte strings. If a unibyte display or overlay string includes non-ASCII characters, these characters are assumed to have left-to-right direction.

Text covered by display text properties, by overlays with display properties whose value is a string, and by any other properties that replace buffer text, is treated as a single unit when it is reordered for display. That is, the entire chunk of text covered by these properties is reordered together. Moreover, the bidirectional properties of the characters in such a chunk of text are ignored, and Emacs reorders them as if they were replaced with a single character U+FFFC, known as the Object Replacement Character. This means that placing a display property over a portion of text may change the way that the surrounding text is reordered for display. To prevent this unexpected effect, always place such properties on text whose directionality is identical with text that surrounds it.

Each paragraph of bidirectional text has a base direction, either right-to-left or left-to-right. Left-to-right paragraphs are displayed beginning at the left margin of the window, and are truncated or continued when the text reaches the right margin. Right-to-left paragraphs are displayed beginning at the right margin, and are continued or truncated at the left margin.

By default, Emacs determines the base direction of each paragraph by looking at the text at its beginning. The precise method of determining the base direction is specified by the UBA; in a nutshell, the first character in a paragraph that has an explicit directionality determines the base direction of the paragraph. However, sometimes a buffer may need to force a certain base direction for its paragraphs. For example, buffers containing program source code should force all paragraphs to be displayed left-to-right. You can use following variable to do this:

Variable: bidi-paragraph-direction

If the value of this buffer-local variable is the symbol right-to-left or left-to-right, all paragraphs in the buffer are assumed to have that specified direction. Any other value is equivalent to nil (the default), which means to determine the base direction of each paragraph from its contents.

Modes for program source code should set this to left-to-right. Prog mode does this by default, so modes derived from Prog mode do not need to set this explicitly (see section Basic Major Modes).

Function: current-bidi-paragraph-direction &optional buffer

This function returns the paragraph direction at point in the named buffer. The returned value is a symbol, either left-to-right or right-to-left. If buffer is omitted or nil, it defaults to the current buffer. If the buffer-local value of the variable bidi-paragraph-direction is non-nil, the returned value will be identical to that value; otherwise, the returned value reflects the paragraph direction determined dynamically by Emacs. For buffers whose value of bidi-display-reordering is nil as well as unibyte buffers, this function always returns left-to-right.

Sometimes there’s a need to move point in strict visual order, either to the left or to the right of its current screen position. Emacs provides a primitive to do that.

Function: move-point-visually direction

This function moves point of the currently selected window to the buffer position that appears immediately to the right or to the left of point on the screen. If direction is positive, point will move one screen position to the right, otherwise it will move one screen position to the left. Note that, depending on the surrounding bidirectional context, this could potentially move point many buffer positions away. If invoked at the end of a screen line, the function moves point to the rightmost or leftmost screen position of the next or previous screen line, as appropriate for the value of direction.

The function returns the new buffer position as its value.

Bidirectional reordering can have surprising and unpleasant effects when two strings with bidirectional content are juxtaposed in a buffer, or otherwise programmatically concatenated into a string of text. A typical problematic case is when a buffer consists of sequences of text “fields” separated by whitespace or punctuation characters, like Buffer Menu mode or Rmail Summary Mode. Because the punctuation characters used as separators have weak directionality, they take on the directionality of surrounding text. As result, a numeric field that follows a field with bidirectional content can be displayed to the left of the preceding field, messing up the expected layout. There are several ways to avoid this problem:

Function: bidi-string-mark-left-to-right string

This function returns its argument string, possibly modified, such that the result can be safely concatenated with another string, or juxtaposed with another string in a buffer, without disrupting the relative layout of this string and the next one on display. If the string returned by this function is displayed as part of a left-to-right paragraph, it will always appear on display to the left of the text that follows it. The function works by examining the characters of its argument, and if any of those characters could cause reordering on display, the function appends the LRM character to the string. The appended LRM character is made invisible by giving it an invisible text property of t (see section Invisible Text).

The reordering algorithm uses the bidirectional properties of the characters stored as their bidi-class property (see section Character Properties). Lisp programs can change these properties by calling the put-char-code-property function. However, doing this requires a thorough understanding of the UBA, and is therefore not recommended. Any changes to the bidirectional properties of a character have global effect: they affect all Emacs frames and windows.

Similarly, the mirroring property is used to display the appropriate mirrored character in the reordered text. Lisp programs can affect the mirrored display by changing this property. Again, any such changes affect all of Emacs display.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38 Operating System Interface

This chapter is about starting and getting out of Emacs, access to values in the operating system environment, and terminal input, output.

See section Building Emacs, for related information. See section Emacs Display, for additional operating system status information pertaining to the terminal and the screen.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1 Starting Up Emacs

This section describes what Emacs does when it is started, and how you can customize these actions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1.1 Summary: Sequence of Actions at Startup

When Emacs is started up, it performs the following operations (see normal-top-level in startup.el):

  1. It adds subdirectories to load-path, by running the file named subdirs.el in each directory in the list. Normally, this file adds the directory’s subdirectories to the list, and those are scanned in their turn. The files subdirs.el are normally generated automatically when Emacs is installed.
  2. It loads any leim-list.el that it finds in the load-path directories. This file is intended for registering input methods. The search is only for any personal leim-list.el files that you may have created; it skips the directories containing the standard Emacs libraries (these should contain only a single leim-list.el file, which is compiled into the Emacs executable).
  3. It sets the variable before-init-time to the value of current-time (see section Time of Day). It also sets after-init-time to nil, which signals to Lisp programs that Emacs is being initialized.
  4. It sets the language environment and the terminal coding system, if requested by environment variables such as LANG.
  5. It does some basic parsing of the command-line arguments.
  6. If not running in batch mode, it initializes the window system that the variable initial-window-system specifies (see section initial-window-system). The initialization function for each supported window system is specified by window-system-initialization-alist. If the value of initial-window-system is windowsystem, then the appropriate initialization function is defined in the file term/windowsystem-win.el. This file should have been compiled into the Emacs executable when it was built.
  7. It runs the normal hook before-init-hook.
  8. If appropriate, it creates a graphical frame. This is not done if the options ‘--batch’ or ‘--daemon’ were specified.
  9. It initializes the initial frame’s faces, and sets up the menu bar and tool bar if needed. If graphical frames are supported, it sets up the tool bar even if the current frame is not a graphical one, since a graphical frame may be created later on.
  10. It use custom-reevaluate-setting to re-initialize the members of the list custom-delayed-init-variables. These are any pre-loaded user options whose default value depends on the run-time, rather than build-time, context. See section custom-initialize-delay.
  11. It loads the library site-start, if it exists. This is not done if the options ‘-Q’ or ‘--no-site-file’ were specified.
  12. It loads your init file (see section The Init File). This is not done if the options ‘-q’, ‘-Q’, or ‘--batch’ were specified. If the ‘-u’ option was specified, Emacs looks for the init file in that user’s home directory instead.
  13. It loads the library default, if it exists. This is not done if inhibit-default-init is non-nil, nor if the options ‘-q’, ‘-Q’, or ‘--batch’ were specified.
  14. It loads your abbrevs from the file specified by abbrev-file-name, if that file exists and can be read (see section abbrev-file-name). This is not done if the option ‘--batch’ was specified.
  15. If package-enable-at-startup is non-nil, it calls the function package-initialize to activate any optional Emacs Lisp package that has been installed. See section Packaging Basics.
  16. It sets the variable after-init-time to the value of current-time. This variable was set to nil earlier; setting it to the current time signals that the initialization phase is over, and, together with before-init-time, provides the measurement of how long it took.
  17. It runs the normal hook after-init-hook.
  18. If the buffer *scratch* exists and is still in Fundamental mode (as it should be by default), it sets its major mode according to initial-major-mode.
  19. If started on a text terminal, it loads the terminal-specific Lisp library (see section Terminal-Specific Initialization), and runs the hook tty-setup-hook. This is not done in --batch mode, nor if term-file-prefix is nil.
  20. It displays the initial echo area message, unless you have suppressed that with inhibit-startup-echo-area-message.
  21. It processes any command-line options that were not handled earlier.
  22. It now exits if the option --batch was specified.
  23. If initial-buffer-choice is a string, it visits the file (or directory) with that name. If it is a function, it calls the function with no arguments and selects the buffer that it returns. If the *scratch* buffer exists and is empty, it inserts initial-scratch-message into that buffer.
  24. It runs emacs-startup-hook.
  25. It calls frame-notice-user-settings, which modifies the parameters of the selected frame according to whatever the init files specify.
  26. It runs window-setup-hook. The only difference between this hook and emacs-startup-hook is that this one runs after the previously mentioned modifications to the frame parameters.
  27. It displays the startup screen, which is a special buffer that contains information about copyleft and basic Emacs usage. This is not done if inhibit-startup-screen or initial-buffer-choice are non-nil, or if the ‘--no-splash’ or ‘-Q’ command-line options were specified.
  28. If the option --daemon was specified, it calls server-start and detaches from the controlling terminal. See Emacs Server in The GNU Emacs Manual.
  29. If started by the X session manager, it calls emacs-session-restore passing it as argument the ID of the previous session. See section Session Management.

The following options affect some aspects of the startup sequence.

User Option: inhibit-startup-screen

This variable, if non-nil, inhibits the startup screen. In that case, Emacs typically displays the *scratch* buffer; but see initial-buffer-choice, below.

Do not set this variable in the init file of a new user, or in a way that affects more than one user, as that would prevent new users from receiving information about copyleft and basic Emacs usage.

inhibit-startup-message and inhibit-splash-screen are aliases for this variable.

User Option: initial-buffer-choice

If non-nil, this variable is a string that specifies a file or directory for Emacs to display after starting up, instead of the startup screen. If its value is a function, Emacs calls that function which must return a buffer which is then displayed. If its value is t, Emacs displays the *scratch* buffer.

User Option: inhibit-startup-echo-area-message

This variable controls the display of the startup echo area message. You can suppress the startup echo area message by adding text with this form to your init file:

(setq inhibit-startup-echo-area-message
      "your-login-name")

Emacs explicitly checks for an expression as shown above in your init file; your login name must appear in the expression as a Lisp string constant. You can also use the Customize interface. Other methods of setting inhibit-startup-echo-area-message to the same value do not inhibit the startup message. This way, you can easily inhibit the message for yourself if you wish, but thoughtless copying of your init file will not inhibit the message for someone else.

User Option: initial-scratch-message

This variable, if non-nil, should be a string, which is inserted into the *scratch* buffer when Emacs starts up. If it is nil, the *scratch* buffer is empty.

The following command-line options affect some aspects of the startup sequence. See Initial Options in The GNU Emacs Manual.

--no-splash

Do not display a splash screen.

--batch

Run without an interactive terminal. See section Batch Mode.

--daemon

Do not initialize any display; just start a server in the background.

--no-init-file
-q

Do not load either the init file, or the default library.

--no-site-file

Do not load the site-start library.

--quick
-Q

Equivalent to ‘-q --no-site-file --no-splash’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1.2 The Init File

When you start Emacs, it normally attempts to load your init file. This is either a file named .emacs or .emacs.el in your home directory, or a file named init.el in a subdirectory named .emacs.d in your home directory.

The command-line switches ‘-q’, ‘-Q’, and ‘-u’ control whether and where to find the init file; ‘-q’ (and the stronger ‘-Q’) says not to load an init file, while ‘-u user’ says to load user’s init file instead of yours. See Entering Emacs in The GNU Emacs Manual. If neither option is specified, Emacs uses the LOGNAME environment variable, or the USER (most systems) or USERNAME (MS systems) variable, to find your home directory and thus your init file; this way, even if you have su’d, Emacs still loads your own init file. If those environment variables are absent, though, Emacs uses your user-id to find your home directory.

An Emacs installation may have a default init file, which is a Lisp library named default.el. Emacs finds this file through the standard search path for libraries (see section How Programs Do Loading). The Emacs distribution does not come with this file; it is intended for local customizations. If the default init file exists, it is loaded whenever you start Emacs. But your own personal init file, if any, is loaded first; if it sets inhibit-default-init to a non-nil value, then Emacs does not subsequently load the default.el file. In batch mode, or if you specify ‘-q’ (or ‘-Q’), Emacs loads neither your personal init file nor the default init file.

Another file for site-customization is site-start.el. Emacs loads this before the user’s init file. You can inhibit the loading of this file with the option ‘--no-site-file’.

User Option: site-run-file

This variable specifies the site-customization file to load before the user’s init file. Its normal value is "site-start". The only way you can change it with real effect is to do so before dumping Emacs.

See Init File Examples in The GNU Emacs Manual, for examples of how to make various commonly desired customizations in your .emacs file.

User Option: inhibit-default-init

If this variable is non-nil, it prevents Emacs from loading the default initialization library file. The default value is nil.

Variable: before-init-hook

This normal hook is run, once, just before loading all the init files (site-start.el, your init file, and default.el). (The only way to change it with real effect is before dumping Emacs.)

Variable: after-init-hook

This normal hook is run, once, just after loading all the init files (site-start.el, your init file, and default.el), before loading the terminal-specific library (if started on a text terminal) and processing the command-line action arguments.

Variable: emacs-startup-hook

This normal hook is run, once, just after handling the command line arguments. In batch mode, Emacs does not run this hook.

Variable: window-setup-hook

This normal hook is very similar to emacs-startup-hook. The only difference is that it runs slightly later, after setting of the frame parameters. See section window-setup-hook.

Variable: user-init-file

This variable holds the absolute file name of the user’s init file. If the actual init file loaded is a compiled file, such as .emacs.elc, the value refers to the corresponding source file.

Variable: user-emacs-directory

This variable holds the name of the .emacs.d directory. It is ~/.emacs.d on all platforms but MS-DOS.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1.3 Terminal-Specific Initialization

Each terminal type can have its own Lisp library that Emacs loads when run on that type of terminal. The library’s name is constructed by concatenating the value of the variable term-file-prefix and the terminal type (specified by the environment variable TERM). Normally, term-file-prefix has the value "term/"; changing this is not recommended. Emacs finds the file in the normal manner, by searching the load-path directories, and trying the ‘.elc’ and ‘.el’ suffixes.

The usual role of a terminal-specific library is to enable special keys to send sequences that Emacs can recognize. It may also need to set or add to input-decode-map if the Termcap or Terminfo entry does not specify all the terminal’s function keys. See section Terminal Input.

When the name of the terminal type contains a hyphen or underscore, and no library is found whose name is identical to the terminal’s name, Emacs strips from the terminal’s name the last hyphen or underscore and everything that follows it, and tries again. This process is repeated until Emacs finds a matching library, or until there are no more hyphens or underscores in the name (i.e., there is no terminal-specific library). For example, if the terminal name is ‘xterm-256color’ and there is no term/xterm-256color.el library, Emacs tries to load term/xterm.el. If necessary, the terminal library can evaluate (getenv "TERM") to find the full name of the terminal type.

Your init file can prevent the loading of the terminal-specific library by setting the variable term-file-prefix to nil.

You can also arrange to override some of the actions of the terminal-specific library by using tty-setup-hook. This is a normal hook that Emacs runs after initializing a new text terminal. You could use this hook to define initializations for terminals that do not have their own libraries. See section Hooks.

Variable: term-file-prefix

If the value of this variable is non-nil, Emacs loads a terminal-specific initialization file as follows:

(load (concat term-file-prefix (getenv "TERM")))

You may set the term-file-prefix variable to nil in your init file if you do not wish to load the terminal-initialization file.

On MS-DOS, Emacs sets the TERM environment variable to ‘internal’.

Variable: tty-setup-hook

This variable is a normal hook that Emacs runs after initializing a new text terminal. (This applies when Emacs starts up in non-windowed mode, and when making a tty emacsclient connection.) The hook runs after loading your init file (if applicable) and the terminal-specific Lisp file, so you can use it to adjust the definitions made by that file.

For a related feature, see section window-setup-hook.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.1.4 Command-Line Arguments

You can use command-line arguments to request various actions when you start Emacs. Note that the recommended way of using Emacs is to start it just once, after logging in, and then do all editing in the same Emacs session (see Entering Emacs in The GNU Emacs Manual). For this reason, you might not use command-line arguments very often; nonetheless, they can be useful when invoking Emacs from session scripts or debugging Emacs. This section describes how Emacs processes command-line arguments.

Function: command-line

This function parses the command line that Emacs was called with, processes it, and (amongst other things) loads the user’s init file and displays the startup messages.

Variable: command-line-processed

The value of this variable is t once the command line has been processed.

If you redump Emacs by calling dump-emacs (see section Building Emacs), you may wish to set this variable to nil first in order to cause the new dumped Emacs to process its new command-line arguments.

Variable: command-switch-alist

This variable is an alist of user-defined command-line options and associated handler functions. By default it is empty, but you can add elements if you wish.

A command-line option is an argument on the command line, which has the form:

-option

The elements of the command-switch-alist look like this:

(option . handler-function)

The CAR, option, is a string, the name of a command-line option (not including the initial hyphen). The handler-function is called to handle option, and receives the option name as its sole argument.

In some cases, the option is followed in the command line by an argument. In these cases, the handler-function can find all the remaining command-line arguments in the variable command-line-args-left (see below). (The entire list of command-line arguments is in command-line-args.)

The command-line arguments are parsed by the command-line-1 function in the startup.el file. See also Command Line Arguments for Emacs Invocation in The GNU Emacs Manual.

Variable: command-line-args

The value of this variable is the list of command-line arguments passed to Emacs.

Variable: command-line-args-left

The value of this variable is the list of command-line arguments that have not yet been processed.

Variable: command-line-functions

This variable’s value is a list of functions for handling an unrecognized command-line argument. Each time the next argument to be processed has no special meaning, the functions in this list are called, in order of appearance, until one of them returns a non-nil value.

These functions are called with no arguments. They can access the command-line argument under consideration through the variable argi, which is bound temporarily at this point. The remaining arguments (not including the current one) are in the variable command-line-args-left.

When a function recognizes and processes the argument in argi, it should return a non-nil value to say it has dealt with that argument. If it has also dealt with some of the following arguments, it can indicate that by deleting them from command-line-args-left.

If all of these functions return nil, then the argument is treated as a file name to visit.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.2 Getting Out of Emacs

There are two ways to get out of Emacs: you can kill the Emacs job, which exits permanently, or you can suspend it, which permits you to reenter the Emacs process later. (In a graphical environment, you can of course simply switch to another application without doing anything special to Emacs, then switch back to Emacs when you want.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.2.1 Killing Emacs

Killing Emacs means ending the execution of the Emacs process. If you started Emacs from a terminal, the parent process normally resumes control. The low-level primitive for killing Emacs is kill-emacs.

Command: kill-emacs &optional exit-data

This command calls the hook kill-emacs-hook, then exits the Emacs process and kills it.

If exit-data is an integer, that is used as the exit status of the Emacs process. (This is useful primarily in batch operation; see Batch Mode.)

If exit-data is a string, its contents are stuffed into the terminal input buffer so that the shell (or whatever program next reads input) can read them.

The kill-emacs function is normally called via the higher-level command C-x C-c (save-buffers-kill-terminal). See Exiting in The GNU Emacs Manual. It is also called automatically if Emacs receives a SIGTERM or SIGHUP operating system signal (e.g., when the controlling terminal is disconnected), or if it receives a SIGINT signal while running in batch mode (see section Batch Mode).

Variable: kill-emacs-hook

This normal hook is run by kill-emacs, before it kills Emacs.

Because kill-emacs can be called in situations where user interaction is impossible (e.g., when the terminal is disconnected), functions on this hook should not attempt to interact with the user. If you want to interact with the user when Emacs is shutting down, use kill-emacs-query-functions, described below.

When Emacs is killed, all the information in the Emacs process, aside from files that have been saved, is lost. Because killing Emacs inadvertently can lose a lot of work, the save-buffers-kill-terminal command queries for confirmation if you have buffers that need saving or subprocesses that are running. It also runs the abnormal hook kill-emacs-query-functions:

Variable: kill-emacs-query-functions

When save-buffers-kill-terminal is killing Emacs, it calls the functions in this hook, after asking the standard questions and before calling kill-emacs. The functions are called in order of appearance, with no arguments. Each function can ask for additional confirmation from the user. If any of them returns nil, save-buffers-kill-emacs does not kill Emacs, and does not run the remaining functions in this hook. Calling kill-emacs directly does not run this hook.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.2.2 Suspending Emacs

On text terminals, it is possible to suspend Emacs, which means stopping Emacs temporarily and returning control to its superior process, which is usually the shell. This allows you to resume editing later in the same Emacs process, with the same buffers, the same kill ring, the same undo history, and so on. To resume Emacs, use the appropriate command in the parent shell—most likely fg.

Suspending works only on a terminal device from which the Emacs session was started. We call that device the controlling terminal of the session. Suspending is not allowed if the controlling terminal is a graphical terminal. Suspending is usually not relevant in graphical environments, since you can simply switch to another application without doing anything special to Emacs.

Some operating systems (those without SIGTSTP, or MS-DOS) do not support suspension of jobs; on these systems, “suspension” actually creates a new shell temporarily as a subprocess of Emacs. Then you would exit the shell to return to Emacs.

Command: suspend-emacs &optional string

This function stops Emacs and returns control to the superior process. If and when the superior process resumes Emacs, suspend-emacs returns nil to its caller in Lisp.

This function works only on the controlling terminal of the Emacs session; to relinquish control of other tty devices, use suspend-tty (see below). If the Emacs session uses more than one terminal, you must delete the frames on all the other terminals before suspending Emacs, or this function signals an error. See section Multiple Terminals.

If string is non-nil, its characters are sent to Emacs’s superior shell, to be read as terminal input. The characters in string are not echoed by the superior shell; only the results appear.

Before suspending, suspend-emacs runs the normal hook suspend-hook. After the user resumes Emacs, suspend-emacs runs the normal hook suspend-resume-hook. See section Hooks.

The next redisplay after resumption will redraw the entire screen, unless the variable no-redraw-on-reenter is non-nil. See section Refreshing the Screen.

Here is an example of how you could use these hooks:

(add-hook 'suspend-hook
          (lambda () (or (y-or-n-p "Really suspend? ")
                         (error "Suspend canceled"))))
(add-hook 'suspend-resume-hook (lambda () (message "Resumed!")
                                 (sit-for 2)))

Here is what you would see upon evaluating (suspend-emacs "pwd"):

---------- Buffer: Minibuffer ----------
Really suspend? y
---------- Buffer: Minibuffer ----------

---------- Parent Shell ----------
bash$ /home/username
bash$ fg

---------- Echo Area ----------
Resumed!

Note that ‘pwd’ is not echoed after Emacs is suspended. But it is read and executed by the shell.

Variable: suspend-hook

This variable is a normal hook that Emacs runs before suspending.

Variable: suspend-resume-hook

This variable is a normal hook that Emacs runs on resuming after a suspension.

Function: suspend-tty &optional tty

If tty specifies a terminal device used by Emacs, this function relinquishes the device and restores it to its prior state. Frames that used the device continue to exist, but are not updated and Emacs doesn’t read input from them. tty can be a terminal object, a frame (meaning the terminal for that frame), or nil (meaning the terminal for the selected frame). See section Multiple Terminals.

If tty is already suspended, this function does nothing.

This function runs the hook suspend-tty-functions, passing the terminal object as an argument to each function.

Function: resume-tty &optional tty

This function resumes the previously suspended terminal device tty; where tty has the same possible values as it does for suspend-tty.

This function reopens the terminal device, re-initializes it, and redraws it with that terminal’s selected frame. It then runs the hook resume-tty-functions, passing the terminal object as an argument to each function.

If the same device is already used by another Emacs terminal, this function signals an error. If tty is not suspended, this function does nothing.

Function: controlling-tty-p &optional tty

This function returns non-nil if tty is the controlling terminal of the Emacs session; tty can be a terminal object, a frame (meaning the terminal for that frame), or nil (meaning the terminal for the selected frame).

Command: suspend-frame

This command suspends a frame. For GUI frames, it calls iconify-frame (see section Visibility of Frames); for frames on text terminals, it calls either suspend-emacs or suspend-tty, depending on whether the frame is displayed on the controlling terminal device or not.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.3 Operating System Environment

Emacs provides access to variables in the operating system environment through various functions. These variables include the name of the system, the user’s UID, and so on.

Variable: system-configuration

This variable holds the standard GNU configuration name for the hardware/software configuration of your system, as a string. For example, a typical value for a 64-bit GNU/Linux system is ‘"x86_64-unknown-linux-gnu"’.

Variable: system-type

The value of this variable is a symbol indicating the type of operating system Emacs is running on. The possible values are:

aix

IBM’s AIX.

berkeley-unix

Berkeley BSD and its variants.

cygwin

Cygwin, a Posix layer on top of MS-Windows.

darwin

Darwin (Mac OS X).

gnu

The GNU system (using the GNU kernel, which consists of the HURD and Mach).

gnu/linux

A GNU/Linux system—that is, a variant GNU system, using the Linux kernel. (These systems are the ones people often call “Linux”, but actually Linux is just the kernel, not the whole system.)

gnu/kfreebsd

A GNU (glibc-based) system with a FreeBSD kernel.

hpux

Hewlett-Packard HPUX operating system.

irix

Silicon Graphics Irix system.

ms-dos

Microsoft’s DOS. Emacs compiled with DJGPP for MS-DOS binds system-type to ms-dos even when you run it on MS-Windows.

usg-unix-v

AT&T Unix System V.

windows-nt

Microsoft Windows NT, 9X and later. The value of system-type is always windows-nt, e.g., even on Windows 7.

We do not wish to add new symbols to make finer distinctions unless it is absolutely necessary! In fact, we hope to eliminate some of these alternatives in the future. If you need to make a finer distinction than system-type allows for, you can test system-configuration, e.g., against a regexp.

Function: system-name

This function returns the name of the machine you are running on, as a string.

The symbol system-name is a variable as well as a function. In fact, the function returns whatever value the variable system-name currently holds. Thus, you can set the variable system-name in case Emacs is confused about the name of your system. The variable is also useful for constructing frame titles (see section Frame Titles).

User Option: mail-host-address

If this variable is non-nil, it is used instead of system-name for purposes of generating email addresses. For example, it is used when constructing the default value of user-mail-address. See section User Identification. (Since this is done when Emacs starts up, the value actually used is the one saved when Emacs was dumped. See section Building Emacs.)

Command: getenv var &optional frame

This function returns the value of the environment variable var, as a string. var should be a string. If var is undefined in the environment, getenv returns nil. It returns ‘""’ if var is set but null. Within Emacs, a list of environment variables and their values is kept in the variable process-environment.

(getenv "USER")
     ⇒ "lewis"

The shell command printenv prints all or part of the environment:

bash$ printenv
PATH=/usr/local/bin:/usr/bin:/bin
USER=lewis
TERM=xterm
SHELL=/bin/bash
HOME=/home/lewis
Command: setenv variable &optional value substitute

This command sets the value of the environment variable named variable to value. variable should be a string. Internally, Emacs Lisp can handle any string. However, normally variable should be a valid shell identifier, that is, a sequence of letters, digits and underscores, starting with a letter or underscore. Otherwise, errors may occur if subprocesses of Emacs try to access the value of variable. If value is omitted or nil (or, interactively, with a prefix argument), setenv removes variable from the environment. Otherwise, value should be a string.

If the optional argument substitute is non-nil, Emacs calls the function substitute-env-vars to expand any environment variables in value.

setenv works by modifying process-environment; binding that variable with let is also reasonable practice.

setenv returns the new value of variable, or nil if it removed variable from the environment.

Variable: process-environment

This variable is a list of strings, each describing one environment variable. The functions getenv and setenv work by means of this variable.

process-environment
⇒ ("PATH=/usr/local/bin:/usr/bin:/bin"
    "USER=lewis"
    "TERM=xterm"
    "SHELL=/bin/bash"
    "HOME=/home/lewis"
    …)

If process-environment contains “duplicate” elements that specify the same environment variable, the first of these elements specifies the variable, and the other “duplicates” are ignored.

Variable: initial-environment

This variable holds the list of environment variables Emacs inherited from its parent process when Emacs started.

Variable: path-separator

This variable holds a string that says which character separates directories in a search path (as found in an environment variable). Its value is ":" for Unix and GNU systems, and ";" for MS systems.

Function: parse-colon-path path

This function takes a search path string such as the value of the PATH environment variable, and splits it at the separators, returning a list of directory names. nil in this list means the current directory. Although the function’s name says “colon”, it actually uses the value of path-separator.

(parse-colon-path ":/foo:/bar")
     ⇒ (nil "/foo/" "/bar/")
Variable: invocation-name

This variable holds the program name under which Emacs was invoked. The value is a string, and does not include a directory name.

Variable: invocation-directory

This variable holds the directory from which the Emacs executable was invoked, or nil if that directory cannot be determined.

Variable: installation-directory

If non-nil, this is a directory within which to look for the lib-src and etc subdirectories. In an installed Emacs, it is normally nil. It is non-nil when Emacs can’t find those directories in their standard installed locations, but can find them in a directory related somehow to the one containing the Emacs executable (i.e., invocation-directory).

Function: load-average &optional use-float

This function returns the current 1-minute, 5-minute, and 15-minute system load averages, in a list. The load average indicates the number of processes trying to run on the system.

By default, the values are integers that are 100 times the system load averages, but if use-float is non-nil, then they are returned as floating-point numbers without multiplying by 100.

If it is impossible to obtain the load average, this function signals an error. On some platforms, access to load averages requires installing Emacs as setuid or setgid so that it can read kernel information, and that usually isn’t advisable.

If the 1-minute load average is available, but the 5- or 15-minute averages are not, this function returns a shortened list containing the available averages.

(load-average)
     ⇒ (169 48 36)
(load-average t)
     ⇒ (1.69 0.48 0.36)

The shell command uptime returns similar information.

Function: emacs-pid

This function returns the process ID of the Emacs process, as an integer.

Variable: tty-erase-char

This variable holds the erase character that was selected in the system’s terminal driver, before Emacs was started.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.4 User Identification

Variable: init-file-user

This variable says which user’s init files should be used by Emacs—or nil if none. "" stands for the user who originally logged in. The value reflects command-line options such as ‘-q’ or ‘-u user’.

Lisp packages that load files of customizations, or any other sort of user profile, should obey this variable in deciding where to find it. They should load the profile of the user name found in this variable. If init-file-user is nil, meaning that the ‘-q’, ‘-Q’, or ‘-batch’ option was used, then Lisp packages should not load any customization files or user profile.

User Option: user-mail-address

This holds the nominal email address of the user who is using Emacs. Emacs normally sets this variable to a default value after reading your init files, but not if you have already set it. So you can set the variable to some other value in your init file if you do not want to use the default value.

Function: user-login-name &optional uid

This function returns the name under which the user is logged in. It uses the environment variables LOGNAME or USER if either is set. Otherwise, the value is based on the effective UID, not the real UID.

If you specify uid (a number), the result is the user name that corresponds to uid, or nil if there is no such user.

Function: user-real-login-name

This function returns the user name corresponding to Emacs’s real UID. This ignores the effective UID, and the environment variables LOGNAME and USER.

Function: user-full-name &optional uid

This function returns the full name of the logged-in user—or the value of the environment variable NAME, if that is set.

If the Emacs process’s user-id does not correspond to any known user (and provided NAME is not set), the result is "unknown".

If uid is non-nil, then it should be a number (a user-id) or a string (a login name). Then user-full-name returns the full name corresponding to that user-id or login name. If you specify a user-id or login name that isn’t defined, it returns nil.

The symbols user-login-name, user-real-login-name and user-full-name are variables as well as functions. The functions return the same values that the variables hold. These variables allow you to “fake out” Emacs by telling the functions what to return. The variables are also useful for constructing frame titles (see section Frame Titles).

Function: user-real-uid

This function returns the real UID of the user. The value may be floating point, in the (unlikely) event that the UID is too large to fit in a Lisp integer.

Function: user-uid

This function returns the effective UID of the user. The value may be floating point.

Function: group-gid

This function returns the effective GID of the Emacs process. The value may be floating point.

Function: group-real-gid

This function returns the real GID of the Emacs process. The value may be floating point.

Function: system-users

This function returns a list of strings, listing the user names on the system. If Emacs cannot retrieve this information, the return value is a list containing just the value of user-real-login-name.

Function: system-groups

This function returns a list of strings, listing the names of user groups on the system. If Emacs cannot retrieve this information, the return value is nil.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.5 Time of Day

This section explains how to determine the current time and time zone.

Most of these functions represent time as a list of either four integers, (sec-high sec-low microsec picosec), or of three integers, (sec-high sec-low microsec), or of two integers, (sec-high sec-low). The integers sec-high and sec-low give the high and low bits of an integer number of seconds. This integer, high * 2**16 + low, is the number of seconds from the epoch (0:00 January 1, 1970 UTC) to the specified time. The third list element microsec, if present, gives the number of microseconds from the start of that second to the specified time. Similarly, the fourth list element picosec, if present, gives the number of picoseconds from the start of that microsecond to the specified time.

The return value of current-time represents time using four integers, as do the timestamps in the return value of file-attributes (see Definition of file-attributes). In function arguments, e.g., the time-value argument to current-time-string, two-, three-, and four-integer lists are accepted. You can convert times from the list representation into standard human-readable strings using current-time-string, or to other forms using the decode-time and format-time-string functions documented in the following sections.

Function: current-time-string &optional time-value

This function returns the current time and date as a human-readable string. The format does not vary for the initial part of the string, which contains the day of week, month, day of month, and time of day in that order: the number of characters used for these fields is always the same, so you can reliably use substring to extract them. You should count characters from the beginning of the string rather than from the end, as the year might not have exactly four digits, and additional information may some day be added at the end.

The argument time-value, if given, specifies a time to format (represented as a list of integers), instead of the current time.

(current-time-string)
     ⇒ "Wed Oct 14 22:21:05 1987"
Function: current-time

This function returns the current time, represented as a list of four integers (sec-high sec-low microsec picosec). These integers have trailing zeros on systems that return time with lower resolutions. On all current machines picosec is a multiple of 1000, but this may change as higher-resolution clocks become available.

Function: float-time &optional time-value

This function returns the current time as a floating-point number of seconds since the epoch. The optional argument time-value, if given, specifies a time (represented as a list of integers) to convert instead of the current time.

Warning: Since the result is floating point, it may not be exact. Do not use this function if precise time stamps are required.

Function: current-time-zone &optional time-value

This function returns a list describing the time zone that the user is in.

The value has the form (offset name). Here offset is an integer giving the number of seconds ahead of UTC (east of Greenwich). A negative value means west of Greenwich. The second element, name, is a string giving the name of the time zone. Both elements change when daylight saving time begins or ends; if the user has specified a time zone that does not use a seasonal time adjustment, then the value is constant through time.

If the operating system doesn’t supply all the information necessary to compute the value, the unknown elements of the list are nil.

The argument time-value, if given, specifies a time (represented as a list of integers) to analyze instead of the current time.

The current time zone is determined by the TZ environment variable. See section Operating System Environment. For example, you can tell Emacs to use universal time with (setenv "TZ" "UTC0"). If TZ is not in the environment, Emacs uses a platform-dependent default time zone.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.6 Time Conversion

These functions convert time values (lists of two to four integers, as explained in the previous section) into calendrical information and vice versa.

Many 32-bit operating systems are limited to time values containing 32 bits of information; these systems typically handle only the times from 1901-12-13 20:45:52 UTC through 2038-01-19 03:14:07 UTC. However, 64-bit and some 32-bit operating systems have larger time values, and can represent times far in the past or future.

Time conversion functions always use the Gregorian calendar, even for dates before the Gregorian calendar was introduced. Year numbers count the number of years since the year 1 B.C., and do not skip zero as traditional Gregorian years do; for example, the year number -37 represents the Gregorian year 38 B.C.

Function: decode-time &optional time

This function converts a time value into calendrical information. If you don’t specify time, it decodes the current time. The return value is a list of nine elements, as follows:

(seconds minutes hour day month year dow dst zone)

Here is what the elements mean:

seconds

The number of seconds past the minute, as an integer between 0 and 59. On some operating systems, this is 60 for leap seconds.

minutes

The number of minutes past the hour, as an integer between 0 and 59.

hour

The hour of the day, as an integer between 0 and 23.

day

The day of the month, as an integer between 1 and 31.

month

The month of the year, as an integer between 1 and 12.

year

The year, an integer typically greater than 1900.

dow

The day of week, as an integer between 0 and 6, where 0 stands for Sunday.

dst

t if daylight saving time is effect, otherwise nil.

zone

An integer indicating the time zone, as the number of seconds east of Greenwich.

Common Lisp Note: Common Lisp has different meanings for dow and zone.

Function: encode-time seconds minutes hour day month year &optional zone

This function is the inverse of decode-time. It converts seven items of calendrical data into a time value. For the meanings of the arguments, see the table above under decode-time.

Year numbers less than 100 are not treated specially. If you want them to stand for years above 1900, or years above 2000, you must alter them yourself before you call encode-time.

The optional argument zone defaults to the current time zone and its daylight saving time rules. If specified, it can be either a list (as you would get from current-time-zone), a string as in the TZ environment variable, t for Universal Time, or an integer (as you would get from decode-time). The specified zone is used without any further alteration for daylight saving time.

If you pass more than seven arguments to encode-time, the first six are used as seconds through year, the last argument is used as zone, and the arguments in between are ignored. This feature makes it possible to use the elements of a list returned by decode-time as the arguments to encode-time, like this:

(apply 'encode-time (decode-time …))

You can perform simple date arithmetic by using out-of-range values for the seconds, minutes, hour, day, and month arguments; for example, day 0 means the day preceding the given month.

The operating system puts limits on the range of possible time values; if you try to encode a time that is out of range, an error results. For instance, years before 1970 do not work on some systems; on others, years as early as 1901 do work.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.7 Parsing and Formatting Times

These functions convert time values to text in a string, and vice versa. Time values are lists of two to four integers (see section Time of Day).

Function: date-to-time string

This function parses the time-string string and returns the corresponding time value.

Function: format-time-string format-string &optional time universal

This function converts time (or the current time, if time is omitted) to a string according to format-string. The argument format-string may contain ‘%’-sequences which say to substitute parts of the time. Here is a table of what the ‘%’-sequences mean:

%a

This stands for the abbreviated name of the day of week.

%A

This stands for the full name of the day of week.

%b

This stands for the abbreviated name of the month.

%B

This stands for the full name of the month.

%c

This is a synonym for ‘%x %X’.

%C

This has a locale-specific meaning. In the default locale (named C), it is equivalent to ‘%A, %B %e, %Y’.

%d

This stands for the day of month, zero-padded.

%D

This is a synonym for ‘%m/%d/%y’.

%e

This stands for the day of month, blank-padded.

%h

This is a synonym for ‘%b’.

%H

This stands for the hour (00–23).

%I

This stands for the hour (01–12).

%j

This stands for the day of the year (001–366).

%k

This stands for the hour (0–23), blank padded.

%l

This stands for the hour (1–12), blank padded.

%m

This stands for the month (01–12).

%M

This stands for the minute (00–59).

%n

This stands for a newline.

%N

This stands for the nanoseconds (000000000–999999999). To ask for fewer digits, use ‘%3N’ for milliseconds, ‘%6N’ for microseconds, etc. Any excess digits are discarded, without rounding.

%p

This stands for ‘AM’ or ‘PM’, as appropriate.

%r

This is a synonym for ‘%I:%M:%S %p’.

%R

This is a synonym for ‘%H:%M’.

%S

This stands for the seconds (00–59).

%t

This stands for a tab character.

%T

This is a synonym for ‘%H:%M:%S’.

%U

This stands for the week of the year (01–52), assuming that weeks start on Sunday.

%w

This stands for the numeric day of week (0–6). Sunday is day 0.

%W

This stands for the week of the year (01–52), assuming that weeks start on Monday.

%x

This has a locale-specific meaning. In the default locale (named ‘C’), it is equivalent to ‘%D’.

%X

This has a locale-specific meaning. In the default locale (named ‘C’), it is equivalent to ‘%T’.

%y

This stands for the year without century (00–99).

%Y

This stands for the year with century.

%Z

This stands for the time zone abbreviation (e.g., ‘EST’).

%z

This stands for the time zone numerical offset (e.g., ‘-0500’).

You can also specify the field width and type of padding for any of these ‘%’-sequences. This works as in printf: you write the field width as digits in the middle of a ‘%’-sequences. If you start the field width with ‘0’, it means to pad with zeros. If you start the field width with ‘_’, it means to pad with spaces.

For example, ‘%S’ specifies the number of seconds since the minute; ‘%03S’ means to pad this with zeros to 3 positions, ‘%_3S’ to pad with spaces to 3 positions. Plain ‘%3S’ pads with zeros, because that is how ‘%S’ normally pads to two positions.

The characters ‘E’ and ‘O’ act as modifiers when used between ‘%’ and one of the letters in the table above. ‘E’ specifies using the current locale’s “alternative” version of the date and time. In a Japanese locale, for example, %Ex might yield a date format based on the Japanese Emperors’ reigns. ‘E’ is allowed in ‘%Ec’, ‘%EC’, ‘%Ex’, ‘%EX’, ‘%Ey’, and ‘%EY’.

O’ means to use the current locale’s “alternative” representation of numbers, instead of the ordinary decimal digits. This is allowed with most letters, all the ones that output numbers.

If universal is non-nil, that means to describe the time as Universal Time; nil means describe it using what Emacs believes is the local time zone (see current-time-zone).

This function uses the C library function strftime (see Formatting Calendar Time in The GNU C Library Reference Manual) to do most of the work. In order to communicate with that function, it first encodes its argument using the coding system specified by locale-coding-system (see section Locales); after strftime returns the resulting string, format-time-string decodes the string using that same coding system.

Function: seconds-to-time seconds

This function converts seconds, the number of seconds since the epoch, to a time value and returns that. To convert back, use float-time (see section Time of Day).

Function: format-seconds format-string seconds

This function converts its argument seconds into a string of years, days, hours, etc., according to format-string. The argument format-string may contain ‘%’-sequences which control the conversion. Here is a table of what the ‘%’-sequences mean:

%y
%Y

The integer number of 365-day years.

%d
%D

The integer number of days.

%h
%H

The integer number of hours.

%m
%M

The integer number of minutes.

%s
%S

The integer number of seconds.

%z

Non-printing control flag. When it is used, other specifiers must be given in the order of decreasing size, i.e., years before days, hours before minutes, etc. Nothing will be produced in the result string to the left of ‘%z’ until the first non-zero conversion is encountered. For example, the default format used by emacs-uptime (see section emacs-uptime) "%Y, %D, %H, %M, %z%S" means that the number of seconds will always be produced, but years, days, hours, and minutes will only be shown if they are non-zero.

%%

Produces a literal ‘%’.

Upper-case format sequences produce the units in addition to the numbers, lower-case formats produce only the numbers.

You can also specify the field width by following the ‘%’ with a number; shorter numbers will be padded with blanks. An optional period before the width requests zero-padding instead. For example, "%.3Y" might produce "004 years".

Warning: This function works only with values of seconds that don’t exceed most-positive-fixnum (see section most-positive-fixnum).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.8 Processor Run time

Emacs provides several functions and primitives that return time, both elapsed and processor time, used by the Emacs process.

Command: emacs-uptime &optional format

This function returns a string representing the Emacs uptime—the elapsed wall-clock time this instance of Emacs is running. The string is formatted by format-seconds according to the optional argument format. For the available format descriptors, see format-seconds. If format is nil or omitted, it defaults to "%Y, %D, %H, %M, %z%S".

When called interactively, it prints the uptime in the echo area.

Function: get-internal-run-time

This function returns the processor run time used by Emacs as a list of four integers: (high low microsec picosec), using the same format as current-time (see section Time of Day).

Note that the time returned by this function excludes the time Emacs was not using the processor, and if the Emacs process has several threads, the returned value is the sum of the processor times used up by all Emacs threads.

If the system doesn’t provide a way to determine the processor run time, get-internal-run-time returns the same time as current-time.

Command: emacs-init-time

This function returns the duration of the Emacs initialization (see section Summary: Sequence of Actions at Startup) in seconds, as a string. When called interactively, it prints the duration in the echo area.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.9 Time Calculations

These functions perform calendrical computations using time values (the kind of list that current-time returns).

Function: time-less-p t1 t2

This returns t if time value t1 is less than time value t2.

Function: time-subtract t1 t2

This returns the time difference t1 - t2 between two time values, in the same format as a time value.

Function: time-add t1 t2

This returns the sum of two time values, one of which ought to represent a time difference rather than a point in time. Here is how to add a number of seconds to a time value:

(time-add time (seconds-to-time seconds))
Function: time-to-days time

This function returns the number of days between the beginning of year 1 and time.

Function: time-to-day-in-year time

This returns the day number within the year corresponding to time.

Function: date-leap-year-p year

This function returns t if year is a leap year.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.10 Timers for Delayed Execution

You can set up a timer to call a function at a specified future time or after a certain length of idleness.

Emacs cannot run timers at any arbitrary point in a Lisp program; it can run them only when Emacs could accept output from a subprocess: namely, while waiting or inside certain primitive functions such as sit-for or read-event which can wait. Therefore, a timer’s execution may be delayed if Emacs is busy. However, the time of execution is very precise if Emacs is idle.

Emacs binds inhibit-quit to t before calling the timer function, because quitting out of many timer functions can leave things in an inconsistent state. This is normally unproblematical because most timer functions don’t do a lot of work. Indeed, for a timer to call a function that takes substantial time to run is likely to be annoying. If a timer function needs to allow quitting, it should use with-local-quit (see section Quitting). For example, if a timer function calls accept-process-output to receive output from an external process, that call should be wrapped inside with-local-quit, to ensure that C-g works if the external process hangs.

It is usually a bad idea for timer functions to alter buffer contents. When they do, they usually should call undo-boundary both before and after changing the buffer, to separate the timer’s changes from user commands’ changes and prevent a single undo entry from growing to be quite large.

Timer functions should also avoid calling functions that cause Emacs to wait, such as sit-for (see section Waiting for Elapsed Time or Input). This can lead to unpredictable effects, since other timers (or even the same timer) can run while waiting. If a timer function needs to perform an action after a certain time has elapsed, it can do this by scheduling a new timer.

If a timer function calls functions that can change the match data, it should save and restore the match data. See section Saving and Restoring the Match Data.

Command: run-at-time time repeat function &rest args

This sets up a timer that calls the function function with arguments args at time time. If repeat is a number (integer or floating point), the timer is scheduled to run again every repeat seconds after time. If repeat is nil, the timer runs only once.

time may specify an absolute or a relative time.

Absolute times may be specified using a string with a limited variety of formats, and are taken to be times today, even if already in the past. The recognized forms are ‘xxxx’, ‘x:xx’, or ‘xx:xx’ (military time), and ‘xxam’, ‘xxAM’, ‘xxpm’, ‘xxPM’, ‘xx:xxam’, ‘xx:xxAM’, ‘xx:xxpm’, or ‘xx:xxPM’. A period can be used instead of a colon to separate the hour and minute parts.

To specify a relative time as a string, use numbers followed by units. For example:

1 min

denotes 1 minute from now.

1 min 5 sec

denotes 65 seconds from now.

1 min 2 sec 3 hour 4 day 5 week 6 fortnight 7 month 8 year

denotes exactly 103 months, 123 days, and 10862 seconds from now.

For relative time values, Emacs considers a month to be exactly thirty days, and a year to be exactly 365.25 days.

Not all convenient formats are strings. If time is a number (integer or floating point), that specifies a relative time measured in seconds. The result of encode-time can also be used to specify an absolute value for time.

In most cases, repeat has no effect on when first call takes place—time alone specifies that. There is one exception: if time is t, then the timer runs whenever the time is a multiple of repeat seconds after the epoch. This is useful for functions like display-time.

The function run-at-time returns a timer value that identifies the particular scheduled future action. You can use this value to call cancel-timer (see below).

A repeating timer nominally ought to run every repeat seconds, but remember that any invocation of a timer can be late. Lateness of one repetition has no effect on the scheduled time of the next repetition. For instance, if Emacs is busy computing for long enough to cover three scheduled repetitions of the timer, and then starts to wait, it will immediately call the timer function three times in immediate succession (presuming no other timers trigger before or between them). If you want a timer to run again no less than n seconds after the last invocation, don’t use the repeat argument. Instead, the timer function should explicitly reschedule the timer.

User Option: timer-max-repeats

This variable’s value specifies the maximum number of times to repeat calling a timer function in a row, when many previously scheduled calls were unavoidably delayed.

Macro: with-timeout (seconds timeout-forms…) body…

Execute body, but give up after seconds seconds. If body finishes before the time is up, with-timeout returns the value of the last form in body. If, however, the execution of body is cut short by the timeout, then with-timeout executes all the timeout-forms and returns the value of the last of them.

This macro works by setting a timer to run after seconds seconds. If body finishes before that time, it cancels the timer. If the timer actually runs, it terminates execution of body, then executes timeout-forms.

Since timers can run within a Lisp program only when the program calls a primitive that can wait, with-timeout cannot stop executing body while it is in the midst of a computation—only when it calls one of those primitives. So use with-timeout only with a body that waits for input, not one that does a long computation.

The function y-or-n-p-with-timeout provides a simple way to use a timer to avoid waiting too long for an answer. See section Yes-or-No Queries.

Function: cancel-timer timer

This cancels the requested action for timer, which should be a timer—usually, one previously returned by run-at-time or run-with-idle-timer. This cancels the effect of that call to one of these functions; the arrival of the specified time will not cause anything special to happen.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.11 Idle Timers

Here is how to set up a timer that runs when Emacs is idle for a certain length of time. Aside from how to set them up, idle timers work just like ordinary timers.

Command: run-with-idle-timer secs repeat function &rest args

Set up a timer which runs the next time Emacs is idle for secs seconds. The value of secs may be a number or a value of the type returned by current-idle-time.

If repeat is nil, the timer runs just once, the first time Emacs remains idle for a long enough time. More often repeat is non-nil, which means to run the timer each time Emacs remains idle for secs seconds.

The function run-with-idle-timer returns a timer value which you can use in calling cancel-timer (see section Timers for Delayed Execution).

Emacs becomes idle when it starts waiting for user input, and it remains idle until the user provides some input. If a timer is set for five seconds of idleness, it runs approximately five seconds after Emacs first becomes idle. Even if repeat is non-nil, this timer will not run again as long as Emacs remains idle, because the duration of idleness will continue to increase and will not go down to five seconds again.

Emacs can do various things while idle: garbage collect, autosave or handle data from a subprocess. But these interludes during idleness do not interfere with idle timers, because they do not reset the clock of idleness to zero. An idle timer set for 600 seconds will run when ten minutes have elapsed since the last user command was finished, even if subprocess output has been accepted thousands of times within those ten minutes, and even if there have been garbage collections and autosaves.

When the user supplies input, Emacs becomes non-idle while executing the input. Then it becomes idle again, and all the idle timers that are set up to repeat will subsequently run another time, one by one.

Do not write an idle timer function containing a loop which does a certain amount of processing each time around, and exits when (input-pending-p) is non-nil. This approach seems very natural but has two problems:

Similarly, do not write an idle timer function that sets up another idle timer (including the same idle timer) with secs argument less than or equal to the current idleness time. Such a timer will run almost immediately, and continue running again and again, instead of waiting for the next time Emacs becomes idle. The correct approach is to reschedule with an appropriate increment of the current value of the idleness time, as described below.

Function: current-idle-time

If Emacs is idle, this function returns the length of time Emacs has been idle, as a list of four integers: (sec-high sec-low microsec picosec), using the same format as current-time (see section Time of Day).

When Emacs is not idle, current-idle-time returns nil. This is a convenient way to test whether Emacs is idle.

The main use of current-idle-time is when an idle timer function wants to “take a break” for a while. It can set up another idle timer to call the same function again, after a few seconds more idleness. Here’s an example:

(defvar my-resume-timer nil
  "Timer for `my-timer-function' to reschedule itself, or nil.")

(defun my-timer-function ()
  ;; If the user types a command while my-resume-timer
  ;; is active, the next time this function is called from
  ;; its main idle timer, deactivate my-resume-timer.
  (when my-resume-timer
    (cancel-timer my-resume-timer))
  ...do the work for a while...
  (when taking-a-break
    (setq my-resume-timer
          (run-with-idle-timer
            ;; Compute an idle time break-length
            ;; more than the current value.
            (time-add (current-idle-time)
                      (seconds-to-time break-length))
            nil
            'my-timer-function))))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.12 Terminal Input

This section describes functions and variables for recording or manipulating terminal input. See Emacs Display, for related functions.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.12.1 Input Modes

Function: set-input-mode interrupt flow meta &optional quit-char

This function sets the mode for reading keyboard input. If interrupt is non-nil, then Emacs uses input interrupts. If it is nil, then it uses CBREAK mode. The default setting is system-dependent. Some systems always use CBREAK mode regardless of what is specified.

When Emacs communicates directly with X, it ignores this argument and uses interrupts if that is the way it knows how to communicate.

If flow is non-nil, then Emacs uses XON/XOFF (C-q, C-s) flow control for output to the terminal. This has no effect except in CBREAK mode.

The argument meta controls support for input character codes above 127. If meta is t, Emacs converts characters with the 8th bit set into Meta characters. If meta is nil, Emacs disregards the 8th bit; this is necessary when the terminal uses it as a parity bit. If meta is neither t nor nil, Emacs uses all 8 bits of input unchanged. This is good for terminals that use 8-bit character sets.

If quit-char is non-nil, it specifies the character to use for quitting. Normally this character is C-g. See section Quitting.

The current-input-mode function returns the input mode settings Emacs is currently using.

Function: current-input-mode

This function returns the current mode for reading keyboard input. It returns a list, corresponding to the arguments of set-input-mode, of the form (interrupt flow meta quit) in which:

interrupt

is non-nil when Emacs is using interrupt-driven input. If nil, Emacs is using CBREAK mode.

flow

is non-nil if Emacs uses XON/XOFF (C-q, C-s) flow control for output to the terminal. This value is meaningful only when interrupt is nil.

meta

is t if Emacs treats the eighth bit of input characters as the meta bit; nil means Emacs clears the eighth bit of every input character; any other value means Emacs uses all eight bits as the basic character code.

quit

is the character Emacs currently uses for quitting, usually C-g.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.12.2 Recording Input

Function: recent-keys

This function returns a vector containing the last 300 input events from the keyboard or mouse. All input events are included, whether or not they were used as parts of key sequences. Thus, you always get the last 300 input events, not counting events generated by keyboard macros. (These are excluded because they are less interesting for debugging; it should be enough to see the events that invoked the macros.)

A call to clear-this-command-keys (see section Information from the Command Loop) causes this function to return an empty vector immediately afterward.

Command: open-dribble-file filename

This function opens a dribble file named filename. When a dribble file is open, each input event from the keyboard or mouse (but not those from keyboard macros) is written in that file. A non-character event is expressed using its printed representation surrounded by ‘<…>’. Be aware that sensitive information (such as passwords) may end up recorded in the dribble file.

You close the dribble file by calling this function with an argument of nil.

See also the open-termscript function (see section Terminal Output).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.13 Terminal Output

The terminal output functions send output to a text terminal, or keep track of output sent to the terminal. The variable baud-rate tells you what Emacs thinks is the output speed of the terminal.

User Option: baud-rate

This variable’s value is the output speed of the terminal, as far as Emacs knows. Setting this variable does not change the speed of actual data transmission, but the value is used for calculations such as padding.

It also affects decisions about whether to scroll part of the screen or repaint on text terminals. See section Forcing Redisplay, for the corresponding functionality on graphical terminals.

The value is measured in baud.

If you are running across a network, and different parts of the network work at different baud rates, the value returned by Emacs may be different from the value used by your local terminal. Some network protocols communicate the local terminal speed to the remote machine, so that Emacs and other programs can get the proper value, but others do not. If Emacs has the wrong value, it makes decisions that are less than optimal. To fix the problem, set baud-rate.

Function: send-string-to-terminal string &optional terminal

This function sends string to terminal without alteration. Control characters in string have terminal-dependent effects. This function operates only on text terminals. terminal may be a terminal object, a frame, or nil for the selected frame’s terminal. In batch mode, string is sent to stdout when terminal is nil.

One use of this function is to define function keys on terminals that have downloadable function key definitions. For example, this is how (on certain terminals) to define function key 4 to move forward four characters (by transmitting the characters C-u C-f to the computer):

(send-string-to-terminal "\eF4\^U\^F")
     ⇒ nil
Command: open-termscript filename

This function is used to open a termscript file that will record all the characters sent by Emacs to the terminal. It returns nil. Termscript files are useful for investigating problems where Emacs garbles the screen, problems that are due to incorrect Termcap entries or to undesirable settings of terminal options more often than to actual Emacs bugs. Once you are certain which characters were actually output, you can determine reliably whether they correspond to the Termcap specifications in use.

(open-termscript "../junk/termscript")
     ⇒ nil

You close the termscript file by calling this function with an argument of nil.

See also open-dribble-file in Recording Input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.14 Sound Output

To play sound using Emacs, use the function play-sound. Only certain systems are supported; if you call play-sound on a system which cannot really do the job, it gives an error.

The sound must be stored as a file in RIFF-WAVE format (‘.wav’) or Sun Audio format (‘.au’).

Function: play-sound sound

This function plays a specified sound. The argument, sound, has the form (sound properties...), where the properties consist of alternating keywords (particular symbols recognized specially) and values corresponding to them.

Here is a table of the keywords that are currently meaningful in sound, and their meanings:

:file file

This specifies the file containing the sound to play. If the file name is not absolute, it is expanded against the directory data-directory.

:data data

This specifies the sound to play without need to refer to a file. The value, data, should be a string containing the same bytes as a sound file. We recommend using a unibyte string.

:volume volume

This specifies how loud to play the sound. It should be a number in the range of 0 to 1. The default is to use whatever volume has been specified before.

:device device

This specifies the system device on which to play the sound, as a string. The default device is system-dependent.

Before actually playing the sound, play-sound calls the functions in the list play-sound-functions. Each function is called with one argument, sound.

Command: play-sound-file file &optional volume device

This function is an alternative interface to playing a sound file specifying an optional volume and device.

Variable: play-sound-functions

A list of functions to be called before playing a sound. Each function is called with one argument, a property list that describes the sound.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.15 Operating on X11 Keysyms

To define system-specific X11 keysyms, set the variable system-key-alist.

Variable: system-key-alist

This variable’s value should be an alist with one element for each system-specific keysym. Each element has the form (code . symbol), where code is the numeric keysym code (not including the “vendor specific” bit, -2**28), and symbol is the name for the function key.

For example (168 . mute-acute) defines a system-specific key (used by HP X servers) whose numeric code is -2**28 + 168.

It is not crucial to exclude from the alist the keysyms of other X servers; those do no harm, as long as they don’t conflict with the ones used by the X server actually in use.

The variable is always local to the current terminal, and cannot be buffer-local. See section Multiple Terminals.

You can specify which keysyms Emacs should use for the Meta, Alt, Hyper, and Super modifiers by setting these variables:

Variable: x-alt-keysym
Variable: x-meta-keysym
Variable: x-hyper-keysym
Variable: x-super-keysym

The name of the keysym that should stand for the Alt modifier (respectively, for Meta, Hyper, and Super). For example, here is how to swap the Meta and Alt modifiers within Emacs:

(setq x-alt-keysym 'meta)
(setq x-meta-keysym 'alt)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.16 Batch Mode

The command-line option ‘-batch’ causes Emacs to run noninteractively. In this mode, Emacs does not read commands from the terminal, it does not alter the terminal modes, and it does not expect to be outputting to an erasable screen. The idea is that you specify Lisp programs to run; when they are finished, Emacs should exit. The way to specify the programs to run is with ‘-l file’, which loads the library named file, or ‘-f function’, which calls function with no arguments, or ‘--eval form’.

Any Lisp program output that would normally go to the echo area, either using message, or using prin1, etc., with t as the stream, goes instead to Emacs’s standard error descriptor when in batch mode. Similarly, input that would normally come from the minibuffer is read from the standard input descriptor. Thus, Emacs behaves much like a noninteractive application program. (The echo area output that Emacs itself normally generates, such as command echoing, is suppressed entirely.)

Variable: noninteractive

This variable is non-nil when Emacs is running in batch mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.17 Session Management

Emacs supports the X Session Management Protocol, which is used to suspend and restart applications. In the X Window System, a program called the session manager is responsible for keeping track of the applications that are running. When the X server shuts down, the session manager asks applications to save their state, and delays the actual shutdown until they respond. An application can also cancel the shutdown.

When the session manager restarts a suspended session, it directs these applications to individually reload their saved state. It does this by specifying a special command-line argument that says what saved session to restore. For Emacs, this argument is ‘--smid session’.

Variable: emacs-save-session-functions

Emacs supports saving state via a hook called emacs-save-session-functions. Emacs runs this hook when the session manager tells it that the window system is shutting down. The functions are called with no arguments, and with the current buffer set to a temporary buffer. Each function can use insert to add Lisp code to this buffer. At the end, Emacs saves the buffer in a file, called the session file.

Subsequently, when the session manager restarts Emacs, it loads the session file automatically (see section Loading). This is performed by a function named emacs-session-restore, which is called during startup. See section Summary: Sequence of Actions at Startup.

If a function in emacs-save-session-functions returns non-nil, Emacs tells the session manager to cancel the shutdown.

Here is an example that just inserts some text into *scratch* when Emacs is restarted by the session manager.

(add-hook 'emacs-save-session-functions 'save-yourself-test)

(defun save-yourself-test ()
  (insert "(save-current-buffer
  (switch-to-buffer \"*scratch*\")
  (insert \"I am restored\"))")
  nil)

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.18 Desktop Notifications

Emacs is able to send notifications on systems that support the freedesktop.org Desktop Notifications Specification. In order to use this functionality, Emacs must have been compiled with D-Bus support, and the notifications library must be loaded. See D-Bus in D-Bus integration in Emacs.

Function: notifications-notify &rest params

This function sends a notification to the desktop via D-Bus, consisting of the parameters specified by the params arguments. These arguments should consist of alternating keyword and value pairs. The supported keywords and values are as follows:

:bus bus

The D-Bus bus. This argument is needed only if a bus other than :session shall be used.

:title title

The notification title.

:body text

The notification body text. Depending on the implementation of the notification server, the text could contain HTML markups, like ‘"<b>bold text</b>"’, hyperlinks, or images. Special HTML characters must be encoded, as ‘"Contact &lt;postmaster@localhost&gt;!"’.

:app-name name

The name of the application sending the notification. The default is notifications-application-name.

:replaces-id id

The notification id that this notification replaces. id must be the result of a previous notifications-notify call.

:app-icon icon-file

The file name of the notification icon. If set to nil, no icon is displayed. The default is notifications-application-icon.

:actions (key title key title ...)

A list of actions to be applied. key and title are both strings. The default action (usually invoked by clicking the notification) should have a key named ‘"default"’. The title can be anything, though implementations are free not to display it.

:timeout timeout

The timeout time in milliseconds since the display of the notification at which the notification should automatically close. If -1, the notification’s expiration time is dependent on the notification server’s settings, and may vary for the type of notification. If 0, the notification never expires. Default value is -1.

:urgency urgency

The urgency level. It can be low, normal, or critical.

:action-items

When this keyword is given, the title string of the actions is interpreted as icon name.

:category category

The type of notification this is, a string. See the Desktop Notifications Specification for a list of standard categories.

:desktop-entry filename

This specifies the name of the desktop filename representing the calling program, like ‘"emacs"’.

:image-data (width height rowstride has-alpha bits channels data)

This is a raw data image format that describes the width, height, rowstride, whether there is an alpha channel, bits per sample, channels and image data, respectively.

:image-path path

This is represented either as a URI (‘file://’ is the only URI schema supported right now) or a name in a freedesktop.org-compliant icon theme from ‘$XDG_DATA_DIRS/icons’.

:sound-file filename

The path to a sound file to play when the notification pops up.

:sound-name name

A themable named sound from the freedesktop.org sound naming specification from ‘$XDG_DATA_DIRS/sounds’, to play when the notification pops up. Similar to the icon name, only for sounds. An example would be ‘"message-new-instant"’.

:suppress-sound

Causes the server to suppress playing any sounds, if it has that ability.

:resident

When set the server will not automatically remove the notification when an action has been invoked. The notification will remain resident in the server until it is explicitly removed by the user or by the sender. This hint is likely only useful when the server has the :persistence capability.

:transient

When set the server will treat the notification as transient and by-pass the server’s persistence capability, if it should exist.

:x position
:y position

Specifies the X, Y location on the screen that the notification should point to. Both arguments must be used together.

:on-action function

Function to call when an action is invoked. The notification id and the key of the action are passed as arguments to the function.

:on-close function

Function to call when the notification has been closed by timeout or by the user. The function receive the notification id and the closing reason as arguments:

  • expired if the notification has expired
  • dismissed if the notification was dismissed by the user
  • close-notification if the notification was closed by a call to notifications-close-notification
  • undefined if the notification server hasn’t provided a reason

Which parameters are accepted by the notification server can be checked via notifications-get-capabilities.

This function returns a notification id, an integer, which can be used to manipulate the notification item with notifications-close-notification or the :replaces-id argument of another notifications-notify call. For example:

(defun my-on-action-function (id key)
  (message "Message %d, key \"%s\" pressed" id key))
     ⇒ my-on-action-function

(defun my-on-close-function (id reason)
  (message "Message %d, closed due to \"%s\"" id reason))
     ⇒ my-on-close-function

(notifications-notify
 :title "Title"
 :body "This is <b>important</b>."
 :actions '("Confirm" "I agree" "Refuse" "I disagree")
 :on-action 'my-on-action-function
 :on-close 'my-on-close-function)
     ⇒ 22

A message window opens on the desktop.  Press "I agree"
     ⇒ Message 22, key "Confirm" pressed
        Message 22, closed due to "dismissed"
Function: notifications-close-notification id &optional bus

This function closes a notification with identifier id. bus can be a string denoting a D-Bus connection, the default is :session.

Function: notifications-get-capabilities &optional bus

Returns the capabilities of the notification server, a list of symbols. bus can be a string denoting a D-Bus connection, the default is :session. The following capabilities can be expected:

:actions

The server will provide the specified actions to the user.

:body

Supports body text.

:body-hyperlinks

The server supports hyperlinks in the notifications.

:body-images

The server supports images in the notifications.

:body-markup

Supports markup in the body text.

:icon-multi

The server will render an animation of all the frames in a given image array.

:icon-static

Supports display of exactly 1 frame of any given image array. This value is mutually exclusive with :icon-multi.

:persistence

The server supports persistence of notifications.

:sound

The server supports sounds on notifications.

Further vendor-specific caps start with :x-vendor, like :x-gnome-foo-cap.

Function: notifications-get-server-information &optional bus

Return information on the notification server, a list of strings. bus can be a string denoting a D-Bus connection, the default is :session. The returned list is (name vendor version spec-version).

name

The product name of the server.

vendor

The vendor name. For example, ‘"KDE"’, ‘"GNOME"’.

version

The server’s version number.

spec-version

The specification version the server is compliant with.

If spec_version is nil, the server supports a specification prior to ‘"1.0"’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.19 Notifications on File Changes

Several operating systems support watching of filesystems for changes of files. If configured properly, Emacs links a respective library like gfilenotify, inotify, or w32notify statically. These libraries enable watching of filesystems on the local machine.

It is also possible to watch filesystems on remote machines, see Remote Files in The GNU Emacs Manual This does not depend on one of the libraries linked to Emacs.

Since all these libraries emit different events on notified file changes, there is the Emacs library filenotify which provides a unique interface.

Function: file-notify-add-watch file flags callback

Add a watch for filesystem events pertaining to file. This arranges for filesystem events pertaining to file to be reported to Emacs.

The returned value is a descriptor for the added watch. Its type depends on the underlying library, it cannot be assumed to be an integer as in the example below. It should be used for comparison by equal only.

If the file cannot be watched for some reason, this function signals a file-notify-error error.

Sometimes, mounted filesystems cannot be watched for file changes. This is not detected by this function, a non-nil return value does not guarantee that changes on file will be notified.

flags is a list of conditions to set what will be watched for. It can include the following symbols:

change

watch for file changes

attribute-change

watch for file attribute changes, like permissions or modification time

If file is a directory, changes for all files in that directory will be notified. This does not work recursively.

When any event happens, Emacs will call the callback function passing it a single argument event, which is of the form

(descriptor action file [file1])

descriptor is the same object as the one returned by this function. action is the description of the event. It could be any one of the following symbols:

created

file was created

deleted

file was deleted

changed

file has changed

renamed

file has been renamed to file1

attribute-changed

a file attribute was changed

file and file1 are the name of the file(s) whose event is being reported. For example:

(require 'filenotify)
     ⇒ filenotify

(defun my-notify-callback (event)
  (message "Event %S" event))
     ⇒ my-notify-callback

(file-notify-add-watch
  "/tmp" '(change attribute-change) 'my-notify-callback)
     ⇒ 35025468

(write-region "foo" nil "/tmp/foo")
     ⇒ Event (35025468 created "/tmp/.#foo")
        Event (35025468 created "/tmp/foo")
        Event (35025468 changed "/tmp/foo")
        Event (35025468 deleted "/tmp/.#foo")

(write-region "bla" nil "/tmp/foo")
     ⇒ Event (35025468 created "/tmp/.#foo")
        Event (35025468 changed "/tmp/foo") [2 times]
        Event (35025468 deleted "/tmp/.#foo")

(set-file-modes "/tmp/foo" (default-file-modes))
     ⇒ Event (35025468 attribute-changed "/tmp/foo")

Whether the action renamed is returned, depends on the used watch library. It can be expected, when a directory is watched, and both file and file1 belong to this directory. Otherwise, the actions deleted and created could be returned in a random order.

(rename-file "/tmp/foo" "/tmp/bla")
     ⇒ Event (35025468 renamed "/tmp/foo" "/tmp/bla")

(file-notify-add-watch
  "/var/tmp" '(change attribute-change) 'my-notify-callback)
     ⇒ 35025504

(rename-file "/tmp/bla" "/var/tmp/bla")
     ⇒ ;; gfilenotify
        Event (35025468 renamed "/tmp/bla" "/var/tmp/bla")

     ⇒ ;; inotify
        Event (35025504 created "/var/tmp/bla")
        Event (35025468 deleted "/tmp/bla")
Function: file-notify-rm-watch descriptor

Removes an existing file watch specified by its descriptor. descriptor should be an object returned by file-notify-add-watch.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

38.20 Dynamically Loaded Libraries

A dynamically loaded library is a library that is loaded on demand, when its facilities are first needed. Emacs supports such on-demand loading of support libraries for some of its features.

Variable: dynamic-library-alist

This is an alist of dynamic libraries and external library files implementing them.

Each element is a list of the form (library files…), where the car is a symbol representing a supported external library, and the rest are strings giving alternate filenames for that library.

Emacs tries to load the library from the files in the order they appear in the list; if none is found, the Emacs session won’t have access to that library, and the features it provides will be unavailable.

Image support on some platforms uses this facility. Here’s an example of setting this variable for supporting images on MS-Windows:

(setq dynamic-library-alist
      '((xpm "libxpm.dll" "xpm4.dll" "libXpm-nox4.dll")
        (png "libpng12d.dll" "libpng12.dll" "libpng.dll"
             "libpng13d.dll" "libpng13.dll")
        (jpeg "jpeg62.dll" "libjpeg.dll" "jpeg-62.dll"
              "jpeg.dll")
        (tiff "libtiff3.dll" "libtiff.dll")
        (gif "giflib4.dll" "libungif4.dll" "libungif.dll")
        (svg "librsvg-2-2.dll")
        (gdk-pixbuf "libgdk_pixbuf-2.0-0.dll")
        (glib "libglib-2.0-0.dll")
	(gobject "libgobject-2.0-0.dll")))

Note that image types pbm and xbm do not need entries in this variable because they do not depend on external libraries and are always available in Emacs.

Also note that this variable is not meant to be a generic facility for accessing external libraries; only those already known by Emacs can be loaded through it.

This variable is ignored if the given library is statically linked into Emacs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39 Preparing Lisp code for distribution

Emacs provides a standard way to distribute Emacs Lisp code to users. A package is a collection of one or more files, formatted and bundled in such a way that users can easily download, install, uninstall, and upgrade it.

The following sections describe how to create a package, and how to put it in a package archive for others to download. See Packages in The GNU Emacs Manual, for a description of user-level features of the packaging system.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39.1 Packaging Basics

A package is either a simple package or a multi-file package. A simple package is stored in a package archive as a single Emacs Lisp file, while a multi-file package is stored as a tar file (containing multiple Lisp files, and possibly non-Lisp files such as a manual).

In ordinary usage, the difference between simple packages and multi-file packages is relatively unimportant; the Package Menu interface makes no distinction between them. However, the procedure for creating them differs, as explained in the following sections.

Each package (whether simple or multi-file) has certain attributes:

Name

A short word (e.g., ‘auctex’). This is usually also the symbol prefix used in the program (see section Emacs Lisp Coding Conventions).

Version

A version number, in a form that the function version-to-list understands (e.g., ‘11.86’). Each release of a package should be accompanied by an increase in the version number.

Brief description

This is shown when the package is listed in the Package Menu. It should occupy a single line, ideally in 36 characters or less.

Long description

This is shown in the buffer created by C-h P (describe-package), following the package’s brief description and installation status. It normally spans multiple lines, and should fully describe the package’s capabilities and how to begin using it once it is installed.

Dependencies

A list of other packages (possibly including minimal acceptable version numbers) on which this package depends. The list may be empty, meaning this package has no dependencies. Otherwise, installing this package also automatically installs its dependencies; if any dependency cannot be found, the package cannot be installed.

Installing a package, either via the command package-install-file, or via the Package Menu, creates a subdirectory of package-user-dir named name-version, where name is the package’s name and version its version (e.g., ~/.emacs.d/elpa/auctex-11.86/). We call this the package’s content directory. It is where Emacs puts the package’s contents (the single Lisp file for a simple package, or the files extracted from a multi-file package).

Emacs then searches every Lisp file in the content directory for autoload magic comments (see section Autoload). These autoload definitions are saved to a file named name-autoloads.el in the content directory. They are typically used to autoload the principal user commands defined in the package, but they can also perform other tasks, such as adding an element to auto-mode-alist (see section How Emacs Chooses a Major Mode). Note that a package typically does not autoload every function and variable defined within it—only the handful of commands typically called to begin using the package. Emacs then byte-compiles every Lisp file in the package.

After installation, the installed package is loaded: Emacs adds the package’s content directory to load-path, and evaluates the autoload definitions in name-autoloads.el.

Whenever Emacs starts up, it automatically calls the function package-initialize to load installed packages. This is done after loading the init file and abbrev file (if any) and before running after-init-hook (see section Summary: Sequence of Actions at Startup). Automatic package loading is disabled if the user option package-enable-at-startup is nil.

Command: package-initialize &optional no-activate

This function initializes Emacs’ internal record of which packages are installed, and loads them. The user option package-load-list specifies which packages to load; by default, all installed packages are loaded. See Package Installation in The GNU Emacs Manual.

The optional argument no-activate, if non-nil, causes Emacs to update its record of installed packages without actually loading them; it is for internal use only.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39.2 Simple Packages

A simple package consists of a single Emacs Lisp source file. The file must conform to the Emacs Lisp library header conventions (see section Conventional Headers for Emacs Libraries). The package’s attributes are taken from the various headers, as illustrated by the following example:

;;; superfrobnicator.el --- Frobnicate and bifurcate flanges

;; Copyright (C) 2011 Free Software Foundation, Inc.

;; Author: J. R. Hacker <jrh@example.com>
;; Version: 1.3
;; Package-Requires: ((flange "1.0"))
;; Keywords: multimedia, frobnicate
;; URL: http://example.com/jrhacker/superfrobnicate

…

;;; Commentary:

;; This package provides a minor mode to frobnicate and/or
;; bifurcate any flanges you desire.  To activate it, just type
…

;;;###autoload
(define-minor-mode superfrobnicator-mode
…

The name of the package is the same as the base name of the file, as written on the first line. Here, it is ‘superfrobnicator’.

The brief description is also taken from the first line. Here, it is ‘Frobnicate and bifurcate flanges’.

The version number comes from the ‘Package-Version’ header, if it exists, or from the ‘Version’ header otherwise. One or the other must be present. Here, the version number is 1.3.

If the file has a ‘;;; Commentary:’ section, this section is used as the long description. (When displaying the description, Emacs omits the ‘;;; Commentary:’ line, as well as the leading comment characters in the commentary itself.)

If the file has a ‘Package-Requires’ header, that is used as the package dependencies. In the above example, the package depends on the ‘flange’ package, version 1.0 or higher. See section Conventional Headers for Emacs Libraries, for a description of the ‘Package-Requires’ header. If the header is omitted, the package has no dependencies.

The ‘Keywords’ and ‘URL’ headers are optional, but recommended. The command describe-package uses these to add links to its output. The ‘Keywords’ header should contain at least one standard keyword from the finder-known-keywords list.

The file ought to also contain one or more autoload magic comments, as explained in Packaging Basics. In the above example, a magic comment autoloads superfrobnicator-mode.

See section Creating and Maintaining Package Archives, for a explanation of how to add a single-file package to a package archive.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39.3 Multi-file Packages

A multi-file package is less convenient to create than a single-file package, but it offers more features: it can include multiple Emacs Lisp files, an Info manual, and other file types (such as images).

Prior to installation, a multi-file package is stored in a package archive as a tar file. The tar file must be named name-version.tar, where name is the package name and version is the version number. Its contents, once extracted, must all appear in a directory named name-version, the content directory (see section Packaging Basics). Files may also extract into subdirectories of the content directory.

One of the files in the content directory must be named name-pkg.el. It must contain a single Lisp form, consisting of a call to the function define-package, described below. This defines the package’s version, brief description, and requirements.

For example, if we distribute version 1.3 of the superfrobnicator as a multi-file package, the tar file would be superfrobnicator-1.3.tar. Its contents would extract into the directory superfrobnicator-1.3, and one of these would be the file superfrobnicator-pkg.el.

Function: define-package name version &optional docstring requirements

This function defines a package. name is the package name, a string. version is the version, as a string of a form that can be understood by the function version-to-list. docstring is the brief description.

requirements is a list of required packages and their versions. Each element in this list should have the form (dep-name dep-version), where dep-name is a symbol whose name is the dependency’s package name, and dep-version is the dependency’s version (a string).

If the content directory contains a file named README, this file is used as the long description.

If the content directory contains a file named dir, this is assumed to be an Info directory file made with install-info. See Invoking install-info in Texinfo. The relevant Info files should also be present in the content directory. In this case, Emacs will automatically add the content directory to Info-directory-list when the package is activated.

Do not include any .elc files in the package. Those are created when the package is installed. Note that there is no way to control the order in which files are byte-compiled.

Do not include any file named name-autoloads.el. This file is reserved for the package’s autoload definitions (see section Packaging Basics). It is created automatically when the package is installed, by searching all the Lisp files in the package for autoload magic comments.

If the multi-file package contains auxiliary data files (such as images), the package’s Lisp code can refer to these files via the variable load-file-name (see section Loading). Here is an example:

(defconst superfrobnicator-base (file-name-directory load-file-name))

(defun superfrobnicator-fetch-image (file)
  (expand-file-name file superfrobnicator-base))

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

39.4 Creating and Maintaining Package Archives

Via the Package Menu, users may download packages from package archives. Such archives are specified by the variable package-archives, whose default value contains a single entry: the archive hosted by the GNU project at http://elpa.gnu.org. This section describes how to set up and maintain a package archive.

User Option: package-archives

The value of this variable is an alist of package archives recognized by the Emacs package manager.

Each alist element corresponds to one archive, and should have the form (id . location), where id is the name of the archive (a string) and location is its base location (a string).

If the base location starts with ‘http:’, it is treated as a HTTP URL, and packages are downloaded from this archive via HTTP (as is the case for the default GNU archive).

Otherwise, the base location should be a directory name. In this case, Emacs retrieves packages from this archive via ordinary file access. Such “local” archives are mainly useful for testing.

A package archive is simply a directory in which the package files, and associated files, are stored. If you want the archive to be reachable via HTTP, this directory must be accessible to a web server. How to accomplish this is beyond the scope of this manual.

A convenient way to set up and update a package archive is via the package-x library. This is included with Emacs, but not loaded by default; type M-x load-library RET package-x RET to load it, or add (require 'package-x) to your init file. See Lisp Libraries in The GNU Emacs Manual. Once loaded, you can make use of the following:

User Option: package-archive-upload-base

The value of this variable is the base location of a package archive, as a directory name. The commands in the package-x library will use this base location.

The directory name should be absolute. You may specify a remote name, such as /ssh:foo@example.com:/var/www/packages/, if the package archive is on a different machine. See Remote Files in The GNU Emacs Manual.

Command: package-upload-file filename

This command prompts for filename, a file name, and uploads that file to package-archive-upload-base. The file must be either a simple package (a .el file) or a multi-file package (a .tar file); otherwise, an error is raised. The package attributes are automatically extracted, and the archive’s contents list is updated with this information.

If package-archive-upload-base does not specify a valid directory, the function prompts interactively for one. If the directory does not exist, it is created. The directory need not have any initial contents (i.e., you can use this command to populate an initially empty archive).

Command: package-upload-buffer

This command is similar to package-upload-file, but instead of prompting for a package file, it uploads the contents of the current buffer. The current buffer must be visiting a simple package (a .el file) or a multi-file package (a .tar file); otherwise, an error is raised.

After you create an archive, remember that it is not accessible in the Package Menu interface unless it is in package-archives.

Maintaining a public package archive entails a degree of responsibility. When Emacs users install packages from your archive, those packages can cause Emacs to run arbitrary code with the permissions of the installing user. (This is true for Emacs code in general, not just for packages.) So you should ensure that your archive is well-maintained and keep the hosting system secure.

One way to increase the security of your packages is to sign them using a cryptographic key. If you have generated a private/public gpg key pair, you can use gpg to sign the package like this:

gpg -ba -o file.sig file

For a single-file package, file is the package Lisp file; for a multi-file package, it is the package tar file. You can also sign the archive’s contents file in the same way. Make the .sig files available in the same location as the packages. You should also make your public key available for people to download; e.g., by uploading it to a key server such as http://pgp.mit.edu/. When people install packages from your archive, they can use your public key to verify the signatures.

A full explanation of these matters is outside the scope of this manual. For more information on cryptographic keys and signing, see GnuPG in The GNU Privacy Guard Manual. Emacs comes with an interface to GNU Privacy Guard, see EasyPG in Emacs EasyPG Assistant Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix A Emacs 23 Antinews

For those users who live backwards in time, here is information about downgrading to Emacs version 23.4. We hope you will enjoy the greater simplicity that results from the absence of many Emacs 24.5 features.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

A.1 Old Lisp Features in Emacs 23


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix B GNU Free Documentation License

Version 1.3, 3 November 2008
Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
http://fsf.org/

Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
  1. PREAMBLE

    The purpose of this License is to make a manual, textbook, or other functional and useful document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

    This License is a kind of “copyleft”, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

    We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

  2. APPLICABILITY AND DEFINITIONS

    This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The “Document”, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as “you”. You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

    A “Modified Version” of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

    A “Secondary Section” is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

    The “Invariant Sections” are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

    The “Cover Texts” are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

    A “Transparent” copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not “Transparent” is called “Opaque”.

    Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

    The “Title Page” means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, “Title Page” means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.

    The “publisher” means any person or entity that distributes copies of the Document to the public.

    A section “Entitled XYZ” means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as “Acknowledgements”, “Dedications”, “Endorsements”, or “History”.) To “Preserve the Title” of such a section when you modify the Document means that it remains a section “Entitled XYZ” according to this definition.

    The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

  3. VERBATIM COPYING

    You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

    You may also lend copies, under the same conditions stated above, and you may publicly display copies.

  4. COPYING IN QUANTITY

    If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

    If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

    If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

    It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

  5. MODIFICATIONS

    You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

    1. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.
    2. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.
    3. State on the Title page the name of the publisher of the Modified Version, as the publisher.
    4. Preserve all the copyright notices of the Document.
    5. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
    6. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.
    7. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice.
    8. Include an unaltered copy of this License.
    9. Preserve the section Entitled “History”, Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled “History” in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.
    10. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the “History” section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.
    11. For any section Entitled “Acknowledgements” or “Dedications”, Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.
    12. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.
    13. Delete any section Entitled “Endorsements”. Such a section may not be included in the Modified Version.
    14. Do not retitle any existing section to be Entitled “Endorsements” or to conflict in title with any Invariant Section.
    15. Preserve any Warranty Disclaimers.

    If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles.

    You may add a section Entitled “Endorsements”, provided it contains nothing but endorsements of your Modified Version by various parties—for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

    You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

    The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

  6. COMBINING DOCUMENTS

    You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

    The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

    In the combination, you must combine any sections Entitled “History” in the various original documents, forming one section Entitled “History”; likewise combine any sections Entitled “Acknowledgements”, and any sections Entitled “Dedications”. You must delete all sections Entitled “Endorsements.”

  7. COLLECTIONS OF DOCUMENTS

    You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

    You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

  8. AGGREGATION WITH INDEPENDENT WORKS

    A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an “aggregate” if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

    If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

  9. TRANSLATION

    Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

    If a section in the Document is Entitled “Acknowledgements”, “Dedications”, or “History”, the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

  10. TERMINATION

    You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License.

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it.

  11. FUTURE REVISIONS OF THIS LICENSE

    The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

    Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License “or any later version” applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Document.

  12. RELICENSING

    “Massive Multiauthor Collaboration Site” (or “MMC Site”) means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A “Massive Multiauthor Collaboration” (or “MMC”) contained in the site means any set of copyrightable works thus published on the MMC site.

    “CC-BY-SA” means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization.

    “Incorporate” means to publish or republish a Document, in whole or in part, as part of another Document.

    An MMC is “eligible for relicensing” if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008.

    The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing.

ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

  Copyright (C)  year  your name.
  Permission is granted to copy, distribute and/or modify this document
  under the terms of the GNU Free Documentation License, Version 1.3
  or any later version published by the Free Software Foundation;
  with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
  Texts.  A copy of the license is included in the section entitled ``GNU
  Free Documentation License''.

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the “with…Texts.” line with this:

    with the Invariant Sections being list their titles, with
    the Front-Cover Texts being list, and with the Back-Cover Texts
    being list.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix C GNU General Public License

Version 3, 29 June 2007
Copyright © 2007 Free Software Foundation, Inc. http://fsf.org/

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program—to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers’ and authors’ protection, the GPL clearly explains that there is no warranty for this free software. For both users’ and authors’ sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users’ freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

  1. Definitions.

    “This License” refers to version 3 of the GNU General Public License.

    “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

    “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

    To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

    A “covered work” means either the unmodified Program or a work based on the Program.

    To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

    To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

    An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

  2. Source Code.

    The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

    A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

    The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

    The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work’s System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

    The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

    The Corresponding Source for a work in source code form is that same work.

  3. Basic Permissions.

    All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

    You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

    Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

  4. Protecting Users’ Legal Rights From Anti-Circumvention Law.

    No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

    When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work’s users, your or third parties’ legal rights to forbid circumvention of technological measures.

  5. Conveying Verbatim Copies.

    You may convey verbatim copies of the Program’s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

    You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

  6. Conveying Modified Source Versions.

    You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

    1. The work must carry prominent notices stating that you modified it, and giving a relevant date.
    2. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
    3. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
    4. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.

    A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation’s users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

  7. Conveying Non-Source Forms.

    You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

    1. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
    2. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
    3. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
    4. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
    5. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.

    A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

    A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

    “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

    If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

    The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

    Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

  8. Additional Terms.

    “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

    When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

    Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

    1. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
    2. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
    3. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
    4. Limiting the use for publicity purposes of names of licensors or authors of the material; or
    5. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
    6. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.

    All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

    If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

    Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

  9. Termination.

    You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

    However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

    Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

    Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

  10. Acceptance Not Required for Having Copies.

    You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

  11. Automatic Licensing of Downstream Recipients.

    Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

    An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party’s predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

    You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

  12. Patents.

    A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor’s “contributor version”.

    A contributor’s “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

    Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor’s essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

    In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

    If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient’s use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

    If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

    A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

    Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

  13. No Surrender of Others’ Freedom.

    If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

  14. Use with the GNU Affero General Public License.

    Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

  15. Revised Versions of this License.

    The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

    Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

    If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy’s public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

    Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

  16. Disclaimer of Warranty.

    THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  17. Limitation of Liability.

    IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

  18. Interpretation of Sections 15 and 16.

    If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

one line to give the program's name and a brief idea of what it does.
Copyright (C) year name of author

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see http://www.gnu.org/licenses/.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

program Copyright (C) year name of author
This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’.
This is free software, and you are welcome to redistribute it
under certain conditions; type ‘show c’ for details.

The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, your program’s commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see http://www.gnu.org/licenses/.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix D Tips and Conventions

This chapter describes no additional features of Emacs Lisp. Instead it gives advice on making effective use of the features described in the previous chapters, and describes conventions Emacs Lisp programmers should follow.

You can automatically check some of the conventions described below by running the command M-x checkdoc RET when visiting a Lisp file. It cannot check all of the conventions, and not all the warnings it gives necessarily correspond to problems, but it is worth examining them all.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.1 Emacs Lisp Coding Conventions

Here are conventions that you should follow when writing Emacs Lisp code intended for widespread use:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.2 Key Binding Conventions


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.3 Emacs Programming Tips

Following these conventions will make your program fit better into Emacs when it runs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.4 Tips for Making Compiled Code Fast

Here are ways of improving the execution speed of byte-compiled Lisp programs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.5 Tips for Avoiding Compiler Warnings


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.6 Tips for Documentation Strings

Here are some tips and conventions for the writing of documentation strings. You can check many of these conventions by running the command M-x checkdoc-minor-mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.7 Tips on Writing Comments

We recommend these conventions for comments:

;

Comments that start with a single semicolon, ‘;’, should all be aligned to the same column on the right of the source code. Such comments usually explain how the code on that line does its job. For example:

(setq base-version-list                 ; There was a base
      (assoc (substring fn 0 start-vn)  ; version to which
             file-version-assoc-list))  ; this looks like
                                        ; a subversion.
;;

Comments that start with two semicolons, ‘;;’, should be aligned to the same level of indentation as the code. Such comments usually describe the purpose of the following lines or the state of the program at that point. For example:

(prog1 (setq auto-fill-function
             …
             …
  ;; Update mode line.
  (force-mode-line-update)))

We also normally use two semicolons for comments outside functions.

;; This Lisp code is run in Emacs when it is to operate as
;; a server for other processes.

If a function has no documentation string, it should instead have a two-semicolon comment right before the function, explaining what the function does and how to call it properly. Explain precisely what each argument means and how the function interprets its possible values. It is much better to convert such comments to documentation strings, though.

;;;

Comments that start with three semicolons, ‘;;;’, should start at the left margin. We use them for comments which should be considered a “heading” by Outline minor mode. By default, comments starting with at least three semicolons (followed by a single space and a non-whitespace character) are considered headings, comments starting with two or fewer are not. Historically, triple-semicolon comments have also been used for commenting out lines within a function, but this use is discouraged.

When commenting out entire functions, use two semicolons.

;;;;

Comments that start with four semicolons, ‘;;;;’, should be aligned to the left margin and are used for headings of major sections of a program. For example:

;;;; The kill ring

Generally speaking, the M-; (comment-dwim) command automatically starts a comment of the appropriate type; or indents an existing comment to the right place, depending on the number of semicolons. See Manipulating Comments in The GNU Emacs Manual.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

D.8 Conventional Headers for Emacs Libraries

Emacs has conventions for using special comments in Lisp libraries to divide them into sections and give information such as who wrote them. Using a standard format for these items makes it easier for tools (and people) to extract the relevant information. This section explains these conventions, starting with an example:

;;; foo.el --- Support for the Foo programming language

;; Copyright (C) 2010-2015 Your Name

;; Author: Your Name <yourname@example.com>
;; Maintainer: Someone Else <someone@example.com>
;; Created: 14 Jul 2010
;; Keywords: languages
;; Homepage: http://example.com/foo

;; This file is not part of GNU Emacs.

;; This file is free software…
…
;; along with this file.  If not, see <http://www.gnu.org/licenses/>.

The very first line should have this format:

;;; filename --- description

The description should be contained in one line. If the file needs a ‘-*-’ specification, put it after description. If this would make the first line too long, use a Local Variables section at the end of the file.

The copyright notice usually lists your name (if you wrote the file). If you have an employer who claims copyright on your work, you might need to list them instead. Do not say that the copyright holder is the Free Software Foundation (or that the file is part of GNU Emacs) unless your file has been accepted into the Emacs distribution. For more information on the form of copyright and license notices, see the guide on the GNU website.

After the copyright notice come several header comment lines, each beginning with ‘;; header-name:’. Here is a table of the conventional possibilities for header-name:

Author

This line states the name and email address of at least the principal author of the library. If there are multiple authors, list them on continuation lines led by ;; and a tab or at least two spaces. We recommend including a contact email address, of the form ‘<…>’. For example:

;; Author: Your Name <yourname@example.com>
;;      Someone Else <someone@example.com>
;;      Another Person <another@example.com>
Maintainer

This header has the same format as the Author header. It lists the person(s) who currently maintain(s) the file (respond to bug reports, etc.).

If there is no maintainer line, the person(s) in the Author field is/are presumed to be the maintainers. Some files in Emacs use ‘FSF’ for the maintainer. This means that the original author is no longer responsible for the file, and that it is maintained as part of Emacs.

Created

This optional line gives the original creation date of the file, and is for historical interest only.

Version

If you wish to record version numbers for the individual Lisp program, put them in this line. Lisp files distributed with Emacs generally do not have a ‘Version’ header, since the version number of Emacs itself serves the same purpose. If you are distributing a collection of multiple files, we recommend not writing the version in every file, but only the main one.

Keywords

This line lists keywords for the finder-by-keyword help command. Please use that command to see a list of the meaningful keywords.

This field is how people will find your package when they’re looking for things by topic. To separate the keywords, you can use spaces, commas, or both.

The name of this field is unfortunate, since people often assume it is the place to write arbitrary keywords that describe their package, rather than just the relevant Finder keywords.

Homepage

This line states the homepage of the library.

Package-Version

If ‘Version’ is not suitable for use by the package manager, then a package can define ‘Package-Version’; it will be used instead. This is handy if ‘Version’ is an RCS id or something else that cannot be parsed by version-to-list. See section Packaging Basics.

Package-Requires

If this exists, it names packages on which the current package depends for proper operation. See section Packaging Basics. This is used by the package manager both at download time (to ensure that a complete set of packages is downloaded) and at activation time (to ensure that a package is only activated if all its dependencies have been).

Its format is a list of lists. The car of each sub-list is the name of a package, as a symbol. The cadr of each sub-list is the minimum acceptable version number, as a string. For instance:

;; Package-Requires: ((gnus "1.0") (bubbles "2.7.2"))

The package code automatically defines a package named ‘emacs’ with the version number of the currently running Emacs. This can be used to require a minimal version of Emacs for a package.

Just about every Lisp library ought to have the ‘Author’ and ‘Keywords’ header comment lines. Use the others if they are appropriate. You can also put in header lines with other header names—they have no standard meanings, so they can’t do any harm.

We use additional stylized comments to subdivide the contents of the library file. These should be separated from anything else by blank lines. Here is a table of them:

;;; Commentary:

This begins introductory comments that explain how the library works. It should come right after the copying permissions, terminated by a ‘Change Log’, ‘History’ or ‘Code’ comment line. This text is used by the Finder package, so it should make sense in that context.

;;; Change Log:

This begins an optional log of changes to the file over time. Don’t put too much information in this section—it is better to keep the detailed logs in a version control system (as Emacs does) or in a separate ChangeLog file. ‘History’ is an alternative to ‘Change Log’.

;;; Code:

This begins the actual code of the program.

;;; filename ends here

This is the footer line; it appears at the very end of the file. Its purpose is to enable people to detect truncated versions of the file from the lack of a footer line.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix E GNU Emacs Internals

This chapter describes how the runnable Emacs executable is dumped with the preloaded Lisp libraries in it, how storage is allocated, and some internal aspects of GNU Emacs that may be of interest to C programmers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.1 Building Emacs

This section explains the steps involved in building the Emacs executable. You don’t have to know this material to build and install Emacs, since the makefiles do all these things automatically. This information is pertinent to Emacs developers.

Compilation of the C source files in the src directory produces an executable file called temacs, also called a bare impure Emacs. It contains the Emacs Lisp interpreter and I/O routines, but not the editing commands.

The command temacs -l loadup would run temacs and direct it to load loadup.el. The loadup library loads additional Lisp libraries, which set up the normal Emacs editing environment. After this step, the Emacs executable is no longer bare.

Because it takes some time to load the standard Lisp files, the temacs executable usually isn’t run directly by users. Instead, as one of the last steps of building Emacs, the command ‘temacs -batch -l loadup dump’ is run. The special ‘dump’ argument causes temacs to dump out an executable program, called emacs, which has all the standard Lisp files preloaded. (The ‘-batch’ argument prevents temacs from trying to initialize any of its data on the terminal, so that the tables of terminal information are empty in the dumped Emacs.)

The dumped emacs executable (also called a pure Emacs) is the one which is installed. The variable preloaded-file-list stores a list of the Lisp files preloaded into the dumped Emacs. If you port Emacs to a new operating system, and are not able to implement dumping, then Emacs must load loadup.el each time it starts.

You can specify additional files to preload by writing a library named site-load.el that loads them. You may need to rebuild Emacs with an added definition

#define SITELOAD_PURESIZE_EXTRA n

to make n added bytes of pure space to hold the additional files; see src/puresize.h. (Try adding increments of 20000 until it is big enough.) However, the advantage of preloading additional files decreases as machines get faster. On modern machines, it is usually not advisable.

After loadup.el reads site-load.el, it finds the documentation strings for primitive and preloaded functions (and variables) in the file etc/DOC where they are stored, by calling Snarf-documentation (see Accessing Documentation).

You can specify other Lisp expressions to execute just before dumping by putting them in a library named site-init.el. This file is executed after the documentation strings are found.

If you want to preload function or variable definitions, there are three ways you can do this and make their documentation strings accessible when you subsequently run Emacs:

It is not advisable to put anything in site-load.el or site-init.el that would alter any of the features that users expect in an ordinary unmodified Emacs. If you feel you must override normal features for your site, do it with default.el, so that users can override your changes if they wish. See section Summary: Sequence of Actions at Startup. Note that if either site-load.el or site-init.el changes load-path, the changes will be lost after dumping. See section Library Search. To make a permanent change to load-path, use the --enable-locallisppath option of configure.

In a package that can be preloaded, it is sometimes necessary (or useful) to delay certain evaluations until Emacs subsequently starts up. The vast majority of such cases relate to the values of customizable variables. For example, tutorial-directory is a variable defined in startup.el, which is preloaded. The default value is set based on data-directory. The variable needs to access the value of data-directory when Emacs starts, not when it is dumped, because the Emacs executable has probably been installed in a different location since it was dumped.

Function: custom-initialize-delay symbol value

This function delays the initialization of symbol to the next Emacs start. You normally use this function by specifying it as the :initialize property of a customizable variable. (The argument value is unused, and is provided only for compatibility with the form Custom expects.)

In the unlikely event that you need a more general functionality than custom-initialize-delay provides, you can use before-init-hook (see section Summary: Sequence of Actions at Startup).

Function: dump-emacs to-file from-file

This function dumps the current state of Emacs into an executable file to-file. It takes symbols from from-file (this is normally the executable file temacs).

If you want to use this function in an Emacs that was already dumped, you must run Emacs with ‘-batch’.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.2 Pure Storage

Emacs Lisp uses two kinds of storage for user-created Lisp objects: normal storage and pure storage. Normal storage is where all the new data created during an Emacs session are kept (see section Garbage Collection). Pure storage is used for certain data in the preloaded standard Lisp files—data that should never change during actual use of Emacs.

Pure storage is allocated only while temacs is loading the standard preloaded Lisp libraries. In the file emacs, it is marked as read-only (on operating systems that permit this), so that the memory space can be shared by all the Emacs jobs running on the machine at once. Pure storage is not expandable; a fixed amount is allocated when Emacs is compiled, and if that is not sufficient for the preloaded libraries, temacs allocates dynamic memory for the part that didn’t fit. The resulting image will work, but garbage collection (see section Garbage Collection) is disabled in this situation, causing a memory leak. Such an overflow normally won’t happen unless you try to preload additional libraries or add features to the standard ones. Emacs will display a warning about the overflow when it starts. If this happens, you should increase the compilation parameter SYSTEM_PURESIZE_EXTRA in the file src/puresize.h and rebuild Emacs.

Function: purecopy object

This function makes a copy in pure storage of object, and returns it. It copies a string by simply making a new string with the same characters, but without text properties, in pure storage. It recursively copies the contents of vectors and cons cells. It does not make copies of other objects such as symbols, but just returns them unchanged. It signals an error if asked to copy markers.

This function is a no-op except while Emacs is being built and dumped; it is usually called only in preloaded Lisp files.

Variable: pure-bytes-used

The value of this variable is the number of bytes of pure storage allocated so far. Typically, in a dumped Emacs, this number is very close to the total amount of pure storage available—if it were not, we would preallocate less.

Variable: purify-flag

This variable determines whether defun should make a copy of the function definition in pure storage. If it is non-nil, then the function definition is copied into pure storage.

This flag is t while loading all of the basic functions for building Emacs initially (allowing those functions to be shareable and non-collectible). Dumping Emacs as an executable always writes nil in this variable, regardless of the value it actually has before and after dumping.

You should not change this flag in a running Emacs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.3 Garbage Collection

When a program creates a list or the user defines a new function (such as by loading a library), that data is placed in normal storage. If normal storage runs low, then Emacs asks the operating system to allocate more memory. Different types of Lisp objects, such as symbols, cons cells, small vectors, markers, etc., are segregated in distinct blocks in memory. (Large vectors, long strings, buffers and certain other editing types, which are fairly large, are allocated in individual blocks, one per object; small strings are packed into blocks of 8k bytes, and small vectors are packed into blocks of 4k bytes).

Beyond the basic vector, a lot of objects like window, buffer, and frame are managed as if they were vectors. The corresponding C data structures include the struct vectorlike_header field whose size member contains the subtype enumerated by enum pvec_type and an information about how many Lisp_Object fields this structure contains and what the size of the rest data is. This information is needed to calculate the memory footprint of an object, and used by the vector allocation code while iterating over the vector blocks.

It is quite common to use some storage for a while, then release it by (for example) killing a buffer or deleting the last pointer to an object. Emacs provides a garbage collector to reclaim this abandoned storage. The garbage collector operates by finding and marking all Lisp objects that are still accessible to Lisp programs. To begin with, it assumes all the symbols, their values and associated function definitions, and any data presently on the stack, are accessible. Any objects that can be reached indirectly through other accessible objects are also accessible.

When marking is finished, all objects still unmarked are garbage. No matter what the Lisp program or the user does, it is impossible to refer to them, since there is no longer a way to reach them. Their space might as well be reused, since no one will miss them. The second (“sweep”) phase of the garbage collector arranges to reuse them.

The sweep phase puts unused cons cells onto a free list for future allocation; likewise for symbols and markers. It compacts the accessible strings so they occupy fewer 8k blocks; then it frees the other 8k blocks. Unreachable vectors from vector blocks are coalesced to create largest possible free areas; if a free area spans a complete 4k block, that block is freed. Otherwise, the free area is recorded in a free list array, where each entry corresponds to a free list of areas of the same size. Large vectors, buffers, and other large objects are allocated and freed individually.

Common Lisp note: Unlike other Lisps, GNU Emacs Lisp does not call the garbage collector when the free list is empty. Instead, it simply requests the operating system to allocate more storage, and processing continues until gc-cons-threshold bytes have been used.

This means that you can make sure that the garbage collector will not run during a certain portion of a Lisp program by calling the garbage collector explicitly just before it (provided that portion of the program does not use so much space as to force a second garbage collection).

Command: garbage-collect

This command runs a garbage collection, and returns information on the amount of space in use. (Garbage collection can also occur spontaneously if you use more than gc-cons-threshold bytes of Lisp data since the previous garbage collection.)

garbage-collect returns a list with information on amount of space in use, where each entry has the form ‘(name size used)’ or ‘(name size used free)’. In the entry, name is a symbol describing the kind of objects this entry represents, size is the number of bytes used by each one, used is the number of those objects that were found live in the heap, and optional free is the number of those objects that are not live but that Emacs keeps around for future allocations. So an overall result is:

((conses cons-size used-conses free-conses)
 (symbols symbol-size used-symbols free-symbols)
 (miscs misc-size used-miscs free-miscs)
 (strings string-size used-strings free-strings)
 (string-bytes byte-size used-bytes)
 (vectors vector-size used-vectors)
 (vector-slots slot-size used-slots free-slots)
 (floats float-size used-floats free-floats)
 (intervals interval-size used-intervals free-intervals)
 (buffers buffer-size used-buffers)
 (heap unit-size total-size free-size))

Here is an example:

(garbage-collect)
      ⇒ ((conses 16 49126 8058) (symbols 48 14607 0)
                 (miscs 40 34 56) (strings 32 2942 2607)
                 (string-bytes 1 78607) (vectors 16 7247)
                 (vector-slots 8 341609 29474) (floats 8 71 102)
                 (intervals 56 27 26) (buffers 944 8)
                 (heap 1024 11715 2678))

Below is a table explaining each element. Note that last heap entry is optional and present only if an underlying malloc implementation provides mallinfo function.

cons-size

Internal size of a cons cell, i.e., sizeof (struct Lisp_Cons).

used-conses

The number of cons cells in use.

free-conses

The number of cons cells for which space has been obtained from the operating system, but that are not currently being used.

symbol-size

Internal size of a symbol, i.e., sizeof (struct Lisp_Symbol).

used-symbols

The number of symbols in use.

free-symbols

The number of symbols for which space has been obtained from the operating system, but that are not currently being used.

misc-size

Internal size of a miscellaneous entity, i.e., sizeof (union Lisp_Misc), which is a size of the largest type enumerated in enum Lisp_Misc_Type.

used-miscs

The number of miscellaneous objects in use. These include markers and overlays, plus certain objects not visible to users.

free-miscs

The number of miscellaneous objects for which space has been obtained from the operating system, but that are not currently being used.

string-size

Internal size of a string header, i.e., sizeof (struct Lisp_String).

used-strings

The number of string headers in use.

free-strings

The number of string headers for which space has been obtained from the operating system, but that are not currently being used.

byte-size

This is used for convenience and equals to sizeof (char).

used-bytes

The total size of all string data in bytes.

vector-size

Internal size of a vector header, i.e., sizeof (struct Lisp_Vector).

used-vectors

The number of vector headers allocated from the vector blocks.

slot-size

Internal size of a vector slot, always equal to sizeof (Lisp_Object).

used-slots

The number of slots in all used vectors.

free-slots

The number of free slots in all vector blocks.

float-size

Internal size of a float object, i.e., sizeof (struct Lisp_Float). (Do not confuse it with the native platform float or double.)

used-floats

The number of floats in use.

free-floats

The number of floats for which space has been obtained from the operating system, but that are not currently being used.

interval-size

Internal size of an interval object, i.e., sizeof (struct interval).

used-intervals

The number of intervals in use.

free-intervals

The number of intervals for which space has been obtained from the operating system, but that are not currently being used.

buffer-size

Internal size of a buffer, i.e., sizeof (struct buffer). (Do not confuse with the value returned by buffer-size function.)

used-buffers

The number of buffer objects in use. This includes killed buffers invisible to users, i.e., all buffers in all_buffers list.

unit-size

The unit of heap space measurement, always equal to 1024 bytes.

total-size

Total heap size, in unit-size units.

free-size

Heap space which is not currently used, in unit-size units.

If there was overflow in pure space (see section Pure Storage), garbage-collect returns nil, because a real garbage collection cannot be done.

User Option: garbage-collection-messages

If this variable is non-nil, Emacs displays a message at the beginning and end of garbage collection. The default value is nil.

Variable: post-gc-hook

This is a normal hook that is run at the end of garbage collection. Garbage collection is inhibited while the hook functions run, so be careful writing them.

User Option: gc-cons-threshold

The value of this variable is the number of bytes of storage that must be allocated for Lisp objects after one garbage collection in order to trigger another garbage collection. You can use the result returned by garbage-collect to get an information about size of the particular object type; space allocated to the contents of buffers does not count. Note that the subsequent garbage collection does not happen immediately when the threshold is exhausted, but only the next time the Lisp interpreter is called.

The initial threshold value is GC_DEFAULT_THRESHOLD, defined in alloc.c. Since it’s defined in word_size units, the value is 400,000 for the default 32-bit configuration and 800,000 for the 64-bit one. If you specify a larger value, garbage collection will happen less often. This reduces the amount of time spent garbage collecting, but increases total memory use. You may want to do this when running a program that creates lots of Lisp data.

You can make collections more frequent by specifying a smaller value, down to 1/10th of GC_DEFAULT_THRESHOLD. A value less than this minimum will remain in effect only until the subsequent garbage collection, at which time garbage-collect will set the threshold back to the minimum.

User Option: gc-cons-percentage

The value of this variable specifies the amount of consing before a garbage collection occurs, as a fraction of the current heap size. This criterion and gc-cons-threshold apply in parallel, and garbage collection occurs only when both criteria are satisfied.

As the heap size increases, the time to perform a garbage collection increases. Thus, it can be desirable to do them less frequently in proportion.

The value returned by garbage-collect describes the amount of memory used by Lisp data, broken down by data type. By contrast, the function memory-limit provides information on the total amount of memory Emacs is currently using.

Function: memory-limit

This function returns the address of the last byte Emacs has allocated, divided by 1024. We divide the value by 1024 to make sure it fits in a Lisp integer.

You can use this to get a general idea of how your actions affect the memory usage.

Variable: memory-full

This variable is t if Emacs is nearly out of memory for Lisp objects, and nil otherwise.

Function: memory-use-counts

This returns a list of numbers that count the number of objects created in this Emacs session. Each of these counters increments for a certain kind of object. See the documentation string for details.

Variable: gcs-done

This variable contains the total number of garbage collections done so far in this Emacs session.

Variable: gc-elapsed

This variable contains the total number of seconds of elapsed time during garbage collection so far in this Emacs session, as a floating-point number.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.4 Memory Usage

These functions and variables give information about the total amount of memory allocation that Emacs has done, broken down by data type. Note the difference between these and the values returned by garbage-collect; those count objects that currently exist, but these count the number or size of all allocations, including those for objects that have since been freed.

Variable: cons-cells-consed

The total number of cons cells that have been allocated so far in this Emacs session.

Variable: floats-consed

The total number of floats that have been allocated so far in this Emacs session.

Variable: vector-cells-consed

The total number of vector cells that have been allocated so far in this Emacs session.

Variable: symbols-consed

The total number of symbols that have been allocated so far in this Emacs session.

Variable: string-chars-consed

The total number of string characters that have been allocated so far in this session.

Variable: misc-objects-consed

The total number of miscellaneous objects that have been allocated so far in this session. These include markers and overlays, plus certain objects not visible to users.

Variable: intervals-consed

The total number of intervals that have been allocated so far in this Emacs session.

Variable: strings-consed

The total number of strings that have been allocated so far in this Emacs session.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.5 C Dialect

The C part of Emacs is portable to C89: C99-specific features such as ‘<stdbool.h>’ and ‘inline’ are not used without a check, typically at configuration time, and the Emacs build procedure provides a substitute implementation if necessary. Some C99 features, such as declarations after statements, are too difficult to provide substitutes for, so they are avoided entirely.

At some point in the not-too-distant future the base C dialect will change from C89 to C99, and eventually it will no doubt change to C11.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.6 Writing Emacs Primitives

Lisp primitives are Lisp functions implemented in C. The details of interfacing the C function so that Lisp can call it are handled by a few C macros. The only way to really understand how to write new C code is to read the source, but we can explain some things here.

An example of a special form is the definition of or, from eval.c. (An ordinary function would have the same general appearance.)

DEFUN ("or", For, Sor, 0, UNEVALLED, 0,
  doc: /* Eval args until one of them yields non-nil, then return
that value.
The remaining args are not evalled at all.
If all args return nil, return nil.
usage: (or CONDITIONS ...)  */)
  (Lisp_Object args)
{
  register Lisp_Object val = Qnil;
  struct gcpro gcpro1;

  GCPRO1 (args);

  while (CONSP (args))
    {
      val = eval_sub (XCAR (args));
      if (!NILP (val))
        break;
      args = XCDR (args);
    }

  UNGCPRO;
  return val;
}

Let’s start with a precise explanation of the arguments to the DEFUN macro. Here is a template for them:

DEFUN (lname, fname, sname, min, max, interactive, doc)
lname

This is the name of the Lisp symbol to define as the function name; in the example above, it is or.

fname

This is the C function name for this function. This is the name that is used in C code for calling the function. The name is, by convention, ‘F’ prepended to the Lisp name, with all dashes (‘-’) in the Lisp name changed to underscores. Thus, to call this function from C code, call For.

sname

This is a C variable name to use for a structure that holds the data for the subr object that represents the function in Lisp. This structure conveys the Lisp symbol name to the initialization routine that will create the symbol and store the subr object as its definition. By convention, this name is always fname with ‘F’ replaced with ‘S’.

min

This is the minimum number of arguments that the function requires. The function or allows a minimum of zero arguments.

max

This is the maximum number of arguments that the function accepts, if there is a fixed maximum. Alternatively, it can be UNEVALLED, indicating a special form that receives unevaluated arguments, or MANY, indicating an unlimited number of evaluated arguments (the equivalent of &rest). Both UNEVALLED and MANY are macros. If max is a number, it must be more than min but less than 8.

interactive

This is an interactive specification, a string such as might be used as the argument of interactive in a Lisp function. In the case of or, it is 0 (a null pointer), indicating that or cannot be called interactively. A value of "" indicates a function that should receive no arguments when called interactively. If the value begins with a ‘"(’, the string is evaluated as a Lisp form. For example:

DEFUN ("foo", Ffoo, Sfoo, 0, UNEVALLED,
       "(list (read-char-by-name \"Insert character: \")\
              (prefix-numeric-value current-prefix-arg)\
              t))",
  doc: /* … /*)
doc

This is the documentation string. It uses C comment syntax rather than C string syntax because comment syntax requires nothing special to include multiple lines. The ‘doc:’ identifies the comment that follows as the documentation string. The ‘/*’ and ‘*/’ delimiters that begin and end the comment are not part of the documentation string.

If the last line of the documentation string begins with the keyword ‘usage:’, the rest of the line is treated as the argument list for documentation purposes. This way, you can use different argument names in the documentation string from the ones used in the C code. ‘usage:’ is required if the function has an unlimited number of arguments.

All the usual rules for documentation strings in Lisp code (see section Tips for Documentation Strings) apply to C code documentation strings too.

After the call to the DEFUN macro, you must write the argument list for the C function, including the types for the arguments. If the primitive accepts a fixed maximum number of Lisp arguments, there must be one C argument for each Lisp argument, and each argument must be of type Lisp_Object. (Various macros and functions for creating values of type Lisp_Object are declared in the file lisp.h.) If the primitive has no upper limit on the number of Lisp arguments, it must have exactly two C arguments: the first is the number of Lisp arguments, and the second is the address of a block containing their values. These have types int and Lisp_Object * respectively. Since Lisp_Object can hold any Lisp object of any data type, you can determine the actual data type only at run time; so if you want a primitive to accept only a certain type of argument, you must check the type explicitly using a suitable predicate (see section Type Predicates).

Within the function For itself, note the use of the macros GCPRO1 and UNGCPRO. These macros are defined for the sake of the few platforms which do not use Emacs’ default stack-marking garbage collector. The GCPRO1 macro “protects” a variable from garbage collection, explicitly informing the garbage collector that that variable and all its contents must be as accessible. GC protection is necessary in any function which can perform Lisp evaluation by calling eval_sub or Feval as a subroutine, either directly or indirectly.

It suffices to ensure that at least one pointer to each object is GC-protected. Thus, a particular local variable can do without protection if it is certain that the object it points to will be preserved by some other pointer (such as another local variable that has a GCPRO). Otherwise, the local variable needs a GCPRO.

The macro GCPRO1 protects just one local variable. If you want to protect two variables, use GCPRO2 instead; repeating GCPRO1 will not work. Macros GCPRO3, GCPRO4, GCPRO5, and GCPRO6 also exist. All these macros implicitly use local variables such as gcpro1; you must declare these explicitly, with type struct gcpro. Thus, if you use GCPRO2, you must declare gcpro1 and gcpro2.

UNGCPRO cancels the protection of the variables that are protected in the current function. It is necessary to do this explicitly.

You must not use C initializers for static or global variables unless the variables are never written once Emacs is dumped. These variables with initializers are allocated in an area of memory that becomes read-only (on certain operating systems) as a result of dumping Emacs. See section Pure Storage.

Defining the C function is not enough to make a Lisp primitive available; you must also create the Lisp symbol for the primitive and store a suitable subr object in its function cell. The code looks like this:

defsubr (&sname);

Here sname is the name you used as the third argument to DEFUN.

If you add a new primitive to a file that already has Lisp primitives defined in it, find the function (near the end of the file) named syms_of_something, and add the call to defsubr there. If the file doesn’t have this function, or if you create a new file, add to it a syms_of_filename (e.g., syms_of_myfile). Then find the spot in emacs.c where all of these functions are called, and add a call to syms_of_filename there.

The function syms_of_filename is also the place to define any C variables that are to be visible as Lisp variables. DEFVAR_LISP makes a C variable of type Lisp_Object visible in Lisp. DEFVAR_INT makes a C variable of type int visible in Lisp with a value that is always an integer. DEFVAR_BOOL makes a C variable of type int visible in Lisp with a value that is either t or nil. Note that variables defined with DEFVAR_BOOL are automatically added to the list byte-boolean-vars used by the byte compiler.

If you want to make a Lisp variables that is defined in C behave like one declared with defcustom, add an appropriate entry to cus-start.el.

If you define a file-scope C variable of type Lisp_Object, you must protect it from garbage-collection by calling staticpro in syms_of_filename, like this:

staticpro (&variable);

Here is another example function, with more complicated arguments. This comes from the code in window.c, and it demonstrates the use of macros and functions to manipulate Lisp objects.

DEFUN ("coordinates-in-window-p", Fcoordinates_in_window_p,
  Scoordinates_in_window_p, 2, 2, 0,
  doc: /* Return non-nil if COORDINATES are in WINDOW.
  ...
  or `right-margin' is returned.  */)
  (register Lisp_Object coordinates, Lisp_Object window)
{
  struct window *w;
  struct frame *f;
  int x, y;
  Lisp_Object lx, ly;

  CHECK_LIVE_WINDOW (window);
  w = XWINDOW (window);
  f = XFRAME (w->frame);
  CHECK_CONS (coordinates);
  lx = Fcar (coordinates);
  ly = Fcdr (coordinates);
  CHECK_NUMBER_OR_FLOAT (lx);
  CHECK_NUMBER_OR_FLOAT (ly);
  x = FRAME_PIXEL_X_FROM_CANON_X (f, lx) + FRAME_INTERNAL_BORDER_WIDTH(f);
  y = FRAME_PIXEL_Y_FROM_CANON_Y (f, ly) + FRAME_INTERNAL_BORDER_WIDTH(f);

  switch (coordinates_in_window (w, x, y))
    {
    case ON_NOTHING:            /* NOT in window at all. */
      return Qnil;

    ...

    case ON_MODE_LINE:          /* In mode line of window. */
      return Qmode_line;

    ...

    case ON_SCROLL_BAR:         /* On scroll-bar of window.  */
      /* Historically we are supposed to return nil in this case.  */
      return Qnil;

    default:
      abort ();
    }
}

Note that C code cannot call functions by name unless they are defined in C. The way to call a function written in Lisp is to use Ffuncall, which embodies the Lisp function funcall. Since the Lisp function funcall accepts an unlimited number of arguments, in C it takes two: the number of Lisp-level arguments, and a one-dimensional array containing their values. The first Lisp-level argument is the Lisp function to call, and the rest are the arguments to pass to it. Since Ffuncall can call the evaluator, you must protect pointers from garbage collection around the call to Ffuncall.

The C functions call0, call1, call2, and so on, provide handy ways to call a Lisp function conveniently with a fixed number of arguments. They work by calling Ffuncall.

eval.c is a very good file to look through for examples; lisp.h contains the definitions for some important macros and functions.

If you define a function which is side-effect free, update the code in byte-opt.el that binds side-effect-free-fns and side-effect-and-error-free-fns so that the compiler optimizer knows about it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.7 Object Internals

Emacs Lisp provides a rich set of the data types. Some of them, like cons cells, integers and strings, are common to nearly all Lisp dialects. Some others, like markers and buffers, are quite special and needed to provide the basic support to write editor commands in Lisp. To implement such a variety of object types and provide an efficient way to pass objects between the subsystems of an interpreter, there is a set of C data structures and a special type to represent the pointers to all of them, which is known as tagged pointer.

In C, the tagged pointer is an object of type Lisp_Object. Any initialized variable of such a type always holds the value of one of the following basic data types: integer, symbol, string, cons cell, float, vectorlike or miscellaneous object. Each of these data types has the corresponding tag value. All tags are enumerated by enum Lisp_Type and placed into a 3-bit bitfield of the Lisp_Object. The rest of the bits is the value itself. Integers are immediate, i.e., directly represented by those value bits, and all other objects are represented by the C pointers to a corresponding object allocated from the heap. Width of the Lisp_Object is platform- and configuration-dependent: usually it’s equal to the width of an underlying platform pointer (i.e., 32-bit on a 32-bit machine and 64-bit on a 64-bit one), but also there is a special configuration where Lisp_Object is 64-bit but all pointers are 32-bit. The latter trick was designed to overcome the limited range of values for Lisp integers on a 32-bit system by using 64-bit long long type for Lisp_Object.

The following C data structures are defined in lisp.h to represent the basic data types beyond integers:

struct Lisp_Cons

Cons cell, an object used to construct lists.

struct Lisp_String

String, the basic object to represent a sequence of characters.

struct Lisp_Vector

Array, a fixed-size set of Lisp objects which may be accessed by an index.

struct Lisp_Symbol

Symbol, the unique-named entity commonly used as an identifier.

struct Lisp_Float

Floating-point value.

union Lisp_Misc

Miscellaneous kinds of objects which don’t fit into any of the above.

These types are the first-class citizens of an internal type system. Since the tag space is limited, all other types are the subtypes of either Lisp_Vectorlike or Lisp_Misc. Vector subtypes are enumerated by enum pvec_type, and nearly all complex objects like windows, buffers, frames, and processes fall into this category. The rest of special types, including markers and overlays, are enumerated by enum Lisp_Misc_Type and form the set of subtypes of Lisp_Misc.

Below there is a description of a few subtypes of Lisp_Vectorlike. Buffer object represents the text to display and edit. Window is the part of display structure which shows the buffer or used as a container to recursively place other windows on the same frame. (Do not confuse Emacs Lisp window object with the window as an entity managed by the user interface system like X; in Emacs terminology, the latter is called frame.) Finally, process object is used to manage the subprocesses.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.7.1 Buffer Internals

Two structures (see buffer.h) are used to represent buffers in C. The buffer_text structure contains fields describing the text of a buffer; the buffer structure holds other fields. In the case of indirect buffers, two or more buffer structures reference the same buffer_text structure.

Here are some of the fields in struct buffer_text:

beg

The address of the buffer contents.

gpt
gpt_byte

The character and byte positions of the buffer gap. See section The Buffer Gap.

z
z_byte

The character and byte positions of the end of the buffer text.

gap_size

The size of buffer’s gap. See section The Buffer Gap.

modiff
save_modiff
chars_modiff
overlay_modiff

These fields count the number of buffer-modification events performed in this buffer. modiff is incremented after each buffer-modification event, and is never otherwise changed; save_modiff contains the value of modiff the last time the buffer was visited or saved; chars_modiff counts only modifications to the characters in the buffer, ignoring all other kinds of changes; and overlay_modiff counts only modifications to the overlays.

beg_unchanged
end_unchanged

The number of characters at the start and end of the text that are known to be unchanged since the last complete redisplay.

unchanged_modified
overlay_unchanged_modified

The values of modiff and overlay_modiff, respectively, after the last complete redisplay. If their current values match modiff or overlay_modiff, that means beg_unchanged and end_unchanged contain no useful information.

markers

The markers that refer to this buffer. This is actually a single marker, and successive elements in its marker chain are the other markers referring to this buffer text.

intervals

The interval tree which records the text properties of this buffer.

Some of the fields of struct buffer are:

header

A header of type struct vectorlike_header is common to all vectorlike objects.

own_text

A struct buffer_text structure that ordinarily holds the buffer contents. In indirect buffers, this field is not used.

text

A pointer to the buffer_text structure for this buffer. In an ordinary buffer, this is the own_text field above. In an indirect buffer, this is the own_text field of the base buffer.

next

A pointer to the next buffer, in the chain of all buffers, including killed buffers. This chain is used only for allocation and garbage collection, in order to collect killed buffers properly.

pt
pt_byte

The character and byte positions of point in a buffer.

begv
begv_byte

The character and byte positions of the beginning of the accessible range of text in the buffer.

zv
zv_byte

The character and byte positions of the end of the accessible range of text in the buffer.

base_buffer

In an indirect buffer, this points to the base buffer. In an ordinary buffer, it is null.

local_flags

This field contains flags indicating that certain variables are local in this buffer. Such variables are declared in the C code using DEFVAR_PER_BUFFER, and their buffer-local bindings are stored in fields in the buffer structure itself. (Some of these fields are described in this table.)

modtime

The modification time of the visited file. It is set when the file is written or read. Before writing the buffer into a file, this field is compared to the modification time of the file to see if the file has changed on disk. See section Buffer Modification.

auto_save_modified

The time when the buffer was last auto-saved.

last_window_start

The window-start position in the buffer as of the last time the buffer was displayed in a window.

clip_changed

This flag indicates that narrowing has changed in the buffer. See section Narrowing.

prevent_redisplay_optimizations_p

This flag indicates that redisplay optimizations should not be used to display this buffer.

overlay_center

This field holds the current overlay center position. See section Managing Overlays.

overlays_before
overlays_after

These fields hold, respectively, a list of overlays that end at or before the current overlay center, and a list of overlays that end after the current overlay center. See section Managing Overlays. overlays_before is sorted in order of decreasing end position, and overlays_after is sorted in order of increasing beginning position.

name

A Lisp string that names the buffer. It is guaranteed to be unique. See section Buffer Names.

save_length

The length of the file this buffer is visiting, when last read or saved. This and other fields concerned with saving are not kept in the buffer_text structure because indirect buffers are never saved.

directory

The directory for expanding relative file names. This is the value of the buffer-local variable default-directory (see section Functions that Expand Filenames).

filename

The name of the file visited in this buffer, or nil. This is the value of the buffer-local variable buffer-file-name (see section Buffer File Name).

undo_list
backed_up
auto_save_file_name
auto_save_file_format
read_only
file_format
file_truename
invisibility_spec
display_count
display_time

These fields store the values of Lisp variables that are automatically buffer-local (see section Buffer-Local Variables), whose corresponding variable names have the additional prefix buffer- and have underscores replaced with dashes. For instance, undo_list stores the value of buffer-undo-list.

mark

The mark for the buffer. The mark is a marker, hence it is also included on the list markers. See section The Mark.

local_var_alist

The association list describing the buffer-local variable bindings of this buffer, not including the built-in buffer-local bindings that have special slots in the buffer object. (Those slots are omitted from this table.) See section Buffer-Local Variables.

major_mode

Symbol naming the major mode of this buffer, e.g., lisp-mode.

mode_name

Pretty name of the major mode, e.g., "Lisp".

keymap
abbrev_table
syntax_table
category_table
display_table

These fields store the buffer’s local keymap (see section Keymaps), abbrev table (see section Abbrev Tables), syntax table (see section Syntax Tables), category table (see section Categories), and display table (see section Display Tables).

downcase_table
upcase_table
case_canon_table

These fields store the conversion tables for converting text to lower case, upper case, and for canonicalizing text for case-fold search. See section The Case Table.

minor_modes

An alist of the minor modes of this buffer.

pt_marker
begv_marker
zv_marker

These fields are only used in an indirect buffer, or in a buffer that is the base of an indirect buffer. Each holds a marker that records pt, begv, and zv respectively, for this buffer when the buffer is not current.

mode_line_format
header_line_format
case_fold_search
tab_width
fill_column
left_margin
auto_fill_function
truncate_lines
word_wrap
ctl_arrow
bidi_display_reordering
bidi_paragraph_direction
selective_display
selective_display_ellipses
overwrite_mode
abbrev_mode
mark_active
enable_multibyte_characters
buffer_file_coding_system
cache_long_line_scans
point_before_scroll
left_fringe_width
right_fringe_width
fringes_outside_margins
scroll_bar_width
indicate_empty_lines
indicate_buffer_boundaries
fringe_indicator_alist
fringe_cursor_alist
scroll_up_aggressively
scroll_down_aggressively
cursor_type
cursor_in_non_selected_windows

These fields store the values of Lisp variables that are automatically buffer-local (see section Buffer-Local Variables), whose corresponding variable names have underscores replaced with dashes. For instance, mode_line_format stores the value of mode-line-format.

last_selected_window

This is the last window that was selected with this buffer in it, or nil if that window no longer displays this buffer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.7.2 Window Internals

The fields of a window (for a complete list, see the definition of struct window in window.h) include:

frame

The frame that this window is on.

mini_p

Non-nil if this window is a minibuffer window.

parent

Internally, Emacs arranges windows in a tree; each group of siblings has a parent window whose area includes all the siblings. This field points to a window’s parent.

Parent windows do not display buffers, and play little role in display except to shape their child windows. Emacs Lisp programs usually have no access to the parent windows; they operate on the windows at the leaves of the tree, which actually display buffers.

hchild
vchild

These fields contain the window’s leftmost child and its topmost child respectively. hchild is used if the window is subdivided horizontally by child windows, and vchild if it is subdivided vertically. In a live window, only one of hchild, vchild, and buffer (q.v.) is non-nil.

next
prev

The next sibling and previous sibling of this window. next is nil if the window is the right-most or bottom-most in its group; prev is nil if it is the left-most or top-most in its group.

left_col

The left-hand edge of the window, measured in columns, relative to the leftmost column in the frame (column 0).

top_line

The top edge of the window, measured in lines, relative to the topmost line in the frame (line 0).

total_cols
total_lines

The width and height of the window, measured in columns and lines respectively. The width includes the scroll bar and fringes, and/or the separator line on the right of the window (if any).

buffer

The buffer that the window is displaying.

start

A marker pointing to the position in the buffer that is the first character displayed in the window.

pointm

This is the value of point in the current buffer when this window is selected; when it is not selected, it retains its previous value.

force_start

If this flag is non-nil, it says that the window has been scrolled explicitly by the Lisp program. This affects what the next redisplay does if point is off the screen: instead of scrolling the window to show the text around point, it moves point to a location that is on the screen.

frozen_window_start_p

This field is set temporarily to 1 to indicate to redisplay that start of this window should not be changed, even if point gets invisible.

start_at_line_beg

Non-nil means current value of start was the beginning of a line when it was chosen.

use_time

This is the last time that the window was selected. The function get-lru-window uses this field.

sequence_number

A unique number assigned to this window when it was created.

last_modified

The modiff field of the window’s buffer, as of the last time a redisplay completed in this window.

last_overlay_modified

The overlay_modiff field of the window’s buffer, as of the last time a redisplay completed in this window.

last_point

The buffer’s value of point, as of the last time a redisplay completed in this window.

last_had_star

A non-nil value means the window’s buffer was “modified” when the window was last updated.

vertical_scroll_bar

This window’s vertical scroll bar.

left_margin_cols
right_margin_cols

The widths of the left and right margins in this window. A value of nil means no margin.

left_fringe_width
right_fringe_width

The widths of the left and right fringes in this window. A value of nil or t means use the values of the frame.

fringes_outside_margins

A non-nil value means the fringes outside the display margins; othersize they are between the margin and the text.

window_end_pos

This is computed as z minus the buffer position of the last glyph in the current matrix of the window. The value is only valid if window_end_valid is not nil.

window_end_bytepos

The byte position corresponding to window_end_pos.

window_end_vpos

The window-relative vertical position of the line containing window_end_pos.

window_end_valid

This field is set to a non-nil value if window_end_pos is truly valid. This is nil if nontrivial redisplay is pre-empted, since in that case the display that window_end_pos was computed for did not get onto the screen.

cursor

A structure describing where the cursor is in this window.

last_cursor

The value of cursor as of the last redisplay that finished.

phys_cursor

A structure describing where the cursor of this window physically is.

phys_cursor_type
phys_cursor_height
phys_cursor_width

The type, height, and width of the cursor that was last displayed on this window.

phys_cursor_on_p

This field is non-zero if the cursor is physically on.

cursor_off_p

Non-zero means the cursor in this window is logically off. This is used for blinking the cursor.

last_cursor_off_p

This field contains the value of cursor_off_p as of the time of the last redisplay.

must_be_updated_p

This is set to 1 during redisplay when this window must be updated.

hscroll

This is the number of columns that the display in the window is scrolled horizontally to the left. Normally, this is 0.

vscroll

Vertical scroll amount, in pixels. Normally, this is 0.

dedicated

Non-nil if this window is dedicated to its buffer.

display_table

The window’s display table, or nil if none is specified for it.

update_mode_line

Non-nil means this window’s mode line needs to be updated.

base_line_number

The line number of a certain position in the buffer, or nil. This is used for displaying the line number of point in the mode line.

base_line_pos

The position in the buffer for which the line number is known, or nil meaning none is known. If it is a buffer, don’t display the line number as long as the window shows that buffer.

column_number_displayed

The column number currently displayed in this window’s mode line, or nil if column numbers are not being displayed.

current_matrix
desired_matrix

Glyph matrices describing the current and desired display of this window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.7.3 Process Internals

The fields of a process (for a complete list, see the definition of struct Lisp_Process in process.h) include:

name

A string, the name of the process.

command

A list containing the command arguments that were used to start this process. For a network or serial process, it is nil if the process is running or t if the process is stopped.

filter

A function used to accept output from the process.

sentinel

A function called whenever the state of the process changes.

buffer

The associated buffer of the process.

pid

An integer, the operating system’s process ID. Pseudo-processes such as network or serial connections use a value of 0.

childp

A flag, t if this is really a child process. For a network or serial connection, it is a plist based on the arguments to make-network-process or make-serial-process.

mark

A marker indicating the position of the end of the last output from this process inserted into the buffer. This is often but not always the end of the buffer.

kill_without_query

If this is non-zero, killing Emacs while this process is still running does not ask for confirmation about killing the process.

raw_status

The raw process status, as returned by the wait system call.

status

The process status, as process-status should return it.

tick
update_tick

If these two fields are not equal, a change in the status of the process needs to be reported, either by running the sentinel or by inserting a message in the process buffer.

pty_flag

Non-nil if communication with the subprocess uses a pty; nil if it uses a pipe.

infd

The file descriptor for input from the process.

outfd

The file descriptor for output to the process.

tty_name

The name of the terminal that the subprocess is using, or nil if it is using pipes.

decode_coding_system

Coding-system for decoding the input from this process.

decoding_buf

A working buffer for decoding.

decoding_carryover

Size of carryover in decoding.

encode_coding_system

Coding-system for encoding the output to this process.

encoding_buf

A working buffer for encoding.

inherit_coding_system_flag

Flag to set coding-system of the process buffer from the coding system used to decode process output.

type

Symbol indicating the type of process: real, network, serial.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

E.8 C Integer Types

Here are some guidelines for use of integer types in the Emacs C source code. These guidelines sometimes give competing advice; common sense is advised.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix F Standard Errors

Here is a list of the more important error symbols in standard Emacs, grouped by concept. The list includes each symbol’s message and a cross reference to a description of how the error can occur.

Each error symbol has an set of parent error conditions that is a list of symbols. Normally this list includes the error symbol itself and the symbol error. Occasionally it includes additional symbols, which are intermediate classifications, narrower than error but broader than a single error symbol. For example, all the errors in accessing files have the condition file-error. If we do not say here that a certain error symbol has additional error conditions, that means it has none.

As a special exception, the error symbol quit does not have the condition error, because quitting is not considered an error.

Most of these error symbols are defined in C (mainly data.c), but some are defined in Lisp. For example, the file userlock.el defines the file-locked and file-supersession errors. Several of the specialized Lisp libraries distributed with Emacs define their own error symbols. We do not attempt to list of all those here.

See section Errors, for an explanation of how errors are generated and handled.

error

The message is ‘error’. See section Errors.

quit

The message is ‘Quit’. See section Quitting.

args-out-of-range

The message is ‘Args out of range’. This happens when trying to access an element beyond the range of a sequence, buffer, or other container-like object. See section Sequences, Arrays, and Vectors, and See section Text.

arith-error

The message is ‘Arithmetic error’. This occurs when trying to perform integer division by zero. See section Numeric Conversions, and See section Arithmetic Operations.

beginning-of-buffer

The message is ‘Beginning of buffer’. See section Motion by Characters.

buffer-read-only

The message is ‘Buffer is read-only’. See section Read-Only Buffers.

circular-list

The message is ‘List contains a loop’. This happens when a circular structure is encountered. See section Read Syntax for Circular Objects.

cl-assertion-failed

The message is ‘Assertion failed’. This happens when the cl-assert macro fails a test. See Assertions in Common Lisp Extensions.

coding-system-error

The message is ‘Invalid coding system’. See section Coding Systems in Lisp.

cyclic-function-indirection

The message is ‘Symbol's chain of function indirections contains a loop’. See section Symbol Function Indirection.

cyclic-variable-indirection

The message is ‘Symbol's chain of variable indirections contains a loop’. See section Variable Aliases.

dbus-error

The message is ‘D-Bus error’. This is only defined if Emacs was compiled with D-Bus support. See Errors and Events in D-Bus integration in Emacs.

end-of-buffer

The message is ‘End of buffer’. See section Motion by Characters.

end-of-file

The message is ‘End of file during parsing’. Note that this is not a subcategory of file-error, because it pertains to the Lisp reader, not to file I/O. See section Input Functions.

file-already-exists

This is a subcategory of file-error. See section Writing to Files.

file-date-error

This is a subcategory of file-error. It occurs when copy-file tries and fails to set the last-modification time of the output file. See section Changing File Names and Attributes.

file-error

We do not list the error-strings of this error and its subcategories, because the error message is normally constructed from the data items alone when the error condition file-error is present. Thus, the error-strings are not very relevant. However, these error symbols do have error-message properties, and if no data is provided, the error-message property is used. See section Files.

compression-error

This is a subcategory of file-error, which results from problems handling a compressed file. See section How Programs Do Loading.

file-locked

This is a subcategory of file-error. See section File Locks.

file-supersession

This is a subcategory of file-error. See section Buffer Modification Time.

file-notify-error

This is a subcategory of file-error. It happens, when a file could not be watched for changes. See section Notifications on File Changes.

ftp-error

This is a subcategory of file-error, which results from problems in accessing a remote file using ftp. See Remote Files in The GNU Emacs Manual.

invalid-function

The message is ‘Invalid function’. See section Symbol Function Indirection.

invalid-read-syntax

The message is ‘Invalid read syntax’. See section Printed Representation and Read Syntax.

invalid-regexp

The message is ‘Invalid regexp’. See section Regular Expressions.

mark-inactive

The message is ‘The mark is not active now’. See section The Mark.

no-catch

The message is ‘No catch for tag’. See section Explicit Nonlocal Exits: catch and throw.

scan-error

The message is ‘Scan error’. This happens when certain syntax-parsing functions find invalid syntax or mismatched parentheses. See section Moving over Balanced Expressions, and See section Parsing Expressions.

search-failed

The message is ‘Search failed’. See section Searching and Matching.

setting-constant

The message is ‘Attempt to set a constant symbol’. This happens when attempting to assign values to nil, t, and keyword symbols. See section Variables that Never Change.

text-read-only

The message is ‘Text is read-only’. This is a subcategory of buffer-read-only. See section Properties with Special Meanings.

undefined-color

The message is ‘Undefined color’. See section Color Names.

user-error

The message is the empty string. See section How to Signal an Error.

void-function

The message is ‘Symbol's function definition is void’. See section Accessing Function Cell Contents.

void-variable

The message is ‘Symbol's value as variable is void’. See section Accessing Variable Values.

wrong-number-of-arguments

The message is ‘Wrong number of arguments’. See section Classification of List Forms.

wrong-type-argument

The message is ‘Wrong type argument’. See section Type Predicates.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix G Standard Keymaps

In this section we list some of the more general keymaps. Many of these exist when Emacs is first started, but some are loaded only when the respective feature is accessed.

There are many other, more specialized, maps than these; in particular those associated with major and minor modes. The minibuffer uses several keymaps (see section Minibuffer Commands that Do Completion). For more details on keymaps, see section Keymaps.

2C-mode-map

A sparse keymap for subcommands of the prefix C-x 6.
See Two-Column Editing in The GNU Emacs Manual.

abbrev-map

A sparse keymap for subcommands of the prefix C-x a.
See Defining Abbrevs in The GNU Emacs Manual.

button-buffer-map

A sparse keymap useful for buffers containing buffers.
You may want to use this as a parent keymap. See section Buttons.

button-map

A sparse keymap used by buttons.

ctl-x-4-map

A sparse keymap for subcommands of the prefix C-x 4.

ctl-x-5-map

A sparse keymap for subcommands of the prefix C-x 5.

ctl-x-map

A full keymap for C-x commands.

ctl-x-r-map

A sparse keymap for subcommands of the prefix C-x r.
See Registers in The GNU Emacs Manual.

esc-map

A full keymap for ESC (or Meta) commands.

facemenu-keymap

A sparse keymap used for the M-o prefix key.

function-key-map

The parent keymap of all local-function-key-map (q.v.) instances.

global-map

The full keymap containing default global key bindings.
Modes should not modify the Global map.

goto-map

A sparse keymap used for the M-g prefix key.

help-map

A sparse keymap for the keys following the help character C-h.
See section Help Functions.

Helper-help-map

A full keymap used by the help utility package.
It has the same keymap in its value cell and in its function cell.

input-decode-map

The keymap for translating keypad and function keys.
If there are none, then it contains an empty sparse keymap. See section Keymaps for Translating Sequences of Events.

key-translation-map

A keymap for translating keys. This one overrides ordinary key bindings, unlike local-function-key-map. See section Keymaps for Translating Sequences of Events.

kmacro-keymap

A sparse keymap for keys that follows the C-x C-k prefix search.
See Keyboard Macros in The GNU Emacs Manual.

local-function-key-map

The keymap for translating key sequences to preferred alternatives.
If there are none, then it contains an empty sparse keymap. See section Keymaps for Translating Sequences of Events.

menu-bar-file-menu
menu-bar-edit-menu
menu-bar-options-menu
global-buffers-menu-map
menu-bar-tools-menu
menu-bar-help-menu

These keymaps display the main, top-level menus in the menu bar.
Some of them contain sub-menus. For example, the Edit menu contains menu-bar-search-menu, etc. See section The Menu Bar.

minibuffer-inactive-mode-map

A full keymap used in the minibuffer when it is not active.
See Editing in the Minibuffer in The GNU Emacs Manual.

mode-line-coding-system-map
mode-line-input-method-map
mode-line-column-line-number-mode-map

These keymaps control various areas of the mode line.
See section Mode Line Format.

mode-specific-map

The keymap for characters following C-c. Note, this is in the global map. This map is not actually mode-specific: its name was chosen to be informative in C-h b (display-bindings), where it describes the main use of the C-c prefix key.

mouse-appearance-menu-map

A sparse keymap used for the S-mouse-1 key.

mule-keymap

The global keymap used for the C-x RET prefix key.

narrow-map

A sparse keymap for subcommands of the prefix C-x n.

prog-mode-map

The keymap used by Prog mode.
See section Basic Major Modes.

query-replace-map
multi-query-replace-map

A sparse keymap used for responses in query-replace and related commands; also for y-or-n-p and map-y-or-n-p. The functions that use this map do not support prefix keys; they look up one event at a time. multi-query-replace-map extends query-replace-map for multi-buffer replacements. See section query-replace-map.

search-map

A sparse keymap that provides global bindings for search-related commands.

special-mode-map

The keymap used by Special mode.
See section Basic Major Modes.

tool-bar-map

The keymap defining the contents of the tool bar.
See section Tool bars.

universal-argument-map

A sparse keymap used while processing C-u.
See section Prefix Command Arguments.

vc-prefix-map

The global keymap used for the C-x v prefix key.

x-alternatives-map

A sparse keymap used to map certain keys under graphical frames.
The function x-setup-function-keys uses this.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Appendix H Standard Hooks

The following is a list of some hook variables that let you provide functions to be called from within Emacs on suitable occasions.

Most of these variables have names ending with ‘-hook’. They are normal hooks, run by means of run-hooks. The value of such a hook is a list of functions; the functions are called with no arguments and their values are completely ignored. The recommended way to put a new function on such a hook is to call add-hook. See section Hooks, for more information about using hooks.

The variables whose names end in ‘-functions’ are usually abnormal hooks (some old code may also use the deprecated ‘-hooks’ suffix); their values are lists of functions, but these functions are called in a special way (they are passed arguments, or their return values are used). The variables whose names end in ‘-function’ have single functions as their values.

This is not an exhaustive list, it only covers the more general hooks. For example, every major mode defines a hook named ‘modename-mode-hook’. The major mode command runs this normal hook with run-mode-hooks as the very last thing it does. See section Mode Hooks. Most minor modes have mode hooks too.

A special feature allows you to specify expressions to evaluate if and when a file is loaded (see section Hooks for Loading). That feature is not exactly a hook, but does a similar job.

activate-mark-hook
deactivate-mark-hook

See section The Mark.

after-change-functions
before-change-functions
first-change-hook

See section Change Hooks.

after-change-major-mode-hook
change-major-mode-after-body-hook

See section Mode Hooks.

after-init-hook
before-init-hook
emacs-startup-hook
window-setup-hook

See section The Init File.

after-insert-file-functions
write-region-annotate-functions
write-region-post-annotation-function

See section File Format Conversion.

after-make-frame-functions
before-make-frame-hook

See section Creating Frames.

after-save-hook
before-save-hook
write-contents-functions
write-file-functions

See section Saving Buffers.

after-setting-font-hook

Hook run after a frame’s font changes.

auto-save-hook

See section Auto-Saving.

before-hack-local-variables-hook
hack-local-variables-hook

See section File Local Variables.

buffer-access-fontify-functions

See section Lazy Computation of Text Properties.

buffer-list-update-hook

Hook run when the buffer list changes (see section The Buffer List).

buffer-quit-function

Function to call to “quit” the current buffer.

change-major-mode-hook

See section Creating and Deleting Buffer-Local Bindings.

command-line-functions

See section Command-Line Arguments.

delayed-warnings-hook

The command loop runs this soon after post-command-hook (q.v.).

focus-in-hook
focus-out-hook

See section Input Focus.

delete-frame-functions

See section Deleting Frames.

delete-terminal-functions

See section Multiple Terminals.

pop-up-frame-function
split-window-preferred-function

See section Additional Options for Displaying Buffers.

echo-area-clear-hook

See section Echo Area Customization.

find-file-hook
find-file-not-found-functions

See section Functions for Visiting Files.

font-lock-extend-after-change-region-function

See section Region to Fontify after a Buffer Change.

font-lock-extend-region-functions

See section Multiline Font Lock Constructs.

font-lock-fontify-buffer-function
font-lock-fontify-region-function
font-lock-mark-block-function
font-lock-unfontify-buffer-function
font-lock-unfontify-region-function

See section Other Font Lock Variables.

fontification-functions

See section Automatic Face Assignment.

frame-auto-hide-function

See section Quitting Windows.

kill-buffer-hook
kill-buffer-query-functions

See section Killing Buffers.

kill-emacs-hook
kill-emacs-query-functions

See section Killing Emacs.

menu-bar-update-hook

See section The Menu Bar.

minibuffer-setup-hook
minibuffer-exit-hook

See section Minibuffer Miscellany.

mouse-leave-buffer-hook

Hook run when about to switch windows with a mouse command.

mouse-position-function

See section Mouse Position.

post-command-hook
pre-command-hook

See section Command Loop Overview.

post-gc-hook

See section Garbage Collection.

post-self-insert-hook

See section Keymaps and Minor Modes.

suspend-hook
suspend-resume-hook
suspend-tty-functions
resume-tty-functions

See section Suspending Emacs.

syntax-begin-function
syntax-propertize-extend-region-functions
syntax-propertize-function
font-lock-syntactic-face-function

See section Syntactic Font Lock. See section Syntax Properties.

temp-buffer-setup-hook
temp-buffer-show-function
temp-buffer-show-hook

See section Temporary Displays.

tty-setup-hook

See section Terminal-Specific Initialization.

window-configuration-change-hook
window-scroll-functions
window-size-change-functions

See section Hooks for Window Scrolling and Changes.

window-text-change-functions

Functions to call in redisplay when text in the window might change.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

Index

Jump to:   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   1   2   3   ;   <   =   >   ?   @   [   \   ]   ^   `   |  
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z  
Index Entry  Section

"
"’ in printing 18.5 Output Functions
"’ in strings 2.3.8.1 Syntax for Strings

#
##’ read syntax 2.3.4 Symbol Type
#$ 16.3 Documentation Strings and Compilation
#'’ syntax 12.7 Anonymous Functions
#(’ read syntax 2.3.8.4 Text Properties in Strings
#:’ read syntax 2.3.4 Symbol Type
#@count 16.3 Documentation Strings and Compilation
#n#’ read syntax 2.5 Read Syntax for Circular Objects
#n=’ read syntax 2.5 Read Syntax for Circular Objects
#^’ read syntax 2.3.10 Char-Table Type

$
$’ in display 37.3 Truncation
$’ in regexp 33.3.1.1 Special Characters in Regular Expressions

%
% 3.6 Arithmetic Operations
%’ in format 4.7 Formatting Strings

&
&’ in replacement 33.6.1 Replacing the Text that Matched
&optional 12.2.3 Other Features of Argument Lists
&rest 12.2.3 Other Features of Argument Lists

'
'’ for quoting 9.3 Quoting

(
(’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
(…)’ in lists 2.3.6 Cons Cell and List Types
(?:’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions

)
)’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions

*
* 3.6 Arithmetic Operations
*’ in interactive 20.2.1 Using interactive
*’ in regexp 33.3.1.1 Special Characters in Regular Expressions
*scratch* 22.2.2 How Emacs Chooses a Major Mode

+
+ 3.6 Arithmetic Operations
+’ in regexp 33.3.1.1 Special Characters in Regular Expressions

,
, (with backquote) 9.4 Backquote
,@ (with backquote) 9.4 Backquote

-
- 3.6 Arithmetic Operations
--enable-locallisppath option to configure E.1 Building Emacs
–enable-profiling option of configure 17.5 Profiling

.
.’ in lists 2.3.6.2 Dotted Pair Notation
.’ in regexp 33.3.1.1 Special Characters in Regular Expressions
.emacs 38.1.2 The Init File

/
/ 3.6 Arithmetic Operations
/= 3.4 Comparison of Numbers
/dev/tty 36.19 Communicating with Serial Ports

1
1+ 3.6 Arithmetic Operations
1- 3.6 Arithmetic Operations
1value 17.4 Test Coverage

2
2C-mode-map 21.6 Prefix Keys
2D box 37.12.1 Face Attributes

3
3D box 37.12.1 Face Attributes

;
;’ in comment 2.2 Comments

<
< 3.4 Comparison of Numbers
<= 3.4 Comparison of Numbers

=
= 3.4 Comparison of Numbers

>
> 3.4 Comparison of Numbers
>= 3.4 Comparison of Numbers

?
?’ in character constant 2.3.3.1 Basic Char Syntax
? in minibuffer 19.2 Reading Text Strings with the Minibuffer
?’ in regexp 33.3.1.1 Special Characters in Regular Expressions

@
@’ in interactive 20.2.1 Using interactive

[
[’ in regexp 33.3.1.1 Special Characters in Regular Expressions
[…] (Edebug) 17.2.15.2 Specification List

\
\’ in character constant 2.3.3.2 General Escape Syntax
\’ in display 37.3 Truncation
\’ in printing 18.5 Output Functions
\’ in regexp 33.3.1.1 Special Characters in Regular Expressions
\’ in replacement 33.6.1 Replacing the Text that Matched
\’ in strings 2.3.8.1 Syntax for Strings
\’ in symbols 2.3.4 Symbol Type
\'’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\<’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\=’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\>’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\a 2.3.3.1 Basic Char Syntax
\b 2.3.3.1 Basic Char Syntax
\b’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\B’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\e 2.3.3.1 Basic Char Syntax
\f 2.3.3.1 Basic Char Syntax
\n 2.3.3.1 Basic Char Syntax
\n’ in print 18.6 Variables Affecting Output
\n’ in replacement 33.6.1 Replacing the Text that Matched
\r 2.3.3.1 Basic Char Syntax
\s 2.3.3.1 Basic Char Syntax
\s’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\S’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\t 2.3.3.1 Basic Char Syntax
\v 2.3.3.1 Basic Char Syntax
\w’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\W’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\_<’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\_>’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions
\`’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions

]
]’ in regexp 33.3.1.1 Special Characters in Regular Expressions

^
^’ in interactive 20.2.1 Using interactive
^’ in regexp 33.3.1.1 Special Characters in Regular Expressions

`
` 9.4 Backquote
‘ (list substitution) 9.4 Backquote

|
|’ in regexp 33.3.1.3 Backslash Constructs in Regular Expressions

A
abbrev 35 Abbrevs and Abbrev Expansion
abbrev properties 35.6 Abbrev Properties
abbrev table properties 35.7 Abbrev Table Properties
abbrev tables 35.1 Abbrev Tables
abbrev tables in modes 22.2.1 Major Mode Conventions
abbrev-all-caps 35.4 Looking Up and Expanding Abbreviations
abbrev-expand-function 35.4 Looking Up and Expanding Abbreviations
abbrev-expansion 35.4 Looking Up and Expanding Abbreviations
abbrev-file-name 35.3 Saving Abbrevs in Files
abbrev-get 35.6 Abbrev Properties
abbrev-insert 35.4 Looking Up and Expanding Abbreviations
abbrev-map Appendix G Standard Keymaps
abbrev-minor-mode-table-alist 35.5 Standard Abbrev Tables
abbrev-prefix-mark 35.4 Looking Up and Expanding Abbreviations
abbrev-put 35.6 Abbrev Properties
abbrev-start-location 35.4 Looking Up and Expanding Abbreviations
abbrev-start-location-buffer 35.4 Looking Up and Expanding Abbreviations
abbrev-symbol 35.4 Looking Up and Expanding Abbreviations
abbrev-table-get 35.7 Abbrev Table Properties
abbrev-table-name-list 35.1 Abbrev Tables
abbrev-table-p 35.1 Abbrev Tables
abbrev-table-put 35.7 Abbrev Table Properties
abbreviate-file-name 24.8.3 Directory Names
abbreviated file names 24.8.3 Directory Names
abbrevs, looking up and expanding 35.4 Looking Up and Expanding Abbreviations
abbrevs-changed 35.3 Saving Abbrevs in Files
abnormal hook 22.1 Hooks
abort-recursive-edit 20.13 Recursive Editing
aborting 20.13 Recursive Editing
abs 3.4 Comparison of Numbers
absolute file name 24.8.2 Absolute and Relative File Names
accept input from processes 36.9.4 Accepting Output from Processes
accept-change-group 31.27 Atomic Change Groups
accept-process-output 36.9.4 Accepting Output from Processes
access control list 24.6.5 Extended File Attributes
access minibuffer contents 19.12 Minibuffer Contents
access-file 24.6.1 Testing Accessibility
accessibility of a file 24.6.1 Testing Accessibility
accessible portion (of a buffer) 29.4 Narrowing
accessible-keymaps 21.16 Scanning Keymaps
accessing documentation strings 23.2 Access to Documentation Strings
accessing hash tables 7.2 Hash Table Access
accessing plist properties 5.9.2 Property Lists Outside Symbols
ACL entries 24.6.5 Extended File Attributes
acos 3.9 Standard Mathematical Functions
action (button property) 37.18.1 Button Properties
action alist, for display-buffer 27.12 Choosing a Window for Display
action function, for display-buffer 27.12 Choosing a Window for Display
action, customization keyword 14.4.4 Type Keywords
activate-change-group 31.27 Atomic Change Groups
activate-mark-hook 30.7 The Mark
active display table 37.21.3 Active Display Table
active keymap 21.7 Active Keymaps
active keymap, controlling 21.9 Controlling the Active Keymaps
active-minibuffer-window 19.11 Minibuffer Windows
adaptive-fill-first-line-regexp 31.13 Adaptive Fill Mode
adaptive-fill-function 31.13 Adaptive Fill Mode
adaptive-fill-mode 31.13 Adaptive Fill Mode
adaptive-fill-regexp 31.13 Adaptive Fill Mode
add-face-text-property 31.19.2 Changing Text Properties
add-function 12.10.1 Primitives to manipulate advices
add-hook 22.1.2 Setting Hooks
add-name-to-file 24.7 Changing File Names and Attributes
add-text-properties 31.19.2 Changing Text Properties
add-to-history 19.4 Minibuffer History
add-to-invisibility-spec 37.6 Invisible Text
add-to-list 5.5 Modifying List Variables
add-to-ordered-list 5.5 Modifying List Variables
address field of register 2.3.6 Cons Cell and List Types
adjust-window-trailing-edge 27.4 Resizing Windows
adjusting point 20.6 Adjusting Point After Commands
advertised binding 23.3 Substituting Key Bindings in Documentation
advice, add and remove 12.10.1 Primitives to manipulate advices
advice-add 12.10.2 Advising Named Functions
advice-eval-interactive-spec 12.10.1 Primitives to manipulate advices
advice-function-mapc 12.10.1 Primitives to manipulate advices
advice-function-member-p 12.10.1 Primitives to manipulate advices
advice-mapc 12.10.2 Advising Named Functions
advice-member-p 12.10.2 Advising Named Functions
advice-remove 12.10.2 Advising Named Functions
advising functions 12.10 Advising Emacs Lisp Functions
advising named functions 12.10.2 Advising Named Functions
after-change-functions 31.28 Change Hooks
after-change-major-mode-hook 22.2.6 Mode Hooks
after-find-file 24.1.2 Subroutines of Visiting
after-init-hook 38.1.2 The Init File
after-init-time 38.1.1 Summary: Sequence of Actions at Startup
after-insert-file-functions 24.12.3 Piecemeal Specification
after-load-functions 15.10 Hooks for Loading
after-make-frame-functions 28.1 Creating Frames
after-revert-hook 25.3 Reverting
after-save-hook 24.2 Saving Buffers
after-setting-font-hook Appendix H Standard Hooks
after-string (overlay property) 37.9.2 Overlay Properties
alias, for coding systems 32.10.1 Basic Concepts of Coding Systems
alias, for faces 37.12.6 Functions for Working with Faces
alias, for functions 12.4 Defining Functions
alias, for variables 11.13 Variable Aliases
alist 5.8 Association Lists
alist vs. plist 5.9.1 Property Lists and Association Lists
all-completions 19.6.1 Basic Completion Functions
alpha, a frame parameter 28.3.3.8 Font and Color Parameters
alt characters 2.3.3.5 Other Character Modifier Bits
alternatives, defining 20.2.4 Select among Command Alternatives
and 10.3 Constructs for Combining Conditions
animation 37.17.10 Multi-Frame Images
anonymous face 37.12 Faces
anonymous function 12.7 Anonymous Functions
apostrophe for quoting 9.3 Quoting
append 5.4 Building Cons Cells and Lists
append-to-file 24.4 Writing to Files
apply 12.5 Calling Functions
apply, and debugging 17.1.8 Internals of the Debugger
apply-partially 12.5 Calling Functions
applying customizations 14.5 Applying Customizations
apropos 23.5 Help Functions
aref 6.3 Functions that Operate on Arrays
args, customization keyword 14.4.2 Composite Types
argument 12.1 What Is a Function?
argument binding 12.2.3 Other Features of Argument Lists
argument lists, features 12.2.3 Other Features of Argument Lists
arguments for shell commands 36.2 Shell Arguments
arguments, interactive entry 20.2.1 Using interactive
arguments, reading 19 Minibuffers
argv 38.1.4 Command-Line Arguments
arith-error example 10.5.3.3 Writing Code to Handle Errors
arith-error in division 3.6 Arithmetic Operations
arithmetic operations 3.6 Arithmetic Operations
arithmetic shift 3.8 Bitwise Operations on Integers
array 6.2 Arrays
array elements 6.3 Functions that Operate on Arrays
arrayp 6.3 Functions that Operate on Arrays
ASCII character codes 2.3.3 Character Type
ASCII control characters 37.21.1 Usual Display Conventions
ascii-case-table 4.9 The Case Table
aset 6.3 Functions that Operate on Arrays
ash 3.8 Bitwise Operations on Integers
asin 3.9 Standard Mathematical Functions
ask-user-about-lock 24.5 File Locks
ask-user-about-supersession-threat 26.6 Buffer Modification Time
asking the user questions 19.7 Yes-or-No Queries
assoc 5.8 Association Lists
assoc-default 5.8 Association Lists
assoc-string 4.5 Comparison of Characters and Strings
association list 5.8 Association Lists
assq 5.8 Association Lists
assq-delete-all 5.8 Association Lists
asynchronous subprocess 36.4 Creating an Asynchronous Process
atan 3.9 Standard Mathematical Functions
atom 5.2 Predicates on Lists
atomic changes 31.27 Atomic Change Groups
atoms 2.3.6 Cons Cell and List Types
attributes of text 31.19 Text Properties
Auto Fill mode 31.14 Auto Filling
auto-coding-alist 32.10.5 Default Coding Systems
auto-coding-functions 32.10.5 Default Coding Systems
auto-coding-regexp-alist 32.10.5 Default Coding Systems
auto-fill-chars 31.14 Auto Filling
auto-fill-function 31.14 Auto Filling
auto-hscroll-mode 27.22 Horizontal Scrolling
auto-lower, a frame parameter 28.3.3.6 Window Management Parameters
auto-mode-alist 22.2.2 How Emacs Chooses a Major Mode
auto-raise, a frame parameter 28.3.3.6 Window Management Parameters
auto-raise-tool-bar-buttons 21.17.6 Tool bars
auto-resize-tool-bars 21.17.6 Tool bars
auto-save-default 25.2 Auto-Saving
auto-save-file-name-p 25.2 Auto-Saving
auto-save-hook 25.2 Auto-Saving
auto-save-interval 25.2 Auto-Saving
auto-save-list-file-name 25.2 Auto-Saving
auto-save-list-file-prefix 25.2 Auto-Saving
auto-save-mode 25.2 Auto-Saving
auto-save-timeout 25.2 Auto-Saving
auto-save-visited-file-name 25.2 Auto-Saving
auto-window-vscroll 27.21 Vertical Fractional Scrolling
autoload 15.5 Autoload
autoload 15.5 Autoload
autoload cookie 15.5 Autoload
autoload errors 15.5 Autoload
autoload object 12.1 What Is a Function?
autoload-do-load 15.5 Autoload
autoloadp 15.5 Autoload
automatic face assignment 37.12.7 Automatic Face Assignment
automatically buffer-local 11.10.1 Introduction to Buffer-Local Variables

B
back-to-indentation 31.17.6 Indentation-Based Motion Commands
background-color, a frame parameter 28.3.3.8 Font and Color Parameters
background-mode, a frame parameter 28.3.3.8 Font and Color Parameters
backing store 28.23 Display Feature Testing
backquote (list substitution) 9.4 Backquote
backslash in character constants 2.3.3.2 General Escape Syntax
backslash in regular expressions 33.3.1.3 Backslash Constructs in Regular Expressions
backslash in strings 2.3.8.1 Syntax for Strings
backslash in symbols 2.3.4 Symbol Type
backspace 2.3.3.1 Basic Char Syntax
backtrace 17.1.8 Internals of the Debugger
backtrace-debug 17.1.8 Internals of the Debugger
backtrace-frame 17.1.8 Internals of the Debugger
backtracking 17.2.15.3 Backtracking in Specifications
backtracking and POSIX regular expressions 33.5 POSIX Regular Expression Searching
backtracking and regular expressions 33.3.1.1 Special Characters in Regular Expressions
backup file 25.1 Backup Files
backup files, rename or copy 25.1.2 Backup by Renaming or by Copying?
backup-buffer 25.1.1 Making Backup Files
backup-by-copying 25.1.2 Backup by Renaming or by Copying?
backup-by-copying-when-linked 25.1.2 Backup by Renaming or by Copying?
backup-by-copying-when-mismatch 25.1.2 Backup by Renaming or by Copying?
backup-by-copying-when-privileged-mismatch 25.1.2 Backup by Renaming or by Copying?
backup-directory-alist 25.1.1 Making Backup Files
backup-enable-predicate 25.1.1 Making Backup Files
backup-file-name-p 25.1.4 Naming Backup Files
backup-inhibited 25.1.1 Making Backup Files
backups and auto-saving 25 Backups and Auto-Saving
backward-button 37.18.5 Button Buffer Commands
backward-char 29.2.1 Motion by Characters
backward-delete-char-untabify 31.6 Deleting Text
backward-delete-char-untabify-method 31.6 Deleting Text
backward-list 29.2.6 Moving over Balanced Expressions
backward-prefix-chars 34.5 Motion and Syntax
backward-sexp 29.2.6 Moving over Balanced Expressions
backward-to-indentation 31.17.6 Indentation-Based Motion Commands
backward-word 29.2.2 Motion by Words
balance-windows 27.4 Resizing Windows
balance-windows-area 27.4 Resizing Windows
balanced parenthesis motion 29.2.6 Moving over Balanced Expressions
balancing parentheses 37.20 Blinking Parentheses
balancing window sizes 27.4 Resizing Windows
barf-if-buffer-read-only 26.7 Read-Only Buffers
base 64 encoding 31.24 Base 64 Encoding
base buffer 26.11 Indirect Buffers
base coding system 32.10.1 Basic Concepts of Coding Systems
base direction of a paragraph 37.24 Bidirectional Display
base for reading an integer 3.1 Integer Basics
base location, package archive 39.4 Creating and Maintaining Package Archives
base remapping, faces 37.12.5 Face Remapping
base64-decode-region 31.24 Base 64 Encoding
base64-decode-string 31.24 Base 64 Encoding
base64-encode-region 31.24 Base 64 Encoding
base64-encode-string 31.24 Base 64 Encoding
basic code (of input character) 20.7.1 Keyboard Events
basic faces 37.12.8 Basic Faces
batch mode 38.16 Batch Mode
batch-byte-compile 16.2 Byte-Compilation Functions
baud, in serial connections 36.19 Communicating with Serial Ports
baud-rate 38.13 Terminal Output
beep 37.22 Beeping
before point, insertion 31.4 Inserting Text
before-change-functions 31.28 Change Hooks
before-hack-local-variables-hook 11.11 File Local Variables
before-init-hook 38.1.2 The Init File
before-init-time 38.1.1 Summary: Sequence of Actions at Startup
before-make-frame-hook 28.1 Creating Frames
before-revert-hook 25.3 Reverting
before-save-hook 24.2 Saving Buffers
before-string (overlay property) 37.9.2 Overlay Properties
beginning of line 29.2.4 Motion by Text Lines
beginning of line in regexp 33.3.1.1 Special Characters in Regular Expressions
beginning-of-buffer 29.2.3 Motion to an End of the Buffer
beginning-of-defun 29.2.6 Moving over Balanced Expressions
beginning-of-defun-function 29.2.6 Moving over Balanced Expressions
beginning-of-line 29.2.4 Motion by Text Lines
bell 37.22 Beeping
bell character 2.3.3.1 Basic Char Syntax
benchmark.el 17.5 Profiling
benchmarking 17.5 Profiling
bidi-display-reordering 37.24 Bidirectional Display
bidi-paragraph-direction 37.24 Bidirectional Display
bidi-string-mark-left-to-right 37.24 Bidirectional Display
bidirectional class of characters 32.6 Character Properties
bidirectional display 37.24 Bidirectional Display
bidirectional reordering 37.24 Bidirectional Display
big endian 36.20.1 Describing Data Layout
binary coding system 32.10.1 Basic Concepts of Coding Systems
bindat-get-field 36.20.2 Functions to Unpack and Pack Bytes
bindat-ip-to-string 36.20.2 Functions to Unpack and Pack Bytes
bindat-length 36.20.2 Functions to Unpack and Pack Bytes
bindat-pack 36.20.2 Functions to Unpack and Pack Bytes
bindat-unpack 36.20.2 Functions to Unpack and Pack Bytes
binding arguments 12.2.3 Other Features of Argument Lists
binding local variables 11.3 Local Variables
binding of a key 21.2 Keymap Basics
bitmap-spec-p 37.12.1 Face Attributes
bitmaps, fringe 37.13.4 Fringe Bitmaps
bitwise arithmetic 3.8 Bitwise Operations on Integers
blink-cursor-alist 28.3.3.7 Cursor Parameters
blink-matching-delay 37.20 Blinking Parentheses
blink-matching-open 37.20 Blinking Parentheses
blink-matching-paren 37.20 Blinking Parentheses
blink-matching-paren-distance 37.20 Blinking Parentheses
blink-paren-function 37.20 Blinking Parentheses
blinking parentheses 37.20 Blinking Parentheses
bobp 31.1 Examining Text Near Point
body height of a window 27.3 Window Sizes
body of a window 27.3 Window Sizes
body of function 12.2.1 Components of a Lambda Expression
body size of a window 27.3 Window Sizes
body width of a window 27.3 Window Sizes
bolp 31.1 Examining Text Near Point
bool-vector-count-consecutive 6.7 Bool-vectors
bool-vector-count-population 6.7 Bool-vectors
bool-vector-exclusive-or 6.7 Bool-vectors
bool-vector-intersection 6.7 Bool-vectors
bool-vector-not 6.7 Bool-vectors
bool-vector-p 6.7 Bool-vectors
bool-vector-set-difference 6.7 Bool-vectors
bool-vector-subsetp 6.7 Bool-vectors
bool-vector-union 6.7 Bool-vectors
Bool-vectors 6.7 Bool-vectors
boolean 1.3.2 nil and t
booleanp 1.3.2 nil and t
border-color, a frame parameter 28.3.3.8 Font and Color Parameters
border-width, a frame parameter 28.3.3.4 Layout Parameters
bottom dividers 37.15 Window Dividers
bottom-divider-width, a frame parameter 28.3.3.4 Layout Parameters
boundp 11.4 When a Variable is “Void”
box diagrams, for lists 2.3.6.1 Drawing Lists as Box Diagrams
break 17.1 The Lisp Debugger
breakpoints (Edebug) 17.2.6.1 Edebug Breakpoints
bucket (in obarray) 8.3 Creating and Interning Symbols
buffer 26 Buffers
buffer boundaries, indicating 37.13.2 Fringe Indicators
buffer contents 31 Text
buffer file name 26.4 Buffer File Name
buffer gap 26.13 The Buffer Gap
buffer input stream 18.2 Input Streams
buffer internals E.7.1 Buffer Internals
buffer list 26.8 The Buffer List
buffer modification 26.5 Buffer Modification
buffer names 26.3 Buffer Names
buffer output stream 18.4 Output Streams
buffer portion as string 31.2 Examining Buffer Contents
buffer position 29 Positions
buffer text notation 1.3.6 Buffer Text Notation
buffer, read-only 26.7 Read-Only Buffers
buffer-access-fontified-property 31.19.7 Lazy Computation of Text Properties
buffer-access-fontify-functions 31.19.7 Lazy Computation of Text Properties
buffer-auto-save-file-format 24.12.2 Round-Trip Specification
buffer-auto-save-file-name 25.2 Auto-Saving
buffer-backed-up 25.1.1 Making Backup Files
buffer-base-buffer 26.11 Indirect Buffers
buffer-chars-modified-tick 26.5 Buffer Modification
buffer-disable-undo 31.10 Maintaining Undo Lists
buffer-display-count 27.10 Buffers and Windows
buffer-display-table 37.21.3 Active Display Table
buffer-display-time 27.10 Buffers and Windows
buffer-enable-undo 31.10 Maintaining Undo Lists
buffer-end 29.1 Point
buffer-file-coding-system 32.10.2 Encoding and I/O
buffer-file-format 24.12.2 Round-Trip Specification
buffer-file-name 26.4 Buffer File Name
buffer-file-name 26.4 Buffer File Name
buffer-file-number 26.4 Buffer File Name
buffer-file-truename 26.4 Buffer File Name
buffer-invisibility-spec 37.6 Invisible Text
buffer-list 26.8 The Buffer List
buffer-list, a frame parameter 28.3.3.5 Buffer Parameters
buffer-list-update-hook 26.8 The Buffer List
buffer-list-update-hook Appendix H Standard Hooks
buffer-live-p 26.10 Killing Buffers
buffer-local variables 11.10 Buffer-Local Variables
buffer-local variables in modes 22.2.1 Major Mode Conventions
buffer-local-value 11.10.2 Creating and Deleting Buffer-Local Bindings
buffer-local-variables 11.10.2 Creating and Deleting Buffer-Local Bindings
buffer-modified-p 26.5 Buffer Modification
buffer-modified-tick 26.5 Buffer Modification
buffer-name 26.3 Buffer Names
buffer-name-history 19.4 Minibuffer History
buffer-narrowed-p 29.4 Narrowing
buffer-offer-save 26.10 Killing Buffers
buffer-predicate, a frame parameter 28.3.3.5 Buffer Parameters
buffer-quit-function Appendix H Standard Hooks
buffer-read-only 26.7 Read-Only Buffers
buffer-save-without-query 26.10 Killing Buffers
buffer-saved-size 25.2 Auto-Saving
buffer-size 29.1 Point
buffer-stale-function 25.3 Reverting
buffer-string 31.2 Examining Buffer Contents
buffer-substring 31.2 Examining Buffer Contents
buffer-substring-filters 31.2 Examining Buffer Contents
buffer-substring-no-properties 31.2 Examining Buffer Contents
buffer-swap-text 26.12 Swapping Text Between Two Buffers
buffer-undo-list 31.9 Undo
bufferp 26.1 Buffer Basics
buffers to display on frame 28.3.3.5 Buffer Parameters
buffers without undo information 26.3 Buffer Names
buffers, controlled in windows 27.10 Buffers and Windows
buffers, creating 26.9 Creating Buffers
buffers, killing 26.10 Killing Buffers
bugs 1.1 Caveats
bugs in this manual 1.1 Caveats
building Emacs E.1 Building Emacs
building lists 5.4 Building Cons Cells and Lists
built-in function 12.1 What Is a Function?
bury-buffer 26.8 The Buffer List
butlast 5.3 Accessing Elements of Lists
button (button property) 37.18.1 Button Properties
button buffer commands 37.18.5 Button Buffer Commands
button properties 37.18.1 Button Properties
button types 37.18.2 Button Types
button-activate 37.18.4 Manipulating Buttons
button-at 37.18.4 Manipulating Buttons
button-down event 20.7.6 Button-Down Events
button-end 37.18.4 Manipulating Buttons
button-face, customization keyword 14.4.4 Type Keywords
button-get 37.18.4 Manipulating Buttons
button-has-type-p 37.18.4 Manipulating Buttons
button-label 37.18.4 Manipulating Buttons
button-prefix, customization keyword 14.4.4 Type Keywords
button-put 37.18.4 Manipulating Buttons
button-start 37.18.4 Manipulating Buttons
button-suffix, customization keyword 14.4.4 Type Keywords
button-type 37.18.4 Manipulating Buttons
button-type-get 37.18.4 Manipulating Buttons
button-type-put 37.18.4 Manipulating Buttons
button-type-subtype-p 37.18.4 Manipulating Buttons
buttons in buffers 37.18 Buttons
byte compilation 16 Byte Compilation
byte compiler warnings, how to avoid D.5 Tips for Avoiding Compiler Warnings
byte packing and unpacking 36.20 Packing and Unpacking Byte Arrays
byte to string 32.3 Converting Text Representations
byte-boolean-vars 11.14 Variables with Restricted Values
byte-boolean-vars E.6 Writing Emacs Primitives
byte-code 16 Byte Compilation
byte-code function 16.7 Byte-Code Function Objects
byte-code object 16.7 Byte-Code Function Objects
byte-code-function-p 12.1 What Is a Function?
byte-compile 16.2 Byte-Compilation Functions
byte-compile-dynamic 16.4 Dynamic Loading of Individual Functions
byte-compile-dynamic-docstrings 16.3 Documentation Strings and Compilation
byte-compile-file 16.2 Byte-Compilation Functions
byte-compiling macros 13.3 Macros and Byte Compilation
byte-compiling require 15.7 Features
byte-recompile-directory 16.2 Byte-Compilation Functions
byte-to-position 32.1 Text Representations
byte-to-string 32.3 Converting Text Representations
bytes 4 Strings and Characters
bytesize, in serial connections 36.19 Communicating with Serial Ports

C
C programming language E.5 C Dialect
C-c 21.6 Prefix Keys
C-g 20.11 Quitting
C-h 21.6 Prefix Keys
C-M-x 17.2.2 Instrumenting for Edebug
C-x 21.6 Prefix Keys
C-x 4 21.6 Prefix Keys
C-x 5 21.6 Prefix Keys
C-x 6 21.6 Prefix Keys
C-x RET 21.6 Prefix Keys
C-x v 21.6 Prefix Keys
C-x X = 17.2.13 Coverage Testing
caar 5.3 Accessing Elements of Lists
cadr 5.3 Accessing Elements of Lists
calendrical computations 38.9 Time Calculations
calendrical information 38.6 Time Conversion
call stack 17.1.8 Internals of the Debugger
call-interactively 20.3 Interactive Call
call-process 36.3 Creating a Synchronous Process
call-process, command-line arguments from minibuffer 36.2 Shell Arguments
call-process-region 36.3 Creating a Synchronous Process
call-process-shell-command 36.3 Creating a Synchronous Process
called-interactively-p 20.4 Distinguish Interactive Calls
calling a function 12.5 Calling Functions
cancel-change-group 31.27 Atomic Change Groups
cancel-debug-on-entry 17.1.3 Entering the Debugger on a Function Call
cancel-timer 38.10 Timers for Delayed Execution
capitalization 4.8 Case Conversion in Lisp
capitalize 4.8 Case Conversion in Lisp
capitalize-region 31.18 Case Changes
capitalize-word 31.18 Case Changes
car 5.3 Accessing Elements of Lists
car-safe 5.3 Accessing Elements of Lists
case conversion in buffers 31.18 Case Changes
case conversion in Lisp 4.8 Case Conversion in Lisp
case in replacements 33.6.1 Replacing the Text that Matched
case-fold-search 33.2 Searching and Case
case-replace 33.2 Searching and Case
case-table-p 4.9 The Case Table
catch 10.5.1 Explicit Nonlocal Exits: catch and throw
categories of characters 34.8 Categories
category (overlay property) 37.9.2 Overlay Properties
category (text property) 31.19.4 Properties with Special Meanings
category set 34.8 Categories
category table 34.8 Categories
category, regexp search for 33.3.1.3 Backslash Constructs in Regular Expressions
category-docstring 34.8 Categories
category-set-mnemonics 34.8 Categories
category-table 34.8 Categories
category-table-p 34.8 Categories
cdar 5.3 Accessing Elements of Lists
cddr 5.3 Accessing Elements of Lists
cdr 5.3 Accessing Elements of Lists
cdr-safe 5.3 Accessing Elements of Lists
ceiling 3.5 Numeric Conversions
centering point 27.20 Textual Scrolling
change hooks 31.28 Change Hooks
change hooks for a character 31.19.4 Properties with Special Meanings
change load-path at configure time E.1 Building Emacs
change-major-mode-after-body-hook 22.2.6 Mode Hooks
change-major-mode-hook 11.10.2 Creating and Deleting Buffer-Local Bindings
changing key bindings 21.12 Changing Key Bindings
changing text properties 31.19.2 Changing Text Properties
changing to another buffer 26.2 The Current Buffer
changing window size 27.4 Resizing Windows
char-after 31.1 Examining Text Near Point
char-before 31.1 Examining Text Near Point
char-category-set 34.8 Categories
char-charset 32.7 Character Sets
char-code-property-description 32.6 Character Properties
char-displayable-p 37.12.11 Fontsets
char-equal 4.5 Comparison of Characters and Strings
char-or-string-p 4.2 Predicates for Strings
char-property-alias-alist 31.19.1 Examining Text Properties
char-script-table 32.6 Character Properties
char-syntax 34.3 Syntax Table Functions
char-table length 6.1 Sequences
char-table-extra-slot 6.6 Char-Tables
char-table-p 6.6 Char-Tables
char-table-parent 6.6 Char-Tables
char-table-range 6.6 Char-Tables
char-table-subtype 6.6 Char-Tables
char-tables 6.6 Char-Tables
char-to-string 4.6 Conversion of Characters and Strings
char-width 37.10 Size of Displayed Text
char-width-table 32.6 Character Properties
character alternative (in regexp) 33.3.1.1 Special Characters in Regular Expressions
character arrays 4 Strings and Characters
character case 4.8 Case Conversion in Lisp
character categories 34.8 Categories
character classes in regexp 33.3.1.2 Character Classes
character code conversion 32.10.1 Basic Concepts of Coding Systems
character codepoint 32.1 Text Representations
character codes 32.5 Character Codes
character insertion 31.5 User-Level Insertion Commands
character printing 23.4 Describing Characters for Help Messages
character properties 32.6 Character Properties
character set, searching 32.8 Scanning for Character Sets
character sets 32.7 Character Sets
character to string 4.6 Conversion of Characters and Strings
character translation tables 32.9 Translation of Characters
character width on display 37.10 Size of Displayed Text
characterp 32.5 Character Codes
characters 4 Strings and Characters
characters for interactive codes 20.2.2 Code Characters for interactive
characters, multi-byte 32 Non-ASCII Characters
characters, representation in buffers and strings 32.1 Text Representations
charset 32.7 Character Sets
charset, coding systems to encode 32.10.3 Coding Systems in Lisp
charset, text property 32.10.7 Explicit Encoding and Decoding
charset-after 32.8 Scanning for Character Sets
charset-list 32.7 Character Sets
charset-plist 32.7 Character Sets
charset-priority-list 32.7 Character Sets
charsetp 32.7 Character Sets
charsets supported by a coding system 32.10.3 Coding Systems in Lisp
check-coding-system 32.10.3 Coding Systems in Lisp
check-coding-systems-region 32.10.3 Coding Systems in Lisp
checkdoc-minor-mode D.6 Tips for Documentation Strings
child process 36 Processes
child window 27.2 Windows and Frames
circular list 5.1 Lists and Cons Cells
circular structure, read syntax 2.5 Read Syntax for Circular Objects
cl 1.2 Lisp History
CL note—allocate more storage E.3 Garbage Collection
CL note—case of letters 2.3.4 Symbol Type
CL note—default optional arg 12.2.3 Other Features of Argument Lists
CL note—integers vrs eq 3.4 Comparison of Numbers
CL note—interning existing symbol 8.3 Creating and Interning Symbols
CL note—lack union, intersection 5.7 Using Lists as Sets
CL note—no continuable errors 10.5.3.1 How to Signal an Error
CL note—no setf functions 11.15.2 Defining new setf forms
CL note—only throw in Emacs 10.5.1 Explicit Nonlocal Exits: catch and throw
CL note—rplaca vs setcar 5.6 Modifying Existing List Structure
CL note—special forms compared 9.2.7 Special Forms
CL note—symbol in obarrays 8.3 Creating and Interning Symbols
classification of file types 24.6.2 Distinguishing Kinds of Files
classifying events 20.7.12 Classifying Events
cleanup forms 10.5.4 Cleaning Up from Nonlocal Exits
clear-abbrev-table 35.1 Abbrev Tables
clear-image-cache 37.17.11 Image Cache
clear-string 4.4 Modifying Strings
clear-this-command-keys 20.5 Information from the Command Loop
clear-visited-file-modtime 26.6 Buffer Modification Time
click event 20.7.4 Click Events
clickable buttons in buffers 37.18 Buttons
clickable text 31.19.8 Defining Clickable Text
clipboard 28.18 Window System Selections
clipboard support (for MS-Windows) 28.18 Window System Selections
clone-indirect-buffer 26.11 Indirect Buffers
closure 12.9 Closures
closures, example of using 11.9.3 Lexical Binding
clrhash 7.2 Hash Table Access
coded character set 32.7 Character Sets
codepoint, largest value 32.5 Character Codes
codes, interactive, description of 20.2.2 Code Characters for interactive
codespace 32.1 Text Representations
coding conventions in Emacs Lisp D.1 Emacs Lisp Coding Conventions
coding standards Appendix D Tips and Conventions
coding system 32.10 Coding Systems
coding system for operation 32.10.6 Specifying a Coding System for One Operation
coding system, automatically determined 32.10.5 Default Coding Systems
coding system, validity check 32.10.3 Coding Systems in Lisp
coding systems for encoding a string 32.10.3 Coding Systems in Lisp
coding systems for encoding region 32.10.3 Coding Systems in Lisp
coding systems, priority 32.10.6 Specifying a Coding System for One Operation
coding-system-aliases 32.10.1 Basic Concepts of Coding Systems
coding-system-change-eol-conversion 32.10.3 Coding Systems in Lisp
coding-system-change-text-conversion 32.10.3 Coding Systems in Lisp
coding-system-charset-list 32.10.3 Coding Systems in Lisp
coding-system-eol-type 32.10.3 Coding Systems in Lisp
coding-system-for-read 32.10.6 Specifying a Coding System for One Operation
coding-system-for-write 32.10.6 Specifying a Coding System for One Operation
coding-system-get 32.10.1 Basic Concepts of Coding Systems
coding-system-list 32.10.3 Coding Systems in Lisp
coding-system-p 32.10.3 Coding Systems in Lisp
coding-system-priority-list 32.10.6 Specifying a Coding System for One Operation
collapse-delayed-warnings 37.5.4 Delayed Warnings
color names 28.20 Color Names
color-defined-p 28.20 Color Names
color-gray-p 28.20 Color Names
color-supported-p 28.20 Color Names
color-values 28.20 Color Names
colors on text terminals 28.21 Text Terminal Colors
columns 31.16 Counting Columns
COM1 36.19 Communicating with Serial Ports
combine-after-change-calls 31.28 Change Hooks
combine-and-quote-strings 36.2 Shell Arguments
combining conditions 10.3 Constructs for Combining Conditions
command 12.1 What Is a Function?
command descriptions 1.3.7.1 A Sample Function Description
command history 20.15 Command History
command in keymap 21.10 Key Lookup
command loop 20 Command Loop
command loop variables 20.5 Information from the Command Loop
command loop, recursive 20.13 Recursive Editing
command-debug-status 17.1.8 Internals of the Debugger
command-error-function 10.5.3.2 How Emacs Processes Errors
command-execute 20.3 Interactive Call
command-history 20.15 Command History
command-line 38.1.4 Command-Line Arguments
command-line arguments 38.1.4 Command-Line Arguments
command-line options 38.1.4 Command-Line Arguments
command-line-args 38.1.4 Command-Line Arguments
command-line-args-left 38.1.4 Command-Line Arguments
command-line-functions 38.1.4 Command-Line Arguments
command-line-processed 38.1.4 Command-Line Arguments
command-remapping 21.13 Remapping Commands
command-switch-alist 38.1.4 Command-Line Arguments
commandp 20.3 Interactive Call
commandp example 19.6.4 High-Level Completion Functions
commands, defining 20.2 Defining Commands
comment style 34.2.2 Syntax Flags
comment syntax 34.2.1 Table of Syntax Classes
commentary, in a Lisp library D.8 Conventional Headers for Emacs Libraries
comments 2.2 Comments
comments, Lisp convention for D.7 Tips on Writing Comments
Common Lisp 1.2 Lisp History
compare-buffer-substrings 31.3 Comparing Text
compare-strings 4.5 Comparison of Characters and Strings
compare-window-configurations 27.24 Window Configurations
comparing buffer text 31.3 Comparing Text
comparing file modification time 26.6 Buffer Modification Time
comparing numbers 3.4 Comparison of Numbers
comparing time values 38.9 Time Calculations
compilation (Emacs Lisp) 16 Byte Compilation
compilation functions 16.2 Byte-Compilation Functions
compile-defun 16.2 Byte-Compilation Functions
compile-time constant 16.5 Evaluation During Compilation
compiled function 16.7 Byte-Code Function Objects
compiler errors 16.6 Compiler Errors
complete key 21.2 Keymap Basics
completing-read 19.6.2 Completion and the Minibuffer
completing-read-function 19.6.2 Completion and the Minibuffer
completion 19.6 Completion
completion styles 19.6.6 Completion Variables
completion table 19.6.1 Basic Completion Functions
completion table, modifying 19.6.1 Basic Completion Functions
completion tables, combining 19.6.1 Basic Completion Functions
completion, file name 24.8.6 File Name Completion
completion-at-point 19.6.8 Completion in Ordinary Buffers
completion-at-point-functions 19.6.8 Completion in Ordinary Buffers
completion-auto-help 19.6.3 Minibuffer Commands that Do Completion
completion-boundaries 19.6.1 Basic Completion Functions
completion-category-overrides 19.6.6 Completion Variables
completion-extra-properties 19.6.6 Completion Variables
completion-ignore-case 19.6.1 Basic Completion Functions
completion-ignored-extensions 24.8.6 File Name Completion
completion-in-region 19.6.8 Completion in Ordinary Buffers
completion-regexp-list 19.6.1 Basic Completion Functions
completion-styles 19.6.6 Completion Variables
completion-styles-alist 19.6.6 Completion Variables
completion-table-case-fold 19.6.1 Basic Completion Functions
completion-table-dynamic 19.6.7 Programmed Completion
completion-table-in-turn 19.6.1 Basic Completion Functions
completion-table-merge 19.6.1 Basic Completion Functions
completion-table-subvert 19.6.1 Basic Completion Functions
completion-table-with-cache 19.6.7 Programmed Completion
completion-table-with-predicate 19.6.1 Basic Completion Functions
completion-table-with-quoting 19.6.1 Basic Completion Functions
completion-table-with-terminator 19.6.1 Basic Completion Functions
complex arguments 19 Minibuffers
complex command 20.15 Command History
composite types (customization) 14.4.2 Composite Types
composition (text property) 31.19.4 Properties with Special Meanings
composition property, and point display 20.6 Adjusting Point After Commands
compute-motion 29.2.5 Motion by Screen Lines
concat 4.3 Creating Strings
concatenating bidirectional strings 37.24 Bidirectional Display
concatenating lists 5.6.3 Functions that Rearrange Lists
concatenating strings 4.3 Creating Strings
cond 10.2 Conditionals
condition name 10.5.3.4 Error Symbols and Condition Names
condition-case 10.5.3.3 Writing Code to Handle Errors
condition-case-unless-debug 10.5.3.3 Writing Code to Handle Errors
conditional evaluation 10.2 Conditionals
conditional selection of windows 27.9 Cyclic Ordering of Windows
cons 5.4 Building Cons Cells and Lists
cons cells 5.4 Building Cons Cells and Lists
cons-cells-consed E.4 Memory Usage
consing 5.4 Building Cons Cells and Lists
consp 5.2 Predicates on Lists
constant variables 11.2 Variables that Never Change
constant variables 11.5 Defining Global Variables
constrain-to-field 31.19.9 Defining and Using Fields
content directory, package 39.1 Packaging Basics
continuation lines 37.3 Truncation
continue-process 36.8 Sending Signals to Processes
control character key constants 21.12 Changing Key Bindings
control character printing 23.4 Describing Characters for Help Messages
control characters 2.3.3.3 Control-Character Syntax
control characters in display 37.21.1 Usual Display Conventions
control characters, reading 20.8.5 Quoted Character Input
control structures 10 Control Structures
Control-X-prefix 21.6 Prefix Keys
controller part, model/view/controller 37.19.2 Abstract Display Example
controlling terminal 38.2.2 Suspending Emacs
controlling-tty-p 38.2.2 Suspending Emacs
conventions for writing major modes 22.2.1 Major Mode Conventions
conventions for writing minor modes 22.3.1 Conventions for Writing Minor Modes
conversion of strings 4.6 Conversion of Characters and Strings
convert-standard-filename 24.8.7 Standard File Names
converting file names from/to MS-Windows syntax 24.8 File Names
converting numbers 3.5 Numeric Conversions
coordinate, relative to frame 27.23 Coordinates and Windows
coordinates-in-window-p 27.23 Coordinates and Windows
copy-abbrev-table 35.1 Abbrev Tables
copy-alist 5.8 Association Lists
copy-category-table 34.8 Categories
copy-directory 24.10 Creating, Copying and Deleting Directories
copy-file 24.7 Changing File Names and Attributes
copy-hash-table 7.4 Other Hash Table Functions
copy-keymap 21.4 Creating Keymaps
copy-marker 30.3 Functions that Create Markers
copy-overlay 37.9.1 Managing Overlays
copy-region-as-kill 31.8.2 Functions for Killing
copy-sequence 6.1 Sequences
copy-syntax-table 34.3 Syntax Table Functions
copy-tree 5.4 Building Cons Cells and Lists
copying alists 5.8 Association Lists
copying files 24.7 Changing File Names and Attributes
copying lists 5.4 Building Cons Cells and Lists
copying sequences 6.1 Sequences
copying strings 4.3 Creating Strings
copying vectors 6.5 Functions for Vectors
copysign 3.2 Floating-Point Basics
cos 3.9 Standard Mathematical Functions
count-lines 29.2.4 Motion by Text Lines
count-loop 1.3.7.1 A Sample Function Description
count-screen-lines 29.2.5 Motion by Screen Lines
count-words 29.2.4 Motion by Text Lines
counting columns 31.16 Counting Columns
coverage testing 17.4 Test Coverage
coverage testing (Edebug) 17.2.13 Coverage Testing
create subprocess 36.1 Functions that Create Subprocesses
create-file-buffer 24.1.2 Subroutines of Visiting
create-fontset-from-fontset-spec 37.12.11 Fontsets
create-image 37.17.8 Defining Images
create-lockfiles 24.5 File Locks
creating buffers 26.9 Creating Buffers
creating hash tables 7.1 Creating Hash Tables
creating keymaps 21.4 Creating Keymaps
creating markers 30.3 Functions that Create Markers
creating strings 4.3 Creating Strings
creating, copying and deleting directories 24.10 Creating, Copying and Deleting Directories
cryptographic hash 31.25 Checksum/Hash
ctl-arrow 37.21.1 Usual Display Conventions
ctl-x-4-map 21.6 Prefix Keys
ctl-x-5-map 21.6 Prefix Keys
ctl-x-map 21.6 Prefix Keys
ctl-x-r-map Appendix G Standard Keymaps
current binding 11.3 Local Variables
current buffer 26.2 The Current Buffer
current buffer mark 30.7 The Mark
current buffer point and mark (Edebug) 17.2.14.2 Edebug Display Update
current buffer position 29.1 Point
current command 20.5 Information from the Command Loop
current stack frame 17.1.5 Using the Debugger
current-active-maps 21.7 Active Keymaps
current-bidi-paragraph-direction 37.24 Bidirectional Display
current-buffer 26.2 The Current Buffer
current-case-table 4.9 The Case Table
current-column 31.16 Counting Columns
current-fill-column 31.12 Margins for Filling
current-frame-configuration 28.12 Frame Configurations
current-global-map 21.9 Controlling the Active Keymaps
current-idle-time 38.11 Idle Timers
current-indentation 31.17.1 Indentation Primitives
current-input-method 32.11 Input Methods
current-input-mode 38.12.1 Input Modes
current-justification 31.11 Filling
current-kill 31.8.5 Low-Level Kill Ring
current-left-margin 31.12 Margins for Filling
current-local-map 21.9 Controlling the Active Keymaps
current-message 37.4.1 Displaying Messages in the Echo Area
current-minor-mode-maps 21.9 Controlling the Active Keymaps
current-prefix-arg 20.12 Prefix Command Arguments
current-time 38.5 Time of Day
current-time-string 38.5 Time of Day
current-time-zone 38.5 Time of Day
current-window-configuration 27.24 Window Configurations
current-word 31.2 Examining Buffer Contents
currying 12.5 Calling Functions
cursor 27.18 Windows and Point
cursor (text property) 31.19.4 Properties with Special Meanings
cursor position for display properties and overlays 31.19.4 Properties with Special Meanings
cursor, and frame parameters 28.3.3.7 Cursor Parameters
cursor, fringe 37.13.3 Fringe Cursors
cursor-color, a frame parameter 28.3.3.8 Font and Color Parameters
cursor-in-echo-area 37.4.4 Echo Area Customization
cursor-in-non-selected-windows 28.3.3.7 Cursor Parameters
cursor-type 28.3.3.7 Cursor Parameters
cursor-type 28.3.3.7 Cursor Parameters
cursor-type, a frame parameter 28.3.3.7 Cursor Parameters
cust-print 17.2.11 Printing in Edebug
custom themes 14.6 Custom Themes
custom-add-frequent-value 14.3 Defining Customization Variables
custom-initialize-delay E.1 Building Emacs
custom-known-themes 14.6 Custom Themes
custom-reevaluate-setting 14.3 Defining Customization Variables
custom-set-faces 14.5 Applying Customizations
custom-set-variables 14.5 Applying Customizations
custom-theme-p 14.6 Custom Themes
custom-theme-set-faces 14.6 Custom Themes
custom-theme-set-variables 14.6 Custom Themes
custom-unlispify-remove-prefixes 14.2 Defining Customization Groups
custom-variable-p 14.3 Defining Customization Variables
customizable variables, how to define 14.3 Defining Customization Variables
customization groups, defining 14.2 Defining Customization Groups
customization item 14 Customization Settings
customization keywords 14.1 Common Item Keywords
customization types 14.4 Customization Types
customization types, define new 14.4.5 Defining New Types
customize-package-emacs-version-alist 14.1 Common Item Keywords
cyclic ordering of windows 27.9 Cyclic Ordering of Windows
cygwin-convert-file-name-from-windows 24.8 File Names
cygwin-convert-file-name-to-windows 24.8 File Names

D
data type 2 Lisp Data Types
data-directory 23.5 Help Functions
datagrams 36.16 Datagrams
date-leap-year-p 38.9 Time Calculations
date-to-time 38.7 Parsing and Formatting Times
deactivate-mark 30.7 The Mark
deactivate-mark 30.7 The Mark
deactivate-mark-hook 30.7 The Mark
debug 17.1.7 Invoking the Debugger
debug-ignored-errors 17.1.1 Entering the Debugger on an Error
debug-on-entry 17.1.3 Entering the Debugger on a Function Call
debug-on-error 17.1.1 Entering the Debugger on an Error
debug-on-error use 10.5.3.2 How Emacs Processes Errors
debug-on-event 17.1.1 Entering the Debugger on an Error
debug-on-message 17.1.1 Entering the Debugger on an Error
debug-on-next-call 17.1.8 Internals of the Debugger
debug-on-quit 17.1.2 Debugging Infinite Loops
debug-on-signal 17.1.1 Entering the Debugger on an Error
debugger 17.1.8 Internals of the Debugger
debugger command list 17.1.6 Debugger Commands
debugger for Emacs Lisp 17.1 The Lisp Debugger
debugger, explicit entry 17.1.4 Explicit Entry to the Debugger
debugger-bury-or-kill 17.1.5 Using the Debugger
debugging errors 17.1.1 Entering the Debugger on an Error
debugging invalid Lisp syntax 17.3 Debugging Invalid Lisp Syntax
debugging lisp programs 17 Debugging Lisp Programs
debugging specific functions 17.1.3 Entering the Debugger on a Function Call
declare 12.13 The declare Form
declare 12.13 The declare Form
declare-function 12.14 Telling the Compiler that a Function is Defined
declare-function 12.14 Telling the Compiler that a Function is Defined
declaring functions 12.14 Telling the Compiler that a Function is Defined
decode process output 36.9.3 Decoding Process Output
decode-char 32.7 Character Sets
decode-coding-inserted-region 32.10.7 Explicit Encoding and Decoding
decode-coding-region 32.10.7 Explicit Encoding and Decoding
decode-coding-string 32.10.7 Explicit Encoding and Decoding
decode-time 38.6 Time Conversion
decoding file formats 24.12 File Format Conversion
decoding in coding systems 32.10.7 Explicit Encoding and Decoding
decrement field of register 2.3.6 Cons Cell and List Types
dedicated window 27.16 Dedicated Windows
def-edebug-spec 17.2.15.1 Instrumenting Macro Calls
defalias 12.4 Defining Functions
defalias-fset-function property 12.4 Defining Functions
default argument string 20.2.2 Code Characters for interactive
default coding system 32.10.5 Default Coding Systems
default coding system, functions to determine 32.10.5 Default Coding Systems
default init file 38.1.2 The Init File
default key binding 21.3 Format of Keymaps
default value 11.10.3 The Default Value of a Buffer-Local Variable
default value of char-table 6.6 Char-Tables
default-boundp 11.10.3 The Default Value of a Buffer-Local Variable
default-directory 24.8.4 Functions that Expand Filenames
default-file-modes 24.7 Changing File Names and Attributes
default-frame-alist 28.3.2 Initial Frame Parameters
default-input-method 32.11 Input Methods
default-justification 31.11 Filling
default-minibuffer-frame 28.8 Minibuffers and Frames
default-process-coding-system 32.10.5 Default Coding Systems
default-text-properties 31.19.1 Examining Text Properties
default-value 11.10.3 The Default Value of a Buffer-Local Variable
default.el 38.1.1 Summary: Sequence of Actions at Startup
defconst 11.5 Defining Global Variables
defcustom 14.3 Defining Customization Variables
defface 37.12.2 Defining Faces
defgroup 14.2 Defining Customization Groups
defimage 37.17.8 Defining Images
define customization group 14.2 Defining Customization Groups
define customization options 14.3 Defining Customization Variables
define hash comparisons 7.3 Defining Hash Comparisons
define image 37.17.8 Defining Images
define new customization types 14.4.5 Defining New Types
define-abbrev 35.2 Defining Abbrevs
define-abbrev-table 35.1 Abbrev Tables
define-alternatives 20.2.4 Select among Command Alternatives
define-button-type 37.18.2 Button Types
define-category 34.8 Categories
define-derived-mode 22.2.4 Defining Derived Modes
define-error 10.5.3.4 Error Symbols and Condition Names
define-error 10.5.3.4 Error Symbols and Condition Names
define-fringe-bitmap 37.13.5 Customizing Fringe Bitmaps
define-generic-mode 22.2.8 Generic Modes
define-globalized-minor-mode 22.3.3 Defining Minor Modes
define-hash-table-test 7.3 Defining Hash Comparisons
define-key 21.12 Changing Key Bindings
define-key-after 21.17.7 Modifying Menus
define-minor-mode 22.3.3 Defining Minor Modes
define-obsolete-face-alias 37.12.6 Functions for Working with Faces
define-obsolete-function-alias 12.11 Declaring Functions Obsolete
define-obsolete-variable-alias 11.13 Variable Aliases
define-package 39.3 Multi-file Packages
define-prefix-command 21.6 Prefix Keys
defined-colors 28.20 Color Names
defining a function 12.4 Defining Functions
defining abbrevs 35.2 Defining Abbrevs
defining commands 20.2 Defining Commands
defining customization variables in C E.6 Writing Emacs Primitives
defining faces 37.12.2 Defining Faces
defining Lisp variables in C E.6 Writing Emacs Primitives
defining macros 13.4 Defining Macros
defining menus 21.17.1 Defining Menus
defining tokens, SMIE 22.7.1.4 Defining Tokens
defining-kbd-macro 20.16 Keyboard Macros
definitions of symbols 8.2 Defining Symbols
defmacro 13.4 Defining Macros
defsubr, Lisp symbol for a primitive E.6 Writing Emacs Primitives
defsubst 12.12 Inline Functions
deftheme 14.6 Custom Themes
defun 12.4 Defining Functions
DEFUN, C macro to define Lisp primitives E.6 Writing Emacs Primitives
defun-prompt-regexp 29.2.6 Moving over Balanced Expressions
defvar 11.5 Defining Global Variables
defvar-local 11.10.2 Creating and Deleting Buffer-Local Bindings
defvaralias 11.13 Variable Aliases
DEFVAR_INT, DEFVAR_LISP, DEFVAR_BOOL E.6 Writing Emacs Primitives
delay-mode-hooks 22.2.6 Mode Hooks
delayed warnings 37.5.4 Delayed Warnings
delayed-warnings-hook 37.5.4 Delayed Warnings
delayed-warnings-hook Appendix H Standard Hooks
delayed-warnings-list 37.5.4 Delayed Warnings
delete 5.7 Using Lists as Sets
delete-and-extract-region 31.6 Deleting Text
delete-auto-save-file-if-necessary 25.2 Auto-Saving
delete-auto-save-files 25.2 Auto-Saving
delete-backward-char 31.6 Deleting Text
delete-blank-lines 31.7 User-Level Deletion Commands
delete-by-moving-to-trash 24.7 Changing File Names and Attributes
delete-by-moving-to-trash 24.10 Creating, Copying and Deleting Directories
delete-char 31.6 Deleting Text
delete-directory 24.10 Creating, Copying and Deleting Directories
delete-dups 5.7 Using Lists as Sets
delete-exited-processes 36.5 Deleting Processes
delete-field 31.19.9 Defining and Using Fields
delete-file 24.7 Changing File Names and Attributes
delete-frame 28.6 Deleting Frames
delete-frame event 20.7.10 Miscellaneous System Events
delete-frame-functions 28.6 Deleting Frames
delete-horizontal-space 31.7 User-Level Deletion Commands
delete-indentation 31.7 User-Level Deletion Commands
delete-minibuffer-contents 19.12 Minibuffer Contents
delete-old-versions 25.1.3 Making and Deleting Numbered Backup Files
delete-other-windows 27.6 Deleting Windows
delete-overlay 37.9.1 Managing Overlays
delete-process 36.5 Deleting Processes
delete-region 31.6 Deleting Text
delete-terminal 28.2 Multiple Terminals
delete-terminal-functions 28.2 Multiple Terminals
delete-to-left-margin 31.12 Margins for Filling
delete-trailing-whitespace 31.7 User-Level Deletion Commands
delete-window 27.6 Deleting Windows
delete-windows-on 27.6 Deleting Windows
deleting files 24.7 Changing File Names and Attributes
deleting frames 28.6 Deleting Frames
deleting list elements 5.7 Using Lists as Sets
deleting previous char 31.6 Deleting Text
deleting processes 36.5 Deleting Processes
deleting text vs killing 31.6 Deleting Text
deleting whitespace 31.7 User-Level Deletion Commands
deleting windows 27.6 Deleting Windows
delq 5.7 Using Lists as Sets
dependencies 39.1 Packaging Basics
derived mode 22.2.4 Defining Derived Modes
derived-mode-p 22.2.4 Defining Derived Modes
describe characters and events 23.4 Describing Characters for Help Messages
describe-bindings 21.16 Scanning Keymaps
describe-buffer-case-table 4.9 The Case Table
describe-categories 34.8 Categories
describe-current-display-table 37.21.2 Display Tables
describe-display-table 37.21.2 Display Tables
describe-mode 22.2.3 Getting Help about a Major Mode
describe-prefix-bindings 23.5 Help Functions
describe-syntax 34.3 Syntax Table Functions
description for interactive codes 20.2.2 Code Characters for interactive
description format 1.3.7 Format of Descriptions
deserializing 36.20 Packing and Unpacking Byte Arrays
desktop notifications 38.18 Desktop Notifications
desktop save mode 22.8 Desktop Save Mode
desktop-buffer-mode-handlers 22.8 Desktop Save Mode
desktop-save-buffer 22.8 Desktop Save Mode
destroy-fringe-bitmap 37.13.5 Customizing Fringe Bitmaps
destructive list operations 5.6 Modifying Existing List Structure
detect-coding-region 32.10.3 Coding Systems in Lisp
detect-coding-string 32.10.3 Coding Systems in Lisp
diagrams, boxed, for lists 2.3.6.1 Drawing Lists as Box Diagrams
dialog boxes 28.16 Dialog Boxes
digit-argument 20.12 Prefix Command Arguments
ding 37.22 Beeping
dir-locals-class-alist 11.12 Directory Local Variables
dir-locals-directory-cache 11.12 Directory Local Variables
dir-locals-file 11.12 Directory Local Variables
dir-locals-set-class-variables 11.12 Directory Local Variables
dir-locals-set-directory-class 11.12 Directory Local Variables
directory local variables 11.12 Directory Local Variables
directory name 24.8.3 Directory Names
directory part (of file name) 24.8.1 File Name Components
directory-file-name 24.8.3 Directory Names
directory-files 24.9 Contents of Directories
directory-files-and-attributes 24.9 Contents of Directories
directory-oriented functions 24.9 Contents of Directories
dired-kept-versions 25.1.3 Making and Deleting Numbered Backup Files
disable-command 20.14 Disabling Commands
disable-point-adjustment 20.6 Adjusting Point After Commands
disable-theme 14.6 Custom Themes
disabled 20.14 Disabling Commands
disabled command 20.14 Disabling Commands
disabled-command-function 20.14 Disabling Commands
disabling multibyte 32.2 Disabling Multibyte Characters
disabling undo 31.10 Maintaining Undo Lists
disassemble 16.8 Disassembled Byte-Code
disassembled byte-code 16.8 Disassembled Byte-Code
discard-input 20.8.6 Miscellaneous Event Input Features
discarding input 20.8.6 Miscellaneous Event Input Features
display (overlay property) 37.9.2 Overlay Properties
display (text property) 37.16 The display Property
display action 27.12 Choosing a Window for Display
display feature testing 28.23 Display Feature Testing
display margins 37.16.5 Displaying in the Margins
display message in echo area 37.4.1 Displaying Messages in the Echo Area
display name on X 28.2 Multiple Terminals
display properties, and bidi reordering of text 37.24 Bidirectional Display
display property, and point display 20.6 Adjusting Point After Commands
display specification 37.16 The display Property
display table 37.21.2 Display Tables
display, a frame parameter 28.3.3.1 Basic Parameters
display, abstract 37.19 Abstract Display
display, arbitrary objects 37.19 Abstract Display
display-backing-store 28.23 Display Feature Testing
display-buffer 27.12 Choosing a Window for Display
display-buffer-alist 27.12 Choosing a Window for Display
display-buffer-at-bottom 27.13 Action Functions for display-buffer
display-buffer-base-action 27.12 Choosing a Window for Display
display-buffer-below-selected 27.13 Action Functions for display-buffer
display-buffer-fallback-action 27.12 Choosing a Window for Display
display-buffer-in-previous-window 27.13 Action Functions for display-buffer
display-buffer-no-window 27.13 Action Functions for display-buffer
display-buffer-overriding-action 27.12 Choosing a Window for Display
display-buffer-pop-up-frame 27.13 Action Functions for display-buffer
display-buffer-pop-up-window 27.13 Action Functions for display-buffer
display-buffer-reuse-window 27.13 Action Functions for display-buffer
display-buffer-same-window 27.13 Action Functions for display-buffer
display-buffer-use-some-window 27.13 Action Functions for display-buffer
display-color-cells 28.23 Display Feature Testing
display-color-p 28.23 Display Feature Testing
display-completion-list 19.6.3 Minibuffer Commands that Do Completion
display-delayed-warnings 37.5.4 Delayed Warnings
display-graphic-p 28.23 Display Feature Testing
display-grayscale-p 28.23 Display Feature Testing
display-images-p 28.23 Display Feature Testing
display-message-or-buffer 37.4.1 Displaying Messages in the Echo Area
display-mm-dimensions-alist 28.23 Display Feature Testing
display-mm-height 28.23 Display Feature Testing
display-mm-width 28.23 Display Feature Testing
display-monitor-attributes-list 28.2 Multiple Terminals
display-mouse-p 28.23 Display Feature Testing
display-pixel-height 28.23 Display Feature Testing
display-pixel-width 28.23 Display Feature Testing
display-planes 28.23 Display Feature Testing
display-popup-menus-p 28.23 Display Feature Testing
display-save-under 28.23 Display Feature Testing
display-screens 28.23 Display Feature Testing
display-selections-p 28.23 Display Feature Testing
display-start position 27.19 The Window Start and End Positions
display-supports-face-attributes-p 28.23 Display Feature Testing
display-table-slot 37.21.2 Display Tables
display-type, a frame parameter 28.3.3.1 Basic Parameters
display-visual-class 28.23 Display Feature Testing
display-warning 37.5.1 Warning Basics
displaying a buffer 27.11 Switching to a Buffer in a Window
displaying faces 37.12.4 Displaying Faces
displays, multiple 28.2 Multiple Terminals
distinguish interactive calls 20.4 Distinguish Interactive Calls
dnd-protocol-alist 28.19 Drag and Drop
do-auto-save 25.2 Auto-Saving
DOC (documentation) file 23.1 Documentation Basics
doc, customization keyword 14.4.4 Type Keywords
doc-directory 23.2 Access to Documentation Strings
documentation 23.2 Access to Documentation Strings
documentation conventions 23.1 Documentation Basics
documentation for major mode 22.2.3 Getting Help about a Major Mode
documentation notation 1.3.3 Evaluation Notation
documentation of function 12.2.4 Documentation Strings of Functions
documentation strings 23 Documentation
documentation strings, conventions and tips D.6 Tips for Documentation Strings
documentation, keys in 23.3 Substituting Key Bindings in Documentation
documentation-property 23.2 Access to Documentation Strings
dolist 10.4 Iteration
dotimes 10.4 Iteration
dotimes-with-progress-reporter 37.4.2 Reporting Operation Progress
dotted list 5.1 Lists and Cons Cells
dotted lists (Edebug) 17.2.15.2 Specification List
dotted pair notation 2.3.6.2 Dotted Pair Notation
double-click events 20.7.7 Repeat Events
double-click-fuzz 20.7.7 Repeat Events
double-click-time 20.7.7 Repeat Events
double-quote in strings 2.3.8.1 Syntax for Strings
down-list 29.2.6 Moving over Balanced Expressions
downcase 4.8 Case Conversion in Lisp
downcase-region 31.18 Case Changes
downcase-word 31.18 Case Changes
downcasing in lookup-key 20.8.1 Key Sequence Input
drag and drop 28.19 Drag and Drop
drag event 20.7.5 Drag Events
drag-n-drop event 20.7.10 Miscellaneous System Events
dribble file 38.12.2 Recording Input
dump-emacs E.1 Building Emacs
dumping Emacs E.1 Building Emacs
dynamic binding 11.9 Scoping Rules for Variable Bindings
dynamic extent 11.9 Scoping Rules for Variable Bindings
dynamic libraries 38.20 Dynamically Loaded Libraries
dynamic loading of documentation 16.3 Documentation Strings and Compilation
dynamic loading of functions 16.4 Dynamic Loading of Individual Functions
dynamic scope 11.9 Scoping Rules for Variable Bindings
dynamic-library-alist 38.20 Dynamically Loaded Libraries

E
eager macro expansion 15.1 How Programs Do Loading
easy-menu-define 21.17.8 Easy Menu
easy-mmode-define-minor-mode 22.3.3 Defining Minor Modes
echo area 37.4 The Echo Area
echo area customization 37.4.4 Echo Area Customization
echo-area-clear-hook 37.4.4 Echo Area Customization
echo-keystrokes 37.4.4 Echo Area Customization
edebug 17.2.6.3 Source Breakpoints
Edebug debugging facility 17.2 Edebug
Edebug execution modes 17.2.3 Edebug Execution Modes
Edebug specification list 17.2.15.2 Specification List
edebug-all-defs 17.2.16 Edebug Options
edebug-all-forms 17.2.16 Edebug Options
edebug-continue-kbd-macro 17.2.16 Edebug Options
edebug-defun 17.2.2 Instrumenting for Edebug
edebug-display-freq-count 17.2.13 Coverage Testing
edebug-eval-macro-args 17.2.15.1 Instrumenting Macro Calls
edebug-eval-top-level-form 17.2.2 Instrumenting for Edebug
edebug-global-break-condition 17.2.16 Edebug Options
edebug-initial-mode 17.2.16 Edebug Options
edebug-on-error 17.2.16 Edebug Options
edebug-on-quit 17.2.16 Edebug Options
edebug-print-circle 17.2.11 Printing in Edebug
edebug-print-length 17.2.11 Printing in Edebug
edebug-print-level 17.2.11 Printing in Edebug
edebug-print-trace-after 17.2.12 Trace Buffer
edebug-print-trace-before 17.2.12 Trace Buffer
edebug-save-displayed-buffer-points 17.2.16 Edebug Options
edebug-save-windows 17.2.16 Edebug Options
edebug-set-global-break-condition 17.2.6.2 Global Break Condition
edebug-setup-hook 17.2.16 Edebug Options
edebug-sit-for-seconds 17.2.3 Edebug Execution Modes
edebug-temp-display-freq-count 17.2.13 Coverage Testing
edebug-test-coverage 17.2.16 Edebug Options
edebug-trace 17.2.16 Edebug Options
edebug-trace 17.2.12 Trace Buffer
edebug-tracing 17.2.12 Trace Buffer
edebug-unwrap-results 17.2.16 Edebug Options
edge detection, images 37.17.2 Image Descriptors
edit-and-eval-command 19.3 Reading Lisp Objects with the Minibuffer
editing types 2.4 Editing Types
editor command loop 20 Command Loop
eight-bit, a charset 32.7 Character Sets
electric-future-map 1.3.7.2 A Sample Variable Description
element (of list) 5 Lists
elements of sequences 6.1 Sequences
elp.el 17.5 Profiling
elt 6.1 Sequences
Emacs event standard notation 23.4 Describing Characters for Help Messages
Emacs process run time 38.8 Processor Run time
emacs, a charset 32.7 Character Sets
emacs-build-time 1.4 Version Information
emacs-init-time 38.8 Processor Run time
emacs-internal coding system 32.10.1 Basic Concepts of Coding Systems
emacs-lisp-docstring-fill-column D.6 Tips for Documentation Strings
emacs-major-version 1.4 Version Information
emacs-minor-version 1.4 Version Information
emacs-pid 38.3 Operating System Environment
emacs-save-session-functions 38.17 Session Management
emacs-session-restore 38.17 Session Management
emacs-startup-hook 38.1.2 The Init File
emacs-uptime 38.8 Processor Run time
emacs-version 1.4 Version Information
emacs-version 1.4 Version Information
EMACSLOADPATH environment variable 15.3 Library Search
empty lines, indicating 37.13.2 Fringe Indicators
empty list 2.3.6.1 Drawing Lists as Box Diagrams
empty region 30.8 The Region
emulation-mode-map-alists 21.9 Controlling the Active Keymaps
enable-command 20.14 Disabling Commands
enable-dir-local-variables 11.12 Directory Local Variables
enable-local-eval 11.11 File Local Variables
enable-local-variables 11.11 File Local Variables
enable-multibyte-characters 32.1 Text Representations
enable-multibyte-characters 32.2 Disabling Multibyte Characters
enable-recursive-minibuffers 19.13 Recursive Minibuffers
enable-theme 14.6 Custom Themes
encapsulation, ewoc 37.19 Abstract Display
encode-char 32.7 Character Sets
encode-coding-region 32.10.7 Explicit Encoding and Decoding
encode-coding-string 32.10.7 Explicit Encoding and Decoding
encode-time 38.6 Time Conversion
encoding file formats 24.12 File Format Conversion
encoding in coding systems 32.10.7 Explicit Encoding and Decoding
encrypted network connections 36.14 Network Connections
end of line in regexp 33.3.1.1 Special Characters in Regular Expressions
end-of-buffer 29.2.3 Motion to an End of the Buffer
end-of-defun 29.2.6 Moving over Balanced Expressions
end-of-defun-function 29.2.6 Moving over Balanced Expressions
end-of-file 18.3 Input Functions
end-of-line 29.2.4 Motion by Text Lines
end-of-line conversion 32.10.1 Basic Concepts of Coding Systems
endianness 36.20.1 Describing Data Layout
environment 9.1 Introduction to Evaluation
environment variable access 38.3 Operating System Environment
environment variables, subprocesses 36.1 Functions that Create Subprocesses
eobp 31.1 Examining Text Near Point
EOL conversion 32.10.1 Basic Concepts of Coding Systems
eol conversion of coding system 32.10.3 Coding Systems in Lisp
eol type of coding system 32.10.3 Coding Systems in Lisp
eolp 31.1 Examining Text Near Point
epoch 38.5 Time of Day
eq 2.7 Equality Predicates
eql 3.4 Comparison of Numbers
equal 2.7 Equality Predicates
equal-including-properties 2.7 Equality Predicates
equality 2.7 Equality Predicates
erase-buffer 31.6 Deleting Text
error 10.5.3.1 How to Signal an Error
error cleanup 10.5.4 Cleaning Up from Nonlocal Exits
error debugging 17.1.1 Entering the Debugger on an Error
error description 10.5.3.3 Writing Code to Handle Errors
error display 37.4 The Echo Area
error handler 10.5.3.3 Writing Code to Handle Errors
error in debug 17.1.7 Invoking the Debugger
error message notation 1.3.5 Error Messages
error name 10.5.3.4 Error Symbols and Condition Names
error symbol 10.5.3.4 Error Symbols and Condition Names
error-conditions 10.5.3.4 Error Symbols and Condition Names
error-message-string 10.5.3.3 Writing Code to Handle Errors
errors 10.5.3 Errors
ESC 21.11 Functions for Key Lookup
esc-map 21.6 Prefix Keys
ESC-prefix 21.6 Prefix Keys
escape (ASCII character) 2.3.3.1 Basic Char Syntax
escape characters 18.6 Variables Affecting Output
escape characters in printing 18.5 Output Functions
escape sequence 2.3.3.1 Basic Char Syntax
eval 9.5 Eval
eval during compilation 16.5 Evaluation During Compilation
eval, and debugging 17.1.8 Internals of the Debugger
eval-and-compile 16.5 Evaluation During Compilation
eval-buffer 9.5 Eval
eval-buffer (Edebug) 17.2.2 Instrumenting for Edebug
eval-current-buffer 9.5 Eval
eval-current-buffer (Edebug) 17.2.2 Instrumenting for Edebug
eval-defun (Edebug) 17.2.2 Instrumenting for Edebug
eval-expression (Edebug) 17.2.2 Instrumenting for Edebug
eval-expression-debug-on-error 17.1.1 Entering the Debugger on an Error
eval-expression-print-length 18.6 Variables Affecting Output
eval-expression-print-level 18.6 Variables Affecting Output
eval-minibuffer 19.3 Reading Lisp Objects with the Minibuffer
eval-region 9.5 Eval
eval-region (Edebug) 17.2.2 Instrumenting for Edebug
eval-when-compile 16.5 Evaluation During Compilation
evaluated expression argument 20.2.2 Code Characters for interactive
evaluation 9 Evaluation
evaluation error 11.3 Local Variables
evaluation list group 17.2.10 Evaluation List Buffer
evaluation notation 1.3.3 Evaluation Notation
evaluation of buffer contents 9.5 Eval
evaluation of special forms 9.2.7 Special Forms
evaporate (overlay property) 37.9.2 Overlay Properties
event printing 23.4 Describing Characters for Help Messages
event translation 20.8.3 Modifying and Translating Input Events
event type 20.7.12 Classifying Events
event, reading only one 20.8.2 Reading One Event
event-basic-type 20.7.12 Classifying Events
event-click-count 20.7.7 Repeat Events
event-convert-list 20.7.12 Classifying Events
event-end 20.7.13 Accessing Mouse Events
event-modifiers 20.7.12 Classifying Events
event-start 20.7.13 Accessing Mouse Events
eventp 20.7 Input Events
events 20.7 Input Events
ewoc 37.19 Abstract Display
ewoc-buffer 37.19.1 Abstract Display Functions
ewoc-collect 37.19.1 Abstract Display Functions
ewoc-create 37.19.1 Abstract Display Functions
ewoc-data 37.19.1 Abstract Display Functions
ewoc-delete 37.19.1 Abstract Display Functions
ewoc-enter-after 37.19.1 Abstract Display Functions
ewoc-enter-before 37.19.1 Abstract Display Functions
ewoc-enter-first 37.19.1 Abstract Display Functions
ewoc-enter-last 37.19.1 Abstract Display Functions
ewoc-filter 37.19.1 Abstract Display Functions
ewoc-get-hf 37.19.1 Abstract Display Functions
ewoc-goto-next 37.19.1 Abstract Display Functions
ewoc-goto-node 37.19.1 Abstract Display Functions
ewoc-goto-prev 37.19.1 Abstract Display Functions
ewoc-invalidate 37.19.1 Abstract Display Functions
ewoc-locate 37.19.1 Abstract Display Functions
ewoc-location 37.19.1 Abstract Display Functions
ewoc-map 37.19.1 Abstract Display Functions
ewoc-next 37.19.1 Abstract Display Functions
ewoc-nth 37.19.1 Abstract Display Functions
ewoc-prev 37.19.1 Abstract Display Functions
ewoc-refresh 37.19.1 Abstract Display Functions
ewoc-set-data 37.19.1 Abstract Display Functions
ewoc-set-hf 37.19.1 Abstract Display Functions
examining text properties 31.19.1 Examining Text Properties
examining the interactive form 20.2.1 Using interactive
examining windows 27.10 Buffers and Windows
examples of using interactive 20.2.3 Examples of Using interactive
excess close parentheses 17.3.2 Excess Close Parentheses
excess open parentheses 17.3.1 Excess Open Parentheses
excursion 29.3 Excursions
exec-directory 36.1 Functions that Create Subprocesses
exec-path 36.1 Functions that Create Subprocesses
exec-suffixes 36.1 Functions that Create Subprocesses
executable-find 24.6.6 Locating Files in Standard Places
execute program 36.1 Functions that Create Subprocesses
execute with prefix argument 20.3 Interactive Call
execute-extended-command 20.3 Interactive Call
execute-kbd-macro 20.16 Keyboard Macros
executing-kbd-macro 20.16 Keyboard Macros
execution speed D.4 Tips for Making Compiled Code Fast
exit 20.13 Recursive Editing
exit recursive editing 20.13 Recursive Editing
exit-minibuffer 19.10 Minibuffer Commands
exit-recursive-edit 20.13 Recursive Editing
exiting Emacs 38.2 Getting Out of Emacs
exp 3.9 Standard Mathematical Functions
expand-abbrev 35.4 Looking Up and Expanding Abbreviations
expand-file-name 24.8.4 Functions that Expand Filenames
expanding abbrevs 35.4 Looking Up and Expanding Abbreviations
expansion of file names 24.8.4 Functions that Expand Filenames
expansion of macros 13.2 Expansion of a Macro Call
explicit selective display 37.7 Selective Display
expression 9.1 Introduction to Evaluation
expt 3.9 Standard Mathematical Functions
extended file attributes 24.6.5 Extended File Attributes
extended menu item 21.17.1.2 Extended Menu Items
extended-command-history 19.4 Minibuffer History
extent 11.9 Scoping Rules for Variable Bindings
extra slots of char-table 6.6 Char-Tables
extra-keyboard-modifiers 20.8.3 Modifying and Translating Input Events

F
face (button property) 37.18.1 Button Properties
face (overlay property) 37.9.2 Overlay Properties
face (text property) 31.19.4 Properties with Special Meanings
face alias 37.12.6 Functions for Working with Faces
face attributes 37.12.1 Face Attributes
face attributes, access and modification 37.12.3 Face Attribute Functions
face codes of text 31.19.4 Properties with Special Meanings
face merging 37.12.4 Displaying Faces
face name 37.12 Faces
face remapping 37.12.5 Face Remapping
face spec 37.12.2 Defining Faces
face-all-attributes 37.12.3 Face Attribute Functions
face-attribute 37.12.3 Face Attribute Functions
face-attribute-relative-p 37.12.3 Face Attribute Functions
face-background 37.12.3 Face Attribute Functions
face-bold-p 37.12.3 Face Attribute Functions
face-differs-from-default-p 37.12.6 Functions for Working with Faces
face-documentation 23.2 Access to Documentation Strings
face-documentation 37.12.6 Functions for Working with Faces
face-equal 37.12.6 Functions for Working with Faces
face-font 37.12.3 Face Attribute Functions
face-font-family-alternatives 37.12.9 Font Selection
face-font-registry-alternatives 37.12.9 Font Selection
face-font-rescale-alist 37.12.9 Font Selection
face-font-selection-order 37.12.9 Font Selection
face-foreground 37.12.3 Face Attribute Functions
face-id 37.12.6 Functions for Working with Faces
face-inverse-video-p 37.12.3 Face Attribute Functions
face-italic-p 37.12.3 Face Attribute Functions
face-list 37.12.6 Functions for Working with Faces
face-name-history 19.4 Minibuffer History
face-remap-add-relative 37.12.5 Face Remapping
face-remap-remove-relative 37.12.5 Face Remapping
face-remap-reset-base 37.12.5 Face Remapping
face-remap-set-base 37.12.5 Face Remapping
face-remapping-alist 37.12.5 Face Remapping
face-spec-set 37.12.2 Defining Faces
face-stipple 37.12.3 Face Attribute Functions
face-underline-p 37.12.3 Face Attribute Functions
facemenu-keymap 21.6 Prefix Keys
facep 37.12 Faces
faces 37.12 Faces
faces for font lock 22.6.7 Faces for Font Lock
faces, automatic choice 37.12.7 Automatic Face Assignment
false 1.3.2 nil and t
fboundp 12.8 Accessing Function Cell Contents
fceiling 3.7 Rounding Operations
feature-unload-function 15.9 Unloading
featurep 15.7 Features
features 15.7 Features
features 15.7 Features
fetch-bytecode 16.4 Dynamic Loading of Individual Functions
ffloor 3.7 Rounding Operations
field (overlay property) 37.9.2 Overlay Properties
field (text property) 31.19.4 Properties with Special Meanings
field width 4.7 Formatting Strings
field-beginning 31.19.9 Defining and Using Fields
field-end 31.19.9 Defining and Using Fields
field-string 31.19.9 Defining and Using Fields
field-string-no-properties 31.19.9 Defining and Using Fields
fields 31.19.9 Defining and Using Fields
fifo data structure 6.8 Managing a Fixed-Size Ring of Objects
file accessibility 24.6.1 Testing Accessibility
file age 24.6.4 File Attributes
file attributes 24.6.4 File Attributes
file classification 24.6.2 Distinguishing Kinds of Files
file contents, and default coding system 32.10.5 Default Coding Systems
file format conversion 24.12 File Format Conversion
file handler 24.11 Making Certain File Names “Magic”
file hard link 24.7 Changing File Names and Attributes
file local variables 11.11 File Local Variables
file locks 24.5 File Locks
file mode specification error 22.2.2 How Emacs Chooses a Major Mode
file modes 24.6.1 Testing Accessibility
file modes and MS-DOS 24.6.1 Testing Accessibility
file modes, setting 24.7 Changing File Names and Attributes
file modification time 24.6.4 File Attributes
file name abbreviations 24.8.3 Directory Names
file name completion subroutines 24.8.6 File Name Completion
file name of buffer 26.4 Buffer File Name
file name of directory 24.8.3 Directory Names
file name, and default coding system 32.10.5 Default Coding Systems
file names 24.8 File Names
file names in directory 24.9 Contents of Directories
file names, trailing whitespace 24.6 Information about Files
file notifications 38.19 Notifications on File Changes
file open error 24.1.2 Subroutines of Visiting
file permissions 24.6.1 Testing Accessibility
file permissions, setting 24.7 Changing File Names and Attributes
file symbolic links 24.6.2 Distinguishing Kinds of Files
file with multiple names 24.7 Changing File Names and Attributes
file, information about 24.6 Information about Files
file-accessible-directory-p 24.6.1 Testing Accessibility
file-acl 24.6.5 Extended File Attributes
file-already-exists 24.7 Changing File Names and Attributes
file-attributes 24.6.4 File Attributes
file-chase-links 24.6.3 Truenames
file-coding-system-alist 32.10.5 Default Coding Systems
file-directory-p 24.6.2 Distinguishing Kinds of Files
file-equal-p 24.6.3 Truenames
file-error 15.1 How Programs Do Loading
file-executable-p 24.6.1 Testing Accessibility
file-exists-p 24.6.1 Testing Accessibility
file-expand-wildcards 24.9 Contents of Directories
file-extended-attributes 24.6.5 Extended File Attributes
file-in-directory-p 24.6.3 Truenames
file-local-copy 24.11 Making Certain File Names “Magic”
file-local-variables-alist 11.11 File Local Variables
file-locked 24.5 File Locks
file-locked-p 24.5 File Locks
file-modes 24.6.1 Testing Accessibility
file-modes-symbolic-to-number 24.7 Changing File Names and Attributes
file-name encoding, MS-Windows 32.10.2 Encoding and I/O
file-name-absolute-p 24.8.2 Absolute and Relative File Names
file-name-all-completions 24.8.6 File Name Completion
file-name-as-directory 24.8.3 Directory Names
file-name-base 24.8.1 File Name Components
file-name-coding-system 32.10.2 Encoding and I/O
file-name-completion 24.8.6 File Name Completion
file-name-directory 24.8.1 File Name Components
file-name-extension 24.8.1 File Name Components
file-name-handler-alist 24.11 Making Certain File Names “Magic”
file-name-history 19.4 Minibuffer History
file-name-nondirectory 24.8.1 File Name Components
file-name-sans-extension 24.8.1 File Name Components
file-name-sans-versions 24.8.1 File Name Components
file-newer-than-file-p 24.6.4 File Attributes
file-newest-backup 25.1.4 Naming Backup Files
file-nlinks 24.6.4 File Attributes
file-notify-add-watch 38.19 Notifications on File Changes
file-notify-rm-watch 38.19 Notifications on File Changes
file-ownership-preserved-p 24.6.1 Testing Accessibility
file-precious-flag 24.2 Saving Buffers
file-readable-p 24.6.1 Testing Accessibility
file-regular-p 24.6.2 Distinguishing Kinds of Files
file-relative-name 24.8.2 Absolute and Relative File Names
file-remote-p 24.11 Making Certain File Names “Magic”
file-selinux-context 24.6.5 Extended File Attributes
file-supersession 26.6 Buffer Modification Time
file-symlink-p 24.6.2 Distinguishing Kinds of Files
file-truename 24.6.3 Truenames
file-writable-p 24.6.1 Testing Accessibility
fill-column 31.12 Margins for Filling
fill-context-prefix 31.13 Adaptive Fill Mode
fill-forward-paragraph-function 31.11 Filling
fill-individual-paragraphs 31.11 Filling
fill-individual-varying-indent 31.11 Filling
fill-nobreak-predicate 31.12 Margins for Filling
fill-paragraph 31.11 Filling
fill-paragraph-function 31.11 Filling
fill-prefix 31.12 Margins for Filling
fill-region 31.11 Filling
fill-region-as-paragraph 31.11 Filling
fillarray 6.3 Functions that Operate on Arrays
filling text 31.11 Filling
filling, automatic 31.14 Auto Filling
filter function 36.9.2 Process Filter Functions
filter multibyte flag, of process 36.9.3 Decoding Process Output
filter-buffer-substring 31.2 Examining Buffer Contents
filter-buffer-substring-function 31.2 Examining Buffer Contents
filter-buffer-substring-functions 31.2 Examining Buffer Contents
find file in path 24.6.6 Locating Files in Standard Places
find library 15.3 Library Search
find-auto-coding 32.10.5 Default Coding Systems
find-backup-file-name 25.1.4 Naming Backup Files
find-buffer-visiting 26.4 Buffer File Name
find-charset-region 32.8 Scanning for Character Sets
find-charset-string 32.8 Scanning for Character Sets
find-coding-systems-for-charsets 32.10.3 Coding Systems in Lisp
find-coding-systems-region 32.10.3 Coding Systems in Lisp
find-coding-systems-string 32.10.3 Coding Systems in Lisp
find-file 24.1.1 Functions for Visiting Files
find-file-hook 24.1.1 Functions for Visiting Files
find-file-literally 24.1.1 Functions for Visiting Files
find-file-literally 24.1.1 Functions for Visiting Files
find-file-name-handler 24.11 Making Certain File Names “Magic”
find-file-noselect 24.1.1 Functions for Visiting Files
find-file-not-found-functions 24.1.1 Functions for Visiting Files
find-file-other-window 24.1.1 Functions for Visiting Files
find-file-read-only 24.1.1 Functions for Visiting Files
find-file-wildcards 24.1.1 Functions for Visiting Files
find-font 37.12.12 Low-Level Font Representation
find-image 37.17.8 Defining Images
find-operation-coding-system 32.10.5 Default Coding Systems
finding files 24.1 Visiting Files
finding windows 27.9 Cyclic Ordering of Windows
first-change-hook 31.28 Change Hooks
fit-frame-to-buffer 27.4 Resizing Windows
fit-frame-to-buffer 28.3.4 Frame Size And Position
fit-frame-to-buffer-margins 28.3.4 Frame Size And Position
fit-frame-to-buffer-sizes 28.3.4 Frame Size And Position
fit-window-to-buffer 27.4 Resizing Windows
fit-window-to-buffer-horizontally 27.4 Resizing Windows
fixed-size window 27.3 Window Sizes
fixup-whitespace 31.7 User-Level Deletion Commands
flags in format specifications 4.7 Formatting Strings
float 3.5 Numeric Conversions
float-e 3.9 Standard Mathematical Functions
float-output-format 18.6 Variables Affecting Output
float-pi 3.9 Standard Mathematical Functions
float-time 38.5 Time of Day
floating-point functions 3.9 Standard Mathematical Functions
floatp 3.3 Type Predicates for Numbers
floats-consed E.4 Memory Usage
floor 3.5 Numeric Conversions
flowcontrol, in serial connections 36.19 Communicating with Serial Ports
flushing input 20.8.6 Miscellaneous Event Input Features
fmakunbound 12.8 Accessing Function Cell Contents
fn in function’s documentation string 15.5 Autoload
focus event 20.7.9 Focus Events
focus-follows-mouse 28.9 Input Focus
focus-in-hook 28.9 Input Focus
focus-in-hook Appendix H Standard Hooks
focus-out-hook 28.9 Input Focus
focus-out-hook Appendix H Standard Hooks
follow links 31.19.8 Defining Clickable Text
follow-link (button property) 37.18.1 Button Properties
follow-link (text or overlay property) 31.19.8 Defining Clickable Text
following-char 31.1 Examining Text Near Point
font and color, frame parameters 28.3.3.8 Font and Color Parameters
font entity 37.12.12 Low-Level Font Representation
font lock faces 22.6.7 Faces for Font Lock
Font Lock mode 22.6 Font Lock Mode
font lookup 37.12.10 Looking Up Fonts
font object 37.12.12 Low-Level Font Representation
font property 37.12.12 Low-Level Font Representation
font registry 37.12.12 Low-Level Font Representation
font selection 37.12.9 Font Selection
font spec 37.12.12 Low-Level Font Representation
font, a frame parameter 28.3.3.8 Font and Color Parameters
font-at 37.12.12 Low-Level Font Representation
font-backend, a frame parameter 28.3.3.8 Font and Color Parameters
font-face-attributes 37.12.12 Low-Level Font Representation
font-family-list 37.12.1 Face Attributes
font-get 37.12.12 Low-Level Font Representation
font-lock-add-keywords 22.6.3 Customizing Search-Based Fontification
font-lock-beginning-of-syntax-function 22.6.8 Syntactic Font Lock
font-lock-builtin-face 22.6.7 Faces for Font Lock
font-lock-comment-delimiter-face 22.6.7 Faces for Font Lock
font-lock-comment-face 22.6.7 Faces for Font Lock
font-lock-constant-face 22.6.7 Faces for Font Lock
font-lock-defaults 22.6.1 Font Lock Basics
font-lock-doc-face 22.6.7 Faces for Font Lock
font-lock-extend-after-change-region-function 22.6.9.2 Region to Fontify after a Buffer Change
font-lock-extra-managed-props 22.6.4 Other Font Lock Variables
font-lock-face (text property) 31.19.4 Properties with Special Meanings
font-lock-fontify-buffer-function 22.6.4 Other Font Lock Variables
font-lock-fontify-region-function 22.6.4 Other Font Lock Variables
font-lock-function-name-face 22.6.7 Faces for Font Lock
font-lock-keyword-face 22.6.7 Faces for Font Lock
font-lock-keywords 22.6.2 Search-based Fontification
font-lock-keywords-case-fold-search 22.6.2 Search-based Fontification
font-lock-keywords-only 22.6.8 Syntactic Font Lock
font-lock-mark-block-function 22.6.4 Other Font Lock Variables
font-lock-multiline 22.6.9.1 Font Lock Multiline
font-lock-negation-char-face 22.6.7 Faces for Font Lock
font-lock-preprocessor-face 22.6.7 Faces for Font Lock
font-lock-remove-keywords 22.6.3 Customizing Search-Based Fontification
font-lock-string-face 22.6.7 Faces for Font Lock
font-lock-syntactic-face-function 22.6.8 Syntactic Font Lock
font-lock-syntax-table 22.6.8 Syntactic Font Lock
font-lock-type-face 22.6.7 Faces for Font Lock
font-lock-unfontify-buffer-function 22.6.4 Other Font Lock Variables
font-lock-unfontify-region-function 22.6.4 Other Font Lock Variables
font-lock-variable-name-face 22.6.7 Faces for Font Lock
font-lock-warning-face 22.6.7 Faces for Font Lock
font-put 37.12.12 Low-Level Font Representation
font-spec 37.12.12 Low-Level Font Representation
font-xlfd-name 37.12.12 Low-Level Font Representation
fontification-functions 37.12.7 Automatic Face Assignment
fontified (text property) 31.19.4 Properties with Special Meanings
fontp 37.12.12 Low-Level Font Representation
fontset 37.12.11 Fontsets
foo 1.3.7.1 A Sample Function Description
for 13.5.2 Evaluating Macro Arguments Repeatedly
force coding system for operation 32.10.6 Specifying a Coding System for One Operation
force entry to debugger 17.1.4 Explicit Entry to the Debugger
force-mode-line-update 22.4.1 Mode Line Basics
force-window-update 37.2 Forcing Redisplay
forcing redisplay 37.2 Forcing Redisplay
foreground-color, a frame parameter 28.3.3.8 Font and Color Parameters
form 9.1 Introduction to Evaluation
format 4.7 Formatting Strings
format definition 24.12.2 Round-Trip Specification
format of keymaps 21.3 Format of Keymaps
format specification 4.7 Formatting Strings
format, customization keyword 14.4.4 Type Keywords
format-alist 24.12.2 Round-Trip Specification
format-find-file 24.12.2 Round-Trip Specification
format-insert-file 24.12.2 Round-Trip Specification
format-mode-line 22.4.8 Emulating Mode Line Formatting
format-network-address 36.18 Misc Network Facilities
format-seconds 38.7 Parsing and Formatting Times
format-time-string 38.7 Parsing and Formatting Times
format-write-file 24.12.2 Round-Trip Specification
formatting strings 4.7 Formatting Strings
formatting time values 38.7 Parsing and Formatting Times
formfeed 2.3.3.1 Basic Char Syntax
forward-button 37.18.5 Button Buffer Commands
forward-char 29.2.1 Motion by Characters
forward-comment 34.6.1 Motion Commands Based on Parsing
forward-line 29.2.4 Motion by Text Lines
forward-list 29.2.6 Moving over Balanced Expressions
forward-sexp 29.2.6 Moving over Balanced Expressions
forward-to-indentation 31.17.6 Indentation-Based Motion Commands
forward-word 29.2.2 Motion by Words
frame 28 Frames
frame configuration 28.12 Frame Configurations
frame creation 28.1 Creating Frames
frame layout parameters 28.3.3.4 Layout Parameters
frame parameters 28.3 Frame Parameters
frame parameters for windowed displays 28.3.3 Window Frame Parameters
frame position 28.3.3.2 Position Parameters
frame size 28.3.4 Frame Size And Position
frame title 28.5 Frame Titles
frame visibility 28.10 Visibility of Frames
frame without a minibuffer 28.8 Minibuffers and Frames
frame, which buffers to display 28.3.3.5 Buffer Parameters
frame-alpha-lower-limit 28.3.3.8 Font and Color Parameters
frame-auto-hide-function 27.17 Quitting Windows
frame-char-height 28.3.4 Frame Size And Position
frame-char-width 28.3.4 Frame Size And Position
frame-current-scroll-bars 37.14 Scroll Bars
frame-first-window 27.2 Windows and Frames
frame-height 28.3.4 Frame Size And Position
frame-inherited-parameters 28.1 Creating Frames
frame-list 28.7 Finding All Frames
frame-live-p 28.6 Deleting Frames
frame-monitor-attributes 28.2 Multiple Terminals
frame-parameter 28.3.1 Access to Frame Parameters
frame-parameters 28.3.1 Access to Frame Parameters
frame-pixel-height 28.3.4 Frame Size And Position
frame-pixel-width 28.3.4 Frame Size And Position
frame-pointer-visible-p 28.14 Mouse Position
frame-relative coordinate 27.23 Coordinates and Windows
frame-resize-pixelwise 28.3.4 Frame Size And Position
frame-root-window 27.2 Windows and Frames
frame-selected-window 27.8 Selecting Windows
frame-terminal 28 Frames
frame-title-format 28.5 Frame Titles
frame-visible-p 28.10 Visibility of Frames
frame-width 28.3.4 Frame Size And Position
framep 28 Frames
frames, scanning all 28.7 Finding All Frames
free list E.3 Garbage Collection
free variable 11.9.4 Using Lexical Binding
frequency counts 17.2.13 Coverage Testing
frexp 3.2 Floating-Point Basics
fringe bitmaps 37.13.4 Fringe Bitmaps
fringe bitmaps, customizing 37.13.5 Customizing Fringe Bitmaps
fringe cursors 37.13.3 Fringe Cursors
fringe indicators 37.13.2 Fringe Indicators
fringe-bitmaps-at-pos 37.13.4 Fringe Bitmaps
fringe-cursor-alist 37.13.3 Fringe Cursors
fringe-indicator-alist 37.13.2 Fringe Indicators
fringes 37.13 Fringes
fringes, and empty line indication 37.13.2 Fringe Indicators
fringes-outside-margins 37.13.1 Fringe Size and Position
fround 3.7 Rounding Operations
fset 12.8 Accessing Function Cell Contents
ftp-login 10.5.4 Cleaning Up from Nonlocal Exits
ftruncate 3.7 Rounding Operations
full keymap 21.3 Format of Keymaps
full-height window 27.3 Window Sizes
full-screen frames 28.3.3.3 Size Parameters
full-width window 27.3 Window Sizes
fullscreen, a frame parameter 28.3.3.3 Size Parameters
funcall 12.5 Calling Functions
funcall, and debugging 17.1.8 Internals of the Debugger
function 12.7 Anonymous Functions
function aliases 12.4 Defining Functions
function call 9.2.5 Evaluation of Function Forms
function call debugging 17.1.3 Entering the Debugger on a Function Call
function cell 8.1 Symbol Components
function cell in autoload 15.5 Autoload
function declaration 12.14 Telling the Compiler that a Function is Defined
function definition 12.3 Naming a Function
function descriptions 1.3.7.1 A Sample Function Description
function form evaluation 9.2.5 Evaluation of Function Forms
function input stream 18.2 Input Streams
function invocation 12.5 Calling Functions
function keys 20.7.2 Function Keys
function name 12.3 Naming a Function
function output stream 18.4 Output Streams
function quoting 12.7 Anonymous Functions
function safety 12.15 Determining whether a Function is Safe to Call
function-documentation property 23.1 Documentation Basics
function-get 8.4.1 Accessing Symbol Properties
functionals 12.5 Calling Functions
functionp 12.1 What Is a Function?
functions in modes 22.2.1 Major Mode Conventions
functions, making them interactive 20.2 Defining Commands
fundamental-mode 22.2 Major Modes
fundamental-mode-abbrev-table 35.5 Standard Abbrev Tables

G
gamma correction 28.3.3.8 Font and Color Parameters
gap-position 26.13 The Buffer Gap
gap-size 26.13 The Buffer Gap
garbage collection E.3 Garbage Collection
garbage collection protection E.6 Writing Emacs Primitives
garbage-collect E.3 Garbage Collection
garbage-collection-messages E.3 Garbage Collection
gc-cons-percentage E.3 Garbage Collection
gc-cons-threshold E.3 Garbage Collection
gc-elapsed E.3 Garbage Collection
GCPRO and UNGCPRO E.6 Writing Emacs Primitives
gcs-done E.3 Garbage Collection
generalized variable 11.15 Generalized Variables
generate-autoload-cookie 15.5 Autoload
generate-new-buffer 26.9 Creating Buffers
generate-new-buffer-name 26.3 Buffer Names
generated-autoload-file 15.5 Autoload
generic commands 20.2.4 Select among Command Alternatives
generic mode 22.2.8 Generic Modes
geometry specification 28.3.5 Geometry
get 8.4.1 Accessing Symbol Properties
get, defcustom keyword 14.3 Defining Customization Variables
get-buffer 26.3 Buffer Names
get-buffer-create 26.9 Creating Buffers
get-buffer-process 36.9.1 Process Buffers
get-buffer-window 27.10 Buffers and Windows
get-buffer-window-list 27.10 Buffers and Windows
get-byte 32.5 Character Codes
get-char-code-property 32.6 Character Properties
get-char-property 31.19.1 Examining Text Properties
get-char-property-and-overlay 31.19.1 Examining Text Properties
get-charset-property 32.7 Character Sets
get-device-terminal 28.2 Multiple Terminals
get-file-buffer 26.4 Buffer File Name
get-internal-run-time 38.8 Processor Run time
get-largest-window 27.9 Cyclic Ordering of Windows
get-load-suffixes 15.2 Load Suffixes
get-lru-window 27.9 Cyclic Ordering of Windows
get-pos-property 31.19.1 Examining Text Properties
get-process 36.6 Process Information
get-register 31.21 Registers
get-text-property 31.19.1 Examining Text Properties
get-unused-category 34.8 Categories
get-window-with-predicate 27.9 Cyclic Ordering of Windows
getenv 38.3 Operating System Environment
gethash 7.2 Hash Table Access
GID 38.4 User Identification
global binding 11.3 Local Variables
global break condition 17.2.6.2 Global Break Condition
global keymap 21.7 Active Keymaps
global variable 11.1 Global Variables
global-abbrev-table 35.5 Standard Abbrev Tables
global-buffers-menu-map Appendix G Standard Keymaps
global-disable-point-adjustment 20.6 Adjusting Point After Commands
global-key-binding 21.11 Functions for Key Lookup
global-map 21.9 Controlling the Active Keymaps
global-mode-string 22.4.4 Variables Used in the Mode Line
global-set-key 21.15 Commands for Binding Keys
global-unset-key 21.15 Commands for Binding Keys
glyph 37.21.4 Glyphs
glyph code 37.21.4 Glyphs
glyph-char 37.21.4 Glyphs
glyph-face 37.21.4 Glyphs
glyph-table 37.21.4 Glyphs
glyphless characters 37.21.5 Glyphless Character Display
glyphless-char-display 37.21.5 Glyphless Character Display
glyphless-char-display-control 37.21.5 Glyphless Character Display
goto-char 29.2.1 Motion by Characters
goto-map 21.6 Prefix Keys
grammar, SMIE 22.7.1.3 Defining the Grammar of a Language
graphical display 28 Frames
graphical terminal 28 Frames
group, customization keyword 14.1 Common Item Keywords
group-gid 38.4 User Identification
group-real-gid 38.4 User Identification
gv-define-expander 11.15.2 Defining new setf forms
gv-define-setter 11.15.2 Defining new setf forms
gv-define-simple-setter 11.15.2 Defining new setf forms
gv-letplace 11.15.2 Defining new setf forms

H
hack-dir-local-variables 11.12 Directory Local Variables
hack-dir-local-variables-non-file-buffer 11.12 Directory Local Variables
hack-local-variables 11.11 File Local Variables
hack-local-variables-hook 11.11 File Local Variables
handle-shift-selection 30.7 The Mark
handle-switch-frame 28.9 Input Focus
handling errors 10.5.3.3 Writing Code to Handle Errors
hash code 7.3 Defining Hash Comparisons
hash notation 2.1 Printed Representation and Read Syntax
hash table access 7.2 Hash Table Access
hash tables 7 Hash Tables
hash, cryptographic 31.25 Checksum/Hash
hash-table-count 7.4 Other Hash Table Functions
hash-table-p 7.4 Other Hash Table Functions
hash-table-rehash-size 7.4 Other Hash Table Functions
hash-table-rehash-threshold 7.4 Other Hash Table Functions
hash-table-size 7.4 Other Hash Table Functions
hash-table-test 7.4 Other Hash Table Functions
hash-table-weakness 7.4 Other Hash Table Functions
hashing 8.3 Creating and Interning Symbols
header comments D.8 Conventional Headers for Emacs Libraries
header line (of a window) 22.4.7 Window Header Lines
header-line prefix key 20.8.1 Key Sequence Input
header-line-format 22.4.7 Window Header Lines
height of a line 37.11 Line Height
height of a window 27.3 Window Sizes
height spec 37.11 Line Height
height, a frame parameter 28.3.3.3 Size Parameters
help for major mode 22.2.3 Getting Help about a Major Mode
help functions 23.5 Help Functions
help-buffer 23.5 Help Functions
help-char 23.5 Help Functions
help-command 23.5 Help Functions
help-echo (overlay property) 37.9.2 Overlay Properties
help-echo (text property) 31.19.4 Properties with Special Meanings
help-echo event 20.7.10 Miscellaneous System Events
help-echo, customization keyword 14.4.4 Type Keywords
help-event-list 23.5 Help Functions
help-form 23.5 Help Functions
help-index (button property) 37.18.1 Button Properties
help-map 23.5 Help Functions
help-setup-xref 23.5 Help Functions
help-window-select 23.5 Help Functions
Helper-describe-bindings 23.5 Help Functions
Helper-help 23.5 Help Functions
Helper-help-map 23.5 Help Functions
hex numbers 3.1 Integer Basics
hidden buffers 26.3 Buffer Names
history list 19.4 Minibuffer History
history of commands 20.15 Command History
history-add-new-input 19.4 Minibuffer History
history-delete-duplicates 19.4 Minibuffer History
history-length 19.4 Minibuffer History
HOME environment variable 36.1 Functions that Create Subprocesses
hook variables, list of Appendix H Standard Hooks
hooks 22.1 Hooks
hooks for changing a character 31.19.4 Properties with Special Meanings
hooks for loading 15.10 Hooks for Loading
hooks for motion of point 31.19.4 Properties with Special Meanings
hooks for text changes 31.28 Change Hooks
hooks for window operations 27.26 Hooks for Window Scrolling and Changes
horizontal combination 27.2 Windows and Frames
horizontal position 31.16 Counting Columns
horizontal scrolling 27.22 Horizontal Scrolling
horizontal-scroll-bar prefix key 20.8.1 Key Sequence Input
how to visit files 24.1.1 Functions for Visiting Files
hyper characters 2.3.3.5 Other Character Modifier Bits
hyperlinks in documentation strings D.6 Tips for Documentation Strings

I
icon-left, a frame parameter 28.3.3.2 Position Parameters
icon-name, a frame parameter 28.3.3.6 Window Management Parameters
icon-title-format 28.5 Frame Titles
icon-top, a frame parameter 28.3.3.2 Position Parameters
icon-type, a frame parameter 28.3.3.6 Window Management Parameters
iconified frame 28.10 Visibility of Frames
iconify-frame 28.10 Visibility of Frames
iconify-frame event 20.7.10 Miscellaneous System Events
identity 12.5 Calling Functions
idle timers 38.11 Idle Timers
idleness 38.11 Idle Timers
IEEE floating point 3.2 Floating-Point Basics
if 10.2 Conditionals
ignore 12.5 Calling Functions
ignore-errors 10.5.3.3 Writing Code to Handle Errors
ignore-window-parameters 27.25 Window Parameters
ignored-local-variables 11.11 File Local Variables
image animation 37.17.10 Multi-Frame Images
image cache 37.17.11 Image Cache
image descriptor 37.17.2 Image Descriptors
image formats 37.17.1 Image Formats
image frames 37.17.10 Multi-Frame Images
image maps 37.17.2 Image Descriptors
image slice 37.17.9 Showing Images
image types 37.17.1 Image Formats
image-animate 37.17.10 Multi-Frame Images
image-animate-timer 37.17.10 Multi-Frame Images
image-cache-eviction-delay 37.17.11 Image Cache
image-current-frame 37.17.10 Multi-Frame Images
image-default-frame-delay 37.17.10 Multi-Frame Images
image-flush 37.17.11 Image Cache
image-format-suffixes 37.17.6 ImageMagick Images
image-load-path 37.17.8 Defining Images
image-load-path-for-library 37.17.8 Defining Images
image-mask-p 37.17.2 Image Descriptors
image-minimum-frame-delay 37.17.10 Multi-Frame Images
image-multi-frame-p 37.17.10 Multi-Frame Images
image-show-frame 37.17.10 Multi-Frame Images
image-size 37.17.9 Showing Images
image-type-available-p 37.17.1 Image Formats
image-types 37.17.1 Image Formats
ImageMagick images 37.17.6 ImageMagick Images
imagemagick-enabled-types 37.17.6 ImageMagick Images
imagemagick-types 37.17.6 ImageMagick Images
imagemagick-types-inhibit 37.17.6 ImageMagick Images
images in buffers 37.17 Images
images, support for more formats 37.17.6 ImageMagick Images
Imenu 22.5 Imenu
imenu-add-to-menubar 22.5 Imenu
imenu-case-fold-search 22.5 Imenu
imenu-create-index-function 22.5 Imenu
imenu-extract-index-name-function 22.5 Imenu
imenu-generic-expression 22.5 Imenu
imenu-prev-index-position-function 22.5 Imenu
imenu-syntax-alist 22.5 Imenu
implicit progn 10.1 Sequencing
inactive minibuffer 19.1 Introduction to Minibuffers
inc 13.1 A Simple Example of a Macro
indefinite extent 11.9 Scoping Rules for Variable Bindings
indent-according-to-mode 31.17.2 Indentation Controlled by Major Mode
indent-code-rigidly 31.17.3 Indenting an Entire Region
indent-for-tab-command 31.17.2 Indentation Controlled by Major Mode
indent-line-function 31.17.2 Indentation Controlled by Major Mode
indent-region 31.17.3 Indenting an Entire Region
indent-region-function 31.17.3 Indenting an Entire Region
indent-relative 31.17.4 Indentation Relative to Previous Lines
indent-relative-maybe 31.17.4 Indentation Relative to Previous Lines
indent-rigidly 31.17.3 Indenting an Entire Region
indent-tabs-mode 31.17.1 Indentation Primitives
indent-to 31.17.1 Indentation Primitives
indent-to-left-margin 31.12 Margins for Filling
indentation 31.17 Indentation
indentation rules, SMIE 22.7.1.6 Specifying Indentation Rules
indicate-buffer-boundaries 37.13.2 Fringe Indicators
indicate-empty-lines 37.13.2 Fringe Indicators
indicators, fringe 37.13.2 Fringe Indicators
indirect buffers 26.11 Indirect Buffers
indirect specifications 17.2.15.2 Specification List
indirect-function 9.2.4 Symbol Function Indirection
indirect-variable 11.13 Variable Aliases
indirection for functions 9.2.4 Symbol Function Indirection
infinite loops 17.1.2 Debugging Infinite Loops
infinite recursion 11.3 Local Variables
infinity 3.2 Floating-Point Basics
inheritance, for faces 37.12.1 Face Attributes
inheritance, keymap 21.5 Inheritance and Keymaps
inheritance, syntax table 34.1 Syntax Table Concepts
inheritance, text property 31.19.6 Stickiness of Text Properties
inhibit-default-init 38.1.2 The Init File
inhibit-eol-conversion 32.10.6 Specifying a Coding System for One Operation
inhibit-field-text-motion 29.2.2 Motion by Words
inhibit-file-name-handlers 24.11 Making Certain File Names “Magic”
inhibit-file-name-operation 24.11 Making Certain File Names “Magic”
inhibit-iso-escape-detection 32.10.3 Coding Systems in Lisp
inhibit-local-variables-regexps 11.11 File Local Variables
inhibit-local-variables-regexps 22.2.2 How Emacs Chooses a Major Mode
inhibit-modification-hooks 31.28 Change Hooks
inhibit-null-byte-detection 32.10.3 Coding Systems in Lisp
inhibit-point-motion-hooks 31.19.4 Properties with Special Meanings
inhibit-quit 20.11 Quitting
inhibit-read-only 26.7 Read-Only Buffers
inhibit-splash-screen 38.1.1 Summary: Sequence of Actions at Startup
inhibit-startup-echo-area-message 38.1.1 Summary: Sequence of Actions at Startup
inhibit-startup-message 38.1.1 Summary: Sequence of Actions at Startup
inhibit-startup-screen 38.1.1 Summary: Sequence of Actions at Startup
inhibit-x-resources 28.22 X Resources
init file 38.1.2 The Init File
init-file-user 38.4 User Identification
init.el 38.1.2 The Init File
initial-buffer-choice 38.1.1 Summary: Sequence of Actions at Startup
initial-environment 38.3 Operating System Environment
initial-frame-alist 28.3.2 Initial Frame Parameters
initial-major-mode 22.2.2 How Emacs Chooses a Major Mode
initial-scratch-message 38.1.1 Summary: Sequence of Actions at Startup
initial-window-system 37.23 Window Systems
initial-window-system, and startup 38.1.1 Summary: Sequence of Actions at Startup
initialization of Emacs 38.1.1 Summary: Sequence of Actions at Startup
initialize, defcustom keyword 14.3 Defining Customization Variables
inline completion 19.6.8 Completion in Ordinary Buffers
inline functions 12.12 Inline Functions
innermost containing parentheses 34.6.3 Parser State
input events 20.7 Input Events
input focus 28.9 Input Focus
input methods 32.11 Input Methods
input modes 38.12.1 Input Modes
input stream 18.2 Input Streams
input-decode-map 21.14 Keymaps for Translating Sequences of Events
input-method-alist 32.11 Input Methods
input-method-function 20.8.4 Invoking the Input Method
input-pending-p 20.8.6 Miscellaneous Event Input Features
insert 31.4 Inserting Text
insert-abbrev-table-description 35.1 Abbrev Tables
insert-and-inherit 31.19.6 Stickiness of Text Properties
insert-before-markers 31.4 Inserting Text
insert-before-markers-and-inherit 31.19.6 Stickiness of Text Properties
insert-behind-hooks (overlay property) 37.9.2 Overlay Properties
insert-behind-hooks (text property) 31.19.4 Properties with Special Meanings
insert-buffer 31.5 User-Level Insertion Commands
insert-buffer-substring 31.4 Inserting Text
insert-buffer-substring-as-yank 31.8.3 Yanking
insert-buffer-substring-no-properties 31.4 Inserting Text
insert-button 37.18.3 Making Buttons
insert-char 31.4 Inserting Text
insert-default-directory 19.6.5 Reading File Names
insert-directory 24.9 Contents of Directories
insert-directory-program 24.9 Contents of Directories
insert-file-contents 24.3 Reading from Files
insert-file-contents-literally 24.3 Reading from Files
insert-for-yank 31.8.3 Yanking
insert-image 37.17.9 Showing Images
insert-in-front-hooks (overlay property) 37.9.2 Overlay Properties
insert-in-front-hooks (text property) 31.19.4 Properties with Special Meanings
insert-register 31.21 Registers
insert-sliced-image 37.17.9 Showing Images
insert-text-button 37.18.3 Making Buttons
inserting killed text 31.8.4 Functions for Yanking
insertion before point 31.4 Inserting Text
insertion of text 31.4 Inserting Text
insertion type of a marker 30.5 Marker Insertion Types
inside comment 34.6.3 Parser State
inside string 34.6.3 Parser State
installation-directory 38.3 Operating System Environment
instrumenting for Edebug 17.2.2 Instrumenting for Edebug
int-to-string 4.6 Conversion of Characters and Strings
intangible (overlay property) 37.9.2 Overlay Properties
intangible (text property) 31.19.4 Properties with Special Meanings
integer to decimal 4.6 Conversion of Characters and Strings
integer to hexadecimal 4.7 Formatting Strings
integer to octal 4.7 Formatting Strings
integer to string 4.6 Conversion of Characters and Strings
integer types (C programming language) E.8 C Integer Types
integer-or-marker-p 30.2 Predicates on Markers
integerp 3.3 Type Predicates for Numbers
integers 3 Numbers
integers in specific radix 3.1 Integer Basics
interactive 20.2.1 Using interactive
interactive call 20.3 Interactive Call
interactive code description 20.2.2 Code Characters for interactive
interactive completion 20.2.2 Code Characters for interactive
interactive function 20.2 Defining Commands
interactive spec, using 20.2.1 Using interactive
interactive specification in primitives E.6 Writing Emacs Primitives
interactive, examples of using 20.2.3 Examples of Using interactive
interactive-form 20.2.1 Using interactive
interactive-form property 20.2 Defining Commands
interactive-form, symbol property 20.2.1 Using interactive
interactive-only property 20.2 Defining Commands
intern 8.3 Creating and Interning Symbols
intern-soft 8.3 Creating and Interning Symbols
internal representation of characters 32.1 Text Representations
internal windows 27.1 Basic Concepts of Emacs Windows
internal-border-width, a frame parameter 28.3.3.4 Layout Parameters
internals, of buffer E.7.1 Buffer Internals
internals, of process E.7.3 Process Internals
internals, of window E.7.2 Window Internals
interning 8.3 Creating and Interning Symbols
interpreter 9 Evaluation
interpreter 9 Evaluation
interpreter-mode-alist 22.2.2 How Emacs Chooses a Major Mode
interprogram-cut-function 31.8.5 Low-Level Kill Ring
interprogram-paste-function 31.8.5 Low-Level Kill Ring
interrupt Lisp functions 20.11 Quitting
interrupt-process 36.8 Sending Signals to Processes
intervals 31.19.10 Why Text Properties are not Intervals
intervals-consed E.4 Memory Usage
invalid prefix key error 21.12 Changing Key Bindings
invalid-function 9.2.4 Symbol Function Indirection
invalid-read-syntax 2.1 Printed Representation and Read Syntax
invalid-regexp 33.3.1.3 Backslash Constructs in Regular Expressions
invert-face 37.12.3 Face Attribute Functions
invisible (overlay property) 37.9.2 Overlay Properties
invisible (text property) 31.19.4 Properties with Special Meanings
invisible frame 28.10 Visibility of Frames
invisible text 37.6 Invisible Text
invisible-p 37.6 Invisible Text
invisible/intangible text, and point 20.6 Adjusting Point After Commands
invocation-directory 38.3 Operating System Environment
invocation-name 38.3 Operating System Environment
invoking input method 20.8.4 Invoking the Input Method
invoking lisp debugger 17.1.7 Invoking the Debugger
is this call interactive 20.4 Distinguish Interactive Calls
isnan 3.2 Floating-Point Basics
italic text 37.12.1 Face Attributes
iteration 10.4 Iteration

J
jit-lock-register 22.6.4 Other Font Lock Variables
jit-lock-unregister 22.6.4 Other Font Lock Variables
joining lists 5.6.3 Functions that Rearrange Lists
jumbled display of bidirectional text 37.24 Bidirectional Display
just-one-space 31.7 User-Level Deletion Commands
justify-current-line 31.11 Filling

K
kbd 21.1 Key Sequences
kbd-macro-termination-hook 20.16 Keyboard Macros
kept-new-versions 25.1.3 Making and Deleting Numbered Backup Files
kept-old-versions 25.1.3 Making and Deleting Numbered Backup Files
key 21.1 Key Sequences
key binding 21.2 Keymap Basics
key binding, conventions for D.2 Key Binding Conventions
key lookup 21.10 Key Lookup
key sequence 21.1 Key Sequences
key sequence error 21.12 Changing Key Bindings
key sequence input 20.8.1 Key Sequence Input
key substitution sequence 23.3 Substituting Key Bindings in Documentation
key translation function 21.14 Keymaps for Translating Sequences of Events
key-binding 21.7 Active Keymaps
key-description 23.4 Describing Characters for Help Messages
key-translation-map 21.14 Keymaps for Translating Sequences of Events
keyboard events 20.7.1 Keyboard Events
keyboard events in strings 20.7.15 Putting Keyboard Events in Strings
keyboard events, data in 20.7.13 Accessing Mouse Events
keyboard input 20.8 Reading Input
keyboard input decoding on X 32.12 Locales
keyboard macro execution 20.3 Interactive Call
keyboard macro termination 37.22 Beeping
keyboard macro, terminating 20.8.6 Miscellaneous Event Input Features
keyboard macros 20.16 Keyboard Macros
keyboard macros (Edebug) 17.2.3 Edebug Execution Modes
keyboard-coding-system 32.10.8 Terminal I/O Encoding
keyboard-quit 20.11 Quitting
keyboard-translate 20.8.3 Modifying and Translating Input Events
keyboard-translate-table 20.8.3 Modifying and Translating Input Events
keymap 21 Keymaps
keymap (button property) 37.18.1 Button Properties
keymap (overlay property) 37.9.2 Overlay Properties
keymap (text property) 31.19.4 Properties with Special Meanings
keymap entry 21.10 Key Lookup
keymap format 21.3 Format of Keymaps
keymap in keymap 21.10 Key Lookup
keymap inheritance 21.5 Inheritance and Keymaps
keymap inheritance from multiple maps 21.5 Inheritance and Keymaps
keymap of character 31.19.4 Properties with Special Meanings
keymap of character (and overlays) 37.9.2 Overlay Properties
keymap prompt string 21.3 Format of Keymaps
keymap-parent 21.5 Inheritance and Keymaps
keymap-prompt 21.17.1 Defining Menus
keymapp 21.3 Format of Keymaps
keymaps for translating events 21.14 Keymaps for Translating Sequences of Events
keymaps in modes 22.2.1 Major Mode Conventions
keymaps, scanning 21.16 Scanning Keymaps
keymaps, standard Appendix G Standard Keymaps
keys in documentation strings 23.3 Substituting Key Bindings in Documentation
keys, reserved D.2 Key Binding Conventions
keystroke 21.1 Key Sequences
keyword symbol 11.2 Variables that Never Change
keywordp 11.2 Variables that Never Change
kill command repetition 20.5 Information from the Command Loop
kill ring 31.8 The Kill Ring
kill-all-local-variables 11.10.2 Creating and Deleting Buffer-Local Bindings
kill-append 31.8.5 Low-Level Kill Ring
kill-buffer 26.10 Killing Buffers
kill-buffer-hook 26.10 Killing Buffers
kill-buffer-query-functions 26.10 Killing Buffers
kill-emacs 38.2.1 Killing Emacs
kill-emacs-hook 38.2.1 Killing Emacs
kill-emacs-query-functions 38.2.1 Killing Emacs
kill-local-variable 11.10.2 Creating and Deleting Buffer-Local Bindings
kill-new 31.8.5 Low-Level Kill Ring
kill-process 36.8 Sending Signals to Processes
kill-read-only-ok 31.8.2 Functions for Killing
kill-region 31.8.2 Functions for Killing
kill-ring 31.8.6 Internals of the Kill Ring
kill-ring-max 31.8.6 Internals of the Kill Ring
kill-ring-yank-pointer 31.8.6 Internals of the Kill Ring
killing buffers 26.10 Killing Buffers
killing Emacs 38.2.1 Killing Emacs
kmacro-keymap Appendix G Standard Keymaps

L
lambda 12.7 Anonymous Functions
lambda expression 12.2 Lambda Expressions
lambda in debug 17.1.7 Invoking the Debugger
lambda in keymap 21.10 Key Lookup
lambda list 12.2.1 Components of a Lambda Expression
lambda-list (Edebug) 17.2.15.2 Specification List
language-change event 20.7.10 Miscellaneous System Events
largest Lisp integer 3.1 Integer Basics
largest window 27.9 Cyclic Ordering of Windows
last 5.3 Accessing Elements of Lists
last-abbrev 35.4 Looking Up and Expanding Abbreviations
last-abbrev-location 35.4 Looking Up and Expanding Abbreviations
last-abbrev-text 35.4 Looking Up and Expanding Abbreviations
last-buffer 26.8 The Buffer List
last-coding-system-used 32.10.2 Encoding and I/O
last-command 20.5 Information from the Command Loop
last-command-event 20.5 Information from the Command Loop
last-event-frame 20.5 Information from the Command Loop
last-input-event 20.8.6 Miscellaneous Event Input Features
last-kbd-macro 20.16 Keyboard Macros
last-nonmenu-event 20.5 Information from the Command Loop
last-prefix-arg 20.12 Prefix Command Arguments
last-repeatable-command 20.5 Information from the Command Loop
lax-plist-get 5.9.2 Property Lists Outside Symbols
lax-plist-put 5.9.2 Property Lists Outside Symbols
layout on display, and bidirectional text 37.24 Bidirectional Display
layout parameters of frames 28.3.3.4 Layout Parameters
lazy loading 16.4 Dynamic Loading of Individual Functions
lazy-completion-table 19.6.1 Basic Completion Functions
ldexp 3.2 Floating-Point Basics
least recently used window 27.9 Cyclic Ordering of Windows
left, a frame parameter 28.3.3.2 Position Parameters
left-fringe, a frame parameter 28.3.3.4 Layout Parameters
left-fringe-width 37.13.1 Fringe Size and Position
left-margin 31.12 Margins for Filling
left-margin-width 37.16.5 Displaying in the Margins
length 6.1 Sequences
let 11.3 Local Variables
let* 11.3 Local Variables
lexical binding 11.9 Scoping Rules for Variable Bindings
lexical binding (Edebug) 17.2.9 Evaluation
lexical comparison 4.5 Comparison of Characters and Strings
lexical environment 11.9.3 Lexical Binding
lexical scope 11.9 Scoping Rules for Variable Bindings
lexical-binding 11.9.4 Using Lexical Binding
library 15 Loading
library compilation 16.2 Byte-Compilation Functions
library header comments D.8 Conventional Headers for Emacs Libraries
library search 15.3 Library Search
libxml-parse-html-region 31.26 Parsing HTML and XML
libxml-parse-xml-region 31.26 Parsing HTML and XML
line end conversion 32.10.1 Basic Concepts of Coding Systems
line height 37.11 Line Height
line number 29.2.4 Motion by Text Lines
line truncation 37.3 Truncation
line wrapping 37.3 Truncation
line-beginning-position 29.2.4 Motion by Text Lines
line-end-position 29.2.4 Motion by Text Lines
line-height (text property) 31.19.4 Properties with Special Meanings
line-height (text property) 37.11 Line Height
line-move-ignore-invisible 37.6 Invisible Text
line-number-at-pos 29.2.4 Motion by Text Lines
line-prefix 37.3 Truncation
line-spacing 37.11 Line Height
line-spacing (text property) 31.19.4 Properties with Special Meanings
line-spacing (text property) 37.11 Line Height
line-spacing, a frame parameter 28.3.3.4 Layout Parameters
lines 29.2.4 Motion by Text Lines
lines in region 29.2.4 Motion by Text Lines
link, customization keyword 14.1 Common Item Keywords
linked list 2.3.6 Cons Cell and List Types
linking files 24.7 Changing File Names and Attributes
Lisp debugger 17.1 The Lisp Debugger
Lisp expression motion 29.2.6 Moving over Balanced Expressions
Lisp history 1.2 Lisp History
Lisp library 15 Loading
Lisp nesting error 9.5 Eval
Lisp object 2 Lisp Data Types
Lisp package 39 Preparing Lisp code for distribution
Lisp printer 18.5 Output Functions
Lisp reader 18.1 Introduction to Reading and Printing
lisp variables defined in C, restrictions 11.14 Variables with Restricted Values
lisp-mode-abbrev-table 35.5 Standard Abbrev Tables
lisp-mode.el 22.2.9 Major Mode Examples
list 5.4 Building Cons Cells and Lists
list all coding systems 32.10.3 Coding Systems in Lisp
list elements 5.3 Accessing Elements of Lists
list form evaluation 9.2.3 Classification of List Forms
list in keymap 21.10 Key Lookup
list length 6.1 Sequences
list modification 5.5 Modifying List Variables
list motion 29.2.6 Moving over Balanced Expressions
list predicates 5.2 Predicates on Lists
list structure 2.3.6 Cons Cell and List Types
list structure 5.1 Lists and Cons Cells
list, replace element 5.6.1 Altering List Elements with setcar
list-buffers-directory 26.4 Buffer File Name
list-charset-chars 32.7 Character Sets
list-fonts 37.12.12 Low-Level Font Representation
list-load-path-shadows 15.3 Library Search
list-processes 36.6 Process Information
list-system-processes 36.12 Accessing Other Processes
listify-key-sequence 20.8.6 Miscellaneous Event Input Features
listing all buffers 26.8 The Buffer List
listp 5.2 Predicates on Lists
lists 5 Lists
lists and cons cells 5.1 Lists and Cons Cells
lists as sets 5.7 Using Lists as Sets
literal evaluation 9.2.1 Self-Evaluating Forms
little endian 36.20.1 Describing Data Layout
live buffer 26.10 Killing Buffers
live windows 27.1 Basic Concepts of Emacs Windows
ln 24.7 Changing File Names and Attributes
load 15.1 How Programs Do Loading
load error with require 15.7 Features
load errors 15.1 How Programs Do Loading
load, customization keyword 14.1 Common Item Keywords
load-average 38.3 Operating System Environment
load-file 15.1 How Programs Do Loading
load-file-name 15.1 How Programs Do Loading
load-file-rep-suffixes 15.2 Load Suffixes
load-history 15.8 Which File Defined a Certain Symbol
load-in-progress 15.1 How Programs Do Loading
load-library 15.1 How Programs Do Loading
load-path 15.3 Library Search
load-prefer-newer 15.2 Load Suffixes
load-read-function 15.1 How Programs Do Loading
load-suffixes 15.2 Load Suffixes
load-theme 14.6 Custom Themes
loading 15 Loading
loading hooks 15.10 Hooks for Loading
loading, and non-ASCII characters 15.4 Loading Non-ASCII Characters
loadup.el E.1 Building Emacs
local binding 11.3 Local Variables
local keymap 21.7 Active Keymaps
local variables 11.3 Local Variables
local variables, killed by major mode 11.10.2 Creating and Deleting Buffer-Local Bindings
local-abbrev-table 35.5 Standard Abbrev Tables
local-function-key-map 21.14 Keymaps for Translating Sequences of Events
local-key-binding 21.11 Functions for Key Lookup
local-map (overlay property) 37.9.2 Overlay Properties
local-map (text property) 31.19.4 Properties with Special Meanings
local-set-key 21.15 Commands for Binding Keys
local-unset-key 21.15 Commands for Binding Keys
local-variable-if-set-p 11.10.2 Creating and Deleting Buffer-Local Bindings
local-variable-p 11.10.2 Creating and Deleting Buffer-Local Bindings
locale 32.12 Locales
locale-coding-system 32.12 Locales
locale-info 32.12 Locales
locate file in path 24.6.6 Locating Files in Standard Places
locate-file 24.6.6 Locating Files in Standard Places
locate-library 15.3 Library Search
locate-user-emacs-file 24.8.7 Standard File Names
lock file 24.5 File Locks
lock-buffer 24.5 File Locks
log 3.9 Standard Mathematical Functions
logand 3.8 Bitwise Operations on Integers
logb 3.2 Floating-Point Basics
logging echo-area messages 37.4.3 Logging Messages in *Messages*
logical arithmetic 3.8 Bitwise Operations on Integers
logical order 37.24 Bidirectional Display
logical shift 3.8 Bitwise Operations on Integers
logior 3.8 Bitwise Operations on Integers
lognot 3.8 Bitwise Operations on Integers
logxor 3.8 Bitwise Operations on Integers
looking up abbrevs 35.4 Looking Up and Expanding Abbreviations
looking up fonts 37.12.10 Looking Up Fonts
looking-at 33.4 Regular Expression Searching
looking-at-p 33.4 Regular Expression Searching
looking-back 33.4 Regular Expression Searching
lookup tables 7 Hash Tables
lookup-key 21.11 Functions for Key Lookup
loops, infinite 17.1.2 Debugging Infinite Loops
lower case 4.8 Case Conversion in Lisp
lower-frame 28.11 Raising and Lowering Frames
lowering a frame 28.11 Raising and Lowering Frames
lsh 3.8 Bitwise Operations on Integers
lwarn 37.5.1 Warning Basics

M
M-g 21.6 Prefix Keys
M-o 21.6 Prefix Keys
M-s 21.6 Prefix Keys
M-x 20.3 Interactive Call
Maclisp 1.2 Lisp History
macro 12.1 What Is a Function?
macro argument evaluation 13.5.2 Evaluating Macro Arguments Repeatedly
macro call 13.2 Expansion of a Macro Call
macro call evaluation 9.2.6 Lisp Macro Evaluation
macro caveats 13.5 Common Problems Using Macros
macro compilation 16.2 Byte-Compilation Functions
macro descriptions 1.3.7.1 A Sample Function Description
macro expansion 13.2 Expansion of a Macro Call
macro, how to define 13.4 Defining Macros
macroexpand 13.2 Expansion of a Macro Call
macroexpand-all 13.2 Expansion of a Macro Call
macrop 13.1 A Simple Example of a Macro
macros 13 Macros
macros, at compile time 16.5 Evaluation During Compilation
magic autoload comment 15.5 Autoload
magic file names 24.11 Making Certain File Names “Magic”
magic-fallback-mode-alist 22.2.2 How Emacs Chooses a Major Mode
magic-mode-alist 22.2.2 How Emacs Chooses a Major Mode
mail-host-address 38.3 Operating System Environment
major mode 22.2 Major Modes
major mode command 22.2 Major Modes
major mode conventions 22.2.1 Major Mode Conventions
major mode hook 22.2.1 Major Mode Conventions
major mode keymap 21.7 Active Keymaps
major mode, automatic selection 22.2.2 How Emacs Chooses a Major Mode
major-mode 22.2 Major Modes
make-abbrev-table 35.1 Abbrev Tables
make-auto-save-file-name 25.2 Auto-Saving
make-backup-file-name 25.1.4 Naming Backup Files
make-backup-file-name-function 25.1.1 Making Backup Files
make-backup-files 25.1.1 Making Backup Files
make-bool-vector 6.7 Bool-vectors
make-button 37.18.3 Making Buttons
make-byte-code 16.7 Byte-Code Function Objects
make-category-set 34.8 Categories
make-category-table 34.8 Categories
make-char-table 6.6 Char-Tables
make-composed-keymap 21.5 Inheritance and Keymaps
make-directory 24.10 Creating, Copying and Deleting Directories
make-display-table 37.21.2 Display Tables
make-frame 28.1 Creating Frames
make-frame-invisible 28.10 Visibility of Frames
make-frame-on-display 28.2 Multiple Terminals
make-frame-visible 28.10 Visibility of Frames
make-frame-visible event 20.7.10 Miscellaneous System Events
make-glyph-code 37.21.4 Glyphs
make-hash-table 7.1 Creating Hash Tables
make-help-screen 23.5 Help Functions
make-indirect-buffer 26.11 Indirect Buffers
make-keymap 21.4 Creating Keymaps
make-list 5.4 Building Cons Cells and Lists
make-local-variable 11.10.2 Creating and Deleting Buffer-Local Bindings
make-marker 30.3 Functions that Create Markers
make-network-process 36.17.1 make-network-process
make-obsolete 12.11 Declaring Functions Obsolete
make-obsolete-variable 11.13 Variable Aliases
make-overlay 37.9.1 Managing Overlays
make-progress-reporter 37.4.2 Reporting Operation Progress
make-ring 6.8 Managing a Fixed-Size Ring of Objects
make-serial-process 36.19 Communicating with Serial Ports
make-sparse-keymap 21.4 Creating Keymaps
make-string 4.3 Creating Strings
make-symbol 8.3 Creating and Interning Symbols
make-symbolic-link 24.7 Changing File Names and Attributes
make-syntax-table 34.3 Syntax Table Functions
make-temp-file 24.8.5 Generating Unique File Names
make-temp-name 24.8.5 Generating Unique File Names
make-text-button 37.18.3 Making Buttons
make-translation-table 32.9 Translation of Characters
make-translation-table-from-alist 32.9 Translation of Characters
make-translation-table-from-vector 32.9 Translation of Characters
make-variable-buffer-local 11.10.2 Creating and Deleting Buffer-Local Bindings
make-vector 6.5 Functions for Vectors
makehash 7.1 Creating Hash Tables
making backup files 25.1.1 Making Backup Files
making buttons 37.18.3 Making Buttons
makunbound 11.4 When a Variable is “Void”
managing overlays 37.9.1 Managing Overlays
manipulating buttons 37.18.4 Manipulating Buttons
map-char-table 6.6 Char-Tables
map-charset-chars 32.7 Character Sets
map-keymap 21.16 Scanning Keymaps
map-y-or-n-p 19.8 Asking Multiple Y-or-N Questions
mapatoms 8.3 Creating and Interning Symbols
mapc 12.6 Mapping Functions
mapcar 12.6 Mapping Functions
mapconcat 12.6 Mapping Functions
maphash 7.2 Hash Table Access
mapping functions 12.6 Mapping Functions
margins, display 37.16.5 Displaying in the Margins
margins, filling 31.12 Margins for Filling
mark 30.7 The Mark
mark excursion 29.3 Excursions
mark ring 30.7 The Mark
mark, the 30.7 The Mark
mark-active 30.7 The Mark
mark-even-if-inactive 30.7 The Mark
mark-marker 30.7 The Mark
mark-ring 30.7 The Mark
mark-ring-max 30.7 The Mark
marker argument 20.2.2 Code Characters for interactive
marker creation 30.3 Functions that Create Markers
marker garbage collection 30.1 Overview of Markers
marker information 30.4 Information from Markers
marker input stream 18.2 Input Streams
marker output stream 18.4 Output Streams
marker relocation 30.1 Overview of Markers
marker, how to move position 30.6 Moving Marker Positions
marker-buffer 30.4 Information from Markers
marker-insertion-type 30.5 Marker Insertion Types
marker-position 30.4 Information from Markers
markerp 30.2 Predicates on Markers
markers 30 Markers
markers as numbers 30.1 Overview of Markers
markers, predicates for 30.2 Predicates on Markers
match data 33.6 The Match Data
match, customization keyword 14.4.4 Type Keywords
match-alternatives, customization keyword 14.4.2 Composite Types
match-beginning 33.6.2 Simple Match Data Access
match-data 33.6.3 Accessing the Entire Match Data
match-end 33.6.2 Simple Match Data Access
match-string 33.6.2 Simple Match Data Access
match-string-no-properties 33.6.2 Simple Match Data Access
match-substitute-replacement 33.6.1 Replacing the Text that Matched
mathematical functions 3.9 Standard Mathematical Functions
max 3.4 Comparison of Numbers
max-char 32.5 Character Codes
max-image-size 37.17.9 Showing Images
max-lisp-eval-depth 9.5 Eval
max-mini-window-height 19.14 Minibuffer Miscellany
max-specpdl-size 11.3 Local Variables
maximize-window 27.4 Resizing Windows
maximizing windows 27.4 Resizing Windows
maximum Lisp integer 3.1 Integer Basics
maximum value of character codepoint 32.5 Character Codes
md5 31.25 Checksum/Hash
MD5 checksum 31.25 Checksum/Hash
measuring resource usage 17.5 Profiling
member 5.7 Using Lists as Sets
member-ignore-case 5.7 Using Lists as Sets
membership in a list 5.7 Using Lists as Sets
memory allocation E.3 Garbage Collection
memory usage 17.5 Profiling
memory usage E.4 Memory Usage
memory-full E.3 Garbage Collection
memory-limit E.3 Garbage Collection
memory-use-counts E.3 Garbage Collection
memq 5.7 Using Lists as Sets
memql 5.7 Using Lists as Sets
menu bar 21.17.5 The Menu Bar
menu bar keymaps Appendix G Standard Keymaps
menu definition example 21.17.4 Menu Example
menu item 21.17.1 Defining Menus
menu keymaps 21.17 Menu Keymaps
menu modification 21.17.7 Modifying Menus
menu prompt string 21.17.1 Defining Menus
menu separators 21.17.1.3 Menu Separators
menu-bar prefix key 20.8.1 Key Sequence Input
menu-bar-file-menu Appendix G Standard Keymaps
menu-bar-final-items 21.17.5 The Menu Bar
menu-bar-help-menu Appendix G Standard Keymaps
menu-bar-lines frame parameter 28.3.3.4 Layout Parameters
menu-bar-options-menu Appendix G Standard Keymaps
menu-bar-tools-menu Appendix G Standard Keymaps
menu-bar-update-hook 21.17.5 The Menu Bar
menu-item 21.17.1.2 Extended Menu Items
menu-prompt-more-char 21.17.3 Menus and the Keyboard
menus, popup 28.15 Pop-Up Menus
merge-face-attribute 37.12.3 Face Attribute Functions
message 37.4.1 Displaying Messages in the Echo Area
message digest 31.25 Checksum/Hash
message, finding what causes a particular message 17.1.1 Entering the Debugger on an Error
message-box 37.4.1 Displaying Messages in the Echo Area
message-log-max 37.4.3 Logging Messages in *Messages*
message-or-box 37.4.1 Displaying Messages in the Echo Area
message-truncate-lines 37.4.4 Echo Area Customization
messages-buffer 37.4.3 Logging Messages in *Messages*
meta character key constants 21.12 Changing Key Bindings
meta character printing 23.4 Describing Characters for Help Messages
meta characters 2.3.3.4 Meta-Character Syntax
meta characters lookup 21.3 Format of Keymaps
meta-prefix-char 21.11 Functions for Key Lookup
min 3.4 Comparison of Numbers
minibuffer 19 Minibuffers
minibuffer completion 19.6.2 Completion and the Minibuffer
minibuffer contents, accessing 19.12 Minibuffer Contents
minibuffer history 19.4 Minibuffer History
minibuffer input 20.13 Recursive Editing
minibuffer input, and command-line arguments 36.2 Shell Arguments
minibuffer input, reading lisp objects 19.3 Reading Lisp Objects with the Minibuffer
minibuffer input, reading text strings 19.2 Reading Text Strings with the Minibuffer
minibuffer window, and next-window 27.9 Cyclic Ordering of Windows
minibuffer windows 19.11 Minibuffer Windows
minibuffer, a frame parameter 28.3.3.5 Buffer Parameters
minibuffer-allow-text-properties 19.2 Reading Text Strings with the Minibuffer
minibuffer-auto-raise 28.11 Raising and Lowering Frames
minibuffer-complete 19.6.3 Minibuffer Commands that Do Completion
minibuffer-complete-and-exit 19.6.3 Minibuffer Commands that Do Completion
minibuffer-complete-word 19.6.3 Minibuffer Commands that Do Completion
minibuffer-completion-confirm 19.6.3 Minibuffer Commands that Do Completion
minibuffer-completion-help 19.6.3 Minibuffer Commands that Do Completion
minibuffer-completion-predicate 19.6.3 Minibuffer Commands that Do Completion
minibuffer-completion-table 19.6.3 Minibuffer Commands that Do Completion
minibuffer-confirm-exit-commands 19.6.3 Minibuffer Commands that Do Completion
minibuffer-contents 19.12 Minibuffer Contents
minibuffer-contents-no-properties 19.12 Minibuffer Contents
minibuffer-depth 19.13 Recursive Minibuffers
minibuffer-exit-hook 19.14 Minibuffer Miscellany
minibuffer-frame-alist 28.3.2 Initial Frame Parameters
minibuffer-help-form 19.14 Minibuffer Miscellany
minibuffer-history 19.4 Minibuffer History
minibuffer-inactive-mode 19.14 Minibuffer Miscellany
minibuffer-local-completion-map 19.6.3 Minibuffer Commands that Do Completion
minibuffer-local-filename-completion-map 19.6.3 Minibuffer Commands that Do Completion
minibuffer-local-map 19.2 Reading Text Strings with the Minibuffer
minibuffer-local-must-match-map 19.6.3 Minibuffer Commands that Do Completion
minibuffer-local-ns-map 19.2 Reading Text Strings with the Minibuffer
minibuffer-local-shell-command-map 19.6.5 Reading File Names
minibuffer-message 19.14 Minibuffer Miscellany
minibuffer-message-timeout 19.14 Minibuffer Miscellany
minibuffer-only frame 28.3.2 Initial Frame Parameters
minibuffer-prompt 19.12 Minibuffer Contents
minibuffer-prompt-end 19.12 Minibuffer Contents
minibuffer-prompt-width 19.12 Minibuffer Contents
minibuffer-scroll-window 19.14 Minibuffer Miscellany
minibuffer-selected-window 19.14 Minibuffer Miscellany
minibuffer-setup-hook 19.14 Minibuffer Miscellany
minibuffer-window 19.11 Minibuffer Windows
minibuffer-window-active-p 19.11 Minibuffer Windows
minibufferp 19.14 Minibuffer Miscellany
minimize-window 27.4 Resizing Windows
minimized frame 28.10 Visibility of Frames
minimizing windows 27.4 Resizing Windows
minimum Lisp integer 3.1 Integer Basics
minor mode 22.3 Minor Modes
minor mode conventions 22.3.1 Conventions for Writing Minor Modes
minor-mode-alist 22.4.4 Variables Used in the Mode Line
minor-mode-key-binding 21.11 Functions for Key Lookup
minor-mode-list 22.3 Minor Modes
minor-mode-map-alist 21.9 Controlling the Active Keymaps
minor-mode-overriding-map-alist 21.9 Controlling the Active Keymaps
mirroring of characters 32.6 Character Properties
misc-objects-consed E.4 Memory Usage
mkdir 24.10 Creating, Copying and Deleting Directories
mod 3.6 Arithmetic Operations
mode 22 Major and Minor Modes
mode bits 24.6.1 Testing Accessibility
mode help 22.2.3 Getting Help about a Major Mode
mode hook 22.2.1 Major Mode Conventions
mode line 22.4 Mode Line Format
mode line construct 22.4.2 The Data Structure of the Mode Line
mode loading 22.2.1 Major Mode Conventions
mode variable 22.3.1 Conventions for Writing Minor Modes
mode-class (property) 22.2.1 Major Mode Conventions
mode-line prefix key 20.8.1 Key Sequence Input
mode-line-buffer-identification 22.4.4 Variables Used in the Mode Line
mode-line-client 22.4.4 Variables Used in the Mode Line
mode-line-coding-system-map Appendix G Standard Keymaps
mode-line-column-line-number-mode-map Appendix G Standard Keymaps
mode-line-format 22.4.3 The Top Level of Mode Line Control
mode-line-frame-identification 22.4.4 Variables Used in the Mode Line
mode-line-input-method-map Appendix G Standard Keymaps
mode-line-modes 22.4.4 Variables Used in the Mode Line
mode-line-modified 22.4.4 Variables Used in the Mode Line
mode-line-mule-info 22.4.4 Variables Used in the Mode Line
mode-line-position 22.4.4 Variables Used in the Mode Line
mode-line-process 22.4.4 Variables Used in the Mode Line
mode-line-remote 22.4.4 Variables Used in the Mode Line
mode-name 22.4.4 Variables Used in the Mode Line
mode-specific-map 21.6 Prefix Keys
model/view/controller 37.19 Abstract Display
modification flag (of buffer) 26.5 Buffer Modification
modification of lists 5.6.3 Functions that Rearrange Lists
modification time of buffer 26.6 Buffer Modification Time
modification time of file 24.6.4 File Attributes
modification-hooks (overlay property) 37.9.2 Overlay Properties
modification-hooks (text property) 31.19.4 Properties with Special Meanings
modifier bits (of input character) 20.7.1 Keyboard Events
modifiers of events 20.8.3 Modifying and Translating Input Events
modify a list 5.5 Modifying List Variables
modify-all-frames-parameters 28.3.1 Access to Frame Parameters
modify-category-entry 34.8 Categories
modify-frame-parameters 28.3.1 Access to Frame Parameters
modify-syntax-entry 34.3 Syntax Table Functions
modifying strings 4.4 Modifying Strings
modulus 3.6 Arithmetic Operations
momentary-string-display 37.8 Temporary Displays
most recently selected windows 27.8 Selecting Windows
most-negative-fixnum 3.1 Integer Basics
most-positive-fixnum 3.1 Integer Basics
motion based on parsing 34.6.1 Motion Commands Based on Parsing
motion by chars, words, lines, lists 29.2 Motion
motion event 20.7.8 Motion Events
mouse click event 20.7.4 Click Events
mouse drag event 20.7.5 Drag Events
mouse events, data in 20.7.13 Accessing Mouse Events
mouse events, in special parts of frame 20.8.1 Key Sequence Input
mouse events, repeated 20.7.7 Repeat Events
mouse motion events 20.7.8 Motion Events
mouse pointer shape 28.17 Pointer Shape
mouse position 28.14 Mouse Position
mouse position list 20.7.4 Click Events
mouse position list, accessing 20.7.13 Accessing Mouse Events
mouse tracking 28.13 Mouse Tracking
mouse, availability 28.23 Display Feature Testing
mouse-1 31.19.8 Defining Clickable Text
mouse-1-click-follows-link 31.19.8 Defining Clickable Text
mouse-2 D.2 Key Binding Conventions
mouse-action (button property) 37.18.1 Button Properties
mouse-appearance-menu-map Appendix G Standard Keymaps
mouse-color, a frame parameter 28.3.3.8 Font and Color Parameters
mouse-face (button property) 37.18.1 Button Properties
mouse-face (overlay property) 37.9.2 Overlay Properties
mouse-face (text property) 31.19.4 Properties with Special Meanings
mouse-leave-buffer-hook Appendix H Standard Hooks
mouse-movement-p 20.7.12 Classifying Events
mouse-on-link-p 31.19.8 Defining Clickable Text
mouse-pixel-position 28.14 Mouse Position
mouse-position 28.14 Mouse Position
mouse-position-function 28.14 Mouse Position
mouse-wheel-down-event 20.7.10 Miscellaneous System Events
mouse-wheel-up-event 20.7.10 Miscellaneous System Events
move to beginning or end of buffer 29.2.3 Motion to an End of the Buffer
move-marker 30.6 Moving Marker Positions
move-overlay 37.9.1 Managing Overlays
move-point-visually 37.24 Bidirectional Display
move-to-column 31.16 Counting Columns
move-to-left-margin 31.12 Margins for Filling
move-to-window-line 29.2.5 Motion by Screen Lines
movemail 36.1 Functions that Create Subprocesses
moving across syntax classes 34.5 Motion and Syntax
moving markers 30.6 Moving Marker Positions
MS-DOS and file modes 24.6.1 Testing Accessibility
MS-Windows file-name syntax 24.8 File Names
mule-keymap 21.6 Prefix Keys
multi-file package 39.3 Multi-file Packages
multi-frame images 37.17.10 Multi-Frame Images
multi-monitor 28.2 Multiple Terminals
multi-query-replace-map 33.7 Search and Replace
multi-tty 28.2 Multiple Terminals
multibyte characters 32 Non-ASCII Characters
multibyte text 32.1 Text Representations
multibyte-char-to-unibyte 32.3 Converting Text Representations
multibyte-string-p 32.1 Text Representations
multibyte-syntax-as-symbol 34.6.5 Parameters to Control Parsing
multiline font lock 22.6.9 Multiline Font Lock Constructs
multiple terminals 28.2 Multiple Terminals
multiple windows 27.1 Basic Concepts of Emacs Windows
multiple X displays 28.2 Multiple Terminals
multiple yes-or-no questions 19.8 Asking Multiple Y-or-N Questions
multiple-frames 28.5 Frame Titles

N
name, a frame parameter 28.3.3.1 Basic Parameters
named function 12.3 Naming a Function
naming backup files 25.1.4 Naming Backup Files
NaN 3.2 Floating-Point Basics
narrow-map Appendix G Standard Keymaps
narrow-to-page 29.4 Narrowing
narrow-to-region 29.4 Narrowing
narrowing 29.4 Narrowing
natnump 3.3 Type Predicates for Numbers
natural numbers 3.3 Type Predicates for Numbers
nbutlast 5.3 Accessing Elements of Lists
nconc 5.6.3 Functions that Rearrange Lists
negative infinity 3.2 Floating-Point Basics
negative-argument 20.12 Prefix Command Arguments
network byte ordering 36.20.1 Describing Data Layout
network connection 36.14 Network Connections
network connection, encrypted 36.14 Network Connections
network servers 36.15 Network Servers
network service name, and default coding system 32.10.5 Default Coding Systems
network-coding-system-alist 32.10.5 Default Coding Systems
network-interface-info 36.18 Misc Network Facilities
network-interface-list 36.18 Misc Network Facilities
new file message 24.1.2 Subroutines of Visiting
newline 2.3.3.1 Basic Char Syntax
newline 31.5 User-Level Insertion Commands
newline and Auto Fill mode 31.5 User-Level Insertion Commands
newline in print 18.5 Output Functions
newline in strings 2.3.8.1 Syntax for Strings
newline-and-indent 31.17.2 Indentation Controlled by Major Mode
next input 20.8.6 Miscellaneous Event Input Features
next-button 37.18.5 Button Buffer Commands
next-char-property-change 31.19.3 Text Property Search Functions
next-complete-history-element 19.10 Minibuffer Commands
next-frame 28.7 Finding All Frames
next-history-element 19.10 Minibuffer Commands
next-matching-history-element 19.10 Minibuffer Commands
next-overlay-change 37.9.3 Searching for Overlays
next-property-change 31.19.3 Text Property Search Functions
next-screen-context-lines 27.20 Textual Scrolling
next-single-char-property-change 31.19.3 Text Property Search Functions
next-single-property-change 31.19.3 Text Property Search Functions
next-window 27.9 Cyclic Ordering of Windows
nil 1.3.2 nil and t
nil as a list 2.3.6.1 Drawing Lists as Box Diagrams
nil in keymap 21.10 Key Lookup
nil input stream 18.2 Input Streams
nil output stream 18.4 Output Streams
nlistp 5.2 Predicates on Lists
no-byte-compile 16 Byte Compilation
no-catch 10.5.1 Explicit Nonlocal Exits: catch and throw
no-conversion coding system 32.10.1 Basic Concepts of Coding Systems
no-redraw-on-reenter 37.1 Refreshing the Screen
no-self-insert property 35.2 Defining Abbrevs
node, ewoc 37.19 Abstract Display
non-ASCII characters 32 Non-ASCII Characters
non-ASCII characters in loaded files 15.4 Loading Non-ASCII Characters
non-ASCII text in keybindings 21.15 Commands for Binding Keys
non-capturing group 33.3.1.3 Backslash Constructs in Regular Expressions
non-greedy repetition characters in regexp 33.3.1.1 Special Characters in Regular Expressions
nondirectory part (of file name) 24.8.1 File Name Components
noninteractive 38.16 Batch Mode
nonlocal exits 10.5 Nonlocal Exits
nonlocal exits, cleaning up 10.5.4 Cleaning Up from Nonlocal Exits
nonprinting characters, reading 20.8.5 Quoted Character Input
noreturn 17.4 Test Coverage
normal hook 22.1 Hooks
normal-auto-fill-function 31.14 Auto Filling
normal-backup-enable-predicate 25.1.1 Making Backup Files
normal-mode 22.2.2 How Emacs Chooses a Major Mode
not 10.3 Constructs for Combining Conditions
not-modified 26.5 Buffer Modification
notation 1.3.3 Evaluation Notation
notifications, on desktop 38.18 Desktop Notifications
notifications-close-notification 38.18 Desktop Notifications
notifications-get-capabilities 38.18 Desktop Notifications
notifications-get-server-information 38.18 Desktop Notifications
notifications-notify 38.18 Desktop Notifications
nreverse 5.6.3 Functions that Rearrange Lists
nth 5.3 Accessing Elements of Lists
nthcdr 5.3 Accessing Elements of Lists
null 5.2 Predicates on Lists
null bytes, and decoding text 32.10.3 Coding Systems in Lisp
num-input-keys 20.8.1 Key Sequence Input
num-nonmacro-input-events 20.8.2 Reading One Event
number comparison 3.4 Comparison of Numbers
number conversions 3.5 Numeric Conversions
number-or-marker-p 30.2 Predicates on Markers
number-sequence 5.4 Building Cons Cells and Lists
number-to-string 4.6 Conversion of Characters and Strings
numbered backups 25.1.3 Making and Deleting Numbered Backup Files
numberp 3.3 Type Predicates for Numbers
numbers 3 Numbers
numeric prefix argument 20.12 Prefix Command Arguments
numeric prefix argument usage 20.2.2 Code Characters for interactive
numerical RGB color specification 28.20 Color Names

O
obarray 8.3 Creating and Interning Symbols
obarray 8.3 Creating and Interning Symbols
obarray in completion 19.6.1 Basic Completion Functions
object 2 Lisp Data Types
object internals E.7 Object Internals
object to string 18.5 Output Functions
obsolete functions 12.11 Declaring Functions Obsolete
octal character code 2.3.3.2 General Escape Syntax
octal character input 20.8.5 Quoted Character Input
octal escapes 37.21.1 Usual Display Conventions
octal numbers 3.1 Integer Basics
old advices, porting 12.10.4 Adapting code using the old defadvice
one-window-p 27.9 Cyclic Ordering of Windows
only-global-abbrevs 35.2 Defining Abbrevs
opacity, frame 28.3.3.8 Font and Color Parameters
open-dribble-file 38.12.2 Recording Input
open-network-stream 36.14 Network Connections
open-paren-in-column-0-is-defun-start 29.2.6 Moving over Balanced Expressions
open-termscript 38.13 Terminal Output
OpenType font 37.12.12 Low-Level Font Representation
operating system environment 38.3 Operating System Environment
operating system signal 38.2.1 Killing Emacs
operations (property) 24.11 Making Certain File Names “Magic”
optimize regexp 33.3.3 Regular Expression Functions
option descriptions 1.3.7.2 A Sample Variable Description
optional arguments 12.2.3 Other Features of Argument Lists
options on command line 38.1.4 Command-Line Arguments
options, defcustom keyword 14.3 Defining Customization Variables
or 10.3 Constructs for Combining Conditions
ordering of windows, cyclic 27.9 Cyclic Ordering of Windows
other-buffer 26.8 The Buffer List
other-window 27.9 Cyclic Ordering of Windows
other-window-scroll-buffer 27.20 Textual Scrolling
outer-window-id, a frame parameter 28.3.3.6 Window Management Parameters
output from processes 36.9 Receiving Output from Processes
output stream 18.4 Output Streams
output-controlling variables 18.6 Variables Affecting Output
overall prompt string 21.3 Format of Keymaps
overflow 3.1 Integer Basics
overflow-newline-into-fringe 37.13.3 Fringe Cursors
overlay properties 37.9.2 Overlay Properties
overlay-arrow-position 37.13.6 The Overlay Arrow
overlay-arrow-string 37.13.6 The Overlay Arrow
overlay-arrow-variable-list 37.13.6 The Overlay Arrow
overlay-buffer 37.9.1 Managing Overlays
overlay-end 37.9.1 Managing Overlays
overlay-get 37.9.2 Overlay Properties
overlay-properties 37.9.2 Overlay Properties
overlay-put 37.9.2 Overlay Properties
overlay-recenter 37.9.1 Managing Overlays
overlay-start 37.9.1 Managing Overlays
overlayp 37.9.1 Managing Overlays
overlays 37.9 Overlays
overlays, managing 37.9.1 Managing Overlays
overlays, searching for 37.9.3 Searching for Overlays
overlays-at 37.9.3 Searching for Overlays
overlays-in 37.9.3 Searching for Overlays
overlined text 37.12.1 Face Attributes
override spec (for a face) 37.12.2 Defining Faces
overriding-local-map 21.9 Controlling the Active Keymaps
overriding-local-map-menu-flag 21.9 Controlling the Active Keymaps
overriding-terminal-local-map 21.9 Controlling the Active Keymaps
overwrite-mode 31.5 User-Level Insertion Commands

P
package 39 Preparing Lisp code for distribution
package archive 39.4 Creating and Maintaining Package Archives
package archive security 39.4 Creating and Maintaining Package Archives
package attributes 39.1 Packaging Basics
package autoloads 39.1 Packaging Basics
package dependencies 39.1 Packaging Basics
package name 39.1 Packaging Basics
package signing 39.4 Creating and Maintaining Package Archives
package version 39.1 Packaging Basics
package-archive-upload-base 39.4 Creating and Maintaining Package Archives
package-archives 39.4 Creating and Maintaining Package Archives
package-initialize 39.1 Packaging Basics
package-upload-buffer 39.4 Creating and Maintaining Package Archives
package-upload-file 39.4 Creating and Maintaining Package Archives
package-version, customization keyword 14.1 Common Item Keywords
packing 36.20 Packing and Unpacking Byte Arrays
padding 4.7 Formatting Strings
page-delimiter 33.8 Standard Regular Expressions Used in Editing
paragraph-separate 33.8 Standard Regular Expressions Used in Editing
paragraph-start 33.8 Standard Regular Expressions Used in Editing
parameters of initial frame 28.3.2 Initial Frame Parameters
parent of char-table 6.6 Char-Tables
parent process 36 Processes
parent window 27.2 Windows and Frames
parent window 27.2 Windows and Frames
parenthesis 2.3.6 Cons Cell and List Types
parenthesis depth 34.6.4 Low-Level Parsing
parenthesis matching 37.20 Blinking Parentheses
parenthesis mismatch, debugging 17.3 Debugging Invalid Lisp Syntax
parity, in serial connections 36.19 Communicating with Serial Ports
parse state for a position 34.6.2 Finding the Parse State for a Position
parse-colon-path 38.3 Operating System Environment
parse-partial-sexp 34.6.4 Low-Level Parsing
parse-sexp-ignore-comments 34.6.5 Parameters to Control Parsing
parse-sexp-lookup-properties 34.4 Syntax Properties
parse-sexp-lookup-properties 34.6.5 Parameters to Control Parsing
parser state 34.6.3 Parser State
parsing buffer text 34 Syntax Tables
parsing expressions 34.6 Parsing Expressions
parsing html 31.26 Parsing HTML and XML
parsing xml 31.26 Parsing HTML and XML
parsing, control parameters 34.6.5 Parameters to Control Parsing
partial application of functions 12.5 Calling Functions
partial-width windows 37.3 Truncation
passwords, reading 19.9 Reading a Password
PATH environment variable 36.1 Functions that Create Subprocesses
path-separator 38.3 Operating System Environment
pattern matching 10.2.1 Pattern matching case statement
PBM 37.17.7 Other Image Types
pcase 10.2.1 Pattern matching case statement
peculiar error 10.5.3.4 Error Symbols and Condition Names
peeking at input 20.8.6 Miscellaneous Event Input Features
percent symbol in mode line 22.4.2 The Data Structure of the Mode Line
perform-replace 33.7 Search and Replace
performance analysis 17.2.13 Coverage Testing
permanent local variable 11.10.2 Creating and Deleting Buffer-Local Bindings
permissions, file 24.6.1 Testing Accessibility
permissions, file 24.7 Changing File Names and Attributes
piece of advice 12.10 Advising Emacs Lisp Functions
pipe 36.4 Creating an Asynchronous Process
pixel height of a window 27.3 Window Sizes
pixel height of a window 27.3 Window Sizes
pixelwise, resizing windows 27.4 Resizing Windows
place form 11.15 Generalized Variables
play-sound 38.14 Sound Output
play-sound-file 38.14 Sound Output
play-sound-functions 38.14 Sound Output
plist 5.9 Property Lists
plist access 5.9.2 Property Lists Outside Symbols
plist vs. alist 5.9.1 Property Lists and Association Lists
plist-get 5.9.2 Property Lists Outside Symbols
plist-member 5.9.2 Property Lists Outside Symbols
plist-put 5.9.2 Property Lists Outside Symbols
point 29.1 Point
point 29.1 Point
point excursion 29.3 Excursions
point in window 27.18 Windows and Point
point with narrowing 29.1 Point
point-entered (text property) 31.19.4 Properties with Special Meanings
point-left (text property) 31.19.4 Properties with Special Meanings
point-marker 30.3 Functions that Create Markers
point-max 29.1 Point
point-max-marker 30.3 Functions that Create Markers
point-min 29.1 Point
point-min-marker 30.3 Functions that Create Markers
pointer (text property) 31.19.4 Properties with Special Meanings
pointer shape 28.17 Pointer Shape
pointers 2.3.6 Cons Cell and List Types
pop 5.3 Accessing Elements of Lists
pop-mark 30.7 The Mark
pop-to-buffer 27.11 Switching to a Buffer in a Window
pop-up-frame-alist 27.14 Additional Options for Displaying Buffers
pop-up-frame-function 27.14 Additional Options for Displaying Buffers
pop-up-frames 27.14 Additional Options for Displaying Buffers
pop-up-windows 27.14 Additional Options for Displaying Buffers
port number, and default coding system 32.10.5 Default Coding Systems
pos-visible-in-window-p 27.19 The Window Start and End Positions
position (in buffer) 29 Positions
position argument 20.2.2 Code Characters for interactive
position in window 27.18 Windows and Point
position of mouse 28.14 Mouse Position
position-bytes 32.1 Text Representations
positive infinity 3.2 Floating-Point Basics
posix-looking-at 33.5 POSIX Regular Expression Searching
posix-search-backward 33.5 POSIX Regular Expression Searching
posix-search-forward 33.5 POSIX Regular Expression Searching
posix-string-match 33.5 POSIX Regular Expression Searching
posn-actual-col-row 20.7.13 Accessing Mouse Events
posn-area 20.7.13 Accessing Mouse Events
posn-at-point 20.7.13 Accessing Mouse Events
posn-at-x-y 20.7.13 Accessing Mouse Events
posn-col-row 20.7.13 Accessing Mouse Events
posn-image 20.7.13 Accessing Mouse Events
posn-object 20.7.13 Accessing Mouse Events
posn-object-width-height 20.7.13 Accessing Mouse Events
posn-object-x-y 20.7.13 Accessing Mouse Events
posn-point 20.7.13 Accessing Mouse Events
posn-string 20.7.13 Accessing Mouse Events
posn-timestamp 20.7.13 Accessing Mouse Events
posn-window 20.7.13 Accessing Mouse Events
posn-x-y 20.7.13 Accessing Mouse Events
posnp 20.7.13 Accessing Mouse Events
post-command-hook 20.1 Command Loop Overview
post-gc-hook E.3 Garbage Collection
post-self-insert-hook 31.5 User-Level Insertion Commands
postscript images 37.17.5 PostScript Images
pp 18.5 Output Functions
pre-command-hook 20.1 Command Loop Overview
pre-redisplay-function 37.2 Forcing Redisplay
preceding-char 31.1 Examining Text Near Point
precision in format specifications 4.7 Formatting Strings
predicates for lists 5.2 Predicates on Lists
predicates for markers 30.2 Predicates on Markers
predicates for numbers 3.3 Type Predicates for Numbers
predicates for strings 4.2 Predicates for Strings
prefix argument 20.12 Prefix Command Arguments
prefix argument unreading 20.8.6 Miscellaneous Event Input Features
prefix command 21.6 Prefix Keys
prefix key 21.6 Prefix Keys
prefix, defgroup keyword 14.2 Defining Customization Groups
prefix-arg 20.12 Prefix Command Arguments
prefix-help-command 23.5 Help Functions
prefix-numeric-value 20.12 Prefix Command Arguments
preloaded Lisp files E.1 Building Emacs
preloaded-file-list E.1 Building Emacs
preloading additional functions and variables E.1 Building Emacs
prepare-change-group 31.27 Atomic Change Groups
preventing backtracking 17.2.15.2 Specification List
preventing prefix key 21.10 Key Lookup
preventing quitting 20.11 Quitting
previous complete subexpression 34.6.3 Parser State
previous-button 37.18.5 Button Buffer Commands
previous-char-property-change 31.19.3 Text Property Search Functions
previous-complete-history-element 19.10 Minibuffer Commands
previous-frame 28.7 Finding All Frames
previous-history-element 19.10 Minibuffer Commands
previous-matching-history-element 19.10 Minibuffer Commands
previous-overlay-change 37.9.3 Searching for Overlays
previous-property-change 31.19.3 Text Property Search Functions
previous-single-char-property-change 31.19.3 Text Property Search Functions
previous-single-property-change 31.19.3 Text Property Search Functions
previous-window 27.9 Cyclic Ordering of Windows
primary selection 28.18 Window System Selections
primitive 12.1 What Is a Function?
primitive function 2.3.15 Primitive Function Type
primitive function internals E.6 Writing Emacs Primitives
primitive type 2 Lisp Data Types
primitive-undo 31.9 Undo
prin1 18.5 Output Functions
prin1-to-string 18.5 Output Functions
princ 18.5 Output Functions
print 18.5 Output Functions
print example 18.4 Output Streams
print name cell 8.1 Symbol Components
print-circle 18.6 Variables Affecting Output
print-continuous-numbering 18.6 Variables Affecting Output
print-escape-multibyte 18.6 Variables Affecting Output
print-escape-newlines 18.6 Variables Affecting Output
print-escape-nonascii 18.6 Variables Affecting Output
print-gensym 18.6 Variables Affecting Output
print-length 18.6 Variables Affecting Output
print-level 18.6 Variables Affecting Output
print-number-table 18.6 Variables Affecting Output
print-quoted 18.6 Variables Affecting Output
printable ASCII characters 37.21.1 Usual Display Conventions
printable-chars 32.6 Character Properties
printed representation 2.1 Printed Representation and Read Syntax
printed representation for characters 2.3.3.1 Basic Char Syntax
printing 18.1 Introduction to Reading and Printing
printing (Edebug) 17.2.11 Printing in Edebug
printing circular structures 17.2.11 Printing in Edebug
printing limits 18.6 Variables Affecting Output
printing notation 1.3.4 Printing Notation
priority (overlay property) 37.9.2 Overlay Properties
priority order of coding systems 32.10.6 Specifying a Coding System for One Operation
process 36 Processes
process creation 36.1 Functions that Create Subprocesses
process filter 36.9.2 Process Filter Functions
process filter multibyte flag 36.9.3 Decoding Process Output
process information 36.6 Process Information
process input 36.7 Sending Input to Processes
process internals E.7.3 Process Internals
process output 36.9 Receiving Output from Processes
process sentinel 36.10 Sentinels: Detecting Process Status Changes
process signals 36.8 Sending Signals to Processes
process-adaptive-read-buffering 36.9 Receiving Output from Processes
process-attributes 36.12 Accessing Other Processes
process-buffer 36.9.1 Process Buffers
process-coding-system 36.6 Process Information
process-coding-system-alist 32.10.5 Default Coding Systems
process-command 36.6 Process Information
process-connection-type 36.4 Creating an Asynchronous Process
process-contact 36.6 Process Information
process-datagram-address 36.16 Datagrams
process-environment 38.3 Operating System Environment
process-exit-status 36.6 Process Information
process-file 36.3 Creating a Synchronous Process
process-file-shell-command 36.3 Creating a Synchronous Process
process-file-side-effects 36.3 Creating a Synchronous Process
process-filter 36.9.2 Process Filter Functions
process-get 36.6 Process Information
process-id 36.6 Process Information
process-kill-buffer-query-function 36.9.1 Process Buffers
process-lines 36.3 Creating a Synchronous Process
process-list 36.6 Process Information
process-live-p 36.6 Process Information
process-mark 36.9.1 Process Buffers
process-name 36.6 Process Information
process-plist 36.6 Process Information
process-put 36.6 Process Information
process-query-on-exit-flag 36.11 Querying Before Exit
process-running-child-p 36.7 Sending Input to Processes
process-send-eof 36.7 Sending Input to Processes
process-send-region 36.7 Sending Input to Processes
process-send-string 36.7 Sending Input to Processes
process-sentinel 36.10 Sentinels: Detecting Process Status Changes
process-status 36.6 Process Information
process-tty-name 36.6 Process Information
process-type 36.6 Process Information
processing of errors 10.5.3.2 How Emacs Processes Errors
processor run time 38.8 Processor Run time
processp 36 Processes
profiling 17.5 Profiling
prog-mode 22.2.5 Basic Major Modes
prog-mode, and bidi-paragraph-direction 37.24 Bidirectional Display
prog-mode-hook 22.2.5 Basic Major Modes
prog1 10.1 Sequencing
prog2 10.1 Sequencing
progn 10.1 Sequencing
program arguments 36.1 Functions that Create Subprocesses
program directories 36.1 Functions that Create Subprocesses
program name, and default coding system 32.10.5 Default Coding Systems
programmed completion 19.6.7 Programmed Completion
programming conventions D.3 Emacs Programming Tips
programming types 2.3 Programming Types
progress reporting 37.4.2 Reporting Operation Progress
progress-reporter-done 37.4.2 Reporting Operation Progress
progress-reporter-force-update 37.4.2 Reporting Operation Progress
progress-reporter-update 37.4.2 Reporting Operation Progress
prompt for file name 19.6.5 Reading File Names
prompt string (of menu) 21.17.1 Defining Menus
prompt string of keymap 21.3 Format of Keymaps
properties of text 31.19 Text Properties
propertize 31.19.2 Changing Text Properties
property category of text character 31.19.4 Properties with Special Meanings
property list 5.9 Property Lists
property list cell 8.1 Symbol Components
property lists vs association lists 5.9.1 Property Lists and Association Lists
protect C variables from garbage collection E.6 Writing Emacs Primitives
protected forms 10.5.4 Cleaning Up from Nonlocal Exits
provide 15.7 Features
provide-theme 14.6 Custom Themes
providing features 15.7 Features
pty 36.4 Creating an Asynchronous Process
pure storage E.2 Pure Storage
pure-bytes-used E.2 Pure Storage
purecopy E.2 Pure Storage
purify-flag E.2 Pure Storage
push 5.5 Modifying List Variables
push-button 37.18.5 Button Buffer Commands
push-mark 30.7 The Mark
put 8.4.1 Accessing Symbol Properties
put-char-code-property 32.6 Character Properties
put-charset-property 32.7 Character Sets
put-image 37.17.9 Showing Images
put-text-property 31.19.2 Changing Text Properties
puthash 7.2 Hash Table Access

Q
query-replace-history 19.4 Minibuffer History
query-replace-map 33.7 Search and Replace
querying the user 19.7 Yes-or-No Queries
question mark in character constant 2.3.3.1 Basic Char Syntax
quietly-read-abbrev-file 35.3 Saving Abbrevs in Files
quit-flag 20.11 Quitting
quit-process 36.8 Sending Signals to Processes
quit-restore-window 27.17 Quitting Windows
quit-window 27.17 Quitting Windows
quitting 20.11 Quitting
quitting from infinite loop 17.1.2 Debugging Infinite Loops
quote 9.3 Quoting
quote character 34.6.3 Parser State
quote special characters in regexp 33.3.3 Regular Expression Functions
quoted character input 20.8.5 Quoted Character Input
quoted-insert suppression 21.12 Changing Key Bindings
quoting and unquoting command-line arguments 36.2 Shell Arguments
quoting characters in printing 18.5 Output Functions
quoting using apostrophe 9.3 Quoting

R
radix for reading an integer 3.1 Integer Basics
raise-frame 28.11 Raising and Lowering Frames
raising a frame 28.11 Raising and Lowering Frames
random 3.10 Random Numbers
random numbers 3.10 Random Numbers
rassoc 5.8 Association Lists
rassq 5.8 Association Lists
rassq-delete-all 5.8 Association Lists
raw prefix argument 20.12 Prefix Command Arguments
raw prefix argument usage 20.2.2 Code Characters for interactive
raw syntax descriptor 34.7 Syntax Table Internals
raw-text coding system 32.10.1 Basic Concepts of Coding Systems
re-builder 33.3 Regular Expressions
re-search-backward 33.4 Regular Expression Searching
re-search-forward 33.4 Regular Expression Searching
read 18.3 Input Functions
read command name 20.3 Interactive Call
read file names 19.6.5 Reading File Names
read input 20.8 Reading Input
read syntax 2.1 Printed Representation and Read Syntax
read syntax for characters 2.3.3.1 Basic Char Syntax
read-buffer 19.6.4 High-Level Completion Functions
read-buffer-completion-ignore-case 19.6.4 High-Level Completion Functions
read-buffer-function 19.6.4 High-Level Completion Functions
read-char 20.8.2 Reading One Event
read-char-choice 20.8.2 Reading One Event
read-char-exclusive 20.8.2 Reading One Event
read-circle 18.3 Input Functions
read-coding-system 32.10.4 User-Chosen Coding Systems
read-color 19.6.4 High-Level Completion Functions
read-command 19.6.4 High-Level Completion Functions
read-directory-name 19.6.5 Reading File Names
read-event 20.8.2 Reading One Event
read-expression-history 19.4 Minibuffer History
read-file-modes 24.7 Changing File Names and Attributes
read-file-name 19.6.5 Reading File Names
read-file-name-completion-ignore-case 19.6.5 Reading File Names
read-file-name-function 19.6.5 Reading File Names
read-from-minibuffer 19.2 Reading Text Strings with the Minibuffer
read-from-string 18.3 Input Functions
read-input-method-name 32.11 Input Methods
read-kbd-macro 23.4 Describing Characters for Help Messages
read-key 20.8.2 Reading One Event
read-key-sequence 20.8.1 Key Sequence Input
read-key-sequence-vector 20.8.1 Key Sequence Input
read-minibuffer 19.3 Reading Lisp Objects with the Minibuffer
read-no-blanks-input 19.2 Reading Text Strings with the Minibuffer
read-non-nil-coding-system 32.10.4 User-Chosen Coding Systems
read-only (text property) 31.19.4 Properties with Special Meanings
read-only buffer 26.7 Read-Only Buffers
read-only buffers in interactive 20.2.1 Using interactive
read-only character 31.19.4 Properties with Special Meanings
read-only-mode 26.7 Read-Only Buffers
read-passwd 19.9 Reading a Password
read-quoted-char 20.8.5 Quoted Character Input
read-quoted-char quitting 20.11 Quitting
read-regexp 19.2 Reading Text Strings with the Minibuffer
read-regexp-defaults-function 19.2 Reading Text Strings with the Minibuffer
read-shell-command 19.6.5 Reading File Names
read-string 19.2 Reading Text Strings with the Minibuffer
read-variable 19.6.4 High-Level Completion Functions
reading 18.1 Introduction to Reading and Printing
reading a single event 20.8.2 Reading One Event
reading from files 24.3 Reading from Files
reading from minibuffer with completion 19.6.2 Completion and the Minibuffer
reading interactive arguments 20.2.2 Code Characters for interactive
reading numbers in hex, octal, and binary 3.1 Integer Basics
reading order 37.24 Bidirectional Display
reading symbols 8.3 Creating and Interning Symbols
real-last-command 20.5 Information from the Command Loop
rearrangement of lists 5.6.3 Functions that Rearrange Lists
rebinding 21.12 Changing Key Bindings
recent-auto-save-p 25.2 Auto-Saving
recent-keys 38.12.2 Recording Input
recenter 27.20 Textual Scrolling
recenter-positions 27.20 Textual Scrolling
recenter-redisplay 27.20 Textual Scrolling
recenter-top-bottom 27.20 Textual Scrolling
recombining windows 27.7 Recombining Windows
record command history 20.3 Interactive Call
recording input 38.12.2 Recording Input
recursion 10.4 Iteration
recursion-depth 20.13 Recursive Editing
recursive command loop 20.13 Recursive Editing
recursive editing level 20.13 Recursive Editing
recursive evaluation 9.1 Introduction to Evaluation
recursive minibuffers 19.13 Recursive Minibuffers
recursive-edit 20.13 Recursive Editing
redirect-frame-focus 28.9 Input Focus
redisplay 37.2 Forcing Redisplay
redo 31.9 Undo
redraw-display 37.1 Refreshing the Screen
redraw-frame 37.1 Refreshing the Screen
references, following D.2 Key Binding Conventions
refresh the screen 37.1 Refreshing the Screen
regexp 33.3 Regular Expressions
regexp alternative 33.3.1.3 Backslash Constructs in Regular Expressions
regexp grouping 33.3.1.3 Backslash Constructs in Regular Expressions
regexp searching 33.4 Regular Expression Searching
regexp syntax 33.3.1 Syntax of Regular Expressions
regexp, special characters in 33.3.1.1 Special Characters in Regular Expressions
regexp-history 19.4 Minibuffer History
regexp-opt 33.3.3 Regular Expression Functions
regexp-opt-charset 33.3.3 Regular Expression Functions
regexp-opt-depth 33.3.3 Regular Expression Functions
regexp-quote 33.3.3 Regular Expression Functions
regexps used standardly in editing 33.8 Standard Regular Expressions Used in Editing
region 30.8 The Region
region argument 20.2.2 Code Characters for interactive
region-beginning 30.8 The Region
region-end 30.8 The Region
register preview 31.21 Registers
register-alist 31.21 Registers
register-read-with-preview 31.21 Registers
registers 31.21 Registers
regular expression 33.3 Regular Expressions
regular expression searching 33.4 Regular Expression Searching
regular expressions, developing 33.3 Regular Expressions
reindent-then-newline-and-indent 31.17.2 Indentation Controlled by Major Mode
relative file name 24.8.2 Absolute and Relative File Names
relative remapping, faces 37.12.5 Face Remapping
remainder 3.6 Arithmetic Operations
remapping commands 21.13 Remapping Commands
remhash 7.2 Hash Table Access
remote-file-name-inhibit-cache 24.11 Making Certain File Names “Magic”
remove 5.7 Using Lists as Sets
remove-from-invisibility-spec 37.6 Invisible Text
remove-function 12.10.1 Primitives to manipulate advices
remove-hook 22.1.2 Setting Hooks
remove-images 37.17.9 Showing Images
remove-list-of-text-properties 31.19.2 Changing Text Properties
remove-overlays 37.9.1 Managing Overlays
remove-text-properties 31.19.2 Changing Text Properties
remq 5.7 Using Lists as Sets
rename-auto-save-file 25.2 Auto-Saving
rename-buffer 26.3 Buffer Names
rename-file 24.7 Changing File Names and Attributes
rendering html 31.26 Parsing HTML and XML
reordering, of bidirectional text 37.24 Bidirectional Display
reordering, of elements in lists 5.6.3 Functions that Rearrange Lists
repeat events 20.7.7 Repeat Events
repeated loading 15.6 Repeated Loading
replace bindings 21.12 Changing Key Bindings
replace characters 31.20 Substituting for a Character Code
replace characters in region 31.20 Substituting for a Character Code
replace list element 5.6.1 Altering List Elements with setcar
replace matched text 33.6.1 Replacing the Text that Matched
replace part of list 5.6.2 Altering the CDR of a List
replace-buffer-in-windows 27.10 Buffers and Windows
replace-match 33.6.1 Replacing the Text that Matched
replace-re-search-function 33.7 Search and Replace
replace-regexp-in-string 33.7 Search and Replace
replace-search-function 33.7 Search and Replace
replacement after search 33.7 Search and Replace
replacing display specs 37.16.1 Display Specs That Replace The Text
require 15.7 Features
require, customization keyword 14.1 Common Item Keywords
require-final-newline 24.2 Saving Buffers
requiring features 15.7 Features
reserved keys D.2 Key Binding Conventions
resize frame 28.3.4 Frame Size And Position
resize window 27.4 Resizing Windows
rest arguments 12.2.3 Other Features of Argument Lists
restore-buffer-modified-p 26.5 Buffer Modification
restriction (in a buffer) 29.4 Narrowing
resume (cf. no-redraw-on-reenter) 37.1 Refreshing the Screen
resume-tty 38.2.2 Suspending Emacs
resume-tty-functions 38.2.2 Suspending Emacs
rethrow a signal 10.5.3.3 Writing Code to Handle Errors
return (ASCII character) 2.3.3.1 Basic Char Syntax
return value 12.1 What Is a Function?
reverse 5.4 Building Cons Cells and Lists
reversing a list 5.6.3 Functions that Rearrange Lists
revert-buffer 25.3 Reverting
revert-buffer-function 25.3 Reverting
revert-buffer-in-progress-p 25.3 Reverting
revert-buffer-insert-file-contents-function 25.3 Reverting
revert-without-query 25.3 Reverting
reverting buffers 25.3 Reverting
rgb value 28.20 Color Names
right dividers 37.15 Window Dividers
right-divider-width, a frame parameter 28.3.3.4 Layout Parameters
right-fringe, a frame parameter 28.3.3.4 Layout Parameters
right-fringe-width 37.13.1 Fringe Size and Position
right-margin-width 37.16.5 Displaying in the Margins
right-to-left text 37.24 Bidirectional Display
ring data structure 6.8 Managing a Fixed-Size Ring of Objects
ring-bell-function 37.22 Beeping
ring-copy 6.8 Managing a Fixed-Size Ring of Objects
ring-elements 6.8 Managing a Fixed-Size Ring of Objects
ring-empty-p 6.8 Managing a Fixed-Size Ring of Objects
ring-insert 6.8 Managing a Fixed-Size Ring of Objects
ring-insert-at-beginning 6.8 Managing a Fixed-Size Ring of Objects
ring-length 6.8 Managing a Fixed-Size Ring of Objects
ring-p 6.8 Managing a Fixed-Size Ring of Objects
ring-ref 6.8 Managing a Fixed-Size Ring of Objects
ring-remove 6.8 Managing a Fixed-Size Ring of Objects
ring-size 6.8 Managing a Fixed-Size Ring of Objects
risky, defcustom keyword 14.3 Defining Customization Variables
risky-local-variable-p 11.11 File Local Variables
rm 24.7 Changing File Names and Attributes
root window 27.2 Windows and Frames
round 3.5 Numeric Conversions
rounding in conversions 3.5 Numeric Conversions
rounding without conversion 3.7 Rounding Operations
rplaca 5.6 Modifying Existing List Structure
rplacd 5.6 Modifying Existing List Structure
run time stack 17.1.8 Internals of the Debugger
run-at-time 38.10 Timers for Delayed Execution
run-hook-with-args 22.1.1 Running Hooks
run-hook-with-args-until-failure 22.1.1 Running Hooks
run-hook-with-args-until-success 22.1.1 Running Hooks
run-hooks 22.1.1 Running Hooks
run-mode-hooks 22.2.6 Mode Hooks
run-with-idle-timer 38.11 Idle Timers

S
S-expression 9.1 Introduction to Evaluation
safe local variable 11.11 File Local Variables
safe, defcustom keyword 14.3 Defining Customization Variables
safe-length 5.3 Accessing Elements of Lists
safe-local-eval-forms 11.11 File Local Variables
safe-local-variable-p 11.11 File Local Variables
safe-local-variable-values 11.11 File Local Variables
safe-magic (property) 24.11 Making Certain File Names “Magic”
safely encode a string 32.10.3 Coding Systems in Lisp
safely encode characters in a charset 32.10.3 Coding Systems in Lisp
safely encode region 32.10.3 Coding Systems in Lisp
safety of functions 12.15 Determining whether a Function is Safe to Call
same-window-buffer-names 27.14 Additional Options for Displaying Buffers
same-window-p 27.14 Additional Options for Displaying Buffers
same-window-regexps 27.14 Additional Options for Displaying Buffers
save abbrevs in files 35.3 Saving Abbrevs in Files
save-abbrevs 35.3 Saving Abbrevs in Files
save-buffer 24.2 Saving Buffers
save-buffer-coding-system 32.10.2 Encoding and I/O
save-current-buffer 26.2 The Current Buffer
save-excursion 29.3 Excursions
save-match-data 33.6.4 Saving and Restoring the Match Data
save-restriction 29.4 Narrowing
save-selected-window 27.8 Selecting Windows
save-some-buffers 24.2 Saving Buffers
save-window-excursion 27.24 Window Configurations
SaveUnder feature 28.23 Display Feature Testing
saving buffers 24.2 Saving Buffers
saving text properties 24.12 File Format Conversion
saving window information 27.24 Window Configurations
scalability of overlays 37.9 Overlays
scalable fonts 37.12.9 Font Selection
scalable-fonts-allowed 37.12.9 Font Selection
scan-lists 34.6.1 Motion Commands Based on Parsing
scan-sexps 34.6.1 Motion Commands Based on Parsing
scanning expressions 34.6 Parsing Expressions
scanning for character sets 32.8 Scanning for Character Sets
scanning keymaps 21.16 Scanning Keymaps
scope 11.9 Scoping Rules for Variable Bindings
scoping rule 11.9 Scoping Rules for Variable Bindings
screen layout 2.4.7 Frame Configuration Type
screen lines, moving by 29.2.5 Motion by Screen Lines
screen of terminal 27.1 Basic Concepts of Emacs Windows
screen refresh 37.1 Refreshing the Screen
screen size 28.3.4 Frame Size And Position
screen-gamma, a frame parameter 28.3.3.8 Font and Color Parameters
script symbols 32.6 Character Properties
scroll bar events, data in 20.7.14 Accessing Scroll Bar Events
scroll bars 37.14 Scroll Bars
scroll-bar-background, a frame parameter 28.3.3.8 Font and Color Parameters
scroll-bar-event-ratio 20.7.14 Accessing Scroll Bar Events
scroll-bar-foreground, a frame parameter 28.3.3.8 Font and Color Parameters
scroll-bar-mode 37.14 Scroll Bars
scroll-bar-scale 20.7.14 Accessing Scroll Bar Events
scroll-bar-width 37.14 Scroll Bars
scroll-bar-width, a frame parameter 28.3.3.4 Layout Parameters
scroll-command property 27.20 Textual Scrolling
scroll-conservatively 27.20 Textual Scrolling
scroll-down 27.20 Textual Scrolling
scroll-down-aggressively 27.20 Textual Scrolling
scroll-down-command 27.20 Textual Scrolling
scroll-error-top-bottom 27.20 Textual Scrolling
scroll-left 27.22 Horizontal Scrolling
scroll-margin 27.20 Textual Scrolling
scroll-other-window 27.20 Textual Scrolling
scroll-preserve-screen-position 27.20 Textual Scrolling
scroll-right 27.22 Horizontal Scrolling
scroll-step 27.20 Textual Scrolling
scroll-up 27.20 Textual Scrolling
scroll-up-aggressively 27.20 Textual Scrolling
scroll-up-command 27.20 Textual Scrolling
scrolling textually 27.20 Textual Scrolling
search-backward 33.1 Searching for Strings
search-failed 33.1 Searching for Strings
search-forward 33.1 Searching for Strings
search-map 21.6 Prefix Keys
search-spaces-regexp 33.4 Regular Expression Searching
searching 33 Searching and Matching
searching active keymaps for keys 21.8 Searching the Active Keymaps
searching and case 33.2 Searching and Case
searching and replacing 33.7 Search and Replace
searching for overlays 37.9.3 Searching for Overlays
searching for regexp 33.4 Regular Expression Searching
searching text properties 31.19.3 Text Property Search Functions
secondary selection 28.18 Window System Selections
seconds-to-time 38.7 Parsing and Formatting Times
secure-hash 31.25 Checksum/Hash
select safe coding system 32.10.4 User-Chosen Coding Systems
select-frame 28.9 Input Focus
select-frame-set-input-focus 28.9 Input Focus
select-safe-coding-system 32.10.4 User-Chosen Coding Systems
select-safe-coding-system-accept-default-p 32.10.4 User-Chosen Coding Systems
select-window 27.8 Selecting Windows
selected window 27.1 Basic Concepts of Emacs Windows
selected-frame 28.9 Input Focus
selected-window 27.1 Basic Concepts of Emacs Windows
selecting a buffer 26.2 The Current Buffer
selecting a font 37.12.9 Font Selection
selecting a window 27.8 Selecting Windows
selection (for window systems) 28.18 Window System Selections
selection-coding-system 28.18 Window System Selections
selective-display 37.7 Selective Display
selective-display-ellipses 37.7 Selective Display
self-evaluating form 9.2.1 Self-Evaluating Forms
self-insert-and-exit 19.10 Minibuffer Commands
self-insert-command 31.5 User-Level Insertion Commands
self-insert-command override 21.12 Changing Key Bindings
self-insert-command, minor modes 22.3.2 Keymaps and Minor Modes
self-insertion 31.5 User-Level Insertion Commands
SELinux context 24.6.5 Extended File Attributes
send-string-to-terminal 38.13 Terminal Output
sending signals 36.8 Sending Signals to Processes
sentence-end 33.8 Standard Regular Expressions Used in Editing
sentence-end 33.8 Standard Regular Expressions Used in Editing
sentence-end-double-space 31.11 Filling
sentence-end-without-period 31.11 Filling
sentence-end-without-space 31.11 Filling
sentinel (of process) 36.10 Sentinels: Detecting Process Status Changes
sequence 6 Sequences, Arrays, and Vectors
sequence length 6.1 Sequences
sequencep 6.1 Sequences
sequencing 10.1 Sequencing
sequential execution 10.1 Sequencing
serial connections 36.19 Communicating with Serial Ports
serial-process-configure 36.19 Communicating with Serial Ports
serial-term 36.19 Communicating with Serial Ports
serializing 36.20 Packing and Unpacking Byte Arrays
session file 38.17 Session Management
session manager 38.17 Session Management
set 11.8 Setting Variable Values
set, defcustom keyword 14.3 Defining Customization Variables
set-advertised-calling-convention 12.11 Declaring Functions Obsolete
set-after, defcustom keyword 14.3 Defining Customization Variables
set-auto-coding 32.10.5 Default Coding Systems
set-auto-mode 22.2.2 How Emacs Chooses a Major Mode
set-buffer 26.2 The Current Buffer
set-buffer-auto-saved 25.2 Auto-Saving
set-buffer-major-mode 22.2.2 How Emacs Chooses a Major Mode
set-buffer-modified-p 26.5 Buffer Modification
set-buffer-multibyte 32.4 Selecting a Representation
set-case-syntax 4.9 The Case Table
set-case-syntax-delims 4.9 The Case Table
set-case-syntax-pair 4.9 The Case Table
set-case-table 4.9 The Case Table
set-category-table 34.8 Categories
set-char-table-extra-slot 6.6 Char-Tables
set-char-table-parent 6.6 Char-Tables
set-char-table-range 6.6 Char-Tables
set-charset-priority 32.7 Character Sets
set-coding-system-priority 32.10.6 Specifying a Coding System for One Operation
set-default 11.10.3 The Default Value of a Buffer-Local Variable
set-default-file-modes 24.7 Changing File Names and Attributes
set-display-table-slot 37.21.2 Display Tables
set-face-attribute 37.12.3 Face Attribute Functions
set-face-background 37.12.3 Face Attribute Functions
set-face-bold 37.12.3 Face Attribute Functions
set-face-font 37.12.3 Face Attribute Functions
set-face-foreground 37.12.3 Face Attribute Functions
set-face-inverse-video 37.12.3 Face Attribute Functions
set-face-italic 37.12.3 Face Attribute Functions
set-face-stipple 37.12.3 Face Attribute Functions
set-face-underline 37.12.3 Face Attribute Functions
set-file-acl 24.7 Changing File Names and Attributes
set-file-extended-attributes 24.7 Changing File Names and Attributes
set-file-modes 24.7 Changing File Names and Attributes
set-file-selinux-context 24.7 Changing File Names and Attributes
set-file-times 24.7 Changing File Names and Attributes
set-fontset-font 37.12.11 Fontsets
set-frame-configuration 28.12 Frame Configurations
set-frame-height 28.3.4 Frame Size And Position
set-frame-parameter 28.3.1 Access to Frame Parameters
set-frame-position 28.3.4 Frame Size And Position
set-frame-selected-window 27.8 Selecting Windows
set-frame-size 28.3.4 Frame Size And Position
set-frame-width 28.3.4 Frame Size And Position
set-fringe-bitmap-face 37.13.5 Customizing Fringe Bitmaps
set-input-method 32.11 Input Methods
set-input-mode 38.12.1 Input Modes
set-keyboard-coding-system 32.10.8 Terminal I/O Encoding
set-keymap-parent 21.5 Inheritance and Keymaps
set-left-margin 31.12 Margins for Filling
set-mark 30.7 The Mark
set-marker 30.6 Moving Marker Positions
set-marker-insertion-type 30.5 Marker Insertion Types
set-match-data 33.6.3 Accessing the Entire Match Data
set-minibuffer-window 19.11 Minibuffer Windows
set-mouse-pixel-position 28.14 Mouse Position
set-mouse-position 28.14 Mouse Position
set-network-process-option 36.17.2 Network Options
set-process-buffer 36.9.1 Process Buffers
set-process-coding-system 36.6 Process Information
set-process-datagram-address 36.16 Datagrams
set-process-filter 36.9.2 Process Filter Functions
set-process-plist 36.6 Process Information
set-process-query-on-exit-flag 36.11 Querying Before Exit
set-process-sentinel 36.10 Sentinels: Detecting Process Status Changes
set-register 31.21 Registers
set-right-margin 31.12 Margins for Filling
set-standard-case-table 4.9 The Case Table
set-syntax-table 34.3 Syntax Table Functions
set-terminal-coding-system 32.10.8 Terminal I/O Encoding
set-terminal-parameter 28.4 Terminal Parameters
set-text-properties 31.19.2 Changing Text Properties
set-transient-map 21.9 Controlling the Active Keymaps
set-visited-file-modtime 26.6 Buffer Modification Time
set-visited-file-name 26.4 Buffer File Name
set-window-buffer 27.10 Buffers and Windows
set-window-combination-limit 27.7 Recombining Windows
set-window-configuration 27.24 Window Configurations
set-window-dedicated-p 27.16 Dedicated Windows
set-window-display-table 37.21.3 Active Display Table
set-window-fringes 37.13.1 Fringe Size and Position
set-window-hscroll 27.22 Horizontal Scrolling
set-window-margins 37.16.5 Displaying in the Margins
set-window-next-buffers 27.15 Window History
set-window-parameter 27.25 Window Parameters
set-window-point 27.18 Windows and Point
set-window-prev-buffers 27.15 Window History
set-window-scroll-bars 37.14 Scroll Bars
set-window-start 27.19 The Window Start and End Positions
set-window-vscroll 27.21 Vertical Fractional Scrolling
setcar 5.6.1 Altering List Elements with setcar
setcdr 5.6.2 Altering the CDR of a List
setenv 38.3 Operating System Environment
setf 11.15.1 The setf Macro
setplist 8.4.1 Accessing Symbol Properties
setq 11.8 Setting Variable Values
setq-default 11.10.3 The Default Value of a Buffer-Local Variable
setq-local 11.10.2 Creating and Deleting Buffer-Local Bindings
sets 5.7 Using Lists as Sets
setting modes of files 24.7 Changing File Names and Attributes
setting-constant error 11.2 Variables that Never Change
severity level 37.5.1 Warning Basics
sexp 9.1 Introduction to Evaluation
sexp motion 29.2.6 Moving over Balanced Expressions
SHA hash 31.25 Checksum/Hash
shadowed Lisp files 15.3 Library Search
shadowing of variables 11.3 Local Variables
shared structure, read syntax 2.5 Read Syntax for Circular Objects
shell command arguments 36.2 Shell Arguments
shell-command-history 19.4 Minibuffer History
shell-command-to-string 36.3 Creating a Synchronous Process
shell-quote-argument 36.2 Shell Arguments
shift-selection, and interactive spec 20.2.1 Using interactive
shift-translation 20.8.1 Key Sequence Input
show image 37.17.9 Showing Images
show-help-function 31.19.4 Properties with Special Meanings
shr-insert-document 31.26 Parsing HTML and XML
shrink-window-if-larger-than-buffer 27.4 Resizing Windows
shy groups 33.3.1.3 Backslash Constructs in Regular Expressions
sibling window 27.2 Windows and Frames
side effect 9.1 Introduction to Evaluation
SIGHUP 38.2.1 Killing Emacs
SIGINT 38.2.1 Killing Emacs
signal 10.5.3.1 How to Signal an Error
signal-process 36.8 Sending Signals to Processes
signaling errors 10.5.3.1 How to Signal an Error
signals 36.8 Sending Signals to Processes
SIGTERM 38.2.1 Killing Emacs
SIGTSTP 38.2.2 Suspending Emacs
sigusr1 event 20.7.10 Miscellaneous System Events
sigusr2 event 20.7.10 Miscellaneous System Events
simple package 39.2 Simple Packages
sin 3.9 Standard Mathematical Functions
single file package 39.2 Simple Packages
single-function hook 22.1 Hooks
single-key-description 23.4 Describing Characters for Help Messages
sit-for 20.10 Waiting for Elapsed Time or Input
site-init.el E.1 Building Emacs
site-lisp directories 15.3 Library Search
site-load.el E.1 Building Emacs
site-run-file 38.1.2 The Init File
site-start.el 38.1.1 Summary: Sequence of Actions at Startup
size of frame 28.3.4 Frame Size And Position
size of image 37.17.9 Showing Images
size of text on display 37.10 Size of Displayed Text
size of window 27.3 Window Sizes
skip-chars-backward 29.2.7 Skipping Characters
skip-chars-forward 29.2.7 Skipping Characters
skip-syntax-backward 34.5 Motion and Syntax
skip-syntax-forward 34.5 Motion and Syntax
skipping characters 29.2.7 Skipping Characters
skipping characters of certain syntax 34.5 Motion and Syntax
skipping comments 34.6.5 Parameters to Control Parsing
sleep-for 20.10 Waiting for Elapsed Time or Input
slice, image 37.17.9 Showing Images
small-temporary-file-directory 24.8.5 Generating Unique File Names
smallest Lisp integer 3.1 Integer Basics
SMIE 22.7.1 Simple Minded Indentation Engine
SMIE grammar 22.7.1.3 Defining the Grammar of a Language
SMIE lexer 22.7.1.4 Defining Tokens
smie-bnf->prec2 22.7.1.2 Operator Precedence Grammars
smie-close-block 22.7.1.1 SMIE Setup and Features
smie-config 22.7.1.9 Customizing Indentation
smie-config-guess 22.7.1.9 Customizing Indentation
smie-config-local 22.7.1.9 Customizing Indentation
smie-config-save 22.7.1.9 Customizing Indentation
smie-config-set-indent 22.7.1.9 Customizing Indentation
smie-config-show-indent 22.7.1.9 Customizing Indentation
smie-down-list 22.7.1.1 SMIE Setup and Features
smie-merge-prec2s 22.7.1.2 Operator Precedence Grammars
smie-prec2->grammar 22.7.1.2 Operator Precedence Grammars
smie-precs->prec2 22.7.1.2 Operator Precedence Grammars
smie-rule-bolp 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-hanging-p 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-next-p 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-parent 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-parent-p 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-prev-p 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-separator 22.7.1.7 Helper Functions for Indentation Rules
smie-rule-sibling-p 22.7.1.7 Helper Functions for Indentation Rules
smie-setup 22.7.1.1 SMIE Setup and Features
Snarf-documentation 23.2 Access to Documentation Strings
sort 5.6.3 Functions that Rearrange Lists
sort-columns 31.15 Sorting Text
sort-fields 31.15 Sorting Text
sort-fold-case 31.15 Sorting Text
sort-lines 31.15 Sorting Text
sort-numeric-base 31.15 Sorting Text
sort-numeric-fields 31.15 Sorting Text
sort-pages 31.15 Sorting Text
sort-paragraphs 31.15 Sorting Text
sort-regexp-fields 31.15 Sorting Text
sort-subr 31.15 Sorting Text
sorting lists 5.6.3 Functions that Rearrange Lists
sorting text 31.15 Sorting Text
sound 38.14 Sound Output
source breakpoints 17.2.6.3 Source Breakpoints
space (ASCII character) 2.3.3.1 Basic Char Syntax
space display spec, and bidirectional text 37.24 Bidirectional Display
spaces, pixel specification 37.16.3 Pixel Specification for Spaces
spaces, specified height or width 37.16.2 Specified Spaces
sparse keymap 21.3 Format of Keymaps
SPC in minibuffer 19.2 Reading Text Strings with the Minibuffer
special events 20.9 Special Events
special form descriptions 1.3.7.1 A Sample Function Description
special forms 9.2.7 Special Forms
special forms for control structures 10 Control Structures
special modes 22.2.1 Major Mode Conventions
special variables 11.9.4 Using Lexical Binding
special-event-map 21.9 Controlling the Active Keymaps
special-form-p 9.2.7 Special Forms
special-mode 22.2.5 Basic Major Modes
special-variable-p 11.9.4 Using Lexical Binding
specify coding system 32.10.6 Specifying a Coding System for One Operation
specify color 28.20 Color Names
speedups D.4 Tips for Making Compiled Code Fast
splicing (with backquote) 9.4 Backquote
split-height-threshold 27.14 Additional Options for Displaying Buffers
split-string 4.3 Creating Strings
split-string-and-unquote 36.2 Shell Arguments
split-string-default-separators 4.3 Creating Strings
split-width-threshold 27.14 Additional Options for Displaying Buffers
split-window 27.5 Splitting Windows
split-window-below 27.5 Splitting Windows
split-window-keep-point 27.5 Splitting Windows
split-window-preferred-function 27.14 Additional Options for Displaying Buffers
split-window-right 27.5 Splitting Windows
split-window-sensibly 27.14 Additional Options for Displaying Buffers
splitting windows 27.5 Splitting Windows
sqrt 3.9 Standard Mathematical Functions
stable sort 5.6.3 Functions that Rearrange Lists
standard abbrev tables 35.5 Standard Abbrev Tables
standard colors for character terminals 28.3.3.8 Font and Color Parameters
standard errors Appendix F Standard Errors
standard hooks Appendix H Standard Hooks
standard regexps used in editing 33.8 Standard Regular Expressions Used in Editing
standard syntax table 34.1 Syntax Table Concepts
standard-case-table 4.9 The Case Table
standard-category-table 34.8 Categories
standard-display-table 37.21.3 Active Display Table
standard-input 18.3 Input Functions
standard-output 18.6 Variables Affecting Output
standard-syntax-table 34.1 Syntax Table Concepts
standard-translation-table-for-decode 32.9 Translation of Characters
standard-translation-table-for-encode 32.9 Translation of Characters
standards of coding style Appendix D Tips and Conventions
start-file-process 36.4 Creating an Asynchronous Process
start-file-process-shell-command 36.4 Creating an Asynchronous Process
start-process 36.4 Creating an Asynchronous Process
start-process, command-line arguments from minibuffer 36.2 Shell Arguments
start-process-shell-command 36.4 Creating an Asynchronous Process
STARTTLS network connections 36.14 Network Connections
startup of Emacs 38.1.1 Summary: Sequence of Actions at Startup
startup screen 38.1.1 Summary: Sequence of Actions at Startup
startup.el 38.1.1 Summary: Sequence of Actions at Startup
staticpro, protection from GC E.6 Writing Emacs Primitives
sticky text properties 31.19.6 Stickiness of Text Properties
sticky, a frame parameter 28.3.3.6 Window Management Parameters
stop points 17.2.1 Using Edebug
stop-process 36.8 Sending Signals to Processes
stopbits, in serial connections 36.19 Communicating with Serial Ports
stopping an infinite loop 17.1.2 Debugging Infinite Loops
stopping on events 17.2.6.2 Global Break Condition
storage of vector-like Lisp objects E.3 Garbage Collection
store-match-data 33.6.3 Accessing the Entire Match Data
store-substring 4.4 Modifying Strings
stream (for printing) 18.4 Output Streams
stream (for reading) 18.2 Input Streams
strike-through text 37.12.1 Face Attributes
string 4.3 Creating Strings
string creation 4.3 Creating Strings
string equality 4.5 Comparison of Characters and Strings
string in keymap 21.10 Key Lookup
string input stream 18.2 Input Streams
string length 6.1 Sequences
string modification 4.4 Modifying Strings
string predicates 4.2 Predicates for Strings
string search 33.1 Searching for Strings
string to number 4.6 Conversion of Characters and Strings
string to object 18.3 Input Functions
string, number of bytes 32.1 Text Representations
string, writing a doc string 23.1 Documentation Basics
string-as-multibyte 32.4 Selecting a Representation
string-as-unibyte 32.4 Selecting a Representation
string-bytes 32.1 Text Representations
string-chars-consed E.4 Memory Usage
string-equal 4.5 Comparison of Characters and Strings
string-lessp 4.5 Comparison of Characters and Strings
string-match 33.4 Regular Expression Searching
string-match-p 33.4 Regular Expression Searching
string-or-null-p 4.2 Predicates for Strings
string-prefix-p 4.5 Comparison of Characters and Strings
string-suffix-p 4.5 Comparison of Characters and Strings
string-to-char 4.6 Conversion of Characters and Strings
string-to-int 4.6 Conversion of Characters and Strings
string-to-multibyte 32.3 Converting Text Representations
string-to-number 4.6 Conversion of Characters and Strings
string-to-syntax 34.7 Syntax Table Internals
string-to-unibyte 32.3 Converting Text Representations
string-width 37.10 Size of Displayed Text
string< 4.5 Comparison of Characters and Strings
string= 4.5 Comparison of Characters and Strings
stringp 4.2 Predicates for Strings
strings 4 Strings and Characters
strings with keyboard events 20.7.15 Putting Keyboard Events in Strings
strings, formatting them 4.7 Formatting Strings
strings-consed E.4 Memory Usage
submenu 21.17.2 Menus and the Mouse
subprocess 36 Processes
subr 12.1 What Is a Function?
subr-arity 12.1 What Is a Function?
subrp 12.1 What Is a Function?
subst-char-in-region 31.20 Substituting for a Character Code
substitute characters 31.20 Substituting for a Character Code
substitute-command-keys 23.3 Substituting Key Bindings in Documentation
substitute-in-file-name 24.8.4 Functions that Expand Filenames
substitute-key-definition 21.12 Changing Key Bindings
substituting keys in documentation 23.3 Substituting Key Bindings in Documentation
substring 4.3 Creating Strings
substring-no-properties 4.3 Creating Strings
subtype of char-table 6.6 Char-Tables
suggestions 1.1 Caveats
super characters 2.3.3.5 Other Character Modifier Bits
suppress-keymap 21.12 Changing Key Bindings
suspend (cf. no-redraw-on-reenter) 37.1 Refreshing the Screen
suspend evaluation 20.13 Recursive Editing
suspend-emacs 38.2.2 Suspending Emacs
suspend-frame 38.2.2 Suspending Emacs
suspend-hook 38.2.2 Suspending Emacs
suspend-resume-hook 38.2.2 Suspending Emacs
suspend-tty 38.2.2 Suspending Emacs
suspend-tty-functions 38.2.2 Suspending Emacs
suspending Emacs 38.2.2 Suspending Emacs
swap text between buffers 26.12 Swapping Text Between Two Buffers
switch-to-buffer 27.11 Switching to a Buffer in a Window
switch-to-buffer-other-frame 27.11 Switching to a Buffer in a Window
switch-to-buffer-other-window 27.11 Switching to a Buffer in a Window
switch-to-buffer-preserve-window-point 27.11 Switching to a Buffer in a Window
switch-to-next-buffer 27.15 Window History
switch-to-prev-buffer 27.15 Window History
switch-to-visible-buffer 27.15 Window History
switches on command line 38.1.4 Command-Line Arguments
switching to a buffer 27.11 Switching to a Buffer in a Window
sxhash 7.3 Defining Hash Comparisons
symbol 8 Symbols
symbol components 8.1 Symbol Components
symbol equality 8.3 Creating and Interning Symbols
symbol evaluation 9.2.2 Symbol Forms
symbol function indirection 9.2.4 Symbol Function Indirection
symbol in keymap 21.10 Key Lookup
symbol name hashing 8.3 Creating and Interning Symbols
symbol property 8.4 Symbol Properties
symbol that evaluates to itself 11.2 Variables that Never Change
symbol with constant value 11.2 Variables that Never Change
symbol, where defined 15.8 Which File Defined a Certain Symbol
symbol-file 15.8 Which File Defined a Certain Symbol
symbol-function 12.8 Accessing Function Cell Contents
symbol-name 8.3 Creating and Interning Symbols
symbol-plist 8.4.1 Accessing Symbol Properties
symbol-value 11.7 Accessing Variable Values
symbolp 8 Symbols
symbols-consed E.4 Memory Usage
synchronous subprocess 36.3 Creating a Synchronous Process
syntactic font lock 22.6.8 Syntactic Font Lock
syntax class 34.2 Syntax Descriptors
syntax class table 34.2.1 Table of Syntax Classes
syntax code 34.7 Syntax Table Internals
syntax descriptor 34.2 Syntax Descriptors
syntax entry, setting 34.3 Syntax Table Functions
syntax error (Edebug) 17.2.15.3 Backtracking in Specifications
syntax flags 34.2.2 Syntax Flags
syntax for characters 2.3.3.1 Basic Char Syntax
syntax of regular expressions 33.3.1 Syntax of Regular Expressions
syntax table 34 Syntax Tables
syntax table example 22.2.9 Major Mode Examples
syntax table internals 34.7 Syntax Table Internals
syntax tables in modes 22.2.1 Major Mode Conventions
syntax-after 34.7 Syntax Table Internals
syntax-begin-function 34.6.2 Finding the Parse State for a Position
syntax-class 34.7 Syntax Table Internals
syntax-ppss 34.6.2 Finding the Parse State for a Position
syntax-ppss-flush-cache 34.6.2 Finding the Parse State for a Position
syntax-ppss-toplevel-pos 34.6.3 Parser State
syntax-propertize-extend-region-functions 34.4 Syntax Properties
syntax-propertize-function 34.4 Syntax Properties
syntax-table 34.3 Syntax Table Functions
syntax-table (text property) 34.4 Syntax Properties
syntax-table-p 34.1 Syntax Table Concepts
system abbrev 35 Abbrevs and Abbrev Expansion
system processes 36.12 Accessing Other Processes
system type and name 38.3 Operating System Environment
system-configuration 38.3 Operating System Environment
system-groups 38.4 User Identification
system-key-alist 38.15 Operating on X11 Keysyms
system-messages-locale 32.12 Locales
system-name 38.3 Operating System Environment
system-time-locale 32.12 Locales
system-type 38.3 Operating System Environment
system-users 38.4 User Identification

T
t 1.3.2 nil and t
t input stream 18.2 Input Streams
t output stream 18.4 Output Streams
tab (ASCII character) 2.3.3.1 Basic Char Syntax
tab deletion 31.6 Deleting Text
TAB in minibuffer 19.2 Reading Text Strings with the Minibuffer
tab-always-indent 31.17.2 Indentation Controlled by Major Mode
tab-stop-list 31.17.5 Adjustable “Tab Stops”
tab-to-tab-stop 31.17.5 Adjustable “Tab Stops”
tab-width 37.21.1 Usual Display Conventions
tabs stops for indentation 31.17.5 Adjustable “Tab Stops”
Tabulated List mode 22.2.7 Tabulated List mode
tabulated-list-entries 22.2.7 Tabulated List mode
tabulated-list-format 22.2.7 Tabulated List mode
tabulated-list-init-header 22.2.7 Tabulated List mode
tabulated-list-mode 22.2.7 Tabulated List mode
tabulated-list-print 22.2.7 Tabulated List mode
tabulated-list-printer 22.2.7 Tabulated List mode
tabulated-list-revert-hook 22.2.7 Tabulated List mode
tabulated-list-sort-key 22.2.7 Tabulated List mode
tag on run time stack 10.5.1 Explicit Nonlocal Exits: catch and throw
tag, customization keyword 14.1 Common Item Keywords
tan 3.9 Standard Mathematical Functions
TCP 36.14 Network Connections
temacs E.1 Building Emacs
TEMP environment variable 24.8.5 Generating Unique File Names
temp-buffer-setup-hook 37.8 Temporary Displays
temp-buffer-show-function 37.8 Temporary Displays
temp-buffer-show-hook 37.8 Temporary Displays
temp-buffer-window-setup-hook 37.8 Temporary Displays
temp-buffer-window-show-hook 37.8 Temporary Displays
temporary buffer display 37.8 Temporary Displays
temporary display 37.8 Temporary Displays
temporary files 24.8.5 Generating Unique File Names
temporary-file-directory 24.8.5 Generating Unique File Names
TERM environment variable 38.1.3 Terminal-Specific Initialization
term-file-prefix 38.1.3 Terminal-Specific Initialization
Termcap 38.1.3 Terminal-Specific Initialization
terminal 28 Frames
terminal input 38.12 Terminal Input
terminal input modes 38.12.1 Input Modes
terminal output 38.13 Terminal Output
terminal parameters 28.4 Terminal Parameters
terminal screen 27.1 Basic Concepts of Emacs Windows
terminal type 2.4.5 Terminal Type
terminal-coding-system 32.10.8 Terminal I/O Encoding
terminal-list 28.2 Multiple Terminals
terminal-live-p 28 Frames
terminal-local variables 28.2 Multiple Terminals
terminal-name 28.2 Multiple Terminals
terminal-parameter 28.4 Terminal Parameters
terminal-parameters 28.4 Terminal Parameters
terminal-specific initialization 38.1.3 Terminal-Specific Initialization
termscript file 38.13 Terminal Output
terpri 18.5 Output Functions
test-completion 19.6.1 Basic Completion Functions
testcover-mark-all 17.4 Test Coverage
testcover-next-mark 17.4 Test Coverage
testcover-start 17.4 Test Coverage
testing types 2.6 Type Predicates
text 31 Text
text area of a window 27.3 Window Sizes
text comparison 4.5 Comparison of Characters and Strings
text conversion of coding system 32.10.3 Coding Systems in Lisp
text deletion 31.6 Deleting Text
text insertion 31.4 Inserting Text
text near point 31.1 Examining Text Near Point
text parsing 34 Syntax Tables
text properties 31.19 Text Properties
text properties in files 24.12 File Format Conversion
text properties in the mode line 22.4.6 Properties in the Mode Line
text properties, changing 31.19.2 Changing Text Properties
text properties, examining 31.19.1 Examining Text Properties
text properties, read syntax 2.3.8.4 Text Properties in Strings
text properties, searching 31.19.3 Text Property Search Functions
text representation 32.1 Text Representations
text terminal 28 Frames
text-char-description 23.4 Describing Characters for Help Messages
text-mode 22.2.5 Basic Major Modes
text-mode-abbrev-table 35.5 Standard Abbrev Tables
text-properties-at 31.19.1 Examining Text Properties
text-property-any 31.19.3 Text Property Search Functions
text-property-default-nonsticky 31.19.6 Stickiness of Text Properties
text-property-not-all 31.19.3 Text Property Search Functions
textual order 10 Control Structures
textual scrolling 27.20 Textual Scrolling
thing-at-point 31.2 Examining Buffer Contents
this-command 20.5 Information from the Command Loop
this-command-keys 20.5 Information from the Command Loop
this-command-keys-shift-translated 20.8.1 Key Sequence Input
this-command-keys-vector 20.5 Information from the Command Loop
this-original-command 20.5 Information from the Command Loop
three-step-help 23.5 Help Functions
throw 10.5.1 Explicit Nonlocal Exits: catch and throw
throw example 20.13 Recursive Editing
tiled windows 27.1 Basic Concepts of Emacs Windows
time calculations 38.9 Time Calculations
time conversion 38.6 Time Conversion
time formatting 38.7 Parsing and Formatting Times
time of day 38.5 Time of Day
time parsing 38.7 Parsing and Formatting Times
time zone, current 38.5 Time of Day
time-add 38.9 Time Calculations
time-less-p 38.9 Time Calculations
time-subtract 38.9 Time Calculations
time-to-day-in-year 38.9 Time Calculations
time-to-days 38.9 Time Calculations
timer 38.10 Timers for Delayed Execution
timer-max-repeats 38.10 Timers for Delayed Execution
timestamp of a mouse event 20.7.13 Accessing Mouse Events
timing programs 17.5 Profiling
tips for writing Lisp Appendix D Tips and Conventions
title, a frame parameter 28.3.3.1 Basic Parameters
TLS network connections 36.14 Network Connections
TMP environment variable 24.8.5 Generating Unique File Names
TMPDIR environment variable 24.8.5 Generating Unique File Names
toggle-enable-multibyte-characters 32.2 Disabling Multibyte Characters
tool bar 21.17.6 Tool bars
tool-bar-add-item 21.17.6 Tool bars
tool-bar-add-item-from-menu 21.17.6 Tool bars
tool-bar-border 21.17.6 Tool bars
tool-bar-button-margin 21.17.6 Tool bars
tool-bar-button-relief 21.17.6 Tool bars
tool-bar-lines frame parameter 28.3.3.4 Layout Parameters
tool-bar-local-item-from-menu 21.17.6 Tool bars
tool-bar-map 21.17.6 Tool bars
tool-bar-position frame parameter 28.3.3.4 Layout Parameters
tooltip 31.19.4 Properties with Special Meanings
top frame 28.11 Raising and Lowering Frames
top, a frame parameter 28.3.3.2 Position Parameters
top-level 20.13 Recursive Editing
top-level form 15 Loading
total height of a window 27.3 Window Sizes
total pixel height of a window 27.3 Window Sizes
total pixel height of a window 27.3 Window Sizes
total width of a window 27.3 Window Sizes
tq-close 36.13 Transaction Queues
tq-create 36.13 Transaction Queues
tq-enqueue 36.13 Transaction Queues
trace buffer 17.2.12 Trace Buffer
track-mouse 28.13 Mouse Tracking
trailing blanks in file names 24.6 Information about Files
transaction queue 36.13 Transaction Queues
transcendental functions 3.9 Standard Mathematical Functions
transient keymap 21.9 Controlling the Active Keymaps
transient-mark-mode 30.7 The Mark
translate-region 31.20 Substituting for a Character Code
translating input events 20.8.3 Modifying and Translating Input Events
translation keymap 21.14 Keymaps for Translating Sequences of Events
translation tables 32.9 Translation of Characters
translation-table-for-input 32.9 Translation of Characters
transparency, frame 28.3.3.8 Font and Color Parameters
transpose-regions 31.22 Transposition of Text
trash 24.7 Changing File Names and Attributes
trash 24.10 Creating, Copying and Deleting Directories
triple-click events 20.7.7 Repeat Events
true 1.3.2 nil and t
true list 5.1 Lists and Cons Cells
truename (of file) 24.6.3 Truenames
truncate 3.5 Numeric Conversions
truncate-lines 37.3 Truncation
truncate-partial-width-windows 37.3 Truncation
truncate-string-to-width 37.10 Size of Displayed Text
truth value 1.3.2 nil and t
try-completion 19.6.1 Basic Completion Functions
tty-color-alist 28.21 Text Terminal Colors
tty-color-approximate 28.21 Text Terminal Colors
tty-color-clear 28.21 Text Terminal Colors
tty-color-define 28.21 Text Terminal Colors
tty-color-mode, a frame parameter 28.3.3.8 Font and Color Parameters
tty-color-translate 28.21 Text Terminal Colors
tty-erase-char 38.3 Operating System Environment
tty-setup-hook 38.1.3 Terminal-Specific Initialization
tty-top-frame 28.11 Raising and Lowering Frames
turn multibyte support on or off 32.2 Disabling Multibyte Characters
two’s complement 3.1 Integer Basics
type 2 Lisp Data Types
type (button property) 37.18.1 Button Properties
type checking 2.6 Type Predicates
type checking internals E.6 Writing Emacs Primitives
type predicates 2.6 Type Predicates
type, defcustom keyword 14.4 Customization Types
type-of 2.6 Type Predicates
typographic conventions 1.3.1 Some Terms

U
UBA 37.24 Bidirectional Display
UDP 36.14 Network Connections
UID 38.4 User Identification
umask 24.7 Changing File Names and Attributes
unassigned character codepoints 32.6 Character Properties
unbalanced parentheses 17.3 Debugging Invalid Lisp Syntax
unbinding keys 21.15 Commands for Binding Keys
unbury-buffer 26.8 The Buffer List
undecided coding-system, when encoding 32.10.7 Explicit Encoding and Decoding
undefined 21.11 Functions for Key Lookup
undefined in keymap 21.10 Key Lookup
undefined key 21.2 Keymap Basics
underline-minimum-offset 37.12.1 Face Attributes
underlined text 37.12.1 Face Attributes
undo avoidance 31.20 Substituting for a Character Code
undo-ask-before-discard 31.10 Maintaining Undo Lists
undo-boundary 31.9 Undo
undo-in-progress 31.9 Undo
undo-limit 31.10 Maintaining Undo Lists
undo-outer-limit 31.10 Maintaining Undo Lists
undo-strong-limit 31.10 Maintaining Undo Lists
unexec E.1 Building Emacs
unhandled-file-name-directory 24.11 Making Certain File Names “Magic”
unibyte buffers, and bidi reordering 37.24 Bidirectional Display
unibyte text 32.1 Text Representations
unibyte-char-to-multibyte 32.3 Converting Text Representations
unibyte-string 32.1 Text Representations
Unicode 32.1 Text Representations
unicode bidirectional algorithm 37.24 Bidirectional Display
unicode character escape 2.3.3.2 General Escape Syntax
unicode general category 32.6 Character Properties
unicode, a charset 32.7 Character Sets
unicode-category-table 32.6 Character Properties
unintern 8.3 Creating and Interning Symbols
uninterned symbol 8.3 Creating and Interning Symbols
unique file names 24.8.5 Generating Unique File Names
universal-argument 20.12 Prefix Command Arguments
universal-argument-map Appendix G Standard Keymaps
unless 10.2 Conditionals
unload-feature 15.9 Unloading
unload-feature-special-hooks 15.9 Unloading
unloading packages 15.9 Unloading
unloading packages, preparing for D.1 Emacs Lisp Coding Conventions
unlock-buffer 24.5 File Locks
unnumbered group 33.3.1.3 Backslash Constructs in Regular Expressions
unpacking 36.20 Packing and Unpacking Byte Arrays
unread-command-events 20.8.6 Miscellaneous Event Input Features
unsafep 12.15 Determining whether a Function is Safe to Call
unsplittable, a frame parameter 28.3.3.5 Buffer Parameters
unused lexical variable 11.9.4 Using Lexical Binding
unwind-protect 10.5.4 Cleaning Up from Nonlocal Exits
unwinding 10.5.4 Cleaning Up from Nonlocal Exits
up-list 29.2.6 Moving over Balanced Expressions
upcase 4.8 Case Conversion in Lisp
upcase-initials 4.8 Case Conversion in Lisp
upcase-region 31.18 Case Changes
upcase-word 31.18 Case Changes
update-directory-autoloads 15.5 Autoload
update-file-autoloads 15.5 Autoload
upper case 4.8 Case Conversion in Lisp
upper case key sequence 20.8.1 Key Sequence Input
uptime of Emacs 38.8 Processor Run time
use-empty-active-region 30.8 The Region
use-global-map 21.9 Controlling the Active Keymaps
use-hard-newlines 31.11 Filling
use-local-map 21.9 Controlling the Active Keymaps
use-region-p 30.8 The Region
user errors, signaling 10.5.3.1 How to Signal an Error
user groups 38.4 User Identification
user identification 38.4 User Identification
user options, how to define 14.3 Defining Customization Variables
user signals 20.7.10 Miscellaneous System Events
user-defined error 10.5.3.4 Error Symbols and Condition Names
user-emacs-directory 38.1.2 The Init File
user-error 10.5.3.1 How to Signal an Error
user-full-name 38.4 User Identification
user-full-name 38.4 User Identification
user-init-file 38.1.2 The Init File
user-login-name 38.4 User Identification
user-login-name 38.4 User Identification
user-mail-address 38.4 User Identification
user-position, a frame parameter 28.3.3.2 Position Parameters
user-real-login-name 38.4 User Identification
user-real-login-name 38.4 User Identification
user-real-uid 38.4 User Identification
user-size, a frame parameter 28.3.3.3 Size Parameters
user-uid 38.4 User Identification
utf-8-emacs coding system 32.10.1 Basic Concepts of Coding Systems

V
valid windows 27.1 Basic Concepts of Emacs Windows
validity of coding system 32.10.3 Coding Systems in Lisp
value cell 8.1 Symbol Components
value of expression 9 Evaluation
value of function 12.1 What Is a Function?
values 9.5 Eval
variable 11 Variables
variable aliases 11.13 Variable Aliases
variable definition 11.5 Defining Global Variables
variable descriptions 1.3.7.2 A Sample Variable Description
variable limit error 11.3 Local Variables
variable with constant value 11.2 Variables that Never Change
variable, buffer-local 11.10 Buffer-Local Variables
variable-documentation property 23.1 Documentation Basics
variable-width spaces 37.16.2 Specified Spaces
variant coding system 32.10.1 Basic Concepts of Coding Systems
vc-mode 22.4.4 Variables Used in the Mode Line
vc-prefix-map 21.6 Prefix Keys
vconcat 6.5 Functions for Vectors
vector 6.5 Functions for Vectors
vector (type) 6.4 Vectors
vector evaluation 9.2.1 Self-Evaluating Forms
vector length 6.1 Sequences
vector-cells-consed E.4 Memory Usage
vector-like objects, storage E.3 Garbage Collection
vectorp 6.5 Functions for Vectors
verify-visited-file-modtime 26.6 Buffer Modification Time
version number (in file name) 24.8.1 File Name Components
version, customization keyword 14.1 Common Item Keywords
version-control 25.1.3 Making and Deleting Numbered Backup Files
vertical combination 27.2 Windows and Frames
vertical fractional scrolling 27.21 Vertical Fractional Scrolling
vertical scroll position 27.21 Vertical Fractional Scrolling
vertical tab 2.3.3.1 Basic Char Syntax
vertical-line prefix key 20.8.1 Key Sequence Input
vertical-motion 29.2.5 Motion by Screen Lines
vertical-scroll-bar 37.14 Scroll Bars
vertical-scroll-bar prefix key 20.8.1 Key Sequence Input
vertical-scroll-bars, a frame parameter 28.3.3.4 Layout Parameters
view part, model/view/controller 37.19 Abstract Display
view-register 31.21 Registers
virtual buffers 26.12 Swapping Text Between Two Buffers
visibility, a frame parameter 28.3.3.6 Window Management Parameters
visible frame 28.10 Visibility of Frames
visible-bell 37.22 Beeping
visible-frame-list 28.7 Finding All Frames
visited file 26.4 Buffer File Name
visited file mode 22.2.2 How Emacs Chooses a Major Mode
visited-file-modtime 26.6 Buffer Modification Time
visiting files 24.1 Visiting Files
visiting files, functions for 24.1.1 Functions for Visiting Files
visual order 37.24 Bidirectional Display
visual-order cursor motion 37.24 Bidirectional Display
void function 9.2.4 Symbol Function Indirection
void function cell 12.8 Accessing Function Cell Contents
void variable 11.4 When a Variable is “Void”
void-function 12.8 Accessing Function Cell Contents
void-text-area-pointer 28.17 Pointer Shape
void-variable error 11.4 When a Variable is “Void”

W
wait-for-wm, a frame parameter 28.3.3.6 Window Management Parameters
waiting 20.10 Waiting for Elapsed Time or Input
waiting for command key input 20.8.6 Miscellaneous Event Input Features
waiting-for-user-input-p 36.10 Sentinels: Detecting Process Status Changes
walk-windows 27.9 Cyclic Ordering of Windows
warn 37.5.1 Warning Basics
warning options 37.5.3 Warning Options
warning type 37.5.1 Warning Basics
warning variables 37.5.2 Warning Variables
warning-fill-prefix 37.5.2 Warning Variables
warning-levels 37.5.2 Warning Variables
warning-minimum-level 37.5.3 Warning Options
warning-minimum-log-level 37.5.3 Warning Options
warning-prefix-function 37.5.2 Warning Variables
warning-series 37.5.2 Warning Variables
warning-suppress-log-types 37.5.3 Warning Options
warning-suppress-types 37.5.3 Warning Options
warning-type-format 37.5.2 Warning Variables
warnings 37.5 Reporting Warnings
watch, for filesystem events 38.19 Notifications on File Changes
wheel-down event 20.7.10 Miscellaneous System Events
wheel-up event 20.7.10 Miscellaneous System Events
when 10.2 Conditionals
where was a symbol defined 15.8 Which File Defined a Certain Symbol
where-is-internal 21.16 Scanning Keymaps
while 10.4 Iteration
while-no-input 20.8.6 Miscellaneous Event Input Features
whitespace 2.3.3.1 Basic Char Syntax
wholenump 3.3 Type Predicates for Numbers
widen 29.4 Narrowing
widening 29.4 Narrowing
width of a window 27.3 Window Sizes
width, a frame parameter 28.3.3.3 Size Parameters
window 27.1 Basic Concepts of Emacs Windows
window (overlay property) 37.9.2 Overlay Properties
window body 27.3 Window Sizes
window body height 27.3 Window Sizes
window body size 27.3 Window Sizes
window body width 27.3 Window Sizes
window combination 27.2 Windows and Frames
window combination limit 27.7 Recombining Windows
window configuration (Edebug) 17.2.14.2 Edebug Display Update
window configurations 27.24 Window Configurations
window dividers 37.15 Window Dividers
window end position 27.19 The Window Start and End Positions
window excursions 29.3 Excursions
window header line 22.4.7 Window Header Lines
window height 27.3 Window Sizes
window history 27.15 Window History
window in direction 27.2 Windows and Frames
window internals E.7.2 Window Internals
window layout in a frame 2.4.6 Window Configuration Type
window layout, all frames 2.4.7 Frame Configuration Type
window manager interaction, and frame parameters 28.3.3.6 Window Management Parameters
window ordering, cyclic 27.9 Cyclic Ordering of Windows
window parameters 27.25 Window Parameters
window pixel height 27.3 Window Sizes
window pixel height 27.3 Window Sizes
window point 27.18 Windows and Point
window point internals E.7.2 Window Internals
window position 27.18 Windows and Point
window position 27.23 Coordinates and Windows
window position on display 28.3.3.2 Position Parameters
window positions and window managers 28.3.3.2 Position Parameters
window resizing 27.4 Resizing Windows
window selected within a frame 27.1 Basic Concepts of Emacs Windows
window size 27.3 Window Sizes
window size on display 28.3.3.3 Size Parameters
window size, changing 27.4 Resizing Windows
window splitting 27.5 Splitting Windows
window start position 27.19 The Window Start and End Positions
window state 27.24 Window Configurations
window that satisfies a predicate 27.9 Cyclic Ordering of Windows
window top line 27.19 The Window Start and End Positions
window tree 27.2 Windows and Frames
window width 27.3 Window Sizes
window-absolute-pixel-edges 27.23 Coordinates and Windows
window-at 27.23 Coordinates and Windows
window-body-height 27.3 Window Sizes
window-body-size 27.3 Window Sizes
window-body-width 27.3 Window Sizes
window-bottom-divider-width 37.15 Window Dividers
window-buffer 27.10 Buffers and Windows
window-child 27.2 Windows and Frames
window-combination-limit 27.7 Recombining Windows
window-combination-limit 27.7 Recombining Windows
window-combination-resize 27.7 Recombining Windows
window-combined-p 27.2 Windows and Frames
window-configuration-change-hook 27.26 Hooks for Window Scrolling and Changes
window-configuration-frame 27.24 Window Configurations
window-configuration-p 27.24 Window Configurations
window-current-scroll-bars 37.14 Scroll Bars
window-dedicated-p 27.16 Dedicated Windows
window-display-table 37.21.3 Active Display Table
window-edges 27.23 Coordinates and Windows
window-end 27.19 The Window Start and End Positions
window-frame 27.2 Windows and Frames
window-fringes 37.13.1 Fringe Size and Position
window-full-height-p 27.3 Window Sizes
window-full-width-p 27.3 Window Sizes
window-header-line-height 22.4.7 Window Header Lines
window-header-line-height 27.3 Window Sizes
window-hscroll 27.22 Horizontal Scrolling
window-id, a frame parameter 28.3.3.6 Window Management Parameters
window-in-direction 27.2 Windows and Frames
window-inside-absolute-pixel-edges 27.23 Coordinates and Windows
window-inside-edges 27.23 Coordinates and Windows
window-inside-pixel-edges 27.23 Coordinates and Windows
window-left-child 27.2 Windows and Frames
window-left-column 27.23 Coordinates and Windows
window-line-height 27.19 The Window Start and End Positions
window-list 27.2 Windows and Frames
window-live-p 27.1 Basic Concepts of Emacs Windows
window-margins 37.16.5 Displaying in the Margins
window-min-height 27.3 Window Sizes
window-min-height 27.3 Window Sizes
window-min-size 27.3 Window Sizes
window-min-width 27.3 Window Sizes
window-min-width 27.3 Window Sizes
window-minibuffer-p 19.11 Minibuffer Windows
window-mode-line-height 27.3 Window Sizes
window-next-buffers 27.15 Window History
window-next-sibling 27.2 Windows and Frames
window-parameter 27.25 Window Parameters
window-parameters 27.25 Window Parameters
window-parent 27.2 Windows and Frames
window-persistent-parameters 27.25 Window Parameters
window-pixel-edges 27.23 Coordinates and Windows
window-pixel-height 27.3 Window Sizes
window-pixel-left 27.23 Coordinates and Windows
window-pixel-top 27.23 Coordinates and Windows
window-pixel-width 27.3 Window Sizes
window-point 27.18 Windows and Point
window-point-insertion-type 27.18 Windows and Point
window-prev-buffers 27.15 Window History
window-prev-sibling 27.2 Windows and Frames
window-resizable 27.4 Resizing Windows
window-resize 27.4 Resizing Windows
window-resize-pixelwise 27.4 Resizing Windows
window-right-divider-width 37.15 Window Dividers
window-scroll-bar-width 37.14 Scroll Bars
window-scroll-bars 37.14 Scroll Bars
window-scroll-functions 27.26 Hooks for Window Scrolling and Changes
window-setup-hook 38.1.2 The Init File
window-size-change-functions 27.26 Hooks for Window Scrolling and Changes
window-size-fixed 27.3 Window Sizes
window-start 27.19 The Window Start and End Positions
window-state-get 27.24 Window Configurations
window-state-put 27.24 Window Configurations
window-system 37.23 Window Systems
window-system 37.23 Window Systems
window-system-initialization-alist 38.1.1 Summary: Sequence of Actions at Startup
window-text-change-functions Appendix H Standard Hooks
window-text-pixel-size 37.10 Size of Displayed Text
window-top-child 27.2 Windows and Frames
window-top-line 27.23 Coordinates and Windows
window-total-height 27.3 Window Sizes
window-total-size 27.3 Window Sizes
window-total-width 27.3 Window Sizes
window-tree 27.2 Windows and Frames
window-valid-p 27.1 Basic Concepts of Emacs Windows
window-vscroll 27.21 Vertical Fractional Scrolling
windowp 27.1 Basic Concepts of Emacs Windows
windows, controlling precisely 27.10 Buffers and Windows
windows, recombining 27.7 Recombining Windows
with-case-table 4.9 The Case Table
with-coding-priority 32.10.6 Specifying a Coding System for One Operation
with-current-buffer 26.2 The Current Buffer
with-current-buffer-window 37.8 Temporary Displays
with-demoted-errors 10.5.3.3 Writing Code to Handle Errors
with-eval-after-load 15.10 Hooks for Loading
with-help-window 23.5 Help Functions
with-local-quit 20.11 Quitting
with-no-warnings 16.6 Compiler Errors
with-output-to-string 18.5 Output Functions
with-output-to-temp-buffer 37.8 Temporary Displays
with-selected-window 27.8 Selecting Windows
with-syntax-table 34.3 Syntax Table Functions
with-temp-buffer 26.2 The Current Buffer
with-temp-buffer-window 37.8 Temporary Displays
with-temp-file 24.4 Writing to Files
with-temp-message 37.4.1 Displaying Messages in the Echo Area
with-timeout 38.10 Timers for Delayed Execution
word-search-backward 33.1 Searching for Strings
word-search-backward-lax 33.1 Searching for Strings
word-search-forward 33.1 Searching for Strings
word-search-forward-lax 33.1 Searching for Strings
word-search-regexp 33.1 Searching for Strings
words in region 29.2.4 Motion by Text Lines
words-include-escapes 29.2.2 Motion by Words
wrap-prefix 37.3 Truncation
write-abbrev-file 35.3 Saving Abbrevs in Files
write-char 18.5 Output Functions
write-contents-functions 24.2 Saving Buffers
write-file 24.2 Saving Buffers
write-file-functions 24.2 Saving Buffers
write-region 24.4 Writing to Files
write-region-annotate-functions 24.12.3 Piecemeal Specification
write-region-post-annotation-function 24.12.3 Piecemeal Specification
writing a documentation string 23.1 Documentation Basics
writing Emacs primitives E.6 Writing Emacs Primitives
writing to files 24.4 Writing to Files
wrong-number-of-arguments 12.2.3 Other Features of Argument Lists
wrong-type-argument 2.6 Type Predicates

X
X display names 28.2 Multiple Terminals
X Window System 37.23 Window Systems
x-alt-keysym 38.15 Operating on X11 Keysyms
x-alternatives-map Appendix G Standard Keymaps
x-bitmap-file-path 37.12.1 Face Attributes
x-close-connection 28.2 Multiple Terminals
x-color-defined-p 28.20 Color Names
x-color-values 28.20 Color Names
x-defined-colors 28.20 Color Names
x-display-color-p 28.23 Display Feature Testing
x-display-list 28.2 Multiple Terminals
x-dnd-known-types 28.19 Drag and Drop
x-dnd-test-function 28.19 Drag and Drop
x-dnd-types-alist 28.19 Drag and Drop
x-family-fonts 37.12.10 Looking Up Fonts
x-get-resource 28.22 X Resources
x-get-selection 28.18 Window System Selections
x-hyper-keysym 38.15 Operating on X11 Keysyms
x-list-fonts 37.12.10 Looking Up Fonts
x-meta-keysym 38.15 Operating on X11 Keysyms
x-open-connection 28.2 Multiple Terminals
x-parse-geometry 28.3.5 Geometry
x-pointer-shape 28.17 Pointer Shape
x-popup-dialog 28.16 Dialog Boxes
x-popup-menu 28.15 Pop-Up Menus
x-resource-class 28.22 X Resources
x-resource-name 28.22 X Resources
x-sensitive-text-pointer-shape 28.17 Pointer Shape
x-server-vendor 28.23 Display Feature Testing
x-server-version 28.23 Display Feature Testing
x-set-selection 28.18 Window System Selections
x-setup-function-keys Appendix G Standard Keymaps
x-super-keysym 38.15 Operating on X11 Keysyms
X11 keysyms 38.15 Operating on X11 Keysyms
XBM 37.17.3 XBM Images
XPM 37.17.4 XPM Images

Y
y-or-n-p 19.7 Yes-or-No Queries
y-or-n-p-with-timeout 19.7 Yes-or-No Queries
yank 31.8.4 Functions for Yanking
yank suppression 21.12 Changing Key Bindings
yank-excluded-properties 31.8.3 Yanking
yank-handled-properties 31.8.3 Yanking
yank-pop 31.8.4 Functions for Yanking
yank-undo-function 31.8.4 Functions for Yanking
yanking and text properties 31.8.3 Yanking
yes-or-no questions 19.7 Yes-or-No Queries
yes-or-no-p 19.7 Yes-or-No Queries

Z
zerop 3.3 Type Predicates for Numbers
zlib-available-p 31.23 Dealing With Compressed Data
zlib-decompress-region 31.23 Dealing With Compressed Data

Jump to:   "   #   $   %   &   '   (   )   *   +   ,   -   .   /   1   2   3   ;   <   =   >   ?   @   [   \   ]   ^   `   |  
A   B   C   D   E   F   G   H   I   J   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y   Z  

[Top] [Contents] [Index] [ ? ]

Footnotes

(1)

“サブ文字テーブル(sub-char-tables)”に使用される‘#^^’を目にすることがあるかもしれません。

(2)

リストの最後に要素を追加するための、これと完全に同等な方法はありません。listnameをコピーすることにより、新しいリストを作成してから、neweltをそのリストの最後に追加する、(append listname (list newelt))を使用することができます。すべてのCDRを辿って、終端のnilを置き換える、(nconc listname (list newelt))を使用することもできます。コピーも変更も行なわずに、リストの先頭に要素を追加するconsと比較してみてください。

(3)

ここでの“キー(key)”の使い方は、用語“キーシーケンス(key sequence)”とは関係ありません。キーはテーブルにあるアイテムを探すために使用される値という意味です。この場合、テーブルはalistでありalistはアイテムに関連付けられます。

(4)

S式(S-expression)、短くはsexpという言葉でも呼ばれることがありますが、わたしたちは通常、このマニュアル内ではこの用語は使用しません。

(5)

“環境”にたいするこの定義は、プログラムの結果に影響し得るすべてのデータを特に意図するものではありません。

(6)

正確に言うと、デフォルトのダイナミックスコープ(dynamic scoping)のルールでは、値セルは常にその変数のカレント値を保持しますが、レキシカルスコープ(lexical scoping)では異なります。詳細は、Scoping Rules for Variable Bindingsを参照してください。

(7)

これには、いくつか例外があります。たとえば、レキシカルバインディングは、Lispデバッガーからもアクセスできます。

(8)

MS-DOS版のEmacsは、DOSファイルシステムの制限により、かわりに_dir-locals.elという名前を使用します。

(9)

これはカリー化(currying)と関連しますが、異なる機能です。カーリングは、複数の引数をとる関数を、関数チェーンとして呼び出せるような、1つの引数を取る個々の関数に変換するような方法です。

(10)

いくつかの要素は実際に2つの引数を提供します。

(11)

ボタンダウン(button-down)はドラッグ(drag)の保守的なアンチテーゼです(訳注: 原文は“Button-down is the conservative antithesis of drag.”。ボタンダウンを着るような人種と麻薬を対比させたジョークのような気がしますが、すいません、よく分からないので直訳します)。

(12)

これはテキスト端末ののような、ツールキットを使用しないメニューにたいして要求されます。

(13)

MS-WindowsバージョンのEmacsはCygwin環境用にコンパイルされており、2つのファイル名構文の変換に、cygwin-convert-file-name-to-windowscygwin-convert-file-name-from-windowsを使用できます。

(14)

An RFC, an acronym for Request for Comments, is a numbered Internet informational document describing a standard. RFCs are usually written by technical experts acting on their own initiative, and are traditionally written in a pragmatic, experience-driven manner.

(15)

This internal representation is based on one of the encodings defined by the Unicode Standard, called UTF-8, for representing any Unicode codepoint, but Emacs extends UTF-8 to represent the additional codepoints it uses for raw 8-bit bytes and characters not unified with Unicode.

(16)

The Unicode specification writes these tag names inside ‘<..>’ brackets, but the tag names in Emacs do not include the brackets; e.g., Unicode specifies ‘<small>’ where Emacs uses ‘small’.

(17)

Note that regexp-opt does not guarantee that its result is absolutely the most efficient form possible. A hand-tuned regular expression can sometimes be slightly more efficient, but is almost never worth the effort.

(18)

On other systems, Emacs uses a Lisp emulation of ls; see Contents of Directories.

(19)

For backward compatibility, you can also use a string to specify a face name; that is equivalent to a Lisp symbol with the same name.

(20)

In this context, the term font has nothing to do with Font Lock (see section Font Lock Mode).

(21)

The benefits of a Common Lisp-style package system are considered not to outweigh the costs.


[Top] [Contents] [Index] [ ? ]

Table of Contents


[Top] [Contents] [Index] [ ? ]

Short Table of Contents


[Top] [Contents] [Index] [ ? ]

About This Document

This document was generated on November 2, 2018 using texi2any.

The buttons in the navigation panels have the following meaning:

Button Name Go to From 1.2.3 go to
[ << ] FastBack Beginning of this chapter or previous chapter 1
[ < ] Back Previous section in reading order 1.2.2
[ Up ] Up Up section 1.2
[ > ] Forward Next section in reading order 1.2.4
[ >> ] FastForward Next chapter 2
[Top] Top Cover (top) of document  
[Contents] Contents Table of contents  
[Index] Index Index  
[ ? ] About About (help)  

where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure:


This document was generated on November 2, 2018 using texi2any.