¿Cómo implementar ID de enlace de estilo Markdown en modo org?

22

A veces, necesito usar el mismo enlace en varios lugares en un documento largo.

Para esos casos, sería útil tener identificadores de enlace como en Markdown. Desde markdown sintaxis ref ,

Opcionalmente, puede usar un espacio para separar los conjuntos de corchetes:

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

Luego, en cualquier parte del documento, define su etiqueta de enlace de esta manera, en una línea por sí misma:

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

Creí que la abreviatura de enlace en modo org funcionaría de la misma manera (sin etiquetas) pero no lo hace.

El propósito de los ID de enlace es tener un lugar central para editar los enlaces. Una buena ubicación sería al final del documento. Los enlaces completos se definen en la ID, pero solo la ID se usa en otra parte del documento donde necesitamos colocar los hipervínculos. Al exportar, los ID se reemplazan con los hipervínculos reales.

Los beneficios de este enfoque son,

  • Cuando los enlaces cambian, solo tenemos que modificar las definiciones de ID. Al exportar, los hipervínculos en el documento se actualizarán a eso.
  • Inserción de hipervínculos más rápida al escribir el documento, ya que no es necesario obtener y pegar los enlaces completos cada vez. Escribe los ID en el documento y los define en un bloque al final del documento.
Kaushal Modi
fuente
¿Es para uso o para exportación?
Malabarba
El uso es para exportaciones. El objetivo es tener un lugar para editar el enlace y simplemente usar la ID donde quiero colocar los hipervínculos. Por ahora, solo uso MACRO en modo organización que se expanden a [[Link][Link Name]]. Pero el enfoque de identificación como en Markdown será más limpio.
Kaushal Modi
Eso se parece mucho a una nota al pie para mí. Algunas otras posibilidades que podrían funcionar son los objetivos de radio ( orgmode.org/manual/Radio-targets.html#Radio-targets ) o enlaces internos a <<targets>> orgmode.org/manual/Internal-links.html#Internal-links. .
John Kitchin

Respuestas:

20

Esta página tiene una buena descripción sobre cómo extender los enlaces del modo org. No aborda su preocupación específica, pero explica el principio básico.
Digamos que queremos que sus enlaces se definan así, en cualquier parte del búfer,

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

e invocado así

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

Primero, debe decirle a org cómo seguir y cómo exportar su enlace.

(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)))

A continuación, sólo tiene que decidir cómo se quiere manejar este enlace.

(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
fuente
No estoy seguro de para qué se usaría el título que mencionaste en el. Si me avisas puedo agregarlo.
Malabarba
1
Noté que para los ejemplos de funciones de exportación existentes: docview, bbdb, a lo largo de la org-add-link-typellamada a la función, también lo hacen (add-hook 'org-store-link-functions 'org-LINKTYPE-store-link).
Kaushal Modi