Next: Selective Display, Previous: The Echo Area, Up: Display
属性invisible
で文字群を不可視にできます。
つまり、それらをスクリーンに表示されないようにするのです。
テキスト属性(see Text Properties)か
オーバレイの属性(see Overlays)を使います。
もっとも単純な場合、
属性invisible
がnil
以外であると文字は見えなくなります。
これはデフォルトの場合、つまり、
buffer-invisibility-spec
のデフォルト値を変更していない場合であり、
このようにして属性invisible
は動作します。
より一般的には、変数buffer-invisibility-spec
を使って、
属性invisible
のどの値のものを不可視なテキストにするかを制御できます。
つまり、invisible
の異なる値を与えて
テキストをあらかじめいくつかのグループに分類しておき、
そのあとでbuffer-invisibility-spec
の値を変更して
さまざまなグループを可視/不可視にします。
buffer-invisibility-spec
で可視性を制御することは、
データベースの項目の一覧を表示するようなプログラムで特に有用です。
データベースの特定の項目だけを見るための
便利なフィルタコマンドを実装できます。
この変数に設定するのはとても速くでき、
変更すべき属性を探すためにバッファ内の全テキストを走査するよりも速いのです。
この変数は、属性
invisible
のどの種類を実際に 不可視な文字にするかを指定する。
t
- 属性
invisible
がnil
以外の文字を不可視にする。 これがデフォルト。- リスト
- リストの各要素で不可視にする条件を指定する。 文字の属性
invisible
がこれらの条件の1つを満たすと、 その文字を不可視にする。 リストには2種類の要素がありうる。
- atom
- 文字の属性
invisible
の値がatomであるか、 そのリストのメンバにatomがあると、 文字を不可視にする。(
atom. t)
- 文字の属性
invisible
の値がatomであるか、 そのリストのメンバにatomがあると、 文字を不可視にする。 さらに、その文字が行末にあり、直後に目に見える改行がある場合には、 ‘...’を表示する。
buffer-invisibility-spec
に要素を追加したり削除するために
2つの関数が特別にあります。
(リストにelementが既存でなければ)
buffer-invisibility-spec
に要素elementを追加する。
buffer-invisibility-spec
の使い方の慣習の1つに、
メジャーモードでは
buffer-invisibility-spec
の1要素と属性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)
普通、テキストを操作したりポイントを移動するコマンドは、
テキストの可視性に注意しません。
ユーザーレベルの移動コマンドは、
line-move-ignore-invisible
がnil
以外であれば
不可視な改行を明示的に無視しますが、
それはそのように明示的にプログラムしてあるからにすぎません。
インクリメンタルサーチでは、
不可視なテキストを含む一致箇所では、
不可視なオーバレイを一時的にあるいは恒久的に可視にできます。
これを可能にするには、オーバレイの属性isearch-open-invisible
が
nil
以外である必要があります。
その属性の値は、オーバレイを引数として呼ばれる関数である必要があります。
その関数がオーバレイを恒久的に可視にします。
その関数は、探索から抜けるときに一致箇所が
オーバレイにまたがっているときに使われます。
探索中には、そのようなオーバレイは、
それらの属性invisible
とintangible
を一時的に変更することで
一時的に可視にされます。
特定のオーバレイに対して異なる扱いをしたければ、
属性isearch-open-invisible-temporary
に関数を与えておきます。
その関数は2つの引数で呼ばれます。
第1引数はオーバレイ、
第2引数は、オーバレイを可視にするt
、あるいは、
オーバレイを再度不可視にするnil
です。