Trong chế độ org, làm thế nào để loại bỏ một liên kết?


11

Làm cách nào để xóa một siêu liên kết hiện có mà không phải lội vào và xóa thủ công một loạt dấu ngoặc? Khi tôi cố gắng org-insert-linkvà chỉ cần xóa liên kết hiện có, tôi nhận được Lisp error: (error "Empty link").

Tôi muốn xóa liên kết và giữ nguyên văn bản (tức là mô tả).

Câu trả lời:


7

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 Descriptiontrong trường hợp đầu tiên hoặc Linktrong 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))))

Đó là một giải pháp nhỏ gọn rất gọn gàng! Tôi cũng cập nhật câu trả lời của mình để hỗ trợ [[LINK]]định dạng liên kết org. Tôi đã học về match-beginningmatch-endtừ câu trả lời của bạn.
Kaushal Modi

5

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-excursionvà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)))))

4

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-modebộ đệ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-ringtrong 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)))))))

1

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.


1
Điều này dường như xóa toàn bộ liên kết, nhưng tôi muốn xóa liên kết và giữ nguyên văn bản (tức là mô tả).
sợi đốt

1
Xin lỗi, tôi đoán tôi đã hiểu nhầm câu hỏi của bạn.
Harald Hanche-Olsen

1
Đối với những người downvoters ngoài kia: Câu hỏi mơ hồ khi tôi trả lời nó. Nó đã được chỉnh sửa kể từ đó, loại bỏ sự mơ hồ. Mặc dù vậy, tôi vẫn để lại câu trả lời, vì đây vẫn là cách dễ nhất để xóa toàn bộ liên kết, mô tả và tất cả.
Harald Hanche-Olsen

1

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

Bạn có thể thêm cách liên kết lệnh của bạn với một khóa để nó đủ cho người mới không?
DoMiNeLa10

Điều này dường như để xóa khoảng trắng sau khi liên kết. Bất cứ ý tưởng làm thế nào để giữ chúng?
Timm

0

Macro rất nhanh và rất bẩn này sẽ là một cách, không phải là cách tốt nhất:

(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])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.