Как сделать работу 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, выполнив:

  • В 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 может заменить все открытые вкладки в окне сообщением об ошибке, что затрудняет или невозможно восстановить эти вкладки. Лучше всего использовать новое окно с вкладкой 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 больше не хочет быть актуальным и полезным.