Estoy escribiendo un front-end del depurador y, en el transcurso de la ejecución del programa, se agregan varias marcas dentro del código fuente. En otros búferes, como un búfer que muestra el historial de ejecución, o un búfer que contiene traza inversa o pila de llamadas, me gustaría tener en esos búferes información de texto que haga clic en el texto de origen.
Mirando http://www.gnu.org/software/emacs/manual/html_node/elisp/Clickable-Text.html , el proceso para agregar texto en el que se puede hacer clic parece un poco engorroso.
Por ejemplo, solo para configurar una región de texto para que se pueda hacer clic, necesito algo como:
(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)
Y luego también necesito una definición para 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))))
Todo esto parece un poco repetitivo y hay mucho de eso. Podría escribir mis propias rutinas, para esto, pero dado que esto parece un pensamiento bastante básico: vincular texto en un búfer a una marca en otro lugar, creo que ya debe haber un paquete que simplifique lo anterior. ¿Esta ahí?
(defun name(event) (interactive "e") (let* ((pos (posn-point (event-end event))) (loc (get-text-property pos 'some-property))) (call-some-fn loc)))
también es más o menos repetitivo.