表形式リストモードは、表形式データ(すなわち、エントリで構成され、各エントリが1行のテキストを占め、その内容が列に分割されているデータ)を表示するための主要なモードです。表形式リストモードでは、行や列の見栄え良く印刷する機能や、各列の値に基づいて行をソートする機能が提供されます。このモードはスペシャルモードから派生したものです(基本メジャーモードを参照)。
表形式リストモードは、単一のフォントと文字サイズを用い、等幅フォントでテキストを表示することを前提としています。可変幅フォントや画像を使用して表を表示したい場合は、代わりに
make-vtable を使用できます。また、vtable
はバッファ内に複数の表を保持することや、表と追加テキストの両方を含むバッファを保持することも可能です。詳細については、(vtable)はじめに
を参照してください。
表形式リストモードは、より特化したメジャーモードの親モードとして使用されることを想定しています。例としては、プロセスメニューモード(プロセス情報を参照)やパッケージメニューモード(The GNU Emacs Manualのパッケージメニューを参照)などが挙げられます。
このような派生モードでは、通常通り define-derived-mode を使用し、第2引数として
tabulated-list-mode を指定します(派生モードの定義 を参照)。define-derived-mode
フォームの本体では、以下に記述する変数に値を代入することで、表形式データのフォーマットを指定します。また、必要に応じて関数 tabulated-list-init-header
を呼び出すことで、列名をヘッダーに格納させることができます。
派生モードでは、リスティングコマンドも定義する必要があります。ユーザーが呼び出すのは(例えば M-x list-processes
のように)、モードコマンドではなくこのコマンドです。リスティングコマンドは、バッファを作成または切り替え、派生モードを有効にし、表形式のデータを指定して、最後に
tabulated-list-print を呼び出してバッファに内容を格納する必要があります。
この変数は、列が昇順にソートされていることを示すために、GUIフレームで使用する文字を指定します。
表形式リストバッファでソート方向を変更するたびに、このインジケーターは昇順(「asc」)と降順(「desc」)を切り替えます。
tabulated-list-gui-sort-indicator-ascと同様ですが、列が降順にソートされている場合に使用されます。
tabulated-list-gui-sort-indicator-ascと同様ですが、テキストモードのフレームに使用されます。
tabulated-list-tty-sort-indicator-ascと同様ですが、列が降順にソートされている場合に使用されます。
このバッファローカル変数は、Tabulated
Listデータの形式を指定します。その値はベクトルである必要があります。ベクトルの各要素はデータ列を表し、リスト (name width sort . props) である必要があります。ここで
nil の場合、その列をソートに使用することはできません。t
の場合、その列は文字列値を比較してソートされます。それ以外の場合は、sort 用の述語関数(リストを再配置する関数を参照)である必要があり、tabulated-list-entries の要素(後述)と同じ形式の2つの引数を取ります。
:right-align の値が nil
以外の場合、列は右揃えにする必要があります。また、プロパティ :pad-right
は、列の右側に設ける追加のパディングスペースの数を指定します(省略した場合はデフォルトで 1 となります)。
このバッファローカル変数は、Tabulated Listバッファに表示されるエントリを指定します。その値は、リストまたは関数のいずれかである必要があります。
値がリストの場合、各リスト要素が1つのエントリに対応し、(id contents)
という形式である必要があります。ここで
nil か、あるいはエントリを識別する
Lisp オブジェクトのいずれかです。後者の場合、エントリを再ソートしてもカーソルは同じエントリに留まります。比較は equal を用いて行われます。
tabulated-list-format
と同じ要素数を持つベクトルです。各ベクトル要素は、そのままバッファに挿入される文字列、画像の挿入に使用される画像記述子(画像記述子を参照)、またはリスト (label . properties)(label と properties を引数として insert-text-button
を呼び出すことでテキストボタンを挿入することを意味します)のいずれかです(ボタンの作成を参照)。
これらの文字列のいずれにも改行が含まれていてはなりません。
それ以外の場合、値は引数なしで呼び出された際に上記の形式のリストを返す関数である必要があります。
このバッファローカル変数は、Tabulated Listバッファに表示されるエントリのグループを指定します。その値は、リストまたは関数のいずれかである必要があります。
値がリストの場合、各リスト要素が1つのグループに対応し、(group-name entry1 entry2 …) という形式になります。ここで、group-name はすべてのグループエントリの前に挿入される文字列であり、entry1、entry2 などはそれぞれ tabulated-list-entries の要素と同じ形式となります(上記参照)。
それ以外の場合、値は引数なしで呼び出された際に上記の形式のリストを返す関数である必要があります。
seq-group-by を使用して、tabulated-list-entries から tabulated-list-groups を作成できます。例えば:
(setq tabulated-list-groups
(seq-group-by 'Buffer-menu-group-by-mode
tabulated-list-entries))
ここでは次のように Buffer-menu-group-by-mode を定義できます:
(defun Buffer-menu-group-by-mode (entry) (concat "* " (aref (cadr entry) 5)))
この通常フックは、表形式リストバッファをリバートする前に実行されます。派生モードでは、このフックに関数を追加して tabulated-list-entries を再計算させることができます。
この変数の値は、終端の改行文字を含めてポイントにエントリを挿入するために呼び出される関数です。この関数は、tabulated-list-entries と同様の意味を持つ2つの引数 id と contents
を受け取る必要があります。デフォルト値は、単純な方法でエントリを挿入する関数です。表形式リストモードをより複雑な方法で利用するモードでは、別の関数を指定できます。
この変数の値は、Tabulated Listバッファの現在のソートキーを指定します。値が nil
の場合、ソートは行われません。それ以外の場合は、(name
. flip) という形式である必要があり、ここで name は tabulated-list-format
に含まれる列名のいずれかに一致する文字列であり、flip が nil 以外の場合はソート順を反転させることを意味します。
この関数は、表形式リストバッファ(ウィンドウヘッダー行を参照)のheader-line-formatを計算して設定し、列ヘッダーをクリックしてエントリをソートできるように、ヘッダー行にキーマップを割り当てます。
Tabulated Listモードから派生したモードでは、上記の変数を設定した後(特にtabulated-list-formatを設定した後のみ)にこれを呼び出す必要があります。
この関数は、現在のバッファにエントリを格納します。リスティングコマンドから呼び出す必要があります。バッファを消去し、tabulated-list-entriesで指定されたエントリをtabulated-list-sort-keyに従ってソートした後、tabulated-list-printerで指定された関数を呼び出して各エントリを挿入します。
オプション引数 remember-pos が nil
以外の場合、この関数は現在の行に id
要素があればそれを探し、すべてのエントリが(再)挿入された後、そのエントリへ移動しようとします。
オプション引数 update が nil
以外の場合、この関数は前回の出力以降に変更があったエントリのみを削除または追加します。前回この関数が呼び出されて以来、ほとんどのエントリに変更がない場合は、処理速度が数倍向上します。結果における唯一の違いは、tabulated-list-put-tag
で付与されたタグが、変更のないエントリからは削除されない点です(通常はすべてのタグが削除されます)。
この関数は、pointにあるエントリを削除します。
リスト (id cols) を返します。ここで id
は削除されたエントリのID、cols
はその列記述子のベクトルです。ポインタを現在の行の先頭に移動します。ポインタ位置にエントリがない場合は nil を返します。
なお、この関数はバッファの内容を変更するだけで、tabulated-list-entries
は変更しません。
この defsubst は、tabulated-list-entries(リストの場合)または tabulated-list-entries が返すリスト(関数の場合)から ID
オブジェクトを返します。省略された場合や nil の場合、pos のデフォルト値は point となります。
この defsubst は、tabulated-list-entries(リストの場合)または tabulated-list-entries
が返すリスト(関数の場合)からエントリオブジェクトを返します。これは pos の ID
に対応するベクトルとなります。pos にエントリが存在しない場合、関数は nil を返します。
この defsubst は、pos
に擬似ヘッダーがある場合に non-nil
を返します。バッファの先頭に列名を配置するため、tabulated-list-use-header-line が nil である場合に擬似ヘッダーが使用されます。省略された場合や nil の場合、pos のデフォルト値は point-min となります。
この関数は、現在の行のパディング領域に tag
を挿入します。パディング領域は行頭の空白領域となり得、その幅は tabulated-list-padding によって規定されます。tag は文字列である必要があり、その長さは tabulated-list-padding 以下でなければなりません。advance が nil
以外の場合、この関数はポイントを1行分進めます。
この関数は、現在のバッファのパディング領域からすべてのタグを削除します。
この関数は、ポイントにある表形式リストのエントリを変更し、col を desc に設定します。col
は変更対象の列番号、または変更対象の列名です。desc は新しい列記述子であり、tabulated-list-print-col を介して挿入されます。
change-entry-data が nil
でない場合、この関数はベクトルの列記述子を desc
に設定することで、基礎となるデータ(通常はリスト tabulated-list-entries
内の列記述子)を変更します。