如何将链接复制到组织模式?


16

关于插入或存储组织模式链接有很多文档,但是显然没有关于将它们复制到其他格式的缓冲区的文档。

您如何通过尽可能少的击键将组织模式链接的URL从组织文件复制到剪贴板/ kill环?我尝试了org-store-linkorg-insert-link,但是它将整个组织模式语法转储到您打开的任何其他缓冲区中。

示例:缓冲区1组织模式,缓冲区2 Markdown。

  1. 访问缓冲区1,C-s搜索链接。
  2. 发生魔术了,URL在剪贴板中
  3. 访问缓冲区2. C-y以将URL拉入缓冲区。

Answers:


10

这是使用文本属性来实现所需功能的一种方法。

您可以转到要复制的组织文件中的链接,然后执行命令, my-org-retrieve-url-from-point这会将当前位置的组织链接复制到剪贴板。在将链接添加到剪贴板之前,先my-yank-org-link注册了yank-handler(),然后在粘贴链接时调用它。yank-handler检查当前缓冲区是否处于org-mode或从org-mode派生的模式,如果是,则按原样插入链接(org-link),否则从链接中提取URL并将其插入

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

这是的DWIM版本kill-ring-save,它使用kill-ring-saveregion是否处于活动状态或在点处复制org-link

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

注意:目前,这不能区分URL链接和内部链接。


1
我删除了if,因为在使用GUI Emacs时,它总是复制整个链接([[a]][b]])而不是URL部分(a
Nitz

3

另一种可能性:将光标放在链接上,执行org-insert-link。通常是这样C-c C-l。使用邪恶模式(或仅使用Spacemacs), i l也可以使用。这将进入链接插入流程,并预先填充链接值。然后,您可以M-x evil-yank-line在微型缓冲区具有链接地址的内容时进行操作。


这种方法基本上是我使用的方法,特别是我使用的方法C-c C-l M-S-<backspace> C-g
奥马尔

它有效,但效率不高。
itirazimvar

2

晚会晚了(顺便说一句,这是我的第一篇文章),但我认为这对其他人也可能有用。再次拉入emacs时,可接受的答案非常有效,但是复制到系统剪贴板的实际文本仍然是完整的组织模式语法。我想要一些可以从org-mode emacs中复制链接的东西。用例:最近我从事许多Web开发,并且我经常使用多个浏览器。其中只有一个可以是C-c c-o快捷方式的默认值,有时我想以非默认的方式打开链接。另外,在Slack等上粘贴指向同事的链接。

长话短说,我通过混合和匹配已接受的答案提出了这个解决方案:

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

这会将链接仅复制到组织模式链接的一部分到剪贴板。

实际上,我已经将先前答案的解决方案和此新功能集成到了我的内部.emacs,每个函数都有自己的按键绑定。完整代码在这里:

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

我选择了C-c eC-c c键绑定,因为它们对于export和copy 是很好的助记符,并且在组织模式下未使用。它们也以某种方式适合C-c C-o用于o链接的现有键绑定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.