【问题标题】:How can I make org-protocol work on Openbox?如何使 org-protocol 在 Openbox 上工作?
【发布时间】:2011-09-18 22:42:41
【问题描述】:

我试过 the instructions - 我在 Lubuntu (Openbox) 上使用 Firefox。但我得到了错误

“Firefox 不知道如何打开这个地址,因为协议(org-protocol)没有与任何程序关联”。

我应该如何解决这个问题?

【问题讨论】:

  • 我之前也遇到过类似的问题。看到这个线程,那里描述的解决方案对我有用:lists.gnu.org/archive/html/emacs-orgmode/2011-05/msg00289.html
  • 我尝试了上述方法,但是当我收到错误“无法更新 [.local/share/applications/] 中的数据库。”时,我仍然无法打开 org-protocol 链接或者只是地址栏中的 org-protocol://。
  • 我在尝试将 Archlinux+AwesomeWM+Firefox 配置为工作时遇到了同样的问题,即使按照该过程似乎也不想关联协议(即使在手动添加它之后:配置) .但是,作为一种解决方法/替代方法,我能够按照说明在 Opera 中使用它。但是,如果您不使用 gnome/gconf,最好能更清楚地说明如何使其工作。
  • 改用update-desktop-database ~/.local/share/applications/

标签: firefox emacs org-mode


【解决方案1】:

以下设置org-protocol 的步骤适用于Ubuntu 16.04 (Xenial Xerus) 和可能的更高版本。假设组织模式已经设置(并使用apt-get install org-mode 或通过ELPA repository 安装)。

设置

  1. 添加 .desktop 文件

创建一个名为 org-protocol.desktop 的文件并将其保存到 ~/.local/share/applications,其中包含:

[Desktop Entry]
Name=org-protocol
Exec=emacsclient %u
Type=Application
Terminal=false
Categories=System;
MimeType=x-scheme-handler/org-protocol;

然后运行:

$ update-desktop-database ~/.local/share/applications/

此步骤使 Firefox 知道“org-protocol”是有效的方案处理程序或协议(通过更新 ~/.local/share/applications/mimeinfo.cache),并导致 Firefox 在打开此类链接时提示要使用的程序。

  1. 将配置设置添加到 ~/.emacs.d/init.el(或 ~/.emacs)文件中

在您的 Emacs 配置文件中有以下设置:

(server-start)
(require 'org-protocol)

还要在配置文件中添加一些模板定义,例如:

(setq org-protocol-default-template-key "l")
(setq org-capture-templates
 '(("t" "Todo" entry (file+headline "/path/to/notes.org" "Tasks")
        "* TODO %?\n  %i\n  %a")
   ("l" "Link" entry (file+olp "/path/to/notes.org" "Web Links")
        "* %a\n %?\n %i")
   ("j" "Journal" entry (file+datetree "/path/to/journal.org")
        "* %?\nEntered on %U\n  %i\n  %a")))

现在运行 Emacs。

  1. 创建您的notes.org 文件

假设您使用第 2 步中定义的捕获模板,您需要在第 2 步中指定的位置准备一个 notes.org 文件。您必须创建此文件 -- 如果是没有与步骤 2 中指定的标题一起创建,org-mode 只会在您尝试捕获网页时发出警告。因此,鉴于步骤 2 中的捕获模板,notes.org 应包含以下内容:

* Tasks
* Web Links
  1. 将小书签添加到 Firefox

将书签保存到包含以下内容的工具栏作为位置:

javascript:location.href='org-protocol://capture?template=l&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title)+'&body='+encodeURIComponent(window.getSelection())

如果您使用的是旧版本的 org-mode,则可能需要改用以下版本:

javascript:location.href='org-protocol://capture://l/'+encodeURIComponent(location.href)+'/'+encodeURIComponent(document.title)+'/'+encodeURIComponent(window.getSelection())

请注意上述 URL 中的“l”(小写 L)——这是(自动)选择捕获模板的内容——这是通过 C-c c 使用 org-mode 捕获时通常必须按下的键。

当您单击此书签时,Firefox 会询问使用什么程序来处理“org-protocol”协议。您可以简单地选择出现的默认程序(“org-protocol”)。

使用它

(可选)选择您在 Firefox 中查看的网页上的一些文本。当您单击小书签时,链接和选定的文本将被放置在 Emacs 捕获缓冲区中。转到 Emacs,根据需要修改捕获缓冲区,然后按 C-c C-c 保存。

【讨论】:

  • 在 Ubuntu 14.04 中,我还必须将 xdg-open 设置为 Firefox 显示其应用程序选择器对话框时要由 Firefox 执行的应用程序。
  • 我认为在您的书签中,capture://l/'+ 应该是 capture://'+
  • @BradyTrainor 不,l 选择捕获模板。
【解决方案2】:

添加协议处理程序

创建文件~/.local/share/applications/org-protocol.desktop,其中包含:

[Desktop Entry]
Name=org-protocol
Exec=emacsclient %u
Type=Application
Terminal=false
Categories=System;
MimeType=x-scheme-handler/org-protocol;

注意:每一行的键必须完全按照显示的大小大写,否则将是无效的.desktop 文件。

然后通过运行更新~/.local/share/applications/mimeinfo.cache

  • 在 GNOME 上:

    update-desktop-database ~/.local/share/applications/
    
  • 在 KDE 上:

    kbuildsycoca4
    

配置 Emacs

初始化文件

添加到您的 Emacs 初始化文件:

(server-start)
(require 'org-protocol)

捕获模板

您可能希望添加类似这样的捕获模板:

("w" "Web site"
 entry
 (file+olp "/path/to/inbox.org" "Web")
 "* %c :website:\n%U %?%:initial")

注意:使用%:initial 而不是%i 似乎可以更好地处理多行内容。

这将导致这样的捕获:

\* [[http://orgmode.org/worg/org-contrib/org-protocol.html][org-protocol.el – Intercept calls from emacsclient to trigger custom actions]] :website:
[2015-09-29 Tue 11:09] About org-protocol.el

org-protocol.el is based on code and ideas from org-annotation-helper.el and org-browser-url.el.

配置火狐

公开协议处理程序

在某些版本的 Firefox 上,可能需要添加此设置。如果您收到错误提示 Firefox 不知道如何处理 org-protocol 链接,您可以跳过此步骤并返回。

打开about:config 并创建一个名为network.protocol-handler.expose.org-protocol 的新boolean 值并将其设置为true

注意:如果您确实跳过了这一步,并且确实遇到了错误,Firefox 可能会将窗口中所有打开的选项卡替换为错误消息,从而难以或无法恢复这些选项卡。最好使用带有一次性标签的新窗口来测试此设置,直到您知道它可以正常工作为止。

制作书签

制作一个带有位置的书签:

javascript:location.href='org-protocol://capture://w/'+encodeURIComponent(location.href)+'/'+encodeURIComponent(document.title)+'/'+encodeURIComponent(window.getSelection())

注意: URL中的w选择对应的抓包模板。如果要提示您输入模板,您可以将其省略。

当你第一次点击这个书签时,Firefox 会询问使用什么程序来处理org-protocol 协议。如果您使用Ubuntu 12.04(精确穿山甲),则必须添加/usr/bin/emacsclient程序,并选择它。使用Ubuntu 12.10 (Quantal Quetzal) 或更高版本,您只需选择出现的默认程序 (org-protocol)。

您可以在捕获时选择页面中的文本并将其复制到模板中,或者您可以只捕获页面标题和URL。

三指

如果您使用Tridactyl,您可以像这样映射键序列:

bind cc js location.href='org-protocol://capture://w/'+encodeURIComponent(content.location.href)+'/'+encodeURIComponent(content.document.title)+'/'+encodeURIComponent(content.document.getSelection())

您可能还想为 `store-link` 子协议添加一个,例如:

bind cl js location.href='org-protocol://store-link://'+encodeURIComponent(content.location.href)+'/'+encodeURIComponent(content.document.title)

捕获脚本

您可能希望使用此脚本从终端捕获输入,无论是作为参数还是通过管道输入:

#!/bin/bash

if [[ $@ ]]
then
    data="$@"
else
    data=$(cat)
fi

if [[ -z $data ]]
then
    exit 1
fi

encoded=$(python -c "import sys, urllib; print urllib.quote(' '.join(sys.argv[1:]), safe='')" "${data[@]}")

# "link" and "title" are not used, but seem to be necessary to get
# $encoded to be captured
emacsclient "org-protocol://capture://link/title/$encoded"

然后你可以像这样从 shell 捕获输入:

tail /var/log/syslog | org-capture

org-capture "I can capture from a terminal!"

这些说明比Mark's answer 中的说明更新。

【讨论】:

  • 嗨,我在 Firefox 中使用了 org-protocol。但是,我不得不创建另一个 Firefox 配置文件,但我无法让它再次工作。每次我尝试捕获某些东西时,Firefox 都会说它不知道如何处理 org-protocol 链接。我已经通过访问“about:config”公开了 org-protocol,但问题仍然存在。我认为这是 Firefox 上的东西,而不是 emacs 或操作系统上的东西,因为当我使用旧的 Firefox 配置文件时,org-capture 可以工作。除了在 about:config 中公开 org-protocol 之外,在 Firefox 中是否还有其他配置?谢谢,雷纳托。
  • 嗨 Renato,恐怕我不知道为什么它不能在新的配置文件上工作。 Mozilla 可能在 Firefox 中破坏了与此相关的内容;如果是这样,祝你好运。我唯一能建议的是在另一个新的个人资料上再次尝试所有步骤,以确保您没有犯任何小错误或拼写错误。您也可以在另一个系统、另一个操作系统、另一个 Firefox 版本、另一个用户帐户等上尝试它;也许如果您能找到另一种有效的组合,它将帮助您缩小范围。如果您找到解决方案,请告诉我们。
  • 嗨,我找到了解决方案。我已经访问了 Firefox about:config 并创建了一个名为 network.protocol-handler.expose.org-protocol 的布尔值设置为 false。为了让 Firefox 识别 org-protocol 处理程序,我必须创建一个本地 HTML 文件,其中包含指向 org-protocol 资源的链接。重新启动 Firefox,打开此文件并单击链接后,Firefox 会打开一个窗口询问要做什么(仅在地址栏中键入 org-protocol 地址不会显示此窗口)。在这个窗口中,我可以选择之前创建的 org-protocol 桌面条目。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多