Gibt es ein Paket zur Vereinfachung von anklickbarem Text?

7

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?

felsig
quelle

Antworten:

8

Emacs bietet Schaltflächen, um diese Schritte zu abstrahieren. Ich würde empfehlen, in den Emacs-Quellen nach Instanzen von make-buttonund zu suchen insert-button.

Wasamasa
quelle
1
Vielen Dank! Dies behandelt den ersten Codeblock gut, aber was ist mit dem Boilerplate für den Event-Handler? Die Dinge, die ich verknüpfen möchte, sind bereits Markierungen, Puffer oder Dateinamen. Das Muster (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.
Rocky
1
(info "(elisp) Button Types")und vielleicht sollte ein Makro Sie dorthin bringen.
Politza
4

Wenn Ihr klickbaren Text kann durch einen regulären Ausdruck definiert werden, die Tastensperre Bibliothek kombiniert Tasten mit font-Lock und kann klickbare Muster in einem Schritt definieren. Beispiel:

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

Gast01
quelle
wiki-nav scheint nah zu sein und vielleicht verwandle ich den Puffer in eine Art Wiki-Puffer, damit ich diese Art von Markup verwenden kann. Aber was hier traurig ist, ist, dass ich bereits Emacs-Positionsmarkierungen habe, die bis zur Granularität einer möglichen Spaltenposition reichen, und ich müsste das wieder in eine Datei- und Zeilennummer umwandeln.
Rocky
0

Die Bibliothek linkd.elbietet eine sehr einfache Möglichkeit, Ihren Dateien anklickbaren Text hinzuzufügen. Aus der Quelldatei Kommentar:

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.
Drew
quelle
Vielen Dank für das Vorschlagen und Korrigieren meiner miesen Grammatik / Rechtschreibung. Obwohl linkd über el-get erhältlich ist, befürchte ich, dass es seit 2009 oder Emacs 22 nicht mehr aktualisiert wurde und seitdem viel passiert ist. Also habe ich mich für den Button.el-Ansatz entschieden, obwohl es immer noch nur die Hälfte (oder vielleicht 2/3) des Problems ist
Rocky
Wenn Sie befürchten, dass es mit den neuesten Emacs-Versionen möglicherweise nicht oder auch nicht funktioniert, machen Sie sich darüber keine Sorgen - das tut es. Wenn Sie befürchten, dass seit 2009 keine zu Emacs hinzugefügten Funktionen mehr verwendet werden, ist dies eine andere Geschichte - nein, dies ist nicht der Fall. Es bleibt "ein sehr einfacher Weg", die Arbeit zu erledigen. Siehe auch Org-Modus für eine schickere, vollständigere Methode.
Drew