Comment copier des liens HORS du mode org?

16

Il y a beaucoup de documentation sur l'insertion ou le stockage de liens en mode organisation, mais apparemment aucun sur leur copie dans des tampons dans d'autres formats.

Comment copiez-vous l'URL d'un lien en mode organisation d'un fichier org dans le presse-papiers / kill ring avec le moins de touches possible? J'ai essayé org-store-linket org-insert-link, mais il vide toute la syntaxe du mode org dans tout autre tampon que vous avez ouvert.

Exemple: tampon 1 en mode org, tampon 2 Markdown.

  1. Visitez le tampon 1, C-srecherchez le lien.
  2. La magie opère , l'URL est dans le presse-papiers
  3. Visitez le tampon 2. C-ypour extraire l'URL dans le tampon.
étoile brillante
la source

Réponses:

10

Voici une façon de réaliser ce que vous voulez, en utilisant les propriétés du texte.

Vous pouvez accéder au lien dans le fichier org que vous souhaitez copier et exécuter la commande my-org-retrieve-url-from-pointqui copiera le lien org au point actuel dans le presse-papiers. Avant d'ajouter le lien au presse-papiers, un gestionnaire-yank ( my-yank-org-link) est enregistré qui est appelé en collant le lien. Le gestionnaire yank vérifie si le tampon actuel est en mode org ou en mode dérivé du mode org, si c'est le cas, il insère le lien tel qu'il est (un lien org), sinon il extrait l'URL du lien et l'insère

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

Voici une version DWIM de kill-ring-save, qui utilise kill-ring-savesi la région est active ou copie le lien organisationnel au point

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

Remarque : Cela ne fait actuellement aucune distinction entre un lien URL et des liens internes.

Iqbal Ansari
la source
1
J'ai supprimé le if, car lors de l'utilisation de l'interface graphique Emacs, il copiait toujours l'intégralité du lien ( [[a]][b]]) au lieu de la partie URL ( a)
Nitz
3

Autre possibilité: avec le curseur sur le lien, exécutez org-insert-link. C'est normalement C-c C-l. Avec le mode diabolique (ou peut-être juste avec Spacemacs) , i lfonctionne également. Cela entre dans le flux d'insertion de lien avec la valeur de lien préremplie. Vous pouvez alors le faire M-x evil-yank-linependant que le mini-tampon a le contenu de l'adresse du lien.

mowwwalker
la source
Cette méthode est essentiellement ce que j'utilise, en particulier je vais C-c C-l M-S-<backspace> C-g.
Omar
Cela fonctionne mais pas si efficace.
itirazimvar
2

Tard dans la soirée (et mon premier post ici, soit dit en passant), mais je pense que cela pourrait être utile à d'autres aussi. La réponse acceptée fonctionne parfaitement lorsque vous tirez à nouveau dans emacs, mais le texte réel copié dans le presse-papiers du système est toujours la syntaxe complète en mode org. Je voulais quelque chose qui puisse copier un lien hors du mode org et d' emacs. Cas d'utilisation: j'ai fait beaucoup de développement Web récemment et j'utilise souvent plusieurs navigateurs. Un seul d'entre eux peut être la valeur par défaut pour le C-c c-oraccourci, et parfois je veux ouvrir un lien dans un lien non par défaut. En outre, coller des liens vers des collègues sur Slack, et cetera.

Pour faire court, j'ai trouvé cette solution en mélangeant et en faisant correspondre la réponse acceptée :

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

Cela copiera dans le presse-papiers le lien uniquement une partie d'un lien en mode organisation.

En fait, j'ai intégré à la fois la solution de la réponse précédente et cette nouvelle fonction à l'intérieur de ma .emacs, chacune avec son propre raccourci clavier. Code complet ici:

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

J'ai choisi les raccourcis clavier C-c eet C-c ccar ils sont de bons mnémoniques pour export et copy et ils ne sont pas utilisés en mode org. Ils cadrent également en quelque sorte avec le raccourci clavier existant C-c C-opour les oliens de pening .

ggrocca
la source