Em Debian xdg-open
(através de xdg-mime
) não segue as especificações de mailcap
usadas por run-mailcap
que eu prefiro usar. Existe alguma maneira sistemática de fazer xdg-open
seguir as entradas mailcap
? Idealmente menos hacky do que modificar o script xdg-open
para sempre chamar run-mailcap
.
O Debian (a partir do 9.5 trecho) tem vários sistemas para configurar aplicativos padrão, ou mais especificamente, associando extensões de arquivos, tipos MIME e programas (ou ações de programas). Eles são brevemente revisados nesta resposta . Os dois principais com a maior granularidade (em termos de associações MIME) são
mailcap
destinava-se mais a agentes de correio e ambientes de terminal (ou agnósticos de desktop). É bem descrito nesta resposta . Eu prefiro usar o segundo sistema mailcap, porque sua abordagem curinga mailcap.order
torna muito conveniente associar automaticamente um aplicativo com todos (ou um subconjunto de) os tipos MIME que ele suporta e também pode diferenciar entre visualizadores e editores para um determinado tipo MIME. Este sistema também está bem ligado às atualizações do sistema, ou seja, a atualização de pacotes não altera a ordem de associação.
Dois métodos mencionados acima têm diferentes pontos de entrada
xdg-open
run-mailcap
ou seus aliases ( view
, edit
) No entanto, programas diferentes chamam pontos de entrada diferentes, portanto, os resultados podem não ser consistentes. Eu estou tentando conseguir isso embora.
xdg-open
pode fazer fallback em run-mailcap
Após a inspeção de /usr/bin/xdg-open
fornecida por xdg-utils-1.1.1-1+deb9u1
, parece que xdg-open
tentará usar xdg-mime
se uma área de trabalho estiver ativa (em um sentido muito genérico, não necessariamente um ambiente de área de trabalho). em run-mailcap
se estiver disponível.
# ... line 787 in /usr/bin/xdg-open
open_generic()
{
if is_file_url_or_path "$1"; then
local file="$(file_url_to_path "$1")"
check_input_file "$file"
if [ -n "$DISPLAY" ]; then
filetype='xdg-mime query filetype "$file" | sed "s/;.*//"'
open_generic_xdg_mime "$file" "$filetype"
fi
if which run-mailcap 2>/dev/null 1>&2; then
run-mailcap --action=view "$file"
if [ $? -eq 0 ]; then
exit_success
fi
fi
# ...
O objetivo é ter o Evince como visualizador padrão para PDF, Djvu, etc.
Eu tenho evince:*/*
em /etc/mailcap.order
, portanto, após a execução (possivelmente automaticamente após a atualização dos pacotes) update-mime
entradas como application/pdf; evince %s; test=test -n "$DISPLAY"
virão primeiro em /etc/mailcap
. Então, os lançadores usando run-mailcap
usam o Evince como eu quero.
No entanto, quando algo usa xdg-open
, ele abrirá o PDF no Libreoffice Draw. A razão para isso é (determinada inserindo set -x
no script):
xdg-open
chamadas xdg-mime query filetype file.pdf
para determinar que seu tipo MIME é application/pdf
xdg-mime
se existe algum aplicativo padrão para esse tipo MIME. *.dekstop
entradas que suportam esse tipo MIME. Para cada arquivo *.desktop
, ele procura no campo InitialPreference
para determinar um bom candidato. libreoffice-draw.desktop
por acaso tem initialPreference=5
ele usa. Aqui está o log detalhado do xdg-mime query default call
com informações de depuração:
$ XDG_UTILS_DEBUG_LEVEL=3 xdg-mime query default application/pdf
Checking /home/$USER/.config/mimeapps.list
Checking /etc/xdg/mimeapps.list
Checking /home/$USER/.local/share/applications/mimeapps.list
Checking /usr/share//applications/mimeapps.list
Checking /home/$USER/.local/share/applications/defaults.list and
/home/$USER/.local/share/applications/mimeinfo.cache
Checking /home/$USER/.local/share/applications/defaults.list and
/home/$USER/.local/share/applications/mimeinfo.cache
Checking /usr/local/share//applications/defaults.list and
/usr/local/share//applications/mimeinfo.cache
Checking /usr/local/share//applications/defaults.list and
/usr/local/share//applications/mimeinfo.cache
Checking /usr/share//applications/defaults.list and
/usr/share//applications/mimeinfo.cache
Checking /usr/share//applications/defaults.list and
/usr/share//applications/mimeinfo.cache
Checking /home/$USER/.local/share/applications/wine-extension-pdf.desktop
Select /home/$USER/.local/share/applications/wine-extension-pdf.desktop
[ -1 => 0 ]
Checking /usr/share//applications/FoxitReader.desktop
Checking /usr/share//applications/evince.desktop
Checking /usr/share//applications/gimp.desktop
Checking /usr/share//applications/inkscape.desktop
Checking /usr/share//applications/libreoffice-draw.desktop
Select /usr/share//applications/libreoffice-draw.desktop [ 0 => 05 ]
Checking /usr/share//applications/mcomix.desktop
Checking /usr/share//applications/mupdf.desktop
Checking /usr/share//applications/pdf-presenter-console.desktop
Checking /usr/share//applications/vprerex.desktop
Checking /usr/share//applications/xpdf.desktop
Checking /usr/share//applications/zathura-pdf-poppler.desktop
libreoffice-draw.desktop
Os números em [ X => ]
são obtidos por chamadas como awk -F= /InitialPreference=/ {print($2)} /usr/share//applications/libreoffice-draw.desktop
, eu determinei isso colocando set -x
no script xdg-mime
.
Aqui estão as soluções que pensei até agora. Estou à procura de uma solução mais agradável e idealmente mais sistemática.
Uma opção é modificar o script xdg-open
para sempre retornar a run-mailcap
. Mas isso é um pouco de truque. Mesmo se eu usar dpkg-divert
, isso ainda significa que eu tenho que mantê-lo sozinho.
Use o sistema XDG e coloque algo como */*:xdg-open
em mailcap
. Mas pode resultar em chamadas circulares em sessões de terminal.
Tags debian xdg-open defaults mime-types