org- मोड में, कैसे एक लिंक को हटाने के लिए?


11

मैं एक हाइपरलिंक को बिना मिटाए और मैन्युअल रूप से कोष्ठक के एक गुच्छा को कैसे हटा सकता हूं? जब मैं कोशिश करता हूं org-insert-linkऔर मौजूदा लिंक को हटा देता हूं, तो मुझे मिल जाता है Lisp error: (error "Empty link")

मैं लिंक को हटाना चाहता हूं और पाठ (यानी विवरण) को संरक्षित करना चाहता हूं।

जवाबों:


7

के रूप में द्वारा मान्यता प्राप्त निम्नलिखित elisp समारोह वर्तमान बिंदु के आसपास एक लिंक ले जाएगा org-bracket-link-regexp, तो या तो [[Link][Description]]या [[Link]], और द्वारा इसे बदलना Descriptionपहले मामले में या Linkदूसरे मामले में।

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

यह एक बहुत साफ कॉम्पैक्ट समाधान है! मैंने अपने उत्तर को अपडेट करने के लिए [[LINK]]प्रारूप org लिंक का भी समर्थन किया । मैंने आपके उत्तर के बारे में match-beginningऔर उससे सीखा match-end
कौशल मोदी

5

मैंने @ उत्तर से इसे जोड़ने की कोशिश की, लेकिन यह एक टिप्पणी के लिए बहुत लंबा था ...

मुझे वास्तव में उसका समाधान पसंद आया, सिवाय इसके कि यह कर्सर ले गया। (तकनीकी रूप से मुझे लगता है कि यह बात आगे बढ़ गई। वैसे भी ...) सौभाग्य से, इससे save-excursionबचने के लिए जोड़ना आसान था :

(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

जब [[ओआरजी-लिंक के पहले कोष्ठक (या कहीं पर / हाइपर-लिंक्ड ऑर्ग-लिंक के बाद) इस बिंदु को कॉल करें ।

यदि यह प्रारूप का है [[LINK][DESCRIPTION]]या बफर [[LINK]]में है तो एक ऑर्गन लिंक हटा दिया जाएगा org-mode; और कुछ नहीं होगा।

सुरक्षा के लिए, मूल-लिंक से हटाए गए लिंक को kill-ringउस घटना में सहेजा जाता है , जब उस लिंक का उपयोग कहीं और करने की आवश्यकता होती है।

(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

एक समाधान है जो रीजैक्स के साथ कस्टम पार्सिंग का उपयोग करने से बचता है और सीधे अंतर्निहित org-elementएपीआई का उपयोग करता है:

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

क्या आप जोड़ सकते हैं कि कैसे अपने कमांड को एक कुंजी से बांधें ताकि यह नौसिखियों के लिए पर्याप्त हो?
DoMiNeLa10

यह लिंक के बाद सफेद रिक्त स्थान को हटाने के लिए लगता है। किसी भी विचार कैसे उन्हें रखने के लिए?
टिम्म

1

सबसे तेज लिंक से पहले कर्सर रखने के लिए हो सकता है, फिर टाइप करें C-M-space( mark-sexp), जो पूरे लिंक को चिह्नित करेगा। फिर एक बैकस्पेस (यदि आप उपयोग करते हैं delete-selection-mode) या टाइप करके इसे हटा दें C-w


1
यह संपूर्ण लिंक को हटाने के लिए लगता है, लेकिन मैं लिंक को हटाना चाहता हूं और पाठ (यानी विवरण) को संरक्षित करना चाहता हूं।
गरमागरम

1
क्षमा करें, मुझे लगता है कि मैंने आपके प्रश्न को गलत समझा।
हेराल्ड हैन्च-ऑलसेन

1
वहाँ से नीचे उतरने वालों के लिए: जब मैंने इसका उत्तर दिया तो यह प्रश्न अस्पष्ट था। यह तब से संपादित किया गया है, अस्पष्टता को हटाते हुए। मैं जवाब छोड़ देता हूं, हालांकि, क्योंकि यह अभी भी पूरे लिंक, विवरण और सभी को हटाने का सबसे आसान तरीका लगता है।
हेराल्ड हैन्च-ऑलसेन

0

यह बहुत जल्दी और बहुत गंदा मैक्रो एक तरीका होगा, सबसे अच्छा तरीका नहीं:

(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])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.