我尝试了here的说明 - 我在Lubuntu上使用firefox(openbox)。但我得到错误“Firefox不知道如何打开这个地址,因为协议(org-protocol)与任何程序都没有关联”。
我该如何解决这个问题?
答案 0 :(得分:15)
以下设置org-protocol的步骤适用于Ubuntu 16.04以及可能的更高版本。假设组织模式已经设置(并使用apt-get install org-mode
或ELPA repository安装)。
创建一个名为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>
在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。
notes.org
文件假设您使用步骤2中定义的捕获模板,则需要在步骤2中指定的位置准备notes.org
文件。必须创建此文件 - 如果它不会与步骤2中指定的标题一起创建,org-mode只会在您尝试捕获网页时发出警告。因此,鉴于步骤2中的捕获模板,notes.org
应包含以下内容:
* Tasks
* Web Links
将书签保存到工具栏中,其中包含以下内容:
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初始文件:
(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
并创建名为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,你可以映射这样的键序列:
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不想再更新和有用了。