Come implementare gli ID dei collegamenti in stile Markdown in modalità organizzazione?


22

A volte, devo usare lo stesso link in più punti in un lungo documento.

In questi casi sarebbe utile avere ID link come nel markdown. Dal riferimento alla sintassi del markdown ,

Puoi opzionalmente usare uno spazio per separare le serie di parentesi:

This is [an example] [id] reference-style link. 

Quindi, ovunque nel documento, definisci l'etichetta del link in questo modo, su una riga da sola:

[id]: http://example.com/ "Optional Title Here"

Credevo che l' abbreviazione del link in modalità org avrebbe funzionato allo stesso modo (senza tag) ma non funziona.

Lo scopo degli ID di collegamento è di avere un posto centrale per la modifica dei collegamenti. Una buona posizione sarebbe alla fine del documento. I collegamenti completi sono definiti nell'ID ma solo l'ID viene utilizzato altrove nel documento in cui è necessario posizionare i collegamenti ipertestuali. Durante l'esportazione, gli ID vengono sostituiti con i collegamenti ipertestuali effettivi.

I vantaggi di questo approccio sono,

  • Quando i collegamenti cambiano, dobbiamo solo modificare le definizioni ID. All'esportazione, i collegamenti ipertestuali nel documento verranno aggiornati a quello.
  • Inserimento più rapido dei collegamenti ipertestuali quando si scrive il documento in quanto non è necessario ottenere e incollare i collegamenti completi ogni volta. Digiti gli ID nel documento e li definisci in un blocco alla fine del documento.

È per uso o per esportazione?
Malabarba,

L'uso è per le esportazioni. Lo scopo è quello di avere un posto per modificare il collegamento e usare semplicemente l'ID in cui voglio posizionare i collegamenti ipertestuali. Per ora ricorro all'utilizzo dei MACRO in modalità org che si espandono a [[Link][Link Name]]. Ma l'approccio ID come in Markdown sarà più pulito.
Kaushal Modi,

Mi sembra molto una nota a piè di pagina. Alcune altre possibilità che potrebbero funzionare sono i target radio ( orgmode.org/manual/Radio-targets.html#Radio-targets ) o i collegamenti interni a <<targets>> orgmode.org/manual/Internal-links.html#Internal-links .
John Kitchin,

Risposte:


20

Questa pagina ha una bella descrizione su come estendere i collegamenti in modalità org. Non affronta la tua specifica preoccupazione, ma spiega il principio di base.
Supponiamo di voler definire i tuoi collegamenti in questo modo, ovunque nel buffer,

#+LINK-ID: wiki http://www.emacswiki.org

e invocato in questo modo

[[lid:wiki][You should check out the wiki]]

Innanzitutto, devi dire all'organizzazione come seguire e come esportare il tuo link.

(org-add-link-type "lid" 'endless/open-id-link 'endless/export-id-link)

(defun endless/open-id-link (path)
  "Follow an ID link to PATH."
  (browse-url (endless/find-id-link path)))

(defun endless/export-id-link (path desc format)
  "Create the export version of an ID link specified by PATH and DESC.
FORMATs understood are 'latex and 'html."
  (setq path (endless/find-id-link path))
  (cond
   ((eq format 'html) (format "<a href=\"%s\">%s</a>" path desc))
   ((eq format 'latex) (format "\\href{%s}{%s}" path desc))
   (t desc)))

Quindi, non vi resta che decidere come si desidera gestire questo link.

(defun endless/find-id-link (id &optional noerror)
  "Find \"#+LINK-ID: ID\" in current buffer and return the link.
Unless NOERROR is non-nil, throw an error if link not found."
  (save-excursion
    (goto-char (point-min))
    (let ((case-fold-search t))
      (when (search-forward-regexp 
             (format "^#\\+LINK-ID: \\b%s\\b +\\(.*\\) *$" id)
             nil noerror)
        (match-string-no-properties 1)))))

Non sono sicuro di quale sarebbe il titolo che hai citato in. Se mi fai sapere che posso aggiungerlo.
Malabarba,

1
Ho notato che per gli esempi di funzioni di esportazione esistenti: docview, bbdb, insieme alla org-add-link-typefunzione, lo fanno anche (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Kaushal Modi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.