¿Hay un paquete para simplificar el texto en el que se puede hacer clic?

7

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í?

rocoso
fuente

Respuestas:

8

Emacs proporciona botones para abstraer estos pasos, sugiero que mire las fuentes de Emacs para ver instancias de make-buttony insert-button.

wasamasa
fuente
1
¡Gracias! Esto maneja muy bien el primer bloque de código, pero ¿qué pasa con la plantilla para el controlador de eventos? Las cosas que quiero vincular ya son marcadores, buffers o nombres de archivos. El patrón (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.
rocoso
1
(info "(elisp) Button Types")y tal vez una macro debería llevarte allí.
politza
4

Si su texto en el que se puede hacer clic se puede definir mediante una expresión regular, la biblioteca de bloqueo de botones combina botones con bloqueo de fuente y puede definir patrones en los que se puede hacer clic en un solo paso. Ejemplo:

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

Invitado01
fuente
wiki-nav parece estar cerca y tal vez convierta el búfer en algún tipo de búfer wiki para poder usar ese tipo de marcado. Pero lo triste aquí es que ya tengo marcas de posición de emacs que están por debajo del nivel de granularidad de posiblemente una posición de columna, y tendría que volver a convertir eso en un archivo y un número de línea.
rocoso
0

La biblioteca linkd.elproporciona una forma muy simple de agregar texto en el que se puede hacer clic a sus archivos. Del archivo fuente Comentario:

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.
Dibujó
fuente
Gracias por sugerir y corregir mi pésima gramática / ortografía. Aunque linkd se puede obtener a través de el-get, mi preocupación con esto es que no se ha actualizado desde 2009 o Emacs 22 y han sucedido muchas cosas desde entonces. Así que he seguido con el enfoque button.el, aunque todavía es solo la mitad (o tal vez 2/3) del problema
rocoso el
Si le preocupa que no funcione, o que no funcione tan bien con las versiones recientes de Emacs, no se preocupe por eso, lo hace. Si le preocupa que no use ninguna característica agregada a Emacs desde 2009, esa es otra historia, no, no lo hace. Sigue siendo "una forma muy simple" de hacer el trabajo. Vea también el modo Org, para una forma más elegante y completa.
Dibujó el