如何优雅地关闭 gnome-terminal 的所有实例

gra*_*us1 4 command-line shortcut-keys gnome-terminal

我试图找出如何一次干净地关闭终端的所有窗口(退出所有 gnome-terminal 实例)。通过“干净”,我的意思是它不仅仅是一次杀死所有实例,这就是我已经拥有的这个别名:

alias poof='/usr/bin/killall gnome-terminal'    
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jac*_*ijm 9

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

但是你可以做一个脚本加薪(全部)gnome-terminal窗口和模拟Ctrl+ Shift+ Q

复杂的是,当窗口分布在不同的工作空间时,这将不起作用。因此,下面的脚本会查找当前工作区上的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)
Run Code Online (Sandbox Code Playgroud)

如何使用

  1. 该脚本同时需要wmctrlxdotool

    sudo apt-get install xdotool
    sudo apt-get install wmctrl
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将脚本复制到一个空文件中,另存为close_allterminals.py.

  3. 通过以下命令测试运行它:

    python3 /path/to/close_allterminals.py
    
    Run Code Online (Sandbox Code Playgroud)

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

    运行该命令后,三个自动关闭,运行进程的一个得到提示:

  4. 如果一切正常,请将其添加到快捷键组合中:选择System Settings > Keyboard > Shortcuts > Custom Shortcuts。单击“+”并添加命令:

     python3 /path/to/close_allterminals.py
    
    Run Code Online (Sandbox Code Playgroud)

编辑

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

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

如果我运行脚本,所有gnome-terminal窗口都会有序地移动到当前工作区并升起。空闲窗口自动关闭,提示正在运行的窗口:

剧本

像第一个版本一样设置它。

sudo apt-get install xdotool
sudo apt-get install wmctrl
Run Code Online (Sandbox Code Playgroud)