私はデバッガのフロントエンドを作成しています。その中で、プログラムの実行中に、ソースコード内にいくつかのマークが追加されます。実行履歴を表示するバッファーや、バックトレースやコールスタックを含むバッファーなどの他のバッファーでは、クリックしてソーステキストに移動するテキスト情報をこれらのバッファーに入れたいと思います。
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))))
これらはすべて定型文のように見え、たくさんあります。私はこれのために独自のルーチンを書くことができますが、これはかなり基本的な考えのように思えるので、バッファー内のテキストをどこか別の場所のマークにリンクします。ある?
(defun name(event) (interactive "e") (let* ((pos (posn-point (event-end event))) (loc (get-text-property pos 'some-property))) (call-some-fn loc)))
もかなり定型です。