如何强制组织模式在另一个框架中打开链接?

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-omouse-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-setupfile 位设置为find-file-other-frame总是(例如,如果我使用C-c C-oC-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-fileorg.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-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。 当变量设置为find-file-other-window,而不是find-file-other-frame,对于file,你得到在新框架中打开链接的结果很奇怪。在我看来,要么它是一个错误,要么你把窗框的区别弄错了。在我的设置中,变量具有相同的值。 @N.N.我在值中进行了编辑。它可能在 7.6 和 7.7 之间发生了变化。我没有安装任何 emacs23 能够以这种方式对其进行测试,但可能是更改发生在 emacs 而不是 org-mode 中。 糟糕,我以为我做对了(奇怪的是,在过去我的议程以我想要的方式打开时,我做对了),但结果却倒退了。对此感到抱歉并忽略答案。

以上是关于如何强制组织模式在另一个框架中打开链接?的主要内容,如果未能解决你的问题,请参考以下文章

单击一帧中的链接并在另一帧中显示 JSP

如何强制 Instagram 在 Safari 而不是应用内浏览器中打开链接

关于html中超链接在另一个页面中的div中显示

强制链接在 webview 而不是浏览器中打开

在另一个标签中打开rss供稿链接

在另一个函数之前强制 setState