次: , 前: The Echo Area, 上: Display


38.4 不可視なテキスト

属性invisibleで文字群を不可視にできます。 つまり、それらをスクリーンに表示されないようにするのです。 テキスト属性(see Text Properties)か オーバレイの属性(see Overlays)を使います。

もっとも単純な場合、 属性invisiblenil以外であると文字は見えなくなります。 これはデフォルトの場合、つまり、 buffer-invisibility-specのデフォルト値を変更していない場合であり、 このようにして属性invisibleは動作します。

より一般的には、変数buffer-invisibility-specを使って、 属性invisibleのどの値のものを不可視なテキストにするかを制御できます。 つまり、invisibleの異なる値を与えて テキストをあらかじめいくつかのグループに分類しておき、 そのあとでbuffer-invisibility-specの値を変更して さまざまなグループを可視/不可視にします。

buffer-invisibility-specで可視性を制御することは、 データベースの項目の一覧を表示するようなプログラムで特に有用です。 データベースの特定の項目だけを見るための 便利なフィルタコマンドを実装できます。 この変数に設定するのはとても速くでき、 変更すべき属性を探すためにバッファ内の全テキストを走査するよりも速いのです。

— 変数: buffer-invisibility-spec

この変数は、属性invisibleのどの種類を実際に 不可視な文字にするかを指定する。

t
属性invisiblenil以外の文字を不可視にする。 これがデフォルト。
リスト
リストの各要素で不可視にする条件を指定する。 文字の属性invisibleがこれらの条件の1つを満たすと、 その文字を不可視にする。 リストには2種類の要素がありうる。
atom
文字の属性invisibleの値がatomであるか、 そのリストのメンバにatomがあると、 文字を不可視にする。
(atom . t)
文字の属性invisibleの値がatomであるか、 そのリストのメンバにatomがあると、 文字を不可視にする。 さらに、その文字が行末にあり、直後に目に見える改行がある場合には、 `...'を表示する。

buffer-invisibility-specに要素を追加したり削除するために 2つの関数が特別にあります。

— 機能: add-to-invisibility-spec element

(リストにelementが既存でなければ) buffer-invisibility-specに要素elementを追加する。

— 機能: remove-from-invisibility-spec 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-invisiblenil以外であれば 不可視な改行を明示的に無視しますが、 それはそのように明示的にプログラムしてあるからにすぎません。

インクリメンタルサーチでは、 不可視なテキストを含む一致箇所では、 不可視なオーバレイを一時的にあるいは恒久的に可視にできます。 これを可能にするには、オーバレイの属性isearch-open-invisiblenil以外である必要があります。 その属性の値は、オーバレイを引数として呼ばれる関数である必要があります。 その関数がオーバレイを恒久的に可視にします。 その関数は、探索から抜けるときに一致箇所が オーバレイにまたがっているときに使われます。

探索中には、そのようなオーバレイは、 それらの属性invisibleintangibleを一時的に変更することで 一時的に可視にされます。 特定のオーバレイに対して異なる扱いをしたければ、 属性isearch-open-invisible-temporaryに関数を与えておきます。 その関数は2つの引数で呼ばれます。 第1引数はオーバレイ、 第2引数は、オーバレイを可視にするt、あるいは、 オーバレイを再度不可視にするnilです。