如何使组织协议工作?

时间:2011-09-18 22:42:42

标签: firefox emacs org-mode

我尝试了here的说明 - 我在Lubuntu上使用firefox(openbox)。但我得到错误“Firefox不知道如何打开这个地址,因为协议(org-protocol)与任何程序都没有关联”。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:15)

以下设置org-protocol的步骤适用于Ubuntu 16.04以及可能的更高版本。假设组织模式已经设置(并使用apt-get install org-modeELPA 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在打开这些类型的链接时提示程序使用。 / p>

2)将配置设置添加到〜/ .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。

3)创建notes.org文件

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

* Tasks
* Web Links

4)将书签添加到Firefox

将书签保存到工具栏中,其中包含以下内容:

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

如果您使用的是旧版本的组织模式,则可能需要使用以下内容:

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

注意上面URL中的'l'(小写L) - 这就是选择捕获模板(自动)的原因 - 它是通过Cc c使用org-mode捕获时通常必须按下的键。

当您单击此书签时,Firefox将询问用于处理“org-protocol”协议的程序。您只需选择出现的默认程序(“org-protocol”)。

使用它

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

答案 1 :(得分:7)

这些说明比上述说明更新。

添加协议处理程序

创建包含以下内容的文件~/.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上,可能需要添加此设置。如果您收到错误消息,指出Firefox不知道如何处理org-protocol链接,您可以跳过此步骤并返回此步骤。

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

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

制作书签

制作一个包含位置的书签:

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

注意:网址中的w会选择相应的捕获模板。如果要提示您输入模板,可以将其保留。

当您第一次点击此书签时,Firefox将询问使用哪个程序来处理org-protocol协议。如果您使用的是Ubuntu 12.04,则必须添加/usr/bin/emacsclient程序,然后选择它。使用Ubuntu 12.10或更高版本,您只需选择显示的默认程序(org-protocol)。

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

Pentadactyl

如果你正在使用Pentadactyl,你可以映射这样的键序列:

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

注意:从Pentadactyl运行JavaScript对象略有不同。

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

map cl -javascript 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!"

注意:我将所有这些更新和扩展的信息编辑到上面的答案中,但编辑被拒绝了,因为它"偏离了帖子的原始意图"并没有保留帖子所有者的目标"。我担心来自维基百科的人们已经过来了,他们宁愿扔掉有用的,最新的信息(最初的答案是 3岁),并认为理所当然的贡献者&#39 ;宝贵的时间(我今天早上花了好几个小时来设置org-protocol并找出其他答案已经过时的艰难方式。所以这是一个新的,单独的答案,淘汰了另一个。我想我应该在某个地方的博客上发布这个,因为Stack不想再更新和有用了。