Ich schreibe ein Debugger-Frontend , und dabei werden im Verlauf der Programmausführung eine Reihe von Markierungen im Quellcode hinzugefügt. In anderen Puffern wie einem Puffer, der den Ausführungsverlauf anzeigt, oder einem Puffer, der Backtrace oder Callstack enthält, möchte ich in diesen Puffern Textinformationen haben, die zum Quelltext durchklicken.
Unter http://www.gnu.org/software/emacs/manual/html_node/elisp/Clickable-Text.html erscheint das Hinzufügen von anklickbarem Text etwas umständlich.
Um beispielsweise einen Textbereich so einzustellen, dass er anklickbar ist, benötige ich Folgendes:
(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)
Und dann brauche ich noch eine Definition, um 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))))
All dies scheint ein bisschen boilerplate und es gibt viel davon. Ich könnte dafür meine eigenen Routinen schreiben, aber da dies ein ziemlich grundlegender Gedanke zu sein scheint: Verknüpfen Sie Text in einem Puffer mit einer Markierung an einer anderen Stelle. Ich denke, es muss bereits ein Paket geben, das das oben Genannte vereinfacht. Gibt es?
(defun name(event) (interactive "e") (let* ((pos (posn-point (event-end event))) (loc (get-text-property pos 'some-property))) (call-some-fn loc)))
ist auch so ziemlich Boilerplate.