Wie entferne ich im Org-Modus einen Link?

11

Wie entferne ich einen vorhandenen Hyperlink, ohne ein paar Klammern einblenden und manuell löschen zu müssen? Wenn ich versuche, org-insert-linkden vorhandenen Link zu löschen, erhalte ich Lisp error: (error "Empty link").

Ich möchte den Link entfernen und den Text (dh die Beschreibung) beibehalten.

Glühlampenmann
quelle

Antworten:

7

Die folgende Elisp-Funktion nimmt eine Verknüpfung um den aktuellen Punkt, wie von org-bracket-link-regexpentweder [[Link][Description]]oder erkannt [[Link]], und ersetzt sie Descriptionim ersten Fall oder Linkim zweiten Fall durch.

(defun afs/org-replace-link-by-link-description ()
    "Replace an org link by its description or if empty its address"
  (interactive)
  (if (org-in-regexp org-bracket-link-regexp 1)
      (let ((remove (list (match-beginning 0) (match-end 0)))
        (description (if (match-end 3) 
                 (org-match-string-no-properties 3)
                 (org-match-string-no-properties 1))))
    (apply 'delete-region remove)
    (insert description))))
Andrew Swann
quelle
Das ist eine sehr ordentliche kompakte Lösung! Ich habe meine Antwort aktualisiert, um auch [[LINK]]Format-Organisationslinks zu unterstützen. Ich habe von match-beginningund match-endaus Ihrer Antwort erfahren .
Kaushal Modi
4

Ich habe versucht, dies der Antwort von @Andrew hinzuzufügen, aber es war zu lang für einen Kommentar ...

Ich mochte seine Lösung wirklich, außer dass sie den Cursor bewegte. (Technisch gesehen hat es den Punkt bewegt. Wie auch immer ...) Glücklicherweise war es einfach hinzuzufügen save-excursion, um dies zu vermeiden:

(defun afs/org-replace-link-by-link-description ()
  "Replace an org link by its description or if empty its address"
  (interactive)
  (if (org-in-regexp org-bracket-link-regexp 1)
      (save-excursion
        (let ((remove (list (match-beginning 0) (match-end 0)))
              (description (if (match-end 3) 
                               (org-match-string-no-properties 3)
                             (org-match-string-no-properties 1))))
          (apply 'delete-region remove)
          (insert description)))))
Chris
quelle
3

Rufen Sie diesen Befehl auf, wenn der Punkt irgendwo nach den ersten [[Klammern eines Organisationslinks liegt (oder irgendwo auf / nach einem Hyperlink-Organisationslink).

Ein Organisationslink wird gelöscht, wenn er das Format [[LINK][DESCRIPTION]]oder [[LINK]]einen org-modePuffer hat. sonst wird nichts passieren.

Aus Sicherheitsgründen wird der verworfene LINK von org-link in gespeichert, kill-ringfalls die Notwendigkeit besteht, diesen Link an anderer Stelle zu verwenden.

(defun my/org-delete-link ()
  "Replace an org link of the format [[LINK][DESCRIPTION]] with DESCRIPTION.
If the link is of the format [[LINK]], delete the whole org link.

In both the cases, save the LINK to the kill-ring.

Execute this command while the point is on or after the hyper-linked org link."
  (interactive)
  (when (derived-mode-p 'org-mode)
    (let ((search-invisible t) start end)
      (save-excursion
        (when (re-search-backward "\\[\\[" nil :noerror)
          (when (re-search-forward "\\[\\[\\(.*?\\)\\(\\]\\[.*?\\)*\\]\\]" nil :noerror)
            (setq start (match-beginning 0))
            (setq end   (match-end 0))
            (kill-new (match-string-no-properties 1)) ; Save the link to kill-ring
            (replace-regexp "\\[\\[.*?\\(\\]\\[\\(.*?\\)\\)*\\]\\]" "\\2" nil start end)))))))
Kaushal Modi
quelle
1

Am schnellsten können Sie den Cursor vor den Link setzen und dann C-M-space( mark-sexp) eingeben, um den gesamten Link zu markieren. Löschen Sie es dann, indem Sie eine Rücktaste (falls verwendet delete-selection-mode) oder eingeben C-w.

Harald Hanche-Olsen
quelle
1
Dies scheint den gesamten Link zu löschen, aber ich möchte den Link entfernen und den Text (dh die Beschreibung) beibehalten.
Glühlampen
1
Entschuldigung, ich glaube, ich habe Ihre Frage falsch verstanden.
Harald Hanche-Olsen
1
An die Downvoter da draußen: Die Frage war nicht eindeutig, als ich sie beantwortete. Es wurde seitdem bearbeitet, um die Mehrdeutigkeit zu beseitigen. Ich lasse die Antwort jedoch offen, da es immer noch der einfachste Weg ist, den gesamten Link, die Beschreibung und alles zu löschen.
Harald Hanche-Olsen
0

Dieses sehr schnelle und sehr schmutzige Makro wäre eine Möglichkeit, nicht die beste:

(fset 'my/org-remove-link
   [?\M-a delete delete ?\M-x ?z ?a ?p ?- ?t ?o ?- ?c ?h ?a ?r return ?\[ ?\C-e backspace backspace ?\C-x])
Brian Z.
quelle
0

Es gibt eine Lösung, die die Verwendung von benutzerdefiniertem Parsen mit regulären Ausdrücken vermeidet und direkt die integrierte org-elementAPI verwendet:

(defun org-link-delete-link ()
  "Remove the link part of an org-mode link at point and keep
only the description"
  (interactive)
  (let ((elem (org-element-context)))
    (if (eq (car elem) 'link)
        (let* ((content-begin (org-element-property :contents-begin elem))
               (content-end  (org-element-property :contents-end elem))
               (link-begin (org-element-property :begin elem))
               (link-end (org-element-property :end elem)))
          (if (and content-begin content-end)
              (let ((content (buffer-substring-no-properties content-begin content-end)))
                (delete-region link-begin link-end)
                (insert content)))))))
user22270
quelle
Können Sie hinzufügen, wie Sie Ihren Befehl an einen Schlüssel binden, damit er für Anfänger ausreicht?
DoMiNeLa10