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-open
foi 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.