web-dev-qa-db-fra.com

Comment puis-je fermer gracieusement toutes les instances de gnome-terminal

J'essaie de savoir comment fermer toutes les fenêtres de Terminal (quitter toutes les instances de gnome-terminal) à la fois, proprement. Par "proprement", je veux dire que cela ne tue pas simplement toutes les instances en même temps, ce qui est ce que j'ai déjà avec cet alias:

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

Ce que je veux faire est de le faire se comporter comme l’application Terminal se comporte sous Mac OS X. Sur cette plate-forme, lorsque je clique sur "commande-Q" (a/k/a "Apple-Q") dans Terminal, toutes les fenêtres sont fermés, mais si des processus s'exécutent dans une fenêtre de terminal particulière, une boîte de dialogue m'avertit et me demandant si je veux toujours fermer la fenêtre. De cette façon, je peux m'assurer que je ne tue pas un processus que j'ai oublié (par exemple, éditer un fichier avec vim). En d'autres termes, c'est comme si j'avais cliqué sur le bouton de fermeture de chaque fenêtre.

Cette question a déjà été posée sous une forme ou une autre auparavant, elle n’a pas reçu de réponse satisfaisante (à moins que j’ai mal compris la réponse). Il existe sûrement un moyen de faire cela dans Ubuntu 14.04? Soit dans la ligne de commande ou en utilisant un raccourci clavier (ou les deux)?

(Et s'il vous plaît, pardonnez-moi si je ne respecte pas les formats stylistiques, car je suis nouvelle.)

4
gracious1

Même le "plus amical" kill-command fermera le terminal sans rien demander. De plus, man gnome-terminal ne donne aucune solution pour fermer la fenêtre comme dans l'interface graphique.

Vous pouvez cependant créer un script (all all) gnome-terminal windows et simuler Ctrl+Shift+Q.

Une complexité est que cela ne fonctionnera pas lorsque les fenêtres sont réparties sur différents espaces de travail. Le script ci-dessous recherche donc la fenêtre gnome-terminal sur l'espace de travail actuel et en prend soin comme expliqué ci-dessus.

Le scénario

#!/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)

Comment utiliser

  1. Le script nécessite à la fois wmctrl et xdotool

    Sudo apt-get install xdotool
    Sudo apt-get install wmctrl
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom close_allterminals.py.

  3. Testez-le avec la commande:

    python3 /path/to/close_allterminals.py
    

    Exemple: quatre gnome-terminal _ fenêtres ouvertes. Dans la partie supérieure gauche, un processus est en cours d'exécution:

    Après l'exécution de la commande, trois d'entre elles sont automatiquement fermées. Celui qui exécute le processus en cours reçoit une invite:

  4. Si tout fonctionne comme vous le souhaitez, ajoutez-le à une combinaison de touches de raccourci: choisissez Paramètres système> Clavier> Raccourcis> Raccourcis personnalisés . Cliquez sur le "+" et ajoutez la commande:

     python3 /path/to/close_allterminals.py
    

Modifier

La version ci-dessous prend également en charge gnome-terminal fenêtres sur un autre espace de travail: toutes les fenêtres sont déplacées vers l'espace de travail actuel avant d'être fermées de manière sécurisée.

Un exemple:
J'ai au total six gnome-terminal fenêtres ouvertes sur quatre espaces de travail différents, dans lesquels nombre d’entre elles comportent des processus:

Si j'exécute le script, toutes les fenêtres gnome-terminal sont correctement déplacées vers l'espace de travail actuel et levées. Les fenêtres inactives étant automatiquement fermées, celles avec un processus en cours sont invitées:

Le scénario

Configurez-le comme la première version.

#!/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
Jacob Vlijm

Vous pouvez utiliser ce simple script 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 

Créez ensuite un nouveau raccourci et appelez ce script.

1
A.B.