in modalità org, come rimuovere un collegamento?


11

Come rimuovo un collegamento ipertestuale esistente senza dover guadare ed eliminare manualmente un gruppo di parentesi? Quando provo a org-insert-linkeliminare il collegamento esistente, ottengo Lisp error: (error "Empty link").

Voglio rimuovere il collegamento e preservare il testo (ovvero la descrizione).

Risposte:


7

La seguente funzione elisp prenderà un collegamento attorno al punto corrente come riconosciuto da org-bracket-link-regexp, quindi o [[Link][Description]]o [[Link]], e lo sostituirà Descriptionnel primo caso o Linknel secondo caso.

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

Questa è una soluzione compatta molto ordinata! Ho aggiornato la mia risposta per supportare [[LINK]]anche i collegamenti organizzativi in ​​formato. Ho imparato a conoscere match-beginninge match-enddalla tua risposta.
Kaushal Modi,

5

Ho provato ad aggiungere questo alla risposta di @Andrew, ma era troppo lungo per un commento ...

Mi è piaciuta molto la sua soluzione, tranne per il fatto che ha spostato il cursore. (Tecnicamente immagino che abbia spostato il punto. Comunque ...) Fortunatamente, è stato facile aggiungere save-excursionper evitare che:

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

4

Chiamare questo comando quando il punto si trova in un punto qualsiasi dopo le prime [[parentesi di un collegamento org (o in qualsiasi punto / dopo un collegamento org ipertestuale).

Un collegamento organizzativo verrà eliminato se è nel formato [[LINK][DESCRIPTION]]o [[LINK]]in un org-modebuffer; altrimenti non succederà nulla.

Per sicurezza, il LINK scartato da org-link viene salvato kill-ringnel caso in cui si presenti la necessità di utilizzare quel link altrove.

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

1

Il più veloce potrebbe essere quello di posizionare il cursore prima del collegamento, quindi digitare C-M-space( mark-sexp), che segnerà l'intero collegamento. Quindi eliminalo digitando un backspace (se lo usi delete-selection-mode) o C-w.


1
Questo sembra eliminare l'intero collegamento, ma voglio rimuovere il collegamento e preservare il testo (ovvero la descrizione).
incandescentman

1
Scusa, immagino di aver frainteso la tua domanda.
Harald Hanche-Olsen,

1
Per i votanti là fuori: la domanda era ambigua quando ho risposto. Da allora è stato modificato, rimuovendo l'ambiguità. Lascio comunque la risposta, dato che sembra ancora il modo più semplice per eliminare l'intero collegamento, la descrizione e tutto il resto.
Harald Hanche-Olsen,

1

Esiste una soluzione che evita l'utilizzo dell'analisi personalizzata con regex e utilizza direttamente l' org-elementAPI integrata :

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

Puoi aggiungere come associare il tuo comando a una chiave in modo che sia sufficiente per i principianti?
DoMiNeLa10

Questo sembra eliminare gli spazi bianchi dopo il collegamento. Qualche idea su come conservarli?
Timm

0

Questa macro molto veloce e molto sporca sarebbe un modo, non il modo migliore:

(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])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.