如何正常关闭所有 gnome-terminal 实例

如何正常关闭所有 gnome-terminal 实例

我正在尝试找出如何一次性彻底关闭所有终端窗口(退出所有 gnome-terminal 实例)。“彻底”的意思是,它不会一次性简单地杀死所有实例,而我已经用这个别名做到了这一点:

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

我想要做的是让它像 Mac OS X 中的终端应用程序一样运行。在该平台上,当我在终端中按下“command-Q”(又名“Apple-Q”)时,所有窗口都会关闭,但如果任何特定终端窗口中有进程正在运行,我就会收到一个对话框警告我,并询问我是否仍要关闭该窗口。这样我就可以确保不会终止我忘记的进程(例如使用 vim 编辑文件)。换句话说,它就像我点击了每个窗口上的关闭按钮一样。

这个问题以前曾以某种形式被问过,但还没有得到令人满意的回答(除非我误解了答案)。在 Ubuntu 14.04 中肯定有办法做到这一点?在命令行中还是使用键盘快捷键(或两者兼而有之)?

(如果我没有正确遵循任何风格格式,请原谅我,因为我是新手。)

答案1

即使是最“友好”的 kill- 命令也会不经询问就关闭终端。而且man gnome-terminal没有提供任何像在 GUI 中那样关闭窗口的解决方案。

但是,您可以编写一个脚本来调出(所有)gnome-terminal窗口并模拟Ctrl++ 。ShiftQ

复杂性在于,当窗口分布在不同的工作区时,这将不起作用。因此,下面的脚本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. 脚本wmctrl需要xdotool

    sudo apt-get install xdotool
    sudo apt-get install wmctrl
    
  2. 将脚本复制到一个空文件中,保存为close_allterminals.py

  3. 通过命令测试运行:

    python3 /path/to/close_allterminals.py
    

    示例:gnome-terminal打开了四个窗口,左上角的窗口正在运行一个进程:

    运行命令后,三个都自动关闭,正在运行的进程会得到提示:

  4. 如果一切顺利,请将其添加到快捷键组合:选择系统设置 > 键盘 > 快捷键 > 自定义快捷键. 点击“+”并添加命令:

     python3 /path/to/close_allterminals.py
    

编辑

下面的版本还处理gnome-terminal其他工作区上的窗口:所有窗口在以安全的方式关闭之前都会移动到当前工作区。

举个例子:
我在四个不同的工作区中总共gnome-terminal打开了六个窗口,其中许多窗口都有进程在运行:

如果我运行该脚本,所有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

答案2

你可以使用这个简单的 shell 脚本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 

然后创建一个新的快捷方式并调用该脚本。

相关内容