invisible プロパティを使用すると、文字を不可視にし、画面上に表示されないようにできます。これはテキストプロパティ(テキストプロパティを参照)またはオーバーレイプロパティ(オーバーレイを参照)のいずれかになります。カーソルの移動時にもこれらの文字は部分的に無視されます。コマンドループが、コマンド実行後にポイントが不可視テキストの範囲内にあると判断した場合、ポイントをテキストの反対側に移動させます。
最も単純なケースでは、nil invisible
以外の任意のプロパティによって文字が非表示になります。これがデフォルトの動作であり、buffer-invisibility-spec のデフォルト値を変更しない場合、invisible プロパティはこの仕組みで動作します。buffer-invisibility-spec を自身で設定する予定がない場合は、通常、invisible プロパティの値として t
を使用すべきです。
より一般的に、変数 buffer-invisibility-spec を使用して、invisible プロパティのどの値がテキストを非表示にするかを制御できます。これにより、あらかじめ異なる
invisible 値を割り当ててテキストをさまざまなサブセットに分類し、その後、buffer-invisibility-spec
の値を変更することで、各種サブセットを表示または非表示にすることが可能になります。
buffer-invisibility-spec
による可視性の制御は、データベースのエントリ一覧を表示するプログラムにおいて特に有用です。これにより、データベース内のエントリの一部のみを表示するための便利なフィルタリングコマンドを実装できます。この変数の設定は非常に高速であり、変更すべきプロパティを探してバッファ内の全テキストをスキャンするよりもはるかに高速です。
この変数は、どの種類の invisible
プロパティが実際に文字を不可視にするかを指定します。この変数を設定すると、バッファローカルになります。
tinvisible プロパティが nil
以外の場合、その文字は非表示になります。これがデフォルトです。
リストの各要素は不可視の判定基準を指定しており、文字のinvisibleプロパティがこれらの基準のいずれかに合致する場合、その文字は不可視となります。リストには2種類の要素を含めることができます:
atominvisibleプロパティの値がatomであるか、またはatomを要素に持つリストである場合、その文字は不可視となります。比較はeqを用いて行われます。
(atom . t)文字の invisible プロパティ値が atom
であるか、または atom を要素とするリストである場合、その文字は不可視となり、eq との比較が行われます。さらに、このような文字が連続すると、省略記号として表示されます。
buffer-invisibility-spec
への要素の追加と削除のために、2つの関数が特別に用意されています。
この関数は、要素 element を buffer-invisibility-spec に追加します。buffer-invisibility-spec が t
であった場合、リスト (t) に変更され、invisible プロパティが t
であるテキストは非表示のままとなります。
これにより、buffer-invisibility-spec から要素 element が削除されます。element
がリストに含まれていない場合は、何も行われません。
buffer-invisibility-spec の使用に関する慣例では、メジャーモードは
buffer-invisibility-spec の要素として、また invisible プロパティの値として、そのモード自身の名称を使用することになっています。
;; If you want to display an ellipsis: (add-to-invisibility-spec '(my-symbol . t)) ;; If you don’t want ellipsis: (add-to-invisibility-spec 'my-symbol) (overlay-put (make-overlay beginning end) 'invisible 'my-symbol) ;; When done with the invisibility: (remove-from-invisibility-spec '(my-symbol . t)) ;; Or respectively: (remove-from-invisibility-spec 'my-symbol)
以下の関数で不可視状態を確認できます。
pos-or-prop
がマーカーまたは数値である場合、この関数は、その位置のテキストが現在非表示であれば、nil
以外の値を返します。
pos-or-prop がそれ以外の種類の Lisp オブジェクトである場合、それは invisible のテキストまたはオーバーレイプロパティの取り得る値であることを意味します。その場合、現在の
buffer-invisibility-spec
の値に基づき、その値によってテキストが非表示になるのであれば、この関数は nil
以外の値を返します。
この関数の戻り値は、テキストが画面上で完全に非表示になる場合は t
となり、テキストが省略記号に置き換えられる場合は nil でも t でもない値となります。
通常、テキストを操作したりポイントを移動させたりする関数は、テキストが不可視であるかどうかを問わず、不可視文字と可視文字を同様に処理します。next-line や previous-line
といったユーザーレベルの行移動コマンドは、line-move-ignore-invisible が
nil(デフォルト)でない場合、不可視の改行を無視します。つまり、これらの不可視の改行がバッファ内に存在しないかのように動作しますが、それは単にそのように明示的にプログラムされているためです。
コマンドが不可視テキストの内部または境界でポイントを終了した場合、メインの編集ループはポイントを不可視テキストの両端のいずれかに移動させます。Emacsは、移動方向がコマンド全体の移動方向と一致するように選択します。判断に迷う場合は、挿入された文字がinvisibleプロパティを継承しない位置を優先します。さらに、テキストが省略記号に置き換えられず、コマンドが不可視テキスト内のみで移動した場合は、コマンドによる移動をカーソルの可視的な移動として反映させるため、ポイントをさらに1文字分移動させます。
したがって、コマンドによってポイントが不可視範囲に戻った場合(通常のスティッキネスに従い)、Emacsはポイントをその範囲の先頭に戻します。コマンドによってポイントが不可視範囲へと前進した場合、Emacsはポイントを不可視テキストに続く最初の可視文字まで前進させ、さらにもう1文字分前進させます。
不可視テキストの途中に配置されてしまったこれらの点の調整は、disable-point-adjustmentにnil以外の値を設定することで無効にできます。コマンド実行後の点の調整を参照してください。
インクリメンタル検索では、マッチ結果に非表示テキストが含まれている場合、非表示のオーバーレイを一時的または恒久的に表示させることができます。これを実現するには、オーバーレイに
nil isearch-open-invisible
以外のプロパティを指定する必要があります。このプロパティの値は、オーバーレイを引数として呼び出される関数である必要があります。この関数はオーバーレイを恒久的に表示させる役割を担い、検索を終了する際にマッチ結果がオーバーレイと重なった場合に使用されます。
検索中、こうしたオーバーレイは、不可視かつ実体のないプロパティを一時的に変更することで、一時的に表示されます。特定のオーバーレイに対して異なる処理を行いたい場合は、関数である
isearch-open-invisible-temporary
プロパティを指定してください。この関数には2つの引数が渡されます。1つ目はオーバーレイ、2つ目は、オーバーレイを表示させるための nil または再び非表示にするための t です。
置換するdisplayプロパティが適用されるテキスト内では、invisibleプロパティは無視されます。これは、こうしたdisplayプロパティがテキストのプロパティを処理せずにスキップするためです。テキストを置換する表示仕様を参照してください。