モードラインの内容は、バッファローカル変数に保持されるリスト、文字列、シンボル、および数値で構成されるモードライン構造と呼ばれるデータ構造によって制御されます。各データ型は、以下に説明するように、モードラインの表示において特定の意味を持ちます。同様のデータ構造が、フレームタイトル(フレームタイトルを参照)、ヘッダー行(ウィンドウヘッダー行を参照)、およびタブ行(ウィンドウタブ行を参照)の構築にも使用されます。
モードライン構文は、単なる固定文字列である場合もありますが、通常は固定文字列と変数の値をどのように組み合わせてテキストを構成するかを指定します。これらの変数の多くは、それ自体がモードライン構文を値として持つように定義されています。
モードライン構成要素としての各種データ型の意味は以下の通りです。
string ¶モードライン構成要素としての文字列は、含まれる%構成要素を除き、そのまま表示されます。これらは他のデータへの置換を表します。モードラインにおける%構成要素を参照してください。
文字列の一部に face
プロパティがある場合、バッファ内のテキストと同様にテキストの表示を制御します。face
プロパティを持たない文字は、デフォルトではフェイス mode-line または mode-line-inactive で表示されます(The GNU
Emacs Manual の Standard
Faces を参照)。string 内の help-echo および keymap
プロパティには特別な意味があります。モードライン内のプロパティ を参照してください。
symbolモードライン構成要素としての記号は、その値を表します。symbol の値は、symbol の代わりにモードライン構成要素として使用されます。ただし、記号 t および nil は無視され、値が void
である記号も同様に無視されます。
1点例外があります。symbol の値が文字列である場合、そのまま表示され、% 構文は認識されません。
symbol がリスクありとしてマークされていない限り(すなわち、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 を超えると、結果は右側から −width 列分切り捨てられます。
例えば、バッファの何パーセントがウィンドウの上端より上にあるかを示す一般的な方法は、(-3 "%p")のようなリストを使用することです。