これまでは xdg-open のエイリアスを使用していました。
alias o='xdg-open $@ 2> /dev/null'
xdg-open のデフォルトの動作は、現在選択されているターミナルのフォアグラウンドでプロセスを開始することです。そのため、たとえば、vim に関連付けられたファイル (xdg-mime 経由) を開くと、コマンドが入力されたターミナルでエディターが開かれます。
問題は、mutt や vim などのターミナル ベースのプログラムを開くと正常に動作するものの、たとえば .html ファイルはデフォルトのブラウザーで開かれ、プロセスがフォアグラウンドで実行され、ファイルが閉じられるのを待機しているため、ターミナル ウィンドウが使用できなくなることでした。
現在使用しているターミナルからファイルを開いて、同じウィンドウで作業できるように、以下の関数を作成しました。
function o(){ xdg-open $@ 2> /dev/null & }
問題は解決しましたが、たとえば vim に関連付けられたファイルを開くと PID が表示され、エディターにアクセスするには $ fg と入力する必要があります。
少なくとも新しいターミナルで起動するように vim.desktop エントリを編集しようとしましたが、これはかなり悪い回避策だと思います。これを適切に解決する方法について、誰かヒントをくれませんか? よろしくお願いします。
答え1
xdg-open
ビューア プログラムを実行し、完了するまで待機するように設計されています。バックグラウンドで実行するようには設計されておらず、おわかりのように、うまく動作しない可能性があります。プログラムをフォアグラウンドで実行する古い mailcap システムでも同じ問題が発生します。
シェル関数を常に新しいターミナルで開くように変更することは可能ですが、そうすると無駄なターミナルが大量に発生する可能性があります。関数をより便利にし、希望どおりに動作させるには、次のようにします。
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
}
これは、プログラムがターミナルを必要とするかどうかを確認し、必要な場合はフォアグラウンドで呼び出します。そうでない場合はバックグラウンドで呼び出します。ただし、これは現在 URL やカスタム アプリケーションを処理しないため、システムで処理できるように適切に編集する必要があります。それでも、これは構築できる出発点です。