プロパティ化/オーバーレイするテキストがないウィンドウの場所に一時的なテキストがありますか?


9

Q:ウィンドウの画面の位置にテキストを表示せずに一時的にテキストを表示/オーバーレイするにはどうすればよいですか?

私はテキストプロパティオーバーレイの背後にある基本的な考え方に精通しており(このスレッドも参照)、それらを何度か使用していますが、決してそれに慣れているわけではありません。私の限られた理解は、プロパティ化またはオーバーレイするにはテキストが必要であるということですが、テキストが含まれていないウィンドウのセクションをどのように使用するのか疑問に思っています。

次に例のスクリーンショットを示します。

ここに画像の説明を入力してください

スクリーンショットの赤いボックスの1つ(つまり、テキストの右側、またはバッファーの最後の行の下)に(一時的に)テキストを配置するにはどうすればよいでしょうか。


つまり、displayプロパティを使用して、そこにないテキストを表示できます。私が家に帰る前に誰かが完全な答えを出すかもしれません。
Malabarba 2014年

company-modeは、displayプロパティの前後のポイントが十分にある場合にテキストにオーバーレイを配置します。または、after-stringプロパティを使用して、バッファーの末尾の下に何かを表示します。横に何かを表示するかどうかはわかりませんが、オーバーレイの幅と位置を適切に設定することで可能になるようです。
wasamasa 2014年

insertバッファにテキストを入力してそれを具体化することはできませんか?
rekado 2014年

回答:


6

文字列を受け取り、一時的にバッファテキストの後にタイムアウトで表示する関数の実際の例をホイップしました。

(defun my-momentarily-display-after-buffer-end (string &optional timeout)
  (let ((ov (make-overlay (point-max) (point-max))))
    (overlay-put ov 'after-string
                 (concat (propertize " " 'display
                                     '(space :align-to (+ left-fringe 10)))
                         (propertize string 'display
                                     '(raise -1))
                         "\n\n"))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

次の呪文を実行すると、赤いボックスの例が表示されます。

(my-momentarily-display-after-buffer-end "Nothing to see here...")

これが機能する理由は、オーバーレイがその間に表示される位置としてマーカーを使用するためです。最も外側の位置をオーバーレイの開始と終了として使用すると、プロパティを使用して、その後ろにテキストを表示できますafter-string。オーバーレイには適切なテキストを含めることができるため、インデントして周囲に空白を表示するように設定しました。

他の例では、同じアイデアを使用して、行の終わりの後にテキストを表示できます。

(defun my-momentarily-display-after-line-end (string &optional timeout)
  (let ((ov (make-overlay (line-end-position) (line-end-position))))
    (overlay-put
     ov 'after-string
     (concat (propertize " " 'display
                         `(space :align-to (- right-fringe
                                              ,(1+ (length string)))))
             string))
    (sit-for (or timeout 5))
    (delete-overlay ov)))

次の呼び出しは、右側の赤いボックスの例になります。

(my-momentarily-display-after-line-end "annotation")

もっとクレイジーになって、これらのオーバーレイをバッファテキストと区別するために面を追加し、タイムアウトよりも長く表示し、それらの位置を調整し、空きスペースがないことを検出し、プロパティ化されたテキストの通常のオーバーレイを使用するなどできます。company-modeのソースコードは 非常に読みやすく、推奨される機能を備えた柔軟なポップアップメニューを作成するためのオーバーレイのより複雑な(そしてほとんどバグのない)使用方法を示しています。


2

関数を使用して、バッファ内のテキストを一時的に表示できますmomentary-string-display。表示するメッセージとバッファ内の位置を取得します。

この:

(momentary-string-display "hello there" 200)

文字列 "hello there"をバッファの200の位置に配置します。この時点で他のすべてのテキストが横に移動され、「hello world」の余地ができますが、すべてのキーは、キーを押したときの場所に復元されます。

オーバーレイを作成するためにバッファにテキストは必要ありませんが、それはテキストプロパティの要件です。幅がゼロのオーバーレイで、追加のテキストが表示されます。

(let ((ov (make-overlay 1 1)))
  (overlay-put ov 'before-string "this text is not part of the buffer"))

このオーバーレイはバッファテキストを押しのけることに注意してください。指定された位置のテキストをカバーしません。

point-max/ より大きいバッファー内の任意の位置にオーバーレイを配置することはできないようですbuffer-size。つまり、この制限を回避しない限り、バッファーテキストの下の特定の位置にテキストを配置できない可能性があります。もちろん、位置にafter-string固定されたオーバーレイのプロパティを使用して、バッファーテキストの直後にテキストをpoint-max配置できます。

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