¿Cómo copiar enlaces fuera del modo org?

16

Hay mucha documentación sobre cómo insertar o almacenar enlaces de modo de organización, pero aparentemente ninguno sobre copiarlos en buffers en otros formatos.

¿Cómo se copia la URL de un enlace de modo de organización desde un archivo de organización al portapapeles / anillo de interrupción con la menor cantidad de pulsaciones posible? Lo intenté org-store-linky org-insert-link, pero volca toda la sintaxis del modo org en cualquier otro búfer que tenga abierto.

Ejemplo: buffer 1 org-mode, buffer 2 Markdown.

  1. Visite el búfer 1, C-sbusque el enlace.
  2. La magia sucede , la URL está en el portapapeles
  3. Visite el búfer 2. C-ypara arrastrar la URL al búfer.
Lucero
fuente

Respuestas:

10

Aquí hay una forma de lograr lo que desea, utilizando las propiedades de texto.

Puede ir al enlace en el archivo de organización que desea copiar y ejecutar el comando, my-org-retrieve-url-from-pointesto copiará el enlace de organización en el punto actual al portapapeles. Antes de agregar el enlace al portapapeles, my-yank-org-linkse registra un yank-handler ( ) que se llama al pegar el enlace. El manejador de tirones comprueba si el búfer actual está en modo org o en un modo derivado del modo org, si es así inserta el enlace tal como está (un enlace org), de lo contrario extrae la URL del enlace y lo inserta

(defun my-yank-org-link (text)
  (if (derived-mode-p 'org-mode)
      (insert text)
    (string-match org-bracket-link-regexp text)
    (insert (substring text (match-beginning 1) (match-end 1)))))

(defun my-org-retrieve-url-from-point ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 ;; org-context seems to return nil if the current element
                 ;; starts at buffer-start or ends at buffer-end
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (add-text-properties 0 (length text) '(yank-handler (my-yank-org-link)) text)
      (kill-new text))))

Aquí hay una versión DWIM de kill-ring-save, que usa kill-ring-savesi la región está activa o copia el enlace de organización en el punto

(defun my-smarter-kill-ring-save ()
  (interactive)
  (if (region-active-p)
      (call-interactively #'kill-ring-save)
    (when (eq major-mode 'org-mode)
      (call-interactively #'my-org-retrieve-url-from-point))))

Nota : Esto no distingue actualmente entre un enlace URL y enlaces internos.

Iqbal Ansari
fuente
1
Eliminé el if, porque cuando usaba la GUI Emacs siempre copiaba todo el enlace ( [[a]][b]]) en lugar de la parte URL ( a)
Nitz
2

Otra posibilidad: con el cursor en el enlace, ejecutar org-insert-link. Esto es normalmente C-c C-l. Con el modo malvado (o tal vez solo con Spacemacs) , i ltambién funciona. Esto ingresa el flujo de inserción del enlace con el valor del enlace previamente completado. Luego puede hacerlo M-x evil-yank-linemientras el minibúfer tiene el contenido de la dirección del enlace.

mowwwalker
fuente
Este método es básicamente lo que uso, específicamente voy C-c C-l M-S-<backspace> C-g.
Omar
Funciona pero no es tan eficiente.
itirazimvar
2

Tarde a la fiesta (y mi primera publicación aquí, por cierto), pero creo que esto también podría ser útil para otros. La respuesta aceptada funciona perfectamente cuando se tira de nuevo dentro de emacs, pero el texto real copiado al portapapeles del sistema sigue siendo la sintaxis completa del modo org. Quería algo que pudiera copiar un enlace tanto del modo org como de emacs. Casos de uso: últimamente he estado haciendo un montón de desarrollo web, y a menudo uso varios navegadores. Solo uno de ellos puede ser el predeterminado para el C-c c-oacceso directo, y a veces quiero abrir un enlace en uno no predeterminado. Además, pegar enlaces a compañeros de trabajo en Slack, etc.

En pocas palabras, he encontrado esta solución mezclando y combinando la respuesta aceptada :

(defun my-org-export-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (string-match org-bracket-link-regexp text)
      (kill-new (substring text (match-beginning 1) (match-end 1))))))

Esto copiará en el portapapeles el enlace solo como parte de un enlace de modo org.

De hecho, he integrado tanto la solución de la respuesta anterior como esta nueva función dentro de mi .emacs, cada una con su propia combinación de teclas. Código completo aquí:

(defun my-yank-org-link (text)
  (if (derived-mode-p 'org-mode)
      (insert text)
    (string-match org-bracket-link-regexp text)
    (insert (substring text (match-beginning 1) (match-end 1)))))

(defun my-org-copy-smart-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (add-text-properties 0 (length text) '(yank-handler (my-yank-org-link)) text)
      (kill-new text))))
(global-set-key (kbd "C-c c") 'my-org-copy-smart-url)

(defun my-org-export-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (string-match org-bracket-link-regexp text)
      (kill-new (substring text (match-beginning 1) (match-end 1))))))
(global-set-key (kbd "C-c e") 'my-org-export-url)

Elegí las combinaciones de teclas C-c ey C-c cporque son buenas mnemotecnias para export y copy y no se usan en modo org. También encajan de alguna manera con la combinación C-c C-ode teclas ya existente para los oenlaces de escritura .

ggrocca
fuente