Como implementar IDs de link no estilo Markdown no modo organizacional?

22

Às vezes, preciso usar o mesmo link em vários locais em um documento longo.

Para esses casos, seria útil ter IDs de link como na remarcação. Na sintaxe de remarcação ref ,

Opcionalmente, você pode usar um espaço para separar os conjuntos de colchetes:

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

Então, em qualquer lugar do documento, você define o rótulo do seu link assim, em uma linha por si só:

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

Eu acreditava que a abreviação de link no modo organizacional funcionaria da mesma maneira (sem tags), mas não.

O objetivo dos IDs de link é ter um local central para editar os links. Uma boa localização seria no final do documento. Os links completos são definidos no ID, mas apenas o ID é usado em outras partes do documento onde precisamos colocar os hiperlinks. Ao exportar, os IDs são substituídos pelos hiperlinks reais.

Os benefícios dessa abordagem são,

  • Quando os links mudam, precisamos apenas modificar as definições de ID. Na exportação, os hiperlinks no documento serão atualizados para isso.
  • Inserção mais rápida de hiperlinks ao escrever o documento, pois não é necessário obter e colar os links completos todas as vezes. Você digita os IDs no documento e os define em um bloco no final do documento.
Kaushal Modi
fonte
É para uso ou para exportação?
Malabarba
O uso é para exportações. O objetivo é ter um lugar para editar o link e apenas usar o ID onde eu quero colocar os hiperlinks. Por enquanto, recorro apenas ao uso de MACROs no modo organizacional que se expandem para [[Link][Link Name]]. Mas a abordagem de identificação como no Markdown será mais limpa.
precisa
Isso me parece muito uma nota de rodapé. Algumas outras possibilidades que podem funcionar são destinos de rádio ( orgmode.org/manual/Radio-targets.html#Radio-targets ) ou links internos para <<targets>> orgmode.org/manual/Internal-links.html#Internal-links .
John Kitchin

Respostas:

20

Esta página possui uma boa descrição de como estender os links do modo organizacional. Não aborda sua preocupação específica, mas explica o princípio básico.
Digamos que queremos que seus links sejam definidos assim, em qualquer lugar do buffer,

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

e invocado assim

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

Primeiro, você precisa informar à organização como seguir e como exportar seu 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)))

Então, você só precisa decidir como você deseja lidar com este 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)))))
Malabarba
fonte
Não tenho certeza para o que o título que você mencionou no seria usado. Se você deixe-me saber que posso adicioná-lo no.
Malabarba
1
Percebo que, para os exemplos de funções de exportação existentes: docview, bbdb, ao longo da org-add-link-typechamada de função, eles também fazem (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Kaushal Modi