如何强制Org-mode在另一个框架中打开链接?

11
在Org-mode中,可以有链接并打开链接。如http://orgmode.org/orgcard.txt所列,在Org-mode中,C-u C-c C-o鼠标右键会强制链接在另一个窗口中打开。我该如何为框架完成相应的操作,即如何强制链接在另一个框架中打开?
我想要默认情况下C-c C-o正常工作,但是C-u C-c C-o则强制链接在另一个框架中打开。
(关于窗口和框架的区分,请参见http://www.gnu.org/software/emacs/manual/html_node/emacs/Frames.html
我正在运行Org-mode 7.6在23.3.1中。
3个回答

7

我刚刚测试了一下,你可以通过将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 - N.N.
如果你将它绑定到C-c 5 C-o,它将为你提供open-other-frame功能,而不会对正常的C-c C-o序列产生任何影响。你可能可以使用defadvice将通用参数映射到zin/org-open-other-frame,但我知道通用参数已经在函数中使用了。最简单的方法可能是保持C-c C-oopen-other-windowC-c 5 C-oopen-other-frameC-u C-c C-oopen-with-emacs - Jonathan Leech-Pepin
Jonathan, 你的代码在我的emacs(24.2.1)中无法运行, 它显示:Symbol's function definition is void: acons 你有任何想法在哪里可以获取这个acons吗? - yashaka
糟糕...抱歉,我自己找到答案了:(acons x y z) 和 (cons (cons x y) z) 是相同的。 - yashaka
1
@yashaka acons 是 cl 的一部分。您应该能够直接使用 (require 'cl) 使其工作。 - Jonathan Leech-Pepin

1
请查看变量org-link-frame-setupM-x customize-variable RET org-link-frame-setup)。文档字符串应该解释了这个方法。

如果我将org-link-frame-setupfile位设置为find-file-other-frame,它将始终(例如,无论我使用C-c C-o还是C-u C-c C-o)在新框架中打开文件。这不是我想要的。我希望只有在我强制它时(执行C-u C-c C-o),它才会在新框架中打开链接,否则我希望保持默认行为。 - N.N.
嗯,我不认为这是开箱即用的。你可以通过自定义org-file-apps来实现某种快速解决方案,并将类似于emacsclient -c %s的应用程序输入到涉及的文件类型中。这样,C-c C-o将在新框架中打开文件,而C-u C-c C-o将按照org-link-frame-setup中定义的方式打开它(例如,在另一个窗口中)。这可能不完全符合您的要求,但也许足够接近了吧? - u-punkt
有没有可能反过来,这样按下 C-c C-o 可以按照 org-link-frame-setup 中定义的方式打开,但按下 C-u C-c C-o 则在新框架中打开?如果其他方法都失败了,反过来也是一种有趣的尝试。 - N.N.
浏览代码后,我怀疑在当前系统下没有任何方法可以使 org-link-frame-setup 按预期工作。在 org.el 的第9993行左右的 org-open-file 函数中,你会得到 ((or (stringp cmd) (eq cmd 'emacs)) 作为 (cond ...) 的匹配项。cmd 'emacs 是使用 C-u C-c C-o 传递的值。这将使用 org-link-frame-setup 中的自定义设置,就像 t 情况 (C-c C-o) 一样。 - Jonathan Leech-Pepin

0

我刚在非定制版的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-oC-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。 - N.N.
当变量设置为find-file-other-window而不是find-file-other-frame时,以新框架打开链接的结果很奇怪。在我的设置中,该变量具有相同的值。我认为这可能是一个错误,或者你可能弄错了窗口-框架的区别。 - N.N.
@N.N. 我编辑了该值。在 7.6 和 7.7 之间它很可能已经被更改了。我没有安装任何 emacs23,无法通过测试来确认,但这种更改可能发生在 Emacs 而不是 Org-mode 中。 - Jonathan Leech-Pepin
糟糕,我以为我做对了(而且奇怪的是,在过去让我的日程表按我想要的方式打开时,我确实做对了),但结果却相反。对此我感到抱歉,请忽略这个答案。 - Jonathan Leech-Pepin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接