回答:
次のelisp関数は、によって認識されている現在のポイントの周りのリンクをとるorg-bracket-link-regexp
ため、[[Link][Description]]
またはのいずれかで、最初のケースまたは2番目のケースで[[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))))
@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)))))
ポイントが[[
org-linkの最初の角括弧の後(またはハイパーリンクされたorg-linkの後/後)にあるときに、このコマンドを呼び出します。
組織リンクがフォーマット[[LINK][DESCRIPTION]]
またはバッファ[[LINK]]
内にある場合は削除されorg-mode
ます。そうでなければ何も起こりません。
安全のために、org-linkから破棄されたLINK 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)))))))
リンクの前にカーソルを置いてからC-M-space
(mark-sexp
)を入力すると、リンク全体がマークされます。次に、バックスペース(を使用する場合delete-selection-mode
)またはを入力して削除しますC-w
。
正規表現によるカスタム解析の使用を回避し、組み込みorg-element
API を直接使用するソリューションがあります。
(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)))))))
[[LINK]]
組織のリンクのフォーマットもサポートしました。私は学びましたmatch-beginning
し、match-end
あなたの答えから。