web-dev-qa-db-ja.com

どうすればgnome-terminalのすべてのインスタンスを正常に閉じることができますか

ターミナルのすべてのウィンドウを閉じる方法(gnome-terminalのすべてのインスタンスを終了する方法)を一度に、きれいに見つけようとしています。 「きれいに」とは、単にすべてのインスタンスを一度に強制終了するだけではないことを意味します。

alias poof='/usr/bin/killall gnome-terminal'    

私がやりたいのは、Mac OS Xでターミナルアプリケーションが動作するように動作させることです。そのプラットフォームでは、ターミナルで「command-Q」(a/k/a「Apple-Q」)を押すと、すべてのウィンドウ閉じられますが、特定のターミナルウィンドウで実行されているプロセスがある場合、ダイアログボックスが表示され、ウィンドウを閉じたいかどうかを尋ねられます。このようにして、忘れたプロセスを強制終了しないようにします(たとえば、vimを使用してファイルを編集します)。つまり、各ウィンドウの閉じるボタンをクリックしたかのように動作します。

この質問は以前に何らかの形で尋ねられてきましたが、満足のいく答えが得られていません(答えを誤解していない限り)。確かにUbuntu 14.04でこれを行う方法はありますか?コマンドラインで使用するか、キーボードショートカットを使用しますか(または両方)?

(そして、私は新しいので、スタイルのフォーマットを正しく守っていない場合はご容赦ください。)

4
gracious1

「最も友好的な」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)

使い方

  1. スクリプトには、wmctrlxdotoolの両方が必要です

    Sudo apt-get install xdotool
    Sudo apt-get install wmctrl
    
  2. スクリプトを空のファイルにコピーし、close_allterminals.pyとして保存します。

  3. 次のコマンドでテスト実行します。

    python3 /path/to/close_allterminals.py
    

    例:4つのgnome-terminalウィンドウが開き、左上のウィンドウは実行中のプロセスです。

    コマンドを実行した後、3つが自動的に閉じられ、実行中のプロセスを持つものはプロンプトを取得します。

  4. すべてが希望どおりに機能する場合は、ショートカットキーの組み合わせに追加します:システム設定>キーボード>ショートカット>カスタムショートカットを選択します。 「+」をクリックして、コマンドを追加します。

     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
9
Jacob Vlijm

この単純なシェルスクリプト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 

次に、新しいショートカットを作成し、このスクリプトを呼び出します。

1
A.B.