Câu trả lời:
Hàm elisp sau đây sẽ lấy một liên kết xung quanh điểm hiện tại như được nhận ra bởi org-bracket-link-regexp
, do đó , [[Link][Description]]
hoặc [[Link]]
, và thay thế nó bằng Description
trong trường hợp đầu tiên hoặc Link
trong trường hợp thứ hai.
(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))))
Tôi đã cố gắng thêm câu này vào câu trả lời từ @Andrew, nhưng quá dài cho một bình luận ...
Tôi thực sự thích giải pháp của anh ấy, ngoại trừ việc nó di chuyển con trỏ. (Về mặt kỹ thuật tôi đoán nó đã di chuyển điểm. Dù sao ...) May mắn thay, thật dễ dàng để thêm save-excursion
vào để tránh điều đó:
(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)))))
Gọi lệnh này khi điểm ở bất cứ đâu sau [[
dấu ngoặc đầu tiên của liên kết org (hoặc bất cứ nơi nào trên / sau khi liên kết cực đại liên kết).
Một liên kết org sẽ bị xóa nếu nó có định dạng [[LINK][DESCRIPTION]]
hoặc [[LINK]]
trong org-mode
bộ đệm; không có gì sẽ xảy ra
Để an toàn, LINK bị loại bỏ từ liên kết org được lưu vào kill-ring
trong trường hợp có nhu cầu sử dụng liên kết đó ở nơi khác.
(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)))))))
Nhanh nhất có thể là đặt con trỏ trước liên kết, sau đó gõ C-M-space
( mark-sexp
), sẽ đánh dấu toàn bộ liên kết. Sau đó xóa nó bằng cách gõ một backspace (nếu bạn sử dụng delete-selection-mode
) hoặc C-w
.
Có một giải pháp tránh sử dụng phân tích cú pháp tùy chỉnh với biểu thức chính quy và trực tiếp sử dụng org-element
API tích hợp:
(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]]
định dạng liên kết org. Tôi đã học vềmatch-beginning
vàmatch-end
từ câu trả lời của bạn.