オーバーレイとは何ですか?また、テキストプロパティとどのように違いますか?


23

手動の状態:

プレゼンテーション機能のために、オーバーレイを使用して、画面上のバッファのテキストの外観を変更できます。

その名前から、既存のテキストの上に「レイヤー」を作成するために使用できることが示唆されていますが、上記の説明は、テキストの外観を変更することを示しているようです。

オーバーレイの具体的な使用とは何ですか?彼らは、テキストプロパティが提供しないことを何を提供しますか?ポップアップ、情報ボックスなど、バッファ内のテキストにテキストを上書きするために使用できますか?


一文だけではなく、そのマニュアルセクションの詳細をお読みください。IMO、それはかなり明確に説明されています。テキストプロパティとの違いを含める。もちろん(同じマニュアルの)も参照してくださいi text properties
ドリュー14年

回答:


10

オーバーレイとは何ですか?

まず第一に、それらはelispオブジェクトです。これは後で関連します。

自分で言ったように、これらはバッファの領域の上に適用されるレイヤーを表します。これらのレイヤーには、バッファー内の実際のテキストと同様に、テキストプロパティがあります。オーバーレイにある通常のプロパティは、その下のテキストに適用されます。ただし、オーバーレイに特別なプロパティがいくつかあります(テキストに適用されても何もしません)。

なぜ有用なのですか?

上記で示唆した2つの理由から:

それらはオブジェクトです

これは、リストに保存して簡単に処理できることを意味します。現在の場所を追跡することなく、プロパティを変更できます。さらに良いことに、それらを使用て、バッファ内のどこにあるかを追跡できます。

ステファンによるこの回答は、バッファ領域を追跡するために使用されるオーバーレイの良い例です。以下に短い抜粋を示します。

(let ((ol (make-overlay beg end)))
  (overlay-put ol 'evaporate t)
  (overlay-put ol 'my--auto-align-regexp regexp)
  (push ol my--auto-align-overlays))

オーバーレイを使用して、位置合わせする領域と、各領域で使用する正規表現を記録します。my--auto-align-overlays

オーバーレイが保存されているリスト。このリストを調べると、オーバーレイに簡単にアクセスできます。
対照的に、これにテキストプロパティを使用している場合(可能な場合)、それらにアクセスする簡単な方法はありません。テキストプロパティを見つけるには、バッファを解析する必要があります。

彼らはわずかに強力です

オーバーレイにのみ影響するテキストプロパティがいくつかあります。リスト全体はマニュアルに記載さ れています。ここに含めるには大きすぎますが、ここで簡単なハイライトを示します。

before-string
このプロパティの値は、オーバーレイの最初に表示に追加する文字列です。文字列は、バッファにはまったく表示されず、画面にのみ表示されます。
line-prefix
このプロパティは、表示時に各非継続行の先頭に追加する表示仕様を指定します。切り捨てを参照してください。
wrap-prefix
このプロパティは、表示時に各継続行の先頭に追加する表示仕様を指定します。切り捨てを参照してください。

特に、このbefore-stringプロパティを使用すると、幅が0のオーバーレイであっても、バッファーの表示に影響を与えることができます。これは、テキストプロパティでは実行できないことです。テキストプロパティを使用して行うことはすべて、既存のテキスト(このテキストを非表示にする場合があります)を調べるか、挿入する新しいテキスト文字列(バッファーの実際の内容を変更する)を調べる必要があります。

これに関するスニペットの例を次に示します。一時バッファーで評価します。

(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")

彼らはいつ悪いですか?

オーバーレイは、テキストプロパティよりもはるかに要求が厳しい(処理の観点から)。いくつかの関連する操作(テキストの挿入など、私が間違っていない場合)は、バッファー内のオーバーレイの数に比例して時間がかかります。そのため、大量に必要な場合には適していません。この場合、テキストプロパティに辞任する必要があります。


12

オーバーレイとテキストプロパティの機能はまったく同じです。テキストの特定の部分に、変更マージン、ボタン、顔、フリンジアイコン、ツールチップ、画像、ハイライトなどを追加します。ただし、概念上の大きな違いがあります。

オーバーレイは独立していますが、テキストプロパティは独立しています。Emacsには明確なオーバーレイタイプがありますが、「テキストプロパティタイプ」はありません。テキストプロパティは、設定された文字列に本質的に関連付けられています。一方、オーバーレイはバッファーに接続されます。

この違いにはいくつかの実用的な意味があります。

  • バッファには含まれない文字列にテキストプロパティを設定できますが、オーバーレイには常にバッファが必要です。
  • どこかに追加したテキストプロパティのリストを保持することはできませんが、バッファに追加されたオーバーレイのリストを保持することは簡単です。たとえば、一度にすべてのオーバーレイを削除します。
  • テキストに複数のオーバーレイを設定する単一のオーバーレイ(顔、ツールチップ、フリンジアイコンなど)を使用できるため、オーバーレイを使用してプロパティの「グループ」を単一のユニットとして管理できますが、テキストプロパティのようなもの。それらを個別に設定し、個別に管理します。

このすべての本質は、テキストコンテンツとは別にオーバーレイを管理できることです。概念的には、テキストから独立していても、バッファに表示するものに使用します。

実際には、テキストに追加したいものが頻繁に変更される場合はオーバーレイを使用し、コンテンツが一定の場合はテキストプロパティを使用します。

たとえば、Emacsはテキストプロパティを使用して、M-x customizeバッファー内にボタンと入力ウィジェットを作成します。これらのウィジェットは一度作成され、バッファが生きている限りそこに留まるため、オーバーレイを取り込む必要はありません。

ただし、Flycheckバッファーを使用してエラーをハイライトするためにオーバーレイを使用します。これは、ハイライトを頻繁に削除および追加する必要があるためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.