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
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. –
J'ai compris, écrire un script bash peut y parvenir. –