Exceções com xdg-open ao iniciar programas em segundo plano

Exceções com xdg-open ao iniciar programas em segundo plano

Até agora tenho usado o alias para xdg-open.

alias o='xdg-open $@ 2> /dev/null'

O comportamento padrão do xdg-open é iniciar o processo no primeiro plano do terminal atualmente selecionado, por exemplo, abrir arquivos associados ao vim (via xdg-mime) resultou na abertura do editor no terminal a partir do qual o comando foi inserido.

O problema era que, embora a abertura de programas baseados em terminal como mutt e vim funcionasse corretamente, os arquivos .html, por exemplo, eram abertos no navegador padrão enquanto minha janela de terminal ficava inutilizável devido ao processo em execução em primeiro plano e aguardando o fechamento do arquivo.

Criei a função abaixo para poder abrir arquivos do terminal usado atualmente e ainda poder trabalhar na mesma janela.

function o(){ xdg-open $@ 2> /dev/null & }

Ele resolveu meu problema, mas agora abrir, por exemplo, arquivos associados ao vim resulta em me mostrar o PID e tenho que inserir $ fg para acessar o editor.

Tentei editar a entrada vim.desktop para que pelo menos iniciasse em um novo terminal, mas acho que essa é uma solução muito ruim. Alguém poderia me dar uma dica sobre como resolver isso corretamente? Agradeço antecipadamente.

Responder1

xdg-openfoi projetado para executar um programa visualizador e aguardar sua conclusão. Ele não foi projetado para ser executado em segundo plano e, como você descobriu, provavelmente não funcionará muito bem. Você teria o mesmo problema com o sistema mailcap mais antigo, que também executa programas em primeiro plano.

É possível alterar a função do seu shell para sempre abrir em um novo terminal, mas isso provavelmente fará com que você tenha um grande número de terminais inúteis. O que você poderia fazer, para tornar sua função mais útil e funcionar mais como você deseja, é fazer algo assim:

o () {
    for i in "$@"
    do
        mimetype=$(xdg-mime query filetype "$i")
        prog=$(xdg-mime query default "$mimetype")
        if grep -qs Terminal=true "/usr/share/applications/$prog"
        then
            xdg-open "$i"
        else
            xdg-open "$i" >/dev/null 2>/dev/null &
        fi
    done
}

Isto irá verificar se o seu programa requer um terminal e, em caso afirmativo, irá invocá-lo em primeiro plano; caso contrário, ele será invocado em segundo plano. No entanto, atualmente isso não suporta URLs ou aplicativos personalizados, e você precisará editá-lo adequadamente para que seu sistema possa lidar com isso. É, no entanto, um ponto de partida sobre o qual você pode construir.

informação relacionada