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.)
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.
#!/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)
Le script nécessite à la fois wmctrl
et xdotool
Sudo apt-get install xdotool
Sudo apt-get install wmctrl
Copiez le script dans un fichier vide, enregistrez-le sous le nom close_allterminals.py
.
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:
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
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:
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
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.