GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Special-Properties.html ・ emacs-doc.conao3.com

33.19.4 特別な意味を持つプロパティ

以下に、組み込みの特別な意味を持つテキストプロパティ名の一覧を示します。次のセクションでは、塗りつぶしやプロパティの継承を制御する、その他の特別なプロパティ名をいくつか挙げます。それ以外の名前には標準的な意味はなく、自由に使用できます。

注:プロパティ composition、display、invisible、intangible によっても、各 Emacs コマンドの実行後にポイントを適切な位置に移動させることができます。コマンド実行後のポイント調整を参照してください。

category

文字に category プロパティがある場合、それをその文字のプロパティカテゴリと呼びます。これはシンボルである必要があります。このシンボルのプロパティは、文字のプロパティのデフォルトとして機能します。

face

face プロパティは、文字の外観を制御します(Faces を参照)。このプロパティの値には、以下が指定可能です。

  • 顔名(記号または文字列)。
  • 匿名のフェイス:(keyword value …) 形式のプロパティリスト。ここで、各 keyword はフェイス属性名、value はその属性の値である。
  • フェイスの一覧。各リスト要素は、フェイス名または匿名フェイスのいずれかである必要があります。これは、リストされた各フェイスの属性を集約したフェイスを指定します。リストの前方に現れるフェイスほど優先度が高くなります。
  • (foreground-color . color-name) または (background-color . color-name) 形式の cons セル。これは (:foreground color-name) や (:background color-name) と同様に、前景色または背景色を指定します。この形式は後方互換性のためだけにサポートされており、使用を避けるべきです。
  • (:filtered filter face-spec) 形式の cons セルで、face-spec で指定されたフェイスを規定するが、これはフェイスが表示に使用される際に filter が一致する場合に限られる。face-spec には前述のいずれの形式も使用可能である。filter は (:window param value) 形式である必要があり、これはパラメータ param が eq から value であるウィンドウに対して一致する。変数 face-filters-always-match が nil 以外である場合、すべてのフェイスフィルタが一致したものとみなされる。

Font Lockモード(Font Lock Modeを参照)は、ほとんどのバッファにおいて、コンテキストに基づいて文字のfaceプロパティを動的に更新することで動作します。

add-face-text-property 関数を使用すると、このテキストプロパティを簡単に設定できます。テキストプロパティの変更を参照してください。

font-lock-face

このプロパティは、Font Lock モードが基となるテキストに適用すべき face プロパティの値を指定します。これは Font Lock モードで使用されるフォント化手法の一つであり、独自のハイライト機能を実装する特殊なモードにおいて有用です。事前計算済みフォント化を参照してください。Font Lock モードが無効な場合、font-lock-face は効果を持ちません。

mouse-face

このプロパティは、マウスポインタがこのプロパティを持つテキスト上にあるときに、faceの代わりに使用されます。このとき、マウス直下の文字だけでなく、同じmouse-faceプロパティ値を持つテキストの範囲全体がハイライトされます。

Emacsは、テキストサイズを変更するmouse-faceプロパティのすべてのフェイス属性(例::height、:weight、:slant)を無視します。これらの属性は、ハイライトされていないテキストの場合と常に同一です。

cursor-face

このプロパティは mouse-face に似ていますが、(マウスではなく)ポイントがこのプロパティを持つテキスト内にある場合に使用されます。ハイライトは、モード cursor-face-highlight-mode が有効な場合にのみ行われます。変数 cursor-face-highlight-nonselected-window が nil 以外の場合、ウィンドウが選択されていなくても、このフェイスを持つテキストがハイライトされます。これは highlight-nonselected-windows がリージョンに対して行う動作と同様です(The GNU Emacs Manual の The Mark and the Region を参照してください)。

fontified

このプロパティは、テキストが表示可能な状態であるかどうかを示します。nil の場合、Emacs の再表示ルーチンは fontification-functions の関数(自動フェイス割り当て を参照)を呼び出し、バッファのこの部分が表示される前に準備を行います。これは、ジャストインタイム・フォントロックコードによって内部的に使用されます。

display

このプロパティは、テキストの表示方法を変更するさまざまな機能を有効にします。例えば、テキストをより高く、あるいは低く、より高く、あるいは低く、より広く、あるいは狭く表示したり、画像に置き換えたりすることができます。display プロパティを参照してください。

help-echo

テキストの help-echo プロパティに文字列が指定されている場合、そのテキストの上にマウスを移動させると、Emacs はその文字列を substitute-command-keys 経由でエコーエリアまたはツールチップウィンドウ(ツールチップ を参照)に表示します。

help-echo プロパティの値が関数である場合、その関数は window、object、pos の3つの引数で呼び出され、ヘルプ文字列、または該当がない場合は nil を返す必要があります。第1引数の window は、ヘルプが見つかったウィンドウです。第2引数の object は、help-echo プロパティを持っていたバッファ、オーバーレイ、または文字列です。pos 引数は以下の通りです:

  • object がバッファの場合、pos はバッファ内の位置となります。
  • object がオーバーレイである場合、そのオーバーレイには help-echo プロパティがあり、pos はオーバーレイのバッファ内における位置となります。
  • object が文字列(オーバーレイ文字列、または display プロパティで表示される文字列)の場合、pos はその文字列内の位置を表します。

help-echo プロパティの値が関数でも文字列でもない場合、評価されてヘルプ文字列が得られます。

変数 show-help-function を設定することで、ヘルプテキストの表示方法を変更できます(ヘルプの表示を参照)。

この機能は、モードラインやその他のアクティブなテキストで使用されます。

help-echo-inhibit-substitution

help-echo 文字列の先頭文字が nil 以外の help-echo-inhibit-substitution プロパティを持つ場合、その文字は substitute-command-keys を経由することなく、show-help-function によってそのまま表示されます。

left-fringe-help
right-fringe-help

画面行の可視テキストに、値が文字列である left-fringe-help または right-fringe-help のテキストプロパティが設定されている場合、マウスポインタが対応する行のフリンジ上にホバーすると、その文字列が表示されます(show-help-function 経由。表示ヘルプ を参照)。これは、フリンジカーソルやビットマップと併用すると便利です(フリンジ を参照)。

keymap

keymap プロパティは、コマンド用の追加キーマップを指定します。このキーマップが適用される場合、マイナーモードのキーマップやバッファのローカルマップよりも前に、キーの検索に使用されます。アクティブキーマップを参照してください。プロパティの値がシンボルである場合は、そのシンボルの関数定義がキーマップとして使用されます。

ポイント前の文字に対するプロパティ値は、それがnon-nilかつrear-stickyである場合に適用され、ポイント後の文字に対するプロパティ値は、それがnon-nilかつfront-stickyである場合に適用されます。(マウスクリックの場合は、ポイントの位置ではなくクリック位置が使用されます。)

local-map

このプロパティは keymap と同様に動作しますが、バッファのローカルマップの代わりに使用するキーマップを指定します。ほとんどの用途(おそらくすべての用途)においては、keymap プロパティを使用する方が適切です。

syntax-table

syntax-table プロパティは、この特定の文字に関する構文テーブルの記述を上書きします。構文プロパティを参照してください。

read-only

文字にプロパティ read-only が設定されている場合、その文字を変更することは許可されません。そのような操作を行うコマンドは、エラー text-read-only を返します。プロパティの値が文字列である場合、その文字列がエラーメッセージとして使用されます。

読み取り専用文字の直後に挿入を行う際、そこに通常のテキストを挿入するとスティッキネスによって read-only プロパティが継承されてしまう場合はエラーとなります。したがって、スティッキネスを制御することで、読み取り専用テキストの直後への挿入許可を制御できます。テキストプロパティのスティッキネスを参照してください。

プロパティの変更はバッファの変更とみなされるため、inhibit-read-only を nil 以外の値にバインドしてからプロパティを削除するという特殊な手法を知らない限り、read-only プロパティを削除することはできません。読み取り専用バッファを参照してください。

inhibit-read-only

プロパティ inhibit-read-only を持つ文字は、読み取り専用バッファでも編集可能です。読み取り専用バッファを参照してください。

invisible

nil invisible 以外のプロパティを使用すると、文字を画面上で非表示にできます。詳細は Invisible Text を参照してください。

inhibit-isearch

nil inhibit-isearch 以外のプロパティを指定すると、isearch はテキストをスキップします。

intangible

連続する文字群のプロパティが等しく、かつ nil intangible 以外である場合、その間にポイントを配置することはできません。ポイントをその文字群の中へ前方に移動させようとすると、実際には文字群の末尾に移動します。ポイントをその文字群の中へ後方に移動させようとすると、実際には文字群の先頭に移動します。

連続する文字が nil intangible 以外のプロパティにおいて等しくない場合、それらは別々のグループに属し、各グループは上述の通り個別に扱われます。

変数 inhibit-point-motion-hooks が nil 以外(デフォルトの状態)の場合、intangible プロパティは無視されます。

注意:このプロパティは非常に低レイヤーで動作し、多くのコードに予期せぬ影響を及ぼします。そのため、使用には細心の注意を払ってください。よくある誤用として、不可視テキストに無形プロパティを設定することが挙げられますが、コマンドループが各コマンドの終了時にいずれにせよポイントを不可視テキストの外に移動させるため、実際には不要です。コマンド実行後のポイント調整を参照してください。こうした理由から、このプロパティは廃止されました。代わりに cursor-intangible プロパティを使用してください。

cursor-intangible

マイナーモード cursor-intangible-mode が有効な場合、再表示が行われる直前に、ポイントは nil または cursor-intangible 以外のプロパティを持つ位置から移動します。なお、許可されるカーソル位置を算出する際には、プロパティの「スティッキネス」(テキストプロパティのスティッキネス を参照)が考慮されるため、(例えば)カーソルが進入できない 5 つの x 文字の連なりを挿入するには、次のような操作を行う必要があります。

(insert
 (propertize "xxxx" 'cursor-intangible t)
 (propertize "x" 'cursor-intangible t 'rear-nonsticky t))

変数 cursor-sensor-inhibit が nil でない場合、cursor-intangible プロパティと cursor-sensor-functions プロパティ(後述)は無視されます。

field

同一の field プロパティを持つ連続した文字は、フィールドを構成します。forward-word や beginning-of-line を含む一部のモーション関数は、フィールドの境界で停止します。フィールドの定義と使用を参照してください。

cursor

通常、カーソルは、現在のバッファ位置を「隠す」(つまり、代わりに表示する)あらゆるオーバーレイおよびテキストプロパティ文字列の先頭または末尾に表示されます。代わりに、これらの文字列内の任意の文字に非nil cursorテキストプロパティを指定することで、その文字にカーソルを配置するようにEmacsに指示できます。さらに、cursorプロパティの値が整数である場合、それはオーバーレイまたはdisplayプロパティが始まる位置を起点として、カーソルを表示すべきバッファ内の文字位置の数を指定します。具体的には、ある文字のcursorプロパティの値が数値nである場合、[ovpos..ovpos+n)の範囲内の任意のバッファ位置(ここでovposはoverlay-startで指定されたオーバーレイの開始位置であり、オーバーレイの管理を参照)、またはバッファ内でdisplayテキストプロパティが始まる位置において、その文字にカーソルが表示されます。

言い換えれば、nil 以外の値を持つ cursor プロパティの文字列文字は、オーバーレイまたは表示文字列によってポイントが画面上で見えなくなった際に、カーソルを表示すべき文字となります。このプロパティの値は、どのバッファ位置にカーソルを表示すべきかを示します。値が整数 n の場合、ポイントがオーバーレイまたは display プロパティの開始位置から、その後の n 個の位置までの間のどこにあっても、そこにカーソルが表示されます。値がそれ以外の値で nil 以外の場合、ポイントが display プロパティの開始位置にあたるバッファ位置にあるとき、またはその位置が画面上で見えない場合は overlay-start にあるときにのみ、そこにカーソルが表示されます。なお、cursor プロパティの値が整数である場合、ポイントが画面上で見えているときでも、その文字にカーソルが表示される可能性があることに注意してください。

このプロパティの微妙な点の一つは、表示文字列やオーバーレイ文字列の一部である改行文字にこのプロパティを設定しても機能しないことです。これは、Emacsがcursorプロパティを持つ文字を画面上で検索する際、改行文字には画面上のグラフィック表現が存在しないためです。

バッファに、バッファテキストの一部や文字列である display プロパティを覆い隠すオーバーレイ文字列(例:before-string を参照)が多く存在する場合、これらの文字列に cursor プロパティを使用することで、文字列を辿る際にカーソルをどこに配置すべきかを Emacs のディスプレイに指示するのが得策です。これにより、ディスプレイやオーバーレイ文字列によって「覆われている」バッファ位置にポイントがある際、Lisp プログラムがどこにカーソルを置きたいか、あるいはユーザーがどこにカーソルがあることを期待するかを、ディスプレイエンジンに直接伝えることができます。

pointer

これは、マウスポインタがこのテキストや画像上にある際の特定のポインタ形状を指定します。利用可能なポインタ形状については、ポインタ形状を参照してください。

line-spacing

改行には line-spacing テキストまたはオーバーレイプロパティを指定でき、これによりその改行で終わる表示行の高さを制御できます。このプロパティ値は、デフォルトのフレーム行間隔およびバッファローカル変数 line-spacing よりも優先されます。行高さ を参照してください。

line-height

改行には line-height の text または overlay プロパティを指定でき、これによりその改行で終わる表示行の全高を制御できます。行高 を参照してください。

wrap-prefix

テキスト領域に wrap-prefix プロパティが指定されている場合、定義されたプレフィックスは、テキストの折り返しによって生じるすべての継続行の先頭に、表示時に追加されます(したがって、行が切り詰められた場合、ラッププレフィックスが使用されることはありません)。プロパティの値には、文字列や画像(その他の表示仕様を参照)、あるいは :width や :align-to 表示プロパティで指定されるような空白領域(指定スペースを参照)を指定できます。なお、この効果を発現させるには、wrap-prefix プロパティを、当該テキストの1行目の先頭文字から最終行の末尾文字まで、テキスト領域全体に設定する必要があります。そうでない場合、別の方法でテキストを行に分割すると、表示エンジンが行の継続直後にしかこのプロパティを確認しないため、プレフィックスが表示されない可能性があります。

また、wrap-prefix バッファローカル変数を使用して、バッファ全体にラッププレフィックスを指定することも可能です(ただし、wrap-prefix テキストプロパティは wrap-prefix 変数の値よりも優先されます)。切り捨てを参照してください。

line-prefix

テキスト領域に line-prefix プロパティが指定されている場合、そのプロパティで定義されたプレフィックスが、表示時に継続行以外のすべての行の先頭に追加されます。プロパティの値には、文字列や画像(その他の表示仕様を参照)、あるいは :width や :align-to 表示プロパティで指定されるような空白領域(指定スペースを参照)を指定できます。なお、この効果を発現させるには、line-prefix プロパティを、当該テキストの1行目の先頭文字から最終行の末尾文字まで、テキスト領域全体に設定する必要があります。そうしないと、テキストを別の方法で行分割した場合に、表示エンジンが改行時にのみこのプロパティを確認するため、プレフィックスが表示されない可能性があります。

また、line-prefix バッファローカル変数を使用して、バッファ全体に行プレフィックスを指定することも可能です(ただし、line-prefix テキストプロパティは line-prefix 変数の値よりも優先されます)。切り捨てを参照してください。

modification-hooks

文字がプロパティ modification-hooks を持つ場合、その値は関数のリストである必要があります。その文字を変更すると、実際の変更が行われる前に、それらすべての関数が呼び出されます。各関数には、変更対象となるバッファ部分の開始位置と終了位置という2つの引数が渡されます。なお、特定の変更フック関数が、単一のプリミティブによって変更される複数の文字に適用されている場合、その関数が何回呼び出されるかを予測することはできません。さらに、挿入操作は既存の文字を変更しないため、このフックは一部の文字を削除したり、別の文字に置き換えたり、あるいはテキストプロパティを変更したりする場合にのみ実行されます。

他の類似したフックとは異なり、Emacsがこれらの関数を呼び出す際、inhibit-modification-hooks は non-nil にバインドされません。これらの関数がバッファを変更する場合、変更フックの実行時にバッファへの変更が発生するのを防ぐため、この変数を non-nil にバインドすることを検討してください。そうでない場合は、再帰呼び出しが発生することを想定しておく必要があります。変更フックを参照してください。

オーバーレイも modification-hooks プロパティをサポートしていますが、詳細は多少異なります(オーバーレイのプロパティ を参照してください)。

insert-in-front-hooks
insert-behind-hooks

バッファにテキストを挿入する操作では、次の文字の insert-in-front-hooks プロパティおよび直前の文字の insert-behind-hooks プロパティに列挙されている関数も呼び出されます。これらの関数は、挿入されるテキストの開始位置と終了位置という2つの引数を受け取ります。これらの関数は、実際の挿入が行われた後に呼び出されます。

これらの関数が呼び出される際、inhibit-modification-hooks は non-nil にバインドされます。関数がバッファを変更する場合、それらの変更に対してチェンジフックが実行されるよう、inhibit-modification-hooks を nil にバインドしたい場合があります。ただし、これを行うと自身のチェンジフックが再帰的に呼び出される可能性があるため、その点への対策を必ず講じてください。

バッファ内のテキストを変更した際に呼び出されるその他のフックについては、Change Hooksも参照してください。

point-entered
point-left

特殊プロパティ point-entered と point-left には、ポイントの移動を報告するフック関数が登録されています。ポイントが移動するたびに、Emacs はこれら2つのプロパティ値を比較します:

  • 旧位置の後の文字の point-left プロパティ、および
  • 新しい位置の後の文字の point-entered プロパティ。

これら2つの値が異なる場合、それぞれ(nil でない限り)、点の旧値と新値という2つの引数とともに呼び出されます。

新旧のロケーションより前の文字についても、同様の比較が行われます。その結果、2つのpoint-left関数(同一の関数である場合もあります)および/または2つのpoint-entered関数(同一の関数である場合もあります)が実行される可能性があります。いずれの場合も、まずすべてのpoint-left関数が呼び出され、続いてすべてのpoint-entered関数が呼び出されます。

char-after を使用することで、ポイントを各バッファ位置に移動させることなく、さまざまなバッファ位置にある文字を調べることができます。これらのフック関数が実行されるのは、ポイントの値が実際に変化した場合のみです。

変数 inhibit-point-motion-hooks はデフォルトで point-left および point-entered フックの実行を抑制します。ポイントモーションフックの抑制 を参照してください。

これらのプロパティは非推奨です。代わりに cursor-sensor-functions を使用してください。

cursor-sensor-functions

この特殊プロパティには、カーソルの移動に反応する関数のリストが記録されています。リスト内の各関数は、再表示の直前に、影響を受けるウィンドウ、直前の既知のカーソル位置、および移動方向を示すシンボルの3つの引数とともに呼び出されます。移動方向は、カーソルがこのプロパティを持つテキストに入るか、あるいはそこから出るかに応じて entered または left となり、カーソルがそのテキスト内で移動した場合は moved となります。方向に関するその他の値は無視されるものとします。境界位置(オーバーレイまたはテキストプロパティの範囲の始点および終点)が内側とみなされるか外側とみなされるかについては、get-pos-property と同様のルールが適用されます。詳細は テキストおよびオーバーレイプロパティの境界 を参照してください。これらの関数は、マイナーモード cursor-sensor-mode が有効な場合にのみ呼び出されます。

変数 cursor-sensor-inhibit が nil でない場合、cursor-sensor-functions プロパティは無視されます。

composition

このテキストプロパティは、一連の文字をコンポーネントから構成される単一のグリフとして表示するために使用されます。ただし、プロパティ自体の値はEmacs内部でのみ扱われるため、例えば put-text-property などで直接操作すべきではありません。

minibuffer-message

このテキストプロパティは、アクティブなミニバッファ内で一時メッセージを表示する位置を指定します。具体的には、このプロパティを持つミニバッファテキストの先頭文字の前に、一時メッセージが表示されます。デフォルトでは、一時メッセージはミニバッファテキストの末尾に表示されます。このテキストプロパティは、set-message-function のデフォルト値となる関数で使用されます(エコーエリアへのメッセージ表示を参照)。

display-line-numbers-disable

このテキストプロパティを指定すると、このプロパティを持つテキストの行番号(The GNU Emacs Manualのdisplay-line-numbersを参照)の表示が抑制されます。

変数: inhibit-point-motion-hooks

この廃止された変数が nil 以外の場合、point-left および point-entered フックは実行されず、intangible プロパティも効果を持ちません。この変数をグローバルに設定せず、let でバインドしてください。影響を受けるプロパティは廃止されているため、これらを効果的に無効化すべく、この変数のデフォルト値は t となっています。

変数: show-help-function

この変数が nil 以外の場合、ヘルプ文字列を表示するための関数が指定されます。これらの文字列は、help-echo プロパティ、メニューのヘルプ文字列(Simple Menu Items を参照、Extended Menu Items を参照)、またはツールバーのヘルプ文字列(Tool bars を参照)である場合があります。指定された関数には、表示するヘルプ文字列という1つの引数が渡されます。ヘルプ文字列の先頭文字に nil 以外の help-echo-inhibit-substitution プロパティがない限り、この文字列は関数に渡される前に substitute-command-keys を経由します。Substituting Key Bindings in Documentation を参照してください。show-help-function を使用するモードの例については、Tooltip モードのコード(The GNU Emacs Manual の Tooltips を参照)を確認してください。

変数: face-filters-always-match

この変数が nil 以外の場合、特定の条件を満たしたときにのみ適用される属性を指定するフェイスフィルターは、常に一致するとみなされます。