我正在尝试找出如何一次性彻底关闭所有终端窗口(退出所有 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)
如何使用
脚本
wmctrl
需要xdotool
sudo apt-get install xdotool sudo apt-get install wmctrl
将脚本复制到一个空文件中,保存为
close_allterminals.py
。通过命令测试运行:
python3 /path/to/close_allterminals.py
示例:
gnome-terminal
打开了四个窗口,左上角的窗口正在运行一个进程:运行命令后,三个都自动关闭,正在运行的进程会得到提示:
如果一切顺利,请将其添加到快捷键组合:选择系统设置 > 键盘 > 快捷键 > 自定义快捷键. 点击“+”并添加命令:
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
然后创建一个新的快捷方式并调用该脚本。