ターミナルのすべてのウィンドウを閉じる方法(gnome-terminalのすべてのインスタンスを終了する方法)を一度に、きれいに見つけようとしています。 「きれいに」とは、単にすべてのインスタンスを一度に強制終了するだけではないことを意味します。
alias poof='/usr/bin/killall gnome-terminal'
私がやりたいのは、Mac OS Xでターミナルアプリケーションが動作するように動作させることです。そのプラットフォームでは、ターミナルで「command-Q」(a/k/a「Apple-Q」)を押すと、すべてのウィンドウ閉じられますが、特定のターミナルウィンドウで実行されているプロセスがある場合、ダイアログボックスが表示され、ウィンドウを閉じたいかどうかを尋ねられます。このようにして、忘れたプロセスを強制終了しないようにします(たとえば、vimを使用してファイルを編集します)。つまり、各ウィンドウの閉じるボタンをクリックしたかのように動作します。
この質問は以前に何らかの形で尋ねられてきましたが、満足のいく答えが得られていません(答えを誤解していない限り)。確かにUbuntu 14.04でこれを行う方法はありますか?コマンドラインで使用するか、キーボードショートカットを使用しますか(または両方)?
(そして、私は新しいので、スタイルのフォーマットを正しく守っていない場合はご容赦ください。)
「最も友好的な」killコマンドでさえも、問い合わせることなく端末を閉じます。また、man gnome-terminal
は、GUIのようにウィンドウを閉じるためのソリューションを提供しません。
ただし、スクリプトで(すべての)gnome-terminal
ウィンドウを発生させ、シミュレートすることはできます Ctrl+Shift+Q。
複雑なのは、ウィンドウが異なるワークスペースに広がっている場合、これが機能しないことです。したがって、以下のスクリプトは、currentワークスペースでgnome-terminal
ウィンドウを検索し、上記で説明したようにそれらを処理します。
#!/usr/bin/env python3
import subprocess
import time
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
try:
pid = subprocess.check_output(["pidof", "gnome-terminal"]).decode("utf-8").strip()
except:
pass
else:
res = get_res()
ws = subprocess.check_output(["wmctrl", "-lpG"]).decode("utf-8").splitlines()
for t in [w for w in ws if pid in w]:
window = t.split()
if all([0 < int(window[3]) < res[0], 0 < int(window[4]) < res[1]]) :
w_id = window[0]
subprocess.Popen(["wmctrl", "-ia", w_id])
subprocess.call(["xdotool", "key", "Ctrl+Shift+Q"])
time.sleep(0.2)
スクリプトには、wmctrl
とxdotool
の両方が必要です
Sudo apt-get install xdotool
Sudo apt-get install wmctrl
スクリプトを空のファイルにコピーし、close_allterminals.py
として保存します。
次のコマンドでテスト実行します。
python3 /path/to/close_allterminals.py
例:4つのgnome-terminal
ウィンドウが開き、左上のウィンドウは実行中のプロセスです。
コマンドを実行した後、3つが自動的に閉じられ、実行中のプロセスを持つものはプロンプトを取得します。
すべてが希望どおりに機能する場合は、ショートカットキーの組み合わせに追加します:システム設定>キーボード>ショートカット>カスタムショートカットを選択します。 「+」をクリックして、コマンドを追加します。
python3 /path/to/close_allterminals.py
以下のバージョンは、他のワークスペース上のgnome-terminal
ウィンドウも処理します。すべてのウィンドウは、安全な方法で閉じる前に現在のワークスペースに移動されます。
例:
合計で6つのgnome-terminal
ウィンドウを4つの異なるワークスペースで開いており、その多くでプロセスが実行されています。
スクリプトを実行すると、すべてのgnome-terminal
ウィンドウが現在のワークスペースに順番に移動されて表示されます。アイドルウィンドウは自動的に閉じられ、実行中のプロセスのあるウィンドウが表示されます。
最初のバージョンのように設定します。
#!/usr/bin/env python3
import subprocess
import time
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
try:
pid = subprocess.check_output(["pidof", "gnome-terminal"]).decode("utf-8").strip()
except:
pass
else:
res = get_res()
ws = subprocess.check_output(["wmctrl", "-lpG"]).decode("utf-8").splitlines()
matches = [t.split() for t in [w for w in ws if pid in w]]
pos = 100
for match in matches:
w_id = match[0]
subprocess.call(["xdotool", "windowmove", "--sync", match[0], str(pos), str(pos/2) ])
subprocess.call(["wmctrl", "-ia", w_id])
subprocess.call(["xdotool", "key", "Ctrl+Shift+Q"])
pos = pos+100
この単純なシェルスクリプトclose_terminals
を使用できます。
#!/bin/bash
xdotool search --class "terminal" | while read id
do
xdotool windowactivate "$id" &>/dev/null
xdotool key ctrl+shift+q
sleep 0.2
done
次に、新しいショートカットを作成し、このスクリプトを呼び出します。