LINUX.ORG.RU

xdg-open vs run-mailcap, или как вернуться к истокам

 , , ,


0

1

Есть у меня пара файлов — .mailcap и .mime.types, и существует эта пара файлов уже почти 20 лет, и тиражируется на все машины.

И уже лет 20 я запускаю run-mailcap %s. И у меня даже есть возможность конфигурировать некую простую логику выбора нужной программы в случае, если есть несколько альтернатив (самый примитивный случай — это разные обработчики в X Window и в консоли), напр.:

text/plain; nedit %s; test=test -n "${VAR}" -a ${VAR} -eq 0
text/plain; vim %s; test=test -n "${VAR}" -a ${VAR} -eq 1
text/plain; gvim %s; test=test -n "${VAR}" -a ${VAR} -eq 2
text/plain; emacs %s; test=test -n "${VAR}" -a ${VAR} -eq 3
text/plain; emacs -nw %s; test=test -n "${VAR}" -a ${VAR} -eq 4
text/plain; mcedit %s;

(Сама форма записи ; test= описана в RFC 1524.)

И работает эта штука достаточно быстро.

Но вот уже лет пять как продвигается альернатива — xdg-open. Которая прекрасна всем:

  1. Пытается определить, какое у меня DE, чтобы запустить «браузер по умолчанию». GNOME? Нет, не GNOME. KDE? Нет, не KDE. XFCE? Опять мимо. Нет, я, конечно, даже глазом не успеваю моргнуть — процесоры нынче быстрые.
  2. По MIME-типу файла пытается найти нужное приложение, распарсив 100500 *.desktop-файлов в /usr/share/applications.
  3. После этого запускает наименее подходящее приложение (напр., для открытия каталогов я использовал thunar (inode/directory; thunar %s; test=test -n "${DISPLAY}")), но вот xdg-open, с*ка, решил, что разумнее запустить git-cola, а затем — audacious (видимо, потому, что в обычных каталогах git-cola возвращает ненулевой код).
  4. Наконец, для программ, у которых отсутствуют *.desktop-файлы, таковые приходится создавать вручную, что однозначно дольше добавления одной строки в .mailcap. Короче, снова приходится настраивать то, что уже годы работало.

Проблема в том, что всё больше инструментов пытаются использовать xdg-open вместо run-mailcap, а сам xdg-open попытается запустить run-mailcap только в случае, если сам не придумает какой-нибудь глупости. Снести xdg-open не получится — от него зависит chromium и ещё куча софта.

Посему вопрос: как сделать, чтобы run-mailcap запускался всегда, и запретить всякие странные эвристики и танцы с бубном?

Для Midnight Commander всё (пока) решается просто:

export MC_XDG_OPEN='run-mailcap'

Для всего остального я, увы, пока вижу лишь

dpkg-divert --divert /usr/bin/xdg-open.orig --local --rename /usr/bin/xdg-open
ln -s run-mailcap /usr/bin/xdg-open

Есть менее радикальные решения?

UPD: Временно решил проблему, создав run-mailcap.desktop след. содержания:

[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
NoDisplay=true
Exec=run-mailcap %u
Name=run-mailcap
Comment=run-mailcap

и прописав его в качестве обработчика для всех типов в ~/.config/mimeapps.list, но как-то это всё равно через задницу.

★★★★★

Мне кажется, что прописывания обработчика для всех типов и есть как бы пока единственный вариант. А xdg не понимает какие-нибудь */* вместо прописывания действия для каждого типа?

Zubok ★★★★★ ()
Последнее исправление: Zubok (всего исправлений: 1)

Вот еще есть такая хрень. Я не уверен, что это то, что нужно.

xdg-mime default application mimetype(s)

       default
           Ask the desktop environment to make application the default
           application for opening files of type mimetype. An application can
           be made the default for several file types by specifying multiple
           mimetypes.

           application is the desktop file id of the application and has the
           form vendor-name.desktop application must already be installed in
           the desktop menu before it can be made the default handler. The
           application's desktop file must list support for all the MIME types
           that it wishes to be the default handler for.

           Requests to make an application a default handler may be subject to
           system policy or approval by the end-user. xdg-mime query can be
           used to verify whether an application is the actual default handler
           for a specific file type.

           The default option is for use inside a desktop session only. It is
           not recommended to use xdg-mime default as root.

Вот это multiple обязательно явно перечислять или по маске, может, можно?

Zubok ★★★★★ ()

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

Avial ★★★★★ ()
Ответ на: комментарий от anonymous

На всякий случай: https://github.com/march-linux/mimi

Спасибо. Собственно, у меня одно из основных нареканий — это как раз

The original xdg-open works horribly without DE environment.

Bass ★★★★★ ()
Ответ на: комментарий от Zubok

А xdg не понимает какие-нибудь */* вместо прописывания действия для каждого типа?

Формально — да (хотя эта сволочь модифицирует deprecated ~/.local/share/applications/mimeapps.list вместо ~/.config/mimeapps.list):

$ xdg-mime default run-mailcap.desktop '*/*'
$ xdg-mime query default '*/*'
run-mailcap.desktop

Но при этом маска */* уже не имеет «иерархической силы» (вывод команды ниже пуст):

$ xdg-mime query default 'application/octet-stream'

Такое, увы, работало только для ~/.mailcap. Но run-mailcap — это инструмент, специфичный для Debian. По этому поводу в списке расылки Midnight Commander даже был срач — не могли определиться с выбором: http://midnight-commander.org/ticket/2118

Bass ★★★★★ ()
Последнее исправление: Bass (всего исправлений: 1)
Ответ на: комментарий от Bass

Формально — да

Это показывает, что как раз не работает. Он просто посчитал */* таким типом MIME. Раскрывать такое не умеет. Выходит, что вариант только вручную каждый тип замкнуть на run-mailcap.desktop. Может, конечно, есть еще какие-то маски типа '*', но нигде я не видел упоминания.

Такое, увы, работало только для ~/.mailcap.

Насколько я помню (проверять не хочется), в .mailcap понимаются маски только типа <application>/*, а */* — нет.

Zubok ★★★★★ ()
Ответ на: комментарий от Zubok

Насколько я помню (проверять не хочется), в .mailcap понимаются маски только типа <application>/*, а */* — нет.

Угу, так и есть. Надо было сначала в man глянуть, а потом писать :)

The "type" field (text/plain, in the above example) is simply any legal
       content  type name, as defined by informational RFC 1524.  In practice,
       this is almost any string.  It is  the  string  that  will  be  matched
       against  the  "Content-type" header (or the value passed in with -c) to
       decide if this is the mailcap entry that matches the  current  message.
       Additionally,   the   type   field   may   specify   a   subtype  (e.g.
       "text/ISO-8859-1")  or  a  wildcard  to  match   all   subtypes   (e.g.
       "image/*").
Zubok ★★★★★ ()

На всякий случай для будущих поколений. Скрипт, который создаёт run-mailcap.desktop и генерирует mimeapps.list из известных mailcap типов для того, чтобы эти типы открывались через run-mailcap. Под Убунтой 18.04 с кастомным WM/DE works well.

#!/bin/bash

# Script makes all mailcap-known mime types
# open with run-mailcap instead of xdg-open
#
# Reason: xdg-open have bad application
# associations, run-mailcap works better

MAILCAP_TYPES="/etc/mailcap"
MIMEAPPS_LIST="${HOME}/.config/mimeapps.list"

MAILCAP_DESKTOP="run-mailcap.desktop"
MAILCAP_DESKTOP_DIR="${HOME}/.local/share/applications"
MAILCAP_DESKTOP_FILE="${MAILCAP_DESKTOP_DIR}/${MAILCAP_DESKTOP}"

# Create .desktop file with mailcap
touch "${MAILCAP_DESKTOP_FILE}"
echo "[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
NoDisplay=true
Exec=run-mailcap %u
Name=run-mailcap
Comment=run-mailcap
" > "${MAILCAP_DESKTOP_FILE}"

# Create mimeapps.list from mailcap known types
mimeTypes=$(cut -d";" -f1 ${MAILCAP_TYPES} | grep -E "^[a-zA-Z]" | sort | uniq)
touch "${MIMEAPPS_LIST}"
echo "[Default Applications]" > "${MIMEAPPS_LIST}"
for mimeType in ${mimeTypes}
do
    echo "${mimeType}=${MAILCAP_DESKTOP}" >> "${MIMEAPPS_LIST}"
done
anonymous ()

ln -s /usr/bin/run-mailcap /usr/bin/xdg-open

anonymous ()

По MIME-типу файла пытается найти нужное приложение, распарсив 100500 *.desktop-файлов в /usr/share/applications

результаты парсинга кэшируются в /usr/share/applications/mimeinfo.cache.

Наконец, для программ, у которых отсутствуют *.desktop-файлы, таковые приходится создавать вручную, что однозначно дольше добавления одной строки в .mailcap

dex -c /usr/bin/ls. И вообще, я не вижу тут ничего, что нельзя легко настроить в xdg-utils. Достаточно один раз покурить маны и спеки. А с mailcap с каждым днем придется делать все больше нестандартных костылей.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.