如何强制组织模式在另一个框架中打开链接?
Posted
技术标签:
【中文标题】如何强制组织模式在另一个框架中打开链接?【英文标题】:How to force Org-mode to open a link in another frame? 【发布时间】:2012-01-16 14:50:16 【问题描述】:在组织模式下,可以有链接和顶部打开的链接。正如 http://orgmode.org/orgcard.txt 在 Org 模式中列出的 C-u C-c C-o 或 mouse-3 强制链接在另一个窗口中打开。对于frames如何做对应,即如何强制一个链接在另一个frame中打开?
我想要的是 C-c C-o 按默认工作,但 C-u C-c C-o 强制链接在另一个框架中打开。
(窗口和框架的区别见http://www.gnu.org/software/emacs/manual/html_node/emacs/Frames.html。)
我在 23.3.1 中运行 Org-mode 7.6。
【问题讨论】:
【参考方案1】:我刚刚进行了测试,您可以通过将 org-open-at-point
包装在 (let )
作为自定义函数来使其工作。
在这种情况下,我只是在当前的org-link-frame-setup
前加上您想要的find-file-other-frame
,以确保如果您在其他链接类型上使用该命令,它不会失败。
(defun zin/org-open-other-frame ()
"Jump to bookmark in another frame. See `bookmark-jump' for more."
(interactive)
(let ((org-link-frame-setup (acons 'file 'find-file-other-frame org-link-frame-setup)))
(org-open-at-point)))
我怀疑你需要将它绑定到 C-u C-c C-o
以外的键序列,除非 Emacs 允许你专门将它绑定到该序列。
【讨论】:
效果很好。是的,当我尝试绑定到该序列时,它引发了错误。我用C-c 5 C-o
。如果您仍然想要原始序列,您将如何进行?劫持C-c C-o
绑定的函数并告诉它当使用通用参数调用它时应该执行zin/org-open-other-frame
?
好吧,如果你将它绑定到C-c 5 C-o
,它将为你提供open-other-frame
功能,而不会对正常的C-c C-o
序列产生任何影响。您也许可以使用defadvice
将通用参数映射到zin/org-open-other-frame
,但我知道通用参数已在函数中使用。为open-other-window
保留C-c C-o
,为open-other-frame
保留C-c 5 C-o
和为open-with-emacs
保留C-u C-c C-o
可能是最简单的。
乔纳森,你的代码在我的 emacs (24.2.1) 中不起作用,它说:Symbol 的函数定义是无效的:acons 你知道我在哪里可以得到这个 acons?
糟糕...抱歉,我自己找到了答案:(acons x y z) 与 (cons (cons x y) z) 相同
@yashaka acons 是cl
的一部分。您应该可以使用(require 'cl)
直接使其工作。【参考方案2】:
查看变量org-link-frame-setup
(M-x customize-variable RET org-link-frame-setup
)。文档字符串应该解释这种方法。
【讨论】:
如果我将org-link-frame-setup
的file
位设置为find-file-other-frame
它总是(例如,如果我使用C-c C-o
和C-u C-c C-o
)打开文件新框架。这不是我想要的。我希望它仅在我强制它时才在新框架中打开链接(执行C-u C-c C-o
),否则我想要默认行为。
嗯,我不认为这是开箱即用的。作为某种快速解决方法,您可以为相关文件类型自定义org-file-apps
,并输入emacsclient -c %s
之类的内容作为应用程序。这样,C-c C-o
将在新框架中打开文件,而C-u C-c C-o
将按照org-link-frame-setup
中的定义打开它(例如在另一个窗口中)。不是您要找的东西,但可能足够接近?
是否有可能让C-c C-o
按照org-link-frame-setup
中的定义打开但C-u C-c C-o
在新框架中打开?如果其他一切都失败了,相反的方式会很有趣。
查看代码,我怀疑是否有任何方法可以让org-link-frame-setup
在当前系统下按需要工作。在函数org-open-file
中org.el
的第9993 行附近,您将得到((or (stringp cmd) (eq cmd 'emacs))
作为(cond ...)
的匹配项。 cmd 'emacs
是使用 C-u C-c C-o
传递的值。这使用 org-link-frame-setup
中的自定义,t
案例 (C-c C-o
) 也是如此。【参考方案3】:
我刚刚在非定制的 emacs 中测试了这个:
emacs -q
GNU Emacs 24.0.92.1 (i386-mingw-nt5.1.2600) of 2011-11-30 on MARVIN
Org-mode version 7.7
在类似于以下的链接上运行 C-c C-o
和 C-u C-c C-o
时:
file:~/Dropbox/org/test.org::*Test
在这两种情况下,我最终都会打开一个新框架。 C-u C-u C-c C-o
在我的活动 emacsclient 会话中打开 test.org
文件。将链接更改为.../org/test.txt
时,它仍会在新框架中打开,但无法创建新文件(我假设我没有正确关联 .txt,这是可能的)。
默认情况下使用[mailto:test@test.org][test-mail]]
进行测试也会产生新帧。
编辑:org-link-frame-setup
的值如下(也是默认值,因为它来自emacs -q
):
Its value is ((vm . vm-visit-folder-other-frame)
(gnus . org-gnus-no-new-news)
(file . find-file-other-window)
(wl . wl-other-frame))
【讨论】:
在您的设置中,变量org-link-frame-setup
的值是多少?我在 23.3.1 中运行 Org-mode 7.6。
当变量设置为find-file-other-window
,而不是find-file-other-frame
,对于file
,你得到在新框架中打开链接的结果很奇怪。在我看来,要么它是一个错误,要么你把窗框的区别弄错了。在我的设置中,变量具有相同的值。
@N.N.我在值中进行了编辑。它可能在 7.6 和 7.7 之间发生了变化。我没有安装任何 emacs23 能够以这种方式对其进行测试,但可能是更改发生在 emacs 而不是 org-mode 中。
糟糕,我以为我做对了(奇怪的是,在过去我的议程以我想要的方式打开时,我做对了),但结果却倒退了。对此感到抱歉并忽略答案。以上是关于如何强制组织模式在另一个框架中打开链接?的主要内容,如果未能解决你的问题,请参考以下文章