Как я могу зарегистрировать пользовательский протокол с помощью xdg?

22

Сегодня утром я пытался связать приложение с пользовательским протоколом, а именно с emacsclient и org-protocol .

Я вызываю этот протокол из букмарклета веб-браузера и получаю следующее поведение:

В chromium
появляется диалоговое окно «Launch Application» и вызывает xdg-open org-protocol: // ..., который завершает работу над новым кадром chromium.

В Firefox
я попытался установить для network.protocol-handler.app.org-protocol пустую строку или путь к emacsclient, в любом случае я получаю следующее сообщение об ошибке:
«Firefox не знает, как открыть этот адрес, потому что протокол (org-protocol) не связан ни с одной программой ", даже не показывая диалог выбора внешнего приложения.

Я не использую какую-либо рабочую среду, поэтому мне нужно, чтобы это работало строго с xdg, однако, несмотря на чтение общей информации MIME и т. Д., Я все еще не могу понять рабочую конфигурацию.

жюльен
источник
askubuntu.com/questions/62585/…
Сиро Сантилли 新疆 '中心 法轮功 六四 事件

Ответы:

18

Метод XDG: создайте emacsclient.desktopфайл, который обрабатывает x-scheme-handler/org-protocolтип MIME:

[Desktop Entry]
Name=Emacs Client
Exec=emacsclient %u
Icon=emacs-icon
Type=Application
Terminal=false
MimeType=x-scheme-handler/org-protocol;

(Обратите внимание на MimeType=строку выше, которая предназначена для org-protocol:URI.)

Поместите файл в ~/.local/share/applicationsили /usr/local/share/applications.

Возможно, вам придется открыть файл ~/.local/share/applications/mimeapps.listи добавить строку вроде этой:

x-scheme-handler/org-protocol=emacsclient.desktop

Добавьте это в [Default Applications]разделе.

grawity
источник
это все еще открывает хромовое окно для меня; что-нибудь еще? (я использую Fluxbox без рабочего стола env, похожего на orig. author)
сборка
8
Вы также можете выполнить последний шаг через xdg-mime default emacsclient.desktop x-scheme-handler/org-protocol, что, вероятно, является более официальным способом сделать это.
Адам Спайерс
Есть ли другие полезные переменные, кроме %u? Например, переменная, которая выражает только часть домена или пути URI?
Джонатан Нойфельд
11

@ Grawity почти правильно, но он упустил из виду две детали:

  1. После установки .desktopфайла вам может потребоваться запустить его вручную sudo update-desktop-database. (Это может быть сделано для вас, если вы установили .desktopфайл с помощью xdg-desktop-menu install emacsclient.desktop)

    Это было то, что требовалось, чтобы мой Firefox отображал «Что должно обрабатывать этот протокол?» диалог, а не просто отображение страницы с ошибкой.

  2. В то время, когда был задан этот вопрос, была ошибка, из-за xdg-openкоторой он слепо передавал URL-адреса $BROWSERна «общие» (не KDE, не GNOME, не Xfce и т. Д.) Рабочие столы, и это приводило именно к поведению @ Жюльен переживал.

    Это должно быть исправлено в современных версиях xdg-open, но если по какой-то причине ваш рабочий стол не использует современную версию, вот версия xdg-open, в которую я загляну, /usr/local/binчтобы решить проблему.

ssokolow
источник
1
обновление xdg-open у меня сработало, спасибо!
Джордж Маркиз
0

По крайней мере, в Fedora 13 и различных дистрибутивах на основе Debian xdg-open открывает все URL, которые не имеют схемы file: // в браузере, если он не работает в поддерживаемой среде рабочего стола. То, как он пытается определить, какой браузер использовать, зависит от дистрибутива.

Поскольку xdg-open - это всего лишь сценарий оболочки, вы можете легко адаптировать его к вашим потребностям.

Флориан Диш
источник
Действительно, но именно конфигурация, которая требуется между xdg-open и xdg-mime, очень непрозрачна для меня, несмотря на чтение документов ...
julien
Если открыть файл: // URI Ubuntu вообще не вызывает xdg-mime, но использует run-mailcap, если не работает под поддерживаемым DE, Fedora 13 сначала пытается найти приложение по умолчанию, используя xdg-mime, и если это не так работа возвращается к мимеопен. xdg-mime использует базу данных общей информации MIME freedesktop.org/wiki/Software/shared-mime-info
Флориан Диш,