2017-06-28 2 views
0

J'utilise i3wm. Je veux trouver un moyen de regrouper logiquement plusieurs fenêtres. J'ai essayé d'utiliser: mark, title_format.i3 comment grouper les fenêtres par regroupement défini par l'utilisateur

Mais je ne peux pas le faire fonctionner pour définir la même marque sur plusieurs fenêtres. Je ne peux pas non plus utiliser title_format pour faire correspondre plusieurs fenêtres.

Je veux juste exécuter une commande sur les fenêtres choisies qui appartiennent à un groupe logique I défini.

Y at-il de toute façon que je peux y parvenir?

Répondre

1

Vous pouvez réellement utiliser des marques pour cela. Il est vrai que les marques sont uniques, de sorte qu'une marque spécifique ne peut être que sur une seule fenêtre. Mais lors de la correspondance de tout critère - y compris con_mark - i3 utilise toujours des expressions régulières.

Il suffit donc de marquer les fenêtres d'une manière qui puisse correspondre à une seule expression régulière. Par exemple

mark groupA_1 
mark groupA_2 
mark groupA_3 
mark groupB_7 
mark groupB_8 
mark groupB_9 

Il est, bien sûr, important de prendre soin d'utiliser chaque marque qu'une seule fois, afin de ne pas supprimer par inadvertance une marque d'une autre fenêtre.

Si vous souhaitez ensuite exécuter une commande sur toutes les fenêtres appartenant au groupe A, vous devez juste ajouter le critère [con_mark="^groupA_"]. Par exemple

[con_mark="^groupA_"] move workspace A 
[con_mark="^groupA_"] kill 

Notez que pour un critère pour correspondre à i3 il suffit d'une sous-chaîne correspond. Donc [con_mark='a'] correspondrait à n'importe quelle marque qui contient au moins un caractère "a". Si vous voulez faire correspondre exactement la marque "a", vous devez ajouter ^ pour le début de la marque et $ pour la fin de la marque: [con_mark='^a$'].


La liste des marques actuellement définies peuvent être récupérées avec i3-msg -t get_marks (ou d'autres implémentations i3 IPC)

Voici un script rapide et sale en utilisant i3-msg et python pour marquer les fenêtres progressivement:

#!/bin/sh 
i3-msg -t get_marks |                                       
python -c '                                    
import json 
import sys                                
group = sys.argv[1] + "_"                            
marks = json.load(sys.stdin); 
indices = [int(mark.lstrip(group)) for mark in marks if mark.startswith(group)] or [0] 
print(sorted(indices)[-1] + 1) 
' "$1" | xargs -I {} i3-msg mark "$1_"{} 

Ceci passe la liste actuelle des marques au script en ligne python. Le script Python prend le nom du groupe ($1) comme argument, filtre toutes les marques qui commencent par le nom du groupe et supprime le nom du groupe, ne laissant que les chiffres. S'il n'y a pas encore de marques de ce groupe, la liste ne contient que 0. Ensuite, il obtient le nombre le plus élevé, ajoute 1 et imprime le résultat. Le résultat est ensuite passé à xargs, puis appelle à nouveau i3-msg pour créer une nouvelle marque. Comme indiqué, c'est rapide et sale, en mettant l'accent sur sale. Cela sera probablement le cas dans certains cas, par ex. si vous voulez nommer un groupe "foo" mais il y a déjà une marque nommée "foo_bar".

Enregistrez le script - par exemple comme i3groupmark - le rendre exécutable, puis l'appeler avec le nom du groupe en tant que premier paramètre:

i3groupmark groupA 
+0

grâce à la solution.J'ai pensé à cela, mais je ne sais pas comment générer une marque incrémentalement avec un seul bindsym au lieu de plusieurs bindsym parce que le nombre d'une telle fenêtre n'est pas fixé. Je ne veux pas non plus utiliser l'entrée i3 pour saisir manuellement des marques, car cela pose trop de problèmes. –

+0

J'ai compris, écrire un script bash peut y parvenir. –