Estou escrevendo um front end de depurador e, ao longo da execução do programa, várias marcas são adicionadas ao código-fonte. Em outros buffers, como um buffer que mostra o histórico de execução ou um buffer que contém backtrace ou callstack, eu gostaria de ter nesses buffers informações de texto que clicam no texto de origem.
Olhando para http://www.gnu.org/software/emacs/manual/html_node/elisp/Clickable-Text.html , o processo para adicionar texto clicável parece um pouco complicado.
Por exemplo, apenas para definir uma região do texto para ser clicável, preciso de 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)
E então eu também preciso de uma definição para o 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))))
Tudo isso parece um pouco confuso e existe muito disso. Eu poderia escrever minhas próprias rotinas, para isso, mas como isso parece bastante básico: vincular algum texto em um buffer a uma marca em outro lugar, acho que já deve haver um pacote que simplifique o que foi dito acima. Existe?
(defun name(event) (interactive "e") (let* ((pos (posn-point (event-end event))) (loc (get-text-property pos 'some-property))) (call-some-fn loc)))
também é bastante bonito.