Answers:
这是使用文本属性来实现所需功能的一种方法。
您可以转到要复制的组织文件中的链接,然后执行命令,
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-save
region是否处于活动状态或在点处复制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链接和内部链接。
另一种可能性:将光标放在链接上,执行org-insert-link
。通常是这样C-c C-l
。使用邪恶模式(或仅使用Spacemacs), i l
也可以使用。这将进入链接插入流程,并预先填充链接值。然后,您可以M-x evil-yank-line
在微型缓冲区具有链接地址的内容时进行操作。
C-c C-l M-S-<backspace> C-g
。
晚会晚了(顺便说一句,这是我的第一篇文章),但我认为这对其他人也可能有用。再次拉入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 e
和C-c c
键绑定,因为它们对于e
xport和c
opy 是很好的助记符,并且在组织模式下未使用。它们也以某种方式适合C-c C-o
用于o
链接的现有键绑定。
if
,因为在使用GUI Emacs时,它总是复制整个链接([[a]][b]]
)而不是URL部分(a
)