Я пытаюсь выяснить, как правильно закрыть все окна Терминала (закрыть все экземпляры gnome-терминала). Под «чисто» я подразумеваю, что он не просто убивает сразу все экземпляры, что я и имею с этим псевдонимом:
alias poof='/usr/bin/killall gnome-terminal'
Что я хочу сделать, это заставить его вести себя так как приложение Terminal ведет себя в Mac OS X. На этой платформе, когда я нажимаю «command-Q» (a / k / a «Apple-Q») в Terminal, все окна закрываются, но если есть процессы, выполняющиеся в В любом конкретном окне терминала я получаю диалоговое окно, предупреждающее меня и спрашивающее, хочу ли я закрыть окно. Таким образом, я могу убедиться, что не убил процесс, о котором я забыл (например, редактирование файла с помощью vim). Другими словами, он действует так, как будто я нажимал кнопку закрытия в каждом окне.
Этот вопрос задавался в той или иной форме раньше, на него не было удовлетворительного ответа (если я не понял ответ). Наверняка есть способ сделать это в Ubuntu 14.04? Либо в командной строке, либо с помощью сочетания клавиш (или и того, и другого)?
(И, пожалуйста, прости меня, если я не правильно придерживаюсь каких-либо стилистических форматов, поскольку я новичок.)
Можно использовать этот простой сценарий оболочки 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
Затем создают новый ярлык и называют этот сценарий.
Даже "самое дружественное" уничтожение - команда закроет терминал Без спроса. Также 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)
Для сценария нужны оба wmctrl
и xdotool
sudo apt-get install xdotool
sudo apt-get install wmctrl
Скопируйте сценарий в пустой файл, сохраните его как close_allterminals.py
.
Тестовый прогон это командой:
python3 /path/to/close_allterminals.py
Пример: четыре gnome-terminal
открытые окна, в верхнем левом являются выполнением процесса:
После выполнения команды, три закрываются автоматически, тот с рабочим процессом получает подсказку:
Если все работы как Вам угодно добавляют его к комбинации сочетания клавиш: выберите System Settings> Keyboard> Shortcuts> Custom Shortcuts. Нажмите "+" и добавьте команду:
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