クリック可能なテキストを簡略化するパッケージはありますか?


7

私はデバッガのフロントエンドを作成しています。その中で、プログラムの実行中に、ソースコード内にいくつかのマークが追加されます。実行履歴を表示するバッファーや、バックトレースやコールスタックを含むバッファーなどの他のバッファーでは、クリックしてソーステキストに移動するテキスト情報をこれらのバッファーに入れたいと思います。

http://www.gnu.org/software/emacs/manual/html_node/elisp/Clickable-Text.htmlを見ると、クリック可能なテキストを追加するプロセスは少し面倒に思えます。

たとえば、テキストの領域をクリック可能に設定するには、次のようなものが必要です。

(setq link-start (point))
(insert (format "%s" (realgud-loc-marker loc)))
(setq link-end (point))
(add-text-properties
 link-start link-end
 '(mouse-face highlight
      help-echo "mouse-2: go to this location"))
(setq map (make-sparse-keymap))
(define-key map [mouse-2] 'realgud:follow-link)
(define-key map [mouse-1] 'realgud:follow-link)
(define-key map [follow-link] 'mouse-face)
(put-text-property link-start link-end 'keymap map)
(put-text-property link-start link-end 'loc loc)

そして、私はrealgud:follow-linkの定義も必要です:

(defun realgud:follow-link(event)
  (interactive "e")
  (let* ((pos (posn-point (event-end event)))
     (loc (get-text-property pos 'loc)))
    (if (realgud-loc-p loc)
      (realgud-loc-goto loc))))

これらはすべて定型文のように見え、たくさんあります。私はこれのために独自のルーチンを書くことができますが、これはかなり基本的な考えのように思えるので、バッファー内のテキストをどこか別の場所のマークにリンクします。ある?

回答:


8

Emacsはこれらの手順を抽象化するボタンを提供しますmake-buttonおよびのインスタンスのEmacsソースを確認することをお勧めしますinsert-button


1
ありがとう!これはコードの最初のブロックをうまく処理しますが、イベントハンドラのボイラープレートはどうですか?リンクしたいのは、すでにマーカー、バッファ、またはファイル名です。パターン (defun name(event) (interactive "e") (let* ((pos (posn-point (event-end event))) (loc (get-text-property pos 'some-property))) (call-some-fn loc))) もかなり定型です。
岩だらけの

1
(info "(elisp) Button Types")そしておそらくマクロはそこにあなたを連れて行くべきです。
politza

4

クリック可能なテキストを正規表現で定義できる場合、ボタンロックライブラリはボタンとフォントロックを組み合わせ、クリック可能なパターンを1つのステップで定義できます。例:

(button-lock-set-button "http://google.com" 'browse-url-at-mouse)


wiki-navは近いようです。バッファをある種のwikiバッファに変えて、そのようなマークアップを使用できるようにするかもしれません。しかし、ここで悲しいのは、おそらく列位置の粒度のレベルまで下がっているemacs位置マークがすでにあり、それをファイルと行番号に戻す必要があることです。
岩だらけの

0

ライブラリlinkd.elは、クリック可能なテキストをファイルに追加する非常に簡単な方法を提供します。ソースファイルの解説から:

Linkd-mode is a major mode that automatically recognizes and
processes certain S-expressions, called "links", embedded in plain
text files.  Links may be followed by invoking certain interactive
functions when point is on the link text.  Links may also be
interpreted as marking up the surrounding text.  Different types
of links have different behaviors when followed, and they may have
different interpretations as markup.

With Linkd mode, you can do the following:
* Embed hyperlinks to files, webpages, or documentation into
  any type of text file in any major mode.
* Delimit and name regions of text ("blocks") in these text files.
* Extract and send blocks to other programs for processing.
* Identify and mark locations and concepts in source code.
* Embed active data objects ("datablocks") into text files.
* Convert Lisp source-code listings to LaTeX for publication.
* Define new link behaviors.

お粗末な文法/スペルの提案と修正に感謝します。リンクはel-getを介して取得できますが、2009年またはEmacs 22以降は更新されておらず、それ以来多くのことが起こっているのではないかと心配しています。したがって、私はbutton.elアプローチを使用しましたが、それはまだ問題の半分(またはおそらく2/3の3分の1)です
ロッキーな

最近のEmacsバージョンで機能しない可能性がある、または機能しない可能性があるという懸念がある場合は、心配する必要はありません。2009年以降にEmacsに追加された機能を使用していないという懸念がある場合、それはまた別の話です-いいえ、使用していません。それは仕事を成し遂げるための「非常に簡単な方法」のままです。より洗練された、より完全な方法については、組織モードも参照してください。
Drew
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.