Como fazer o xdg-open seguir as configurações de mailcap no Debian

2

tl; dr:

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 .

Contexto

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

  1. O padrão XDG "mais moderno" destinado a ambientes de área de trabalho
  2. O antigo sistema mailcap destinava-se mais a agentes de correio e ambientes de terminal (ou agnósticos de desktop). É bem descrito nesta resposta .

O objetivo

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.

Pontos de entrada de execução

Dois métodos mencionados acima têm diferentes pontos de entrada

  1. O XDG usa xdg-open
  2. o sistema mailcap usa 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
# ...

Exemplo específico de inconsistência

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):

  1. xdg-open chamadas xdg-mime query filetype file.pdf para determinar que seu tipo MIME é application/pdf
  2. em seguida, ele consulta xdg-mime se existe algum aplicativo padrão para esse tipo MIME.
  3. Como não tenho nenhuma associação real, ele começa procurando por *.dekstop entradas que suportam esse tipo MIME. Para cada arquivo *.desktop , ele procura no campo InitialPreference para determinar um bom candidato.
  4. como 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 .

Soluções alternativas propostas até o momento

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.

por Ondřej Grover 29.09.2018 / 11:55

0 respostas