モードラインのコンテンツはモードライン構文(mode line construct)と呼ばれるデータ構造によって制御されます。モードライン構文はリストやシンボル、数字を保持するバッファーローカル変数により構成されます。それぞれのデータ型は以下で説明するようにモードラインの外見にたいして特別な意味をもちます。フレームタイトル(フレームのタイトルを参照)とヘッダーライン(ウィンドウのヘッダーラインを参照)、タブライン(ウィンドウのタブラインを参照)にも同じデータ構造が使用されます。
固定文字列のようなシンプルなモードライン構文の場合もありますが、通常はモードライン構文のテキストを構築するために固定文字列と変数の値を組み合わせる方法を指定します。これらの変数の多くはその変数自体がその値によりモードライン構文を定義する変数です。
以下はモードライン構文における、さまざまなデータ型の意味です:
string
¶モードライン構文における文字列は、文字列内に%
構文(%
-constructs)を含む以外はそのまま表現される。これらは他のデータによる置換を意味する。モードラインでの%
構文を参照のこと。
文字列の一部がface
プロパティをもつ場合には、バッファー内でそれらが表示されるときと同じようにテキスト表示を制御する。face
プロパティをもたない文字はデフォルトのフェイスmode-line
、またはmode-line-inactive
で表示される(Standard
Faces in The GNU Emacs
Manualを参照)。string内のhelp-echo
プロパティとkeymap
プロパティは特別な意味をもつ。モードラインでのプロパティを参照のこと。
symbol
モードライン構文におけるシンボルはその値を意味する。モードライン構文としては、symbolの値はsymbolの位置に使用される。しかしシンボルt
とnil
は値がvoidであるようなシンボルとして無視される。
例外が1つある。symbolの値が文字列なら、それはそのまま表示されて%
構文は認識されない。
symbolがrisky(危険)とマークされていない(非nil
のrisky-local-variable
プロパティをもつ)場合には、symbolの値中で指定されたテキストプロパティはすべて無視される。これにはsymbolの値中の文字列のテキストプロパティ、同様に文字列内の:eval
フォームと:propertize
フォームすべてが含まれる(これはセキュリティー上の理由による。危険とマークされていない変数は、ユーザーへの問い合わせなしでファイル変数から自動的にセットされ得る)。
(string rest…)
(list rest…)
最初の要素が文字列、またはすべての要素を再帰的に処理して結果を結合することを意図したリスト。これはもっとも一般的なモードライン構文である(モードラインへの文字列表示時には、テキストプロパティは(効率的理由により)特別に処理されることに注意。文字列の最初の文字のテキストプロパティだけを考慮して、それを文字列全体に使用する。別のテキストプロパティをもつ文字列が必要なら、特別モードライン構文:propertize
を使う必要がある)。
(:eval form)
最初の要素がシンボル:eval
であるようなリストは、formを評価してその結果を表示する文字列として使用するよう指示する。この評価がファイルのロード、あるいはposn-at-point
やwindow-in-direction
のような関数を呼び出さないことを確認すること。これらの関数自身がモードラインを評価するので、無限再帰が発生するかもしれない。
(:propertize elt props…)
最初の要素がシンボル:propertize
であるようなリストはモードライン構文eltを再帰的に処理して、propsにより指定されるテキストプロパティに結果を加えるよう指示する。引数propsは0個以上のtext-propertyとvalueのペアーで構成されること。eltがテキストプロパティをもつ文字列、またはテキストプロパティをもつ文字列を生成する場合には、その文字列内のすべての文字は同一のプロパティをもつこと。さもなければ:propertize
によっていくつかのプロパティは削除されるかもしれない。
(symbol then else)
最初の要素がキーワード以外のシンボルであるようなリストは条件文を指定する。その意味はsymbolの値に依存する。symbolが非nil
値をもつ場合は、モードライン構文として2つ目の要素thenが再帰的に処理され、それ以外は3つ目の要素elseが再帰的に処理される。elseは省略でき、その場合にはsymbolの値がnil
かvoidならモードライン構文は何も表示しない。
(width rest…)
最初の要素が整数であるようなリストはrestの結果の切り詰め、またはパディングを指定する。残りの要素restはモードライン構文として再帰的に処理されて互いに結合される。widthが正で結果の幅がwidthより少なければ右側にスペースがパディングされる。widthが負で結果の幅が−widthより大きければ右側が切り詰められる。
たとえばウィンドウ最上部からのバッファー位置をパーセント表示するには(-3 "%p")
のようなリストを使用すればよい。