invisible
プロパティにより、スクリーン上に表示されないように文字を不可視(invisible)にすることができます。これはテキストプロパティ(テキストのプロパティを参照)、またはオーバーレイプロパティ(オーバーレイを参照)のいずれかで行うことができます。カーソル移動もこれらの文字を部分的に無視します。あるコマンドの後に不可視テキスト範囲内にポイントがあることをコマンドループが検知した場合には、コマンドループはポイントをそのテキストの別サイドへ再配置します。
もっともシンプルなケースでは、非nil
のinvisible
プロパティにより文字は不可視になります。これがデフォルトのケースであり、もしbuffer-invisibility-spec
のデフォルト値を変更したくない場合には、これがinvisible
プロパティを機能させる方法です。自身でbuffer-invisibility-spec
をセットする予定がなければ、invisible
プロパティの値として通常はt
を使用するべきです。
より一般的にはどのinvisible
の値がテキストを不可視にするかを制御するために変数buffer-invisibility-spec
を使用できます。テキストにたいして異なるinvisible
の値を与えることにより、事前に別のサブセットへテキストをクラス分けした後にbuffer-invisibility-spec
の値を変更して、さまざまなサブセットを可視や不可視にすることができます。
特にデータベース内のエントリーのリストを表示するプログラム内では、buffer-invisibility-spec
による可視性の制御は有用です。これによりデータベース内の一部だけを閲覧するフィルターコマンドを簡便に実装することが可能になります。この変数をセットするのは非常に高速であり、バッファー内のすべてのテキストにたいしてプロパティが変更されたかスキャンするよりはるかに高速です。
この変数はどの種類のinvisible
プロパティが実際に文字を不可視にするかを指定する。この変数はセットすることによりバッファーローカルになる。
t
invisible
プロパティが非nil
ならその文字は不可視になる。これがデフォルト。
このリスト内の各要素は不可視性の条件を指定する。ある文字のinvisible
プロパティがこれらの条件のいずれかに適合したら、その文字は不可視になる。このリストは2種類の要素をもつことができる:
atom
invisible
プロパティの値がatom、またはatomをメンバーにもつリストならその文字は不可視になる。比較はeq
により行われる。
(atom . t)
invisible
プロパティの値がatom、またはatomをメンバーにもつリストならその文字は不可視になる。比較はeq
により行われる。さらにそのような文字シーケンスは省略記号(ellipsis)として表示される。
特にbuffer-invisibility-spec
への要素の追加と削除のために2つの関数が提供されています。
この関数は、buffer-invisibility-spec
に要素elementを追加する。buffer-invisibility-spec
がt
なら、これはリスト(t)
に変更されてinvisible
プロパティがt
のテキストは不可視のまま留まる。
この関数はbuffer-invisibility-spec
から要素elementを削除する。リスト内にelementがなければ何も行わない。
buffer-invisibility-spec
を使用するための規約として、メジャーモードはbuffer-invisibility-spec
の要素、およびinvisible
プロパティの値として自身のモード名を使用することになっている。
;; 省略記号を表示したければ: (add-to-invisibility-spec '(my-symbol . t)) ;; 表示したくなければ: (add-to-invisibility-spec 'my-symbol) (overlay-put (make-overlay beginning end) 'invisible 'my-symbol) ;; 不可視状態が終わったら: (remove-from-invisibility-spec '(my-symbol . t)) ;; または各々を: (remove-from-invisibility-spec 'my-symbol)
以下の関数を使用することにより不可視性をチェックできます:
この関数はpos-or-propがマーカーか数字の場合には、その位置のテキストがカレントで不可視なら非nil
をリターンする。
pos-or-propが別の類のLispオブジェクトなら、テキストプロパティかオーバーレイプロパティとして可能な値を意味すると解釈される。この場合にはbuffer-invisibility-spec
のカレント値にもとづき、もしその値がテキストを不可視とするようならこの関数は非nil
をリターンする。
この関数のリターン値はテキストがディスプレイ上で完全に非表示ならt
、省略記号(ellipsis)で置き換えられていればnil
でもt
でもない値となる。
テキストを操作したりポイントを移動する関数は、通常はそのテキストが不可視かどうかに注意を払わずに、可視と不可視のテキストを同様に処理します。next-line
やprevious-line
のようなユーザーレベルの行移動関数はline-move-ignore-invisible
が非nil
(デフォルト)なら不可視な改行を無視します。これらの関数は不可視な改行がそのバッファーに存在しないかのように振る舞いますが、それはそう振る舞うように明示的にプログラムされているからです。
あるコマンドが不可視テキストの境界内側のポイントで終了した場合には、メイン編集ループはその不可視テキストの両端のうちのいずれかにポイントを再配置します。そのコマンドの移動関数の全体的な方向と同じになるようにEmacsが再配置の方向を決定します。これに疑問がある場合には、挿入された文字がinvisible
プロパティを継承しないような位置を優先してください。加えてそのテキストが省略記号で置換されずに、コマンドが不可視テキスト内への移動のみを行う場合には、ポイントを1文字余計に移動して目に見えるようカーソルを移動することにより、そのコマンドの移動を反映するよう試みます。
したがってコマンドが(通常のstickinessをもつ)不可視範囲に後方へとポイントを移動すると、Emacsはポイントをその範囲の先頭に後方へと移動します。コマンドが不可視範囲へ前方にポイントを移動した場合には、Emacsは不可視テキストの前にある最初の可視文字に前方へとポイントを移動して、その後さらに前方へ1文字余計に移動します。
これら不可視テキスト中間で終了するポイントにたいするこれらの調整(adjustments)は、disable-point-adjustment
を非nil
にセットすることにより無効にできます。コマンド後のポイントの調整を参照してください。
インクリメンタル検索はマッチが不可視テキストを含む場合には、一時的および/または永続的に不可視オーバーレイを可視にすることができます。これを有効にするためには、そのオーバーレイが非nil
のisearch-open-invisible
プロパティをもつ必要があります。プロパティの値は、そのオーバーレイを引数として呼び出される関数であるべきです。その関数はオーバーレイを永続的に可視にする必要があります。これは検索からのexit時にマッチがそのオーバーレイに重なるときに使用されます。
検索の間にそのようなオーバーレイのinvisible、およびintangibleプロパティを一時的に変更することによりオーバーレイは一時的に可視にされます。特定のオーバーレイにたいして異なる方法でこれを行いたいなら、それをisearch-open-invisible-temporary
プロパティ(関数)に与えてください。その関数は2つの引数により呼び出されます。1つ目はそのオーバーレイ、2つ目はnil
ならオーバーレイを可視、t
なら再び不可視にします。