Bisher habe ich den Alias für xdg-open verwendet.
alias o='xdg-open $@ 2> /dev/null'
Das Standardverhalten von xdg-open besteht darin, den Prozess im Vordergrund des aktuell ausgewählten Terminals zu starten. Das Öffnen von mit vim verknüpften Dateien (über xdg-mime) führte also beispielsweise dazu, dass der Editor in dem Terminal geöffnet wurde, von dem aus der Befehl eingegeben wurde.
Das Problem bestand darin, dass das Öffnen terminalbasierter Programme wie Mutt und Vim zwar ordnungsgemäß funktionierte, die HTML-Dateien beispielsweise jedoch im Standardbrowser geöffnet wurden, während mein Terminalfenster unbrauchbar wurde, da der Prozess im Vordergrund lief und darauf wartete, dass die Datei geschlossen wird.
Damit ich Dateien vom aktuell verwendeten Terminal öffnen und trotzdem im selben Fenster arbeiten kann, habe ich die folgende Funktion erstellt.
function o(){ xdg-open $@ 2> /dev/null & }
Dadurch wurde mein Problem behoben, aber wenn ich jetzt zB Dateien öffne, die mit vim verknüpft sind, wird mir die PID angezeigt und ich muss $fg eingeben, um auf den Editor zuzugreifen.
Ich habe versucht, den vim.desktop-Eintrag so zu bearbeiten, dass er zumindest in einem neuen Terminal gestartet wird, aber ich glaube, das ist ein ziemlich schlechter Workaround. Kann mir jemand einen Tipp geben, wie ich das richtig lösen kann? Vielen Dank im Voraus.
Antwort1
xdg-open
ist dafür ausgelegt, ein Viewer-Programm auszuführen und auf dessen Abschluss zu warten. Es ist nicht dafür ausgelegt, im Hintergrund ausgeführt zu werden, und wie Sie herausgefunden haben, wird es wahrscheinlich nicht sehr gut funktionieren. Sie hätten dasselbe Problem mit dem älteren Mailcap-System, das Programme ebenfalls im Vordergrund ausführt.
Es ist möglich, Ihre Shell-Funktion so zu ändern, dass sie immer in einem neuen Terminal geöffnet wird, aber das führt wahrscheinlich dazu, dass Sie eine große Anzahl nutzloser Terminals haben. Um Ihre Funktion nützlicher zu machen und sie Ihren Wünschen entsprechender arbeiten zu lassen, können Sie Folgendes tun:
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
}
Dadurch wird geprüft, ob Ihr Programm ein Terminal benötigt. Wenn ja, wird es im Vordergrund aufgerufen. Andernfalls wird es im Hintergrund aufgerufen. Derzeit werden jedoch keine URLs oder benutzerdefinierten Anwendungen verarbeitet. Sie müssen es entsprechend bearbeiten, damit Ihr System damit umgehen kann. Es ist dennoch ein Ausgangspunkt, auf dem Sie aufbauen können.