Làm cách nào để sao chép liên kết OUT của chế độ org?


15

Có rất nhiều tài liệu về việc chèn hoặc lưu trữ các liên kết chế độ org, nhưng dường như không có tài liệu nào về việc sao chép chúng vào bộ đệm ở các định dạng khác.

Làm thế nào để bạn sao chép URL của một liên kết chế độ org từ một tệp org vào vòng đệm / hủy với càng ít lần nhấn phím càng tốt? Tôi đã thử org-store-linkorg-insert-link, nhưng nó đưa toàn bộ cú pháp chế độ org vào bất kỳ bộ đệm nào khác mà bạn đã mở.

Ví dụ: bộ đệm 1 chế độ org, bộ đệm 2 Markdown.

  1. Truy cập bộ đệm 1, C-stìm kiếm liên kết.
  2. Điều kỳ diệu xảy ra , URL nằm trong clipboard
  3. Truy cập bộ đệm 2. C-yđể kéo URL vào bộ đệm.

Câu trả lời:


10

Đây là một cách để đạt được những gì bạn muốn, sử dụng các thuộc tính văn bản.

Bạn có thể đi đến liên kết trong tệp org mà bạn muốn sao chép và thực thi lệnh my-org-retrieve-url-from-pointnày sẽ sao chép liên kết org tại điểm hiện tại vào bảng tạm. Trước khi thêm liên kết vào clipboard, yank-handler ( my-yank-org-link) đã được đăng ký được gọi trong khi dán liên kết. Trình xử lý yank kiểm tra xem bộ đệm hiện tại ở chế độ org hay chế độ có nguồn gốc từ chế độ org, nếu vậy nó sẽ chèn liên kết như hiện tại (một liên kết org), nếu không, nó trích xuất URL từ liên kết và chèn nó vào

(defun my-yank-org-link (text)
  (if (derived-mode-p 'org-mode)
      (insert text)
    (string-match org-bracket-link-regexp text)
    (insert (substring text (match-beginning 1) (match-end 1)))))

(defun my-org-retrieve-url-from-point ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 ;; org-context seems to return nil if the current element
                 ;; starts at buffer-start or ends at buffer-end
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (add-text-properties 0 (length text) '(yank-handler (my-yank-org-link)) text)
      (kill-new text))))

Đây là phiên bản DWIM kill-ring-save, sử dụng kill-ring-savenếu vùng đang hoạt động hoặc sao chép liên kết org tại điểm

(defun my-smarter-kill-ring-save ()
  (interactive)
  (if (region-active-p)
      (call-interactively #'kill-ring-save)
    (when (eq major-mode 'org-mode)
      (call-interactively #'my-org-retrieve-url-from-point))))

Lưu ý : Điều này hiện không phân biệt giữa liên kết URL và liên kết nội bộ.


1
Tôi đã xóa if, vì khi sử dụng GUI Emacs, nó luôn sao chép toàn bộ liên kết ( [[a]][b]]) thay vì phần URL ( a)
Nitz

2

Cuối buổi tiệc (và bài viết đầu tiên của tôi ở đây), nhưng tôi nghĩ điều này cũng có thể hữu ích cho những người khác. Câu trả lời được chấp nhận hoạt động hoàn hảo khi kéo lại bên trong emacs, nhưng văn bản thực tế được sao chép vào bảng tạm hệ thống vẫn là cú pháp chế độ org đầy đủ. Tôi muốn một cái gì đó có thể sao chép một liên kết ra khỏi cả chế độ org emacs. Các trường hợp sử dụng: Gần đây tôi đã làm rất nhiều nhà phát triển web và tôi thường sử dụng nhiều trình duyệt. Chỉ một trong số chúng có thể là mặc định cho C-c c-ophím tắt và đôi khi tôi muốn mở một liên kết trong một liên kết không mặc định. Ngoài ra, dán liên kết đến đồng nghiệp trên Slack, et cetera.

Tóm lại, tôi đã đưa ra giải pháp này bằng cách trộn và kết hợp câu trả lời được chấp nhận :

(defun my-org-export-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (string-match org-bracket-link-regexp text)
      (kill-new (substring text (match-beginning 1) (match-end 1))))))

Điều này sẽ sao chép vào clipboard chỉ là một phần của liên kết chế độ org.

Trên thực tế, tôi đã tích hợp cả giải pháp của câu trả lời trước và chức năng mới này bên trong tôi .emacs, mỗi chức năng có khóa phím riêng. Mã đầy đủ ở đây:

(defun my-yank-org-link (text)
  (if (derived-mode-p 'org-mode)
      (insert text)
    (string-match org-bracket-link-regexp text)
    (insert (substring text (match-beginning 1) (match-end 1)))))

(defun my-org-copy-smart-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (add-text-properties 0 (length text) '(yank-handler (my-yank-org-link)) text)
      (kill-new text))))
(global-set-key (kbd "C-c c") 'my-org-copy-smart-url)

(defun my-org-export-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (string-match org-bracket-link-regexp text)
      (kill-new (substring text (match-beginning 1) (match-end 1))))))
(global-set-key (kbd "C-c e") 'my-org-export-url)

Tôi đã chọn C-c eC-c ckeybindings vì chúng là những bản ghi nhớ tốt cho export và copy và chúng không được sử dụng trong chế độ org. Chúng cũng bằng cách nào đó phù hợp với các liên kết phím đã có sẵn C-c C-ocho ocác liên kết bút.


1

Một khả năng khác: Với con trỏ trên liên kết, thực hiện org-insert-link. Điều này là bình thường C-c C-l. Với chế độ ác (hoặc có thể chỉ với Spacemacs) , i lcũng hoạt động. Điều này đi vào luồng chèn liên kết với giá trị liên kết được điền trước. Sau đó, bạn có thể làm M-x evil-yank-linetrong khi xe buýt nhỏ có nội dung của địa chỉ liên kết.


Phương pháp này về cơ bản là những gì tôi sử dụng, cụ thể là tôi đi C-c C-l M-S-<backspace> C-g.
Omar

Nó hoạt động nhưng không hiệu quả.
itirazimvar
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.