답변:
다음 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))))
@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
답변에서.