在组织模式下,如何删除链接?


11

如何删除现有的超链接而不必涉足并手动删除一堆括号?当我尝试org-insert-link删除现有链接时,我得到了Lisp error: (error "Empty link")

我想删除链接并保留文本(即描述)。

Answers:


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]]格式组织链接。我了解match-beginningmatch-end从你的答案。
Kaushal Modi 2015年

5

我试图将其添加到@Andrew的答案中,但是评论太久了……

我非常喜欢他的解决方案,除了它可以移动光标。(从技术上讲,我想这是正确的。无论如何...)幸运的是,很容易添加它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如果需要在其他地方使用该链接,则将从org-link中丢弃的LINK保存到。

(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

最快的方法可能是将光标放在链接之前,然后键入C-M-spacemark-sexp),这将标记整个链接。然后通过键入退格键(如果使用delete-selection-mode)或将其删除C-w


1
这似乎删除了整个链接,但是我想删除该链接并保留文本(即描述)。
白炽灯2015年

1
对不起,我想我误会了你的问题。
Harald Hanche-Olsen 2015年

1
对那里的反对者:我回答这个问题时模棱两可。从那时起,它已被编辑,消除了歧义。但是,我确实保留了答案,因为这似乎仍然是删除整个链接,描述和所有内容的最简单方法。
Harald Hanche-Olsen 2015年

1

有一种解决方案可以避免对正则表达式使用自定义解析,而直接使用内置org-elementAPI:

(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

这似乎删除链接后的空白。知道如何保留它们吗?
Timm

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])
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.