Hasta ahora he estado usando el alias de xdg-open.
alias o='xdg-open $@ 2> /dev/null'
El comportamiento predeterminado para xdg-open es iniciar el proceso en primer plano del terminal seleccionado actualmente, por ejemplo, abrir archivos asociados con vim (a través de xdg-mime) resultó en que el editor se abriera en el terminal desde el cual se ingresó el comando.
El problema era que, aunque abrir programas basados en terminal como mutt y vim funcionaba correctamente, por ejemplo, los archivos .html se abrían en el navegador predeterminado mientras la ventana de mi terminal quedaba inutilizable debido al proceso que se ejecutaba en primer plano y esperaba que se cerrara el archivo.
Creé la siguiente función para poder abrir archivos desde la terminal utilizada actualmente y aún poder trabajar en la misma ventana.
function o(){ xdg-open $@ 2> /dev/null & }
Solucionó mi problema, pero ahora al abrir, por ejemplo, archivos asociados con vim, me muestra el PID y tengo que ingresar $ fg para acceder al editor.
Intenté editar la entrada vim.desktop para que al menos comenzara en una nueva terminal, pero creo que es una solución bastante mala. ¿Alguien podría darme un empujón sobre cómo resolver esto correctamente? Gracias de antemano.
Respuesta1
xdg-open
está diseñado para ejecutar un programa de visualización y esperar a que se complete. No está diseñado para ejecutarse en segundo plano y, como habrás descubierto, no es probable que funcione muy bien. Tendrías el mismo problema con el antiguo sistema mailcap, que también ejecuta programas en primer plano.
Es posible cambiar la función de su shell para que siempre se abra en una nueva terminal, pero eso probablemente causará que tenga una gran cantidad de terminales inútiles. Lo que podrías hacer, para que tu función sea más útil y funcione mejor como deseas, es hacer algo como esto:
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
}
Esto buscará si su programa requiere una terminal y, de ser así, la invocará en primer plano; de lo contrario, lo invocará en segundo plano. Sin embargo, actualmente esto no maneja URL ni aplicaciones personalizadas, y deberá editarlo adecuadamente para que su sistema lo pueda manejar. Sin embargo, es un punto de partida sobre el que se puede construir.