dalam mode org, bagaimana cara menghapus tautan?

11

Bagaimana cara menghapus hyperlink yang ada tanpa harus menyeberang dan secara manual menghapus banyak tanda kurung? Ketika saya mencoba org-insert-linkdan hanya menghapus tautan yang ada, saya mengerti Lisp error: (error "Empty link").

Saya ingin menghapus tautan dan menyimpan teksnya (yaitu uraian).

pijar
sumber

Jawaban:

7

Fungsi elisp berikut akan mengambil tautan di sekitar titik saat ini seperti yang dikenali oleh org-bracket-link-regexp, jadi salah satu [[Link][Description]]atau [[Link]], dan menggantinya dengan Descriptiondalam kasus pertama atau Linkdalam kasus kedua.

(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
sumber
Itu solusi kompak yang sangat rapi! Saya memperbarui jawaban saya untuk mendukung [[LINK]]tautan format org juga. Saya belajar tentang match-beginningdan match-enddari jawaban Anda.
Kaushal Modi
5

Saya mencoba menambahkan ini ke jawaban dari @Andrew, tapi itu terlalu lama untuk komentar ...

Saya sangat menyukai solusinya, kecuali bahwa itu memindahkan kursor. (Secara teknis saya kira itu memindahkan intinya. Lagi pula ...) Untungnya, mudah untuk menambahkan save-excursionuntuk menghindari itu:

(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
sumber
4

Panggil perintah ini ketika titik di mana saja setelah [[tanda kurung pertama dari tautan-org (atau di mana saja di / setelah tautan-tautan-hyper-link).

Tautan org akan dihapus jika formatnya [[LINK][DESCRIPTION]]atau [[LINK]]dalam org-modebuffer; kalau tidak, tidak akan terjadi apa-apa.

Demi keamanan, LINK yang dibuang dari tautan-org disimpan ke kill-ringjika diperlukan untuk menggunakan tautan itu di tempat lain.

(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
sumber
1

Cara tercepat adalah menempatkan kursor di depan tautan, lalu ketik C-M-space( mark-sexp), yang akan menandai seluruh tautan. Kemudian hapus dengan mengetikkan backspace (jika Anda gunakan delete-selection-mode) atau C-w.

Harald Hanche-Olsen
sumber
1
Ini tampaknya menghapus seluruh tautan, tetapi saya ingin menghapus tautan dan menyimpan teksnya (yaitu uraian).
incandescentman
1
Maaf, saya kira saya salah mengerti pertanyaan Anda.
Harald Hanche-Olsen
1
Bagi para pemilih di luar sana: Pertanyaan itu ambigu ketika saya menjawabnya. Itu telah diedit sejak saat itu, menghilangkan ambiguitas. Saya tetap membiarkan jawabannya, karena sepertinya masih cara termudah untuk menghapus seluruh tautan, deskripsi dan semua.
Harald Hanche-Olsen
1

Ada solusi yang menghindari penggunaan penguraian khusus dengan regex dan langsung menggunakan org-elementAPI bawaan:

(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)))))))
pengguna22270
sumber
Bisakah Anda menambahkan cara mengikat perintah Anda ke kunci sehingga cukup untuk pemula?
DoMiNeLa10
Ini tampaknya menghapus spasi putih setelah tautan. Adakah yang tahu bagaimana cara menyimpannya?
Timm
0

Makro yang sangat cepat dan sangat kotor ini akan menjadi salah satu cara, bukan cara terbaik:

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