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