org modunda, bir bağlantı nasıl kaldırılır?


11

Bir grup parantez içine girip el ile silmeye gerek kalmadan mevcut bir köprüyü nasıl kaldırabilirim? org-insert-linkVarolan bağlantıyı silmeye çalıştığımda , alıyorum Lisp error: (error "Empty link").

Bağlantıyı kaldırmak ve metni (yani açıklama) korumak istiyorum.

Yanıtlar:


7

Aşağıdaki elisp işlevi, geçerli nokta etrafında veya tarafından tanındığı şekilde bir bağlantı alır ve org-bracket-link-regexpya ilk durumda ya da ikinci durumda değiştirir.[[Link][Description]][[Link]]DescriptionLink

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

Bu çok düzgün bir kompakt çözüm! [[LINK]]Yanıtımı biçim org bağlantılarını da destekleyecek şekilde güncelledim . Cevabınızı match-beginningve match-endcevabınızı öğrendim .
Kaushal Modi

5

Bunu @Andrew'ın cevabına eklemeye çalıştım, ancak yorum yapmak çok uzun sürdü ...

Onun çözümünü gerçekten sevdim, ancak imleci hareket ettirmesi dışında. (Teknik olarak bu noktayı değiştirdi sanırım. Her neyse ...) Neyse ki, bundan save-excursionkaçınmak için eklemek kolay oldu :

(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

Nokta [[bir org-linkinin ilk köşeli parantezlerinden sonra (veya hiper-bağlı org-link üzerinde / sonrasında) herhangi bir yerde olduğunda bu komutu çağırın .

O formatta olduğunda bir org bağlantısı silinecek [[LINK][DESCRIPTION]]ya [[LINK]]bir in org-modetampon; yoksa hiçbir şey olmayacak.

Güvenlik için, org-link'ten atılan LINK, kill-ringbu bağlantıyı başka bir yerde kullanmanız gerektiğinde kaydedilir .

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

2

Normal ifadelerle özel ayrıştırmayı kullanmaktan kaçınan ve doğrudan yerleşik org-elementAPI'yi kullanan bir çözüm var :

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

Acemiler için yeterli olması için komutunuzu bir tuşa nasıl bağlayacağınızı ekleyebilir misiniz?
DoMiNeLa10

Bu, bağlantıdan sonra beyaz boşlukları siliyor gibi görünüyor. Onları nasıl tutacağına dair bir fikrin var mı?
Timm

1

En hızlısı, imleci bağlantının önüne yerleştirmek olabilir, ardından tüm bağlantının işaretleneceği C-M-space( mark-sexp) yazın . Sonra bir geri tuşu yazarak silin (kullanıyorsanız delete-selection-mode) veya C-w.


1
Bu, tüm bağlantıyı silmek gibi görünüyor, ancak bağlantıyı kaldırmak ve metni (yani açıklama) korumak istiyorum.
incandescentman

1
Üzgünüm, sanırım sorunuzu yanlış anladım.
Harald Hanche-Olsen

1
Oradaki downvoters için: Soru cevap verdiğimde belirsizdi. O zamandan beri belirsizliği ortadan kaldırarak düzenlenmiştir. Yine de, tüm bağlantıyı, açıklamayı ve hepsini silmenin en kolay yolu gibi göründüğü için, yanıtı bırakıyorum.
Harald Hanche-Olsen

0

Bu çok hızlı ve çok kirli makro en iyi yol değil, bir yol olacaktır:

(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])
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.