Как сделать работу org-протокола?
Я пробовал инструкции здесь - я использую firefox на Lubuntu (openbox). Но я получаю сообщение об ошибке "Firefox не знает, как открыть этот адрес, потому что протокол (org-protocol) не связан с какой-либо программой".
Как мне исправить это?
Ответы
Ответ 1
Следующие шаги для настройки org-protocol работают с Ubuntu 16.04 и, предположительно, более поздними версиями. Предполагается, что режим Org уже настроен (и установлен с помощью apt-get install org-mode
или через репозиторий ELPA).
Настройка
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 запрашивать программу для использования при открытии этих типов ссылок.
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, вам нужно подготовить файл notes.org
в месте, указанном на шаге 2. Вы должны создать этот файл - если это не созданный вместе с заголовками, указанными на шаге 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())
Если вы используете более старую версию org-mode, вам может потребоваться следующее:
javascript:location.href='org-protocol://capture://l/'+encodeURIComponent(location.href)+'/'+encodeURIComponent(document.title)+'/'+encodeURIComponent(window.getSelection())
Обратите внимание на "l" (нижний регистр L) в указанном выше URL-адресе - это то, что выбирает шаблон захвата (автоматически) - это ключевой, который обычно нужно было бы нажать при захвате с помощью org-mode через Cc c.
Когда вы нажимаете на этот букмарклет, Firefox будет спрашивать, какую программу использовать для обработки протокола "org-protocol" . Вы можете просто выбрать программу по умолчанию, которая появляется ( "org-protocol" ).
Использование
(Необязательно) выберите текст на веб-странице, которую вы просматриваете в Firefox. Когда вы нажимаете на букмарклет, ссылка и выделенный текст будут помещены в буфер захвата emacs. Перейдите в emacs, измените буфер захвата по желанию и нажмите C-c C-c
, чтобы сохранить его.
Ответ 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
, выполнив:
Настройка 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 может заменить все открытые вкладки в окне сообщением об ошибке, что затрудняет или невозможно восстановить эти вкладки. Лучше всего использовать новое окно с вкладкой throwaway, чтобы проверить эту настройку, пока не узнаете, что она работает.
Сделать букмарклет
Сделайте букмарклет с указанием местоположения:
javascript:location.href='org-protocol://capture://w/'+encodeURIComponent(location.href)+'/'+encodeURIComponent(document.title)+'/'+encodeURIComponent(window.getSelection())
Примечание. w
в URL-адресе выбирает соответствующий шаблон захвата. Вы можете оставить его, если хотите получить приглашение для шаблона.
Когда вы впервые нажимаете на этот букмарклет, 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())
Примечание. Объекты JavaScript немного отличаются для работы от Pentadactyl.
Вы также можете добавить его для под-протокола `store-link`, например:
map cl -javascript location.href='org-protocol://store-link://'+encodeURIComponent(content.location.href)+'/'+encodeURIComponent(content.document.title)
Захват script
Вы можете использовать этот script для захвата ввода с терминала, либо в качестве аргумента, либо в виде:
#!/bin/bash
if [[ [email protected] ]]
then
data="[email protected]"
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"
Затем вы можете захватить ввод из оболочки следующим образом:
tail /var/log/syslog | org-capture
org-capture "I can capture from a terminal!"
Примечание. Я отредактировал всю эту обновленную и расширенную информацию в ответе выше, но редактирование было отклонено, поскольку оно "отклоняется от первоначального намерения публикации" и не "сохраняет цели владельца сообщения". Я боюсь, что из Википедии пришли победители, которые предпочли бы отказаться от полезной, актуальной информации (первоначальный ответ 3 года) и принять как должное вкладчику драгоценное время ( Сегодня утром я провел несколько часов, установив org-protocol
и узнав, что другой ответ устарел). Итак, вот новый, отдельный ответ, который убирает другой. Думаю, я должен просто разместить это в блоге где-нибудь, так как Stack больше не хочет быть актуальным и полезным.