Existe um pacote para simplificar o texto clicável?


7

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?

Respostas:


8

O Emacs fornece botões para abstrair essas etapas, eu sugiro olhar as fontes do Emacs para instâncias de make-buttone insert-button.


11
Obrigado! Isso lida muito bem com o primeiro bloco de código, mas e o padrão para o manipulador de eventos? As coisas que eu quero vincular já são marcadores, buffers ou nomes de arquivos. O padrão (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.
rochoso

11
(info "(elisp) Button Types")e talvez uma macro o leve até lá.
politza 22/08/16

4

Se o texto clicável puder ser definido por uma expressão regular, a biblioteca de bloqueio de botão combinará botões com o bloqueio de fonte e poderá definir padrões clicáveis ​​em uma etapa. Exemplo:

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


O wiki-nav parece próximo e talvez eu transforme o buffer em algum tipo de buffer do wiki para poder usar esse tipo de marcação. Mas o que é triste aqui, é que eu já tenho marcas de posição do emacs que estão no nível de granularidade de possivelmente uma posição de coluna, e eu teria que transformá-las novamente em um número de arquivo e linha.
rochoso

0

A Biblioteca linkd.elfornece uma maneira muito simples de adicionar texto clicável aos seus arquivos. Do arquivo de origem Comentário:

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.

Obrigado pela sugestão e correção da minha péssima gramática / ortografia. Embora o linkd possa ser obtido via el-get, minha preocupação é que ele não seja atualizado desde 2009 ou no Emacs 22 e muita coisa aconteceu desde então. Então eu fui com a abordagem button.el, embora ainda seja apenas a metade (ou talvez 2 / 3rds) do problema
rochoso

Se sua preocupação é que ele pode não funcionar, ou pode não funcionar tão bem, nas versões recentes do Emacs, não se preocupe com isso - ele funciona. Se sua preocupação é que ele não usa nenhum recurso adicionado ao Emacs desde 2009, isso é outra história - não, não. Continua sendo "uma maneira muito simples" de realizar o trabalho. Veja também o modo Org, para uma maneira mais sofisticada e completa.
Drew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.