Voici une autre solution adhérant à la méthode UNIX!
À première vue, il n'est pas aussi beau que le vôtre, @ t7ko:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
Mais supporte-moi! Il y a une beauté cachée en elle.
Bref, il
- a une structure linéaire , au lieu d'une structure arborescente, comme une au lieu de deux dimensions
- utilise une syntaxe shell plus connue .
- répond en fait à votre question: il localise la fenêtre.
(Que ces points soient des avantages dépend du contexte - ignorons simplement cet aspect * .)
Je vais montrer le même code dans une mise en page plus structurée ci-dessous, pour faciliter la compréhension étape par étape.
Mais notez que l'indentation est d'expliquer la commande - elle n'indique pas l'imbrication ou tout, tout est toujours un pipeline UNIX linéaire.
La même commande, juste divisée après les pipes ( |):
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
La commande complète, comme indiqué ci-dessus, donne l'emplacement des pixels de la gvimfenêtre, renvoyant les coordonnées des pixels par rapport au coin supérieur gauche de l'écran actuel (éventuellement virtuel) comme x,y, comme 42,433, ou peut -5375,-3809- être quand il se trouve sur le premier des quatre à quatre écrans virtuels et l'actuel se trouve quelque part sur le côté droit.
Pour l'instant, je raccourcirai la commande pour ne trouver qu'un ID de fenêtre X11 - c'est peut-être tout ce dont avait réellement besoin l'OP, pas sûr:
Le pipeline de commandes raccourci, une commande shell distincte sur chaque ligne:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO'
Maintenant, il commence à être lisible:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool search --all --pid {} --name 'TODO'
La xdotoolcommande searchest utilisée pour rechercher des fenêtres avec la " classe " gvim, en laissant de côté certaines fenêtres "internes". Le résultat est répertorié comme PID'(identificateurs de processus).
Pour chacun PID, en xargsexécute un autre xdotool search, en vérifiant le "nom" pour notre exemple de modèle TODO- après avoir vérifié le PID.
(Juste au cas où: les lignes se terminant par \- appelées lignes de continuation - doivent en fait se terminer par un \et aucun espace avant la nouvelle ligne.)
Revenons maintenant à la commande d'origine:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool \
search --all --pid {} --name 'TODO' \
getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
La partie restante répertorie certains détails sur la fenêtre, y compris la position. La sedcommande correspond et renvoie uniquement la x,yvaleur de position.
Par exemple, exécuter la commande en haut sur mon 16ème écran virtuel (de 4 par 4), avec un "TODO" gvimsur l'écran 1:
$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732
*) Avertissement: je préfère le code de @ t7ko. Beaucoup!
xdotoolsuce ... c'est une opération si simple et il n'y a aucun moyen de le faire avec élégance.