Wie kopiere ich Links aus dem org-Modus?

15

Es gibt eine Menge Dokumentation zum Einfügen oder Speichern von Verknüpfungen im Organisationsmodus, aber anscheinend keine zum Kopieren in Puffer in anderen Formaten.

Wie kopiert man die URL eines Org-Mode-Links aus einer Org-Datei mit möglichst wenigen Tastenanschlägen in die Zwischenablage / den Kill-Ring? Ich habe versucht org-store-linkund org-insert-link, aber es speichert die gesamte Syntax des Organisationsmodus in einem beliebigen anderen Puffer, den Sie geöffnet haben.

Beispiel: Buffer 1 Org-Mode, Buffer 2 Markdown.

  1. Besuchen Sie Puffer 1 und C-ssuchen Sie nach einem Link.
  2. Magie passiert , URL ist in der Zwischenablage
  3. Besuchen Sie den Puffer 2. C-y, um die URL in den Puffer zu ziehen.
heller Stern
quelle

Antworten:

10

Hier ist eine Möglichkeit, mithilfe von Texteigenschaften die gewünschten Ergebnisse zu erzielen.

Sie können zu dem Link in der zu kopierenden Organisationsdatei gehen und den Befehl ausführen, mit dem my-org-retrieve-url-from-pointder Organisationslink an der aktuellen Stelle in die Zwischenablage kopiert wird. Vor dem Hinzufügen des Links zur Zwischenablage wird ein yank-handler ( my-yank-org-link) registriert, der beim Einfügen des Links aufgerufen wird. Der Yank-Handler prüft, ob sich der aktuelle Puffer im Organisationsmodus befindet oder in einem vom Organisationsmodus abgeleiteten Modus. In diesem Fall wird der Link unverändert eingefügt (ein Organisationslink). Andernfalls wird die URL aus dem Link extrahiert und eingefügt

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

Hier ist eine DWIM-Version von kill-ring-save, die verwendet, kill-ring-savewenn region aktiv ist oder den org-link an point kopiert

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

Hinweis : Dies unterscheidet derzeit nicht zwischen einem URL-Link und internen Links.

Iqbal Ansari
quelle
1
Ich habe das entfernt if, weil bei der Verwendung der GUI Emacs immer der gesamte Link ( [[a]][b]]) anstelle des URL-Teils ( a) kopiert wurde
Nitz
2

Spät zur Party (und übrigens zu meinem ersten Beitrag hier), aber ich denke, das könnte auch für andere nützlich sein. Die akzeptierte Antwort funktioniert einwandfrei, wenn Sie wieder in Emacs reißen, aber der tatsächliche Text, der in die System-Zwischenablage kopiert wird, hat immer noch die vollständige Syntax für den Organisationsmodus. Ich wollte etwas, das einen Link sowohl aus dem Org-Modus als auch aus dem Emacs kopieren kann . Anwendungsfälle: Ich habe in letzter Zeit viel Web-Entwicklung betrieben und benutze oft mehrere Browser. Nur einer von ihnen kann der Standard für die C-c c-oVerknüpfung sein, und manchmal möchte ich einen Link in einem nicht standardmäßigen öffnen. Auch das Einfügen von Links zu Kollegen auf Slack, und so weiter.

Um es kurz zu machen, ich bin auf diese Lösung gekommen, indem ich die akzeptierte Antwort gemischt und angepasst habe :

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

Dies kopiert den Link, der nur Teil eines Org-Modus-Links ist, in die Zwischenablage.

Tatsächlich habe ich sowohl die Lösung der vorherigen Antwort als auch diese neue Funktion in meine integriert .emacs, jede mit einer eigenen Tastenkombination. Vollständiger Code hier:

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

Ich habe die gewählte C-c eund C-c ckeybindings , weil sie gute Mnemoniken sind export und copieren und sie sind nicht verwendete in org-Modus. Sie passen auch irgendwie zu der bereits vorhandenen Tastenkombination C-c C-ofür das oSchreiben von Links.

ggrocca
quelle
1

Eine andere Möglichkeit: Führen Sie mit dem Cursor auf dem Link aus org-insert-link. Das ist normalerweise so C-c C-l. Mit bösen Modus (oder vielleicht nur mit Spacemacs) , i lfunktioniert das auch. Dadurch wird der Link-Einfügungsfluss mit dem vorab ausgefüllten Link-Wert eingegeben. M-x evil-yank-lineDies können Sie tun, während der Minipuffer den Inhalt der Linkadresse enthält.

mowwwalker
quelle
Diese Methode verwende ich im Grunde genommen, speziell wenn ich gehe C-c C-l M-S-<backspace> C-g.
Omar
Es funktioniert aber nicht so effizient.
Itirazimvar