Next: , Previous: , Up: Display   [Contents][Index]


37.6 不可視のテキスト

invisibleプロパティにより、スクリーン上に表示されないように文字を不可視(invisible)にすることができます。これはテキストプロパティ(Text Propertiesを参照)、またはオーバーレイプロパティ(Overlaysを参照)のいずれかで行うことができます。カーソル移動もこれらの文字を部分的に無視します。あるコマンドの後に不可視テキスト範囲内にポイントがあることをコマンドループが検知した場合には、コマンドループはポイントをそのテキストの別サイドへ再配置します。

もっともシンプルなケースでは、非nilinvisibleプロパティにより文字は不可視になります。これがデフォルトのケースであり、もしbuffer-invisibility-specのデフォルト値を変更したくない場合には、これがinvisibleプロパティを機能させる方法です。自身でbuffer-invisibility-specをセットする予定がなければ、invisibleプロパティの値として通常はtを使用するべきです。

より一般的にはどのinvisibleの値がテキストを不可視にするかを制御するために変数buffer-invisibility-specを使用できます。テキストにたいして異なるinvisibleの値を与えることにより、事前に別のサブセットへテキストをクラス分けした後にbuffer-invisibility-specの値を変更して、さまざまなサブセットを可視や不可視にすることができます。

特にデータベース内のエントリーのリストを表示するプログラム内では、buffer-invisibility-specによる可視性の制御は有用です。これによりデータベース内の一部だけを閲覧するフィルターコマンドを簡便に実装することが可能になります。この変数をセットするのは非常に高速であり、バッファー内のすべてのテキストにたいしてプロパティが変更されたかスキャンするよりはるかに高速です。

Variable: 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つの関数が提供されています。

Function: add-to-invisibility-spec element

この関数は、buffer-invisibility-specに要素elementを追加する。buffer-invisibility-spectなら、これはリスト(t)に変更されてinvisibleプロパティがtのテキストは不可視のまま留まる。

Function: remove-from-invisibility-spec element

この関数は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)

以下の関数を使用することにより不可視性をチェックできます:

Function: invisible-p pos-or-prop

pos-or-propがマーカーか数字の場合には、その位置のテキストが不可視ならこの関数は非nilをリターンする。

pos-or-propが別の類のLispオブジェクトなら、テキストプロパティかオーバーレイプロパティとして可能な値を意味すると解釈される。この場合にはbuffer-invisibility-specのカレント値にもとづき、もしその値がテキストを不可視とするようならこの関数は非nilをリターンする。

テキストを操作したりポイントを移動する関数は、通常はそのテキストが不可視かどうかに注意を払わずに、可視と不可視のテキストを同様に処理します。next-lineprevious-lineのようなユーザーレベルの行移動関数はline-move-ignore-invisibleが非nil (デフォルト)なら不可視な改行を無視します。これらの関数は不可視な改行がそのバッファーに存在しないかのように振る舞いますが、それはそう振る舞うように明示的にプログラムされているからです。

あるコマンドが不可視テキストの境界内側のポイントで終了した場合には、メイン編集ループはその不可視テキストの両端のうちのいずれかにポイントを再配置します。そのコマンドの移動関数の全体的な方向と同じになるようにEmacsが再配置の方向を決定します。これに疑問がある場合には、挿入された文字がinvisibleプロパティを継承しないような位置を優先してください。加えてそのテキストが省略記号で置換されずに、コマンドが不可視テキスト内への移動のみを行う場合には、ポイントを1文字余計に移動して目に見えるようカーソルを移動することにより、そのコマンドの移動を反映するよう試みます。

したがってコマンドが(通常のstickinessをもつ)不可視範囲に後方へとポイントを移動すると、Emacsはポイントをその範囲の先頭に後方へと移動します。コマンドが不可視範囲へ前方にポイントを移動した場合には、Emacsは不可視テキストの前にある最初の可視文字に前方へとポイントを移動して、その後さらに前方へ1文字余計に移動します。

これら不可視テキスト中間で終了するポイントにたいするこれらの調整(adjustments)は、disable-point-adjustmentを非nilにセットすることにより無効にできます。Adjusting Pointを参照してください。

インクリメンタル検索はマッチが不可視テキストを含む場合には、一時的および/または永続的に不可視オーバーレイを可視にすることができます。これを有効にするためには、そのオーバーレイが非nilisearch-open-invisibleプロパティをもつ必要があります。プロパティの値は、そのオーバーレイを引数として呼び出される関数であるべきです。その関数はオーバーレイを永続的に可視にする必要があります。これは検索からのexit時にマッチがそのオーバーレイに重なるときに使用されます。

検索の間にそのようなオーバーレイのinvisible、およびintangibleプロパティを一時的に変更することによりオーバーレイは一時的に可視にされます。特定のオーバーレイにたいして異なる方法でこれを行いたいなら、それをisearch-open-invisible-temporaryプロパティ(関数)に与えてください。その関数は2つの引数により呼び出されます。1つ目はそのオーバーレイ、2つ目はnilならオーバーレイを可視、tなら再び不可視にします。