Как я могу изящно закрыть все экземпляры gnome-терминала

Я пытаюсь выяснить, как правильно закрыть все окна Терминала (закрыть все экземпляры gnome-терминала). Под «чисто» я подразумеваю, что он не просто убивает сразу все экземпляры, что я и имею с этим псевдонимом:

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

Что я хочу сделать, это заставить его вести себя так как приложение Terminal ведет себя в Mac OS X. На этой платформе, когда я нажимаю «command-Q» (a / k / a «Apple-Q») в Terminal, все окна закрываются, но если есть процессы, выполняющиеся в В любом конкретном окне терминала я получаю диалоговое окно, предупреждающее меня и спрашивающее, хочу ли я закрыть окно. Таким образом, я могу убедиться, что не убил процесс, о котором я забыл (например, редактирование файла с помощью vim). Другими словами, он действует так, как будто я нажимал кнопку закрытия в каждом окне.

Этот вопрос задавался в той или иной форме раньше, на него не было удовлетворительного ответа (если я не понял ответ). Наверняка есть способ сделать это в Ubuntu 14.04? Либо в командной строке, либо с помощью сочетания клавиш (или и того, и другого)?

(И, пожалуйста, прости меня, если я не правильно придерживаюсь каких-либо стилистических форматов, поскольку я новичок.)

4
задан 17 July 2018 в 02:07

2 ответа

Можно использовать этот простой сценарий оболочки 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 

Затем создают новый ярлык и называют этот сценарий.

3
ответ дан 17 July 2018 в 12:07

Даже "самое дружественное" уничтожение - команда закроет терминал Без спроса. Также 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)

Как использовать

  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. Если все работы как Вам угодно добавляют его к комбинации сочетания клавиш: выберите 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
9
ответ дан 17 July 2018 в 12:07

Другие вопросы по тегам:

Похожие вопросы: