Je fais partie de ceux qui utilisent la touche Caps Lock pour changer de disposition parce que c'est trop fatiguant d'appuyer sur deux touches quand on peut en appuyer sur une. J'aimerais mĂȘme avoir deux touches inutiles : l'une pour passer Ă la disposition anglaise et l'autre pour la russe. Mais la seconde touche inutile est celle qui ouvre le menu contextuel, qui est tellement inutile que beaucoup de fabricants de portables l'Ă©liminent. Donc, je dois me contenter de ce que j'ai.
Et je ne veux pas chercher les icĂŽnes de mes fenĂȘtres sur la barre des tĂąches en changeant de fenĂȘtre, ni me concentrer sur les noms en faisant dĂ©filer Ă travers Alt+Tab, faire dĂ©filer les bureaux, etc. Je veux appuyer sur une combinaison de touches (idĂ©alement juste une, mais il n'y a plus de touches inutiles libres) et accĂ©der directement Ă la fenĂȘtre dont j'ai besoin. Par exemple comme ceci :
- Alt+F : Firefox
- Alt+D : Firefox (Navigation privée)
- Alt+T : Terminal
- Alt+M : Calculatrice
- Alt+E : IntelliJ Idea
- et cetera.
D'ailleurs, quand je presse, par exemple, sur Alt+M , je veux voir la calculatrice indĂ©pendamment du fait que ce programme soit ouvert ou non. Si c'est le cas, la fenĂȘtre doit prendre le focus, sinon, il faut lancer le programme souhaitĂ© et lui donner le focus lorsqu'il est chargĂ©.
Pour les situations qui ne sont pas couvertes par le scĂ©nario prĂ©cĂ©dent, je veux avoir des combinaisons de touches universelles sur lesquelles je peux facilement assigner n'importe quelle fenĂȘtre ouverte. Par exemple, j'ai attribuĂ© 10 combinaisons allant de Alt+1 Ă Alt+0, qui ne sont liĂ©es Ă aucun programme. Je peux tout simplement appuyer sur Alt+1 et la fenĂȘtre qui est actuellement au premier plan prendra le focus quand je presse Alt+1.
Sous le post, une description de quelques autres fonctionnalitĂ©s et une rĂ©ponse sur la façon de procĂ©der. Mais je prĂ©viens tout de suite que ce type de personnalisation peut crĂ©er une forte dĂ©pendance et mĂȘme un manque lorsque l'on doit utiliser Windows, Mac OS ou mĂȘme un autre ordinateur avec Linux.
En réalité, si l'on réfléchit, nous n'utilisons pas tant de programmes au quotidien. Un navigateur, un terminal, un IDE, un messager, un gestionnaire de fichiers, une calculatrice et, c'est à peu prÚs tout. Il ne faut pas tant de combinaisons de touches pour couvrir 95% des tùches quotidiennes.
Pour les programmes qui ont plusieurs fenĂȘtres ouvertes, l'une d'entre elles peut ĂȘtre dĂ©finie comme principale. Par exemple, plusieurs fenĂȘtres d'IntelliJ Idea ouvertes et assignĂ©es Ă Alt+E.Dans des conditions normales, lorsque l'on appuie sur Alt+E. , une des fenĂȘtres de ce programme s'ouvrira, probablement celle qui Ă©tait ouverte en premier. Cependant, si l'on appuie sur Alt+E. Lorsque l'une des fenĂȘtres de ce programme est dĂ©jĂ au premier plan, c'est cette fenĂȘtre qui sera dĂ©finie comme principale et c'est elle qui recevra le focus lors des pressions suivantes de la combinaison.
La fenĂȘtre principale peut ĂȘtre rĂ©assignĂ©e. Pour cela, il faut d'abord rĂ©initialiser la combinaison, puis attribuer une autre fenĂȘtre comme principale. Pour rĂ©initialiser la combinaison, il faut appuyer sur la combinaison elle-mĂȘme, puis sur la combinaison spĂ©ciale de rĂ©initialisation, que j'ai assignĂ©e Ă Alt+Backspace. Cela dĂ©clenchera un script qui annulera la dĂ©signation de la fenĂȘtre principale pour la combinaison prĂ©cĂ©dente. Ensuite, il sera possible de dĂ©signer une nouvelle fenĂȘtre principale comme cela a Ă©tĂ© dĂ©crit dans le paragraphe prĂ©cĂ©dent. La rĂ©initialisation de la fenĂȘtre attachĂ©e aux combinaisons universelles se fait de façon similaire.
L'introduction a été longue, mais je voulais d'abord expliquer ce que nous allons faire, puis décrire comment le faire.
Pour ceux qui en ont assez de lire
En résumé, le lien vers les scripts se trouve à la fin de l'article.
Mais il n'est toujours pas possible de l'installer et de l'utiliser immĂ©diatement. Il faudra d'abord comprendre comment le script trouve la fenĂȘtre nĂ©cessaire. Sans cela, il ne sera pas possible d'indiquer au script oĂč exactement transmettre le focus. Et il faut connaĂźtre la marche Ă suivre si jamais la fenĂȘtre appropriĂ©e n'est pas trouvĂ©e.
Je ne vais pas non plus me concentrer sur la façon de configurer l'exĂ©cution des scripts en appuyant sur des combinaisons de touches. Par exemple, dans KDE, cela se trouve dans les ParamĂštres systĂšme â Raccourcis â Raccourcis personnalisĂ©s. D'autres gestionnaires de fenĂȘtres devraient Ă©galement avoir quelque chose de similaire.
Présentation de wmctrl
Wmctrl est un outil en ligne de commande pour interagir avec le gestionnaire de fenĂȘtres X. C'est le programme clĂ© pour le script. Voyons rapidement comment il peut ĂȘtre utilisĂ©.
Pour commencer, affichons la liste des fenĂȘtres ouvertes :
$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell N/A Bureau â Plasma
0x01e0001e -1 plasmashell.plasmashell N/A Plasma
0x03a00001 0 skype.Skype N/A Skype
0x04400003 0 Navigator.Firefox N/A Google Traduction - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Meilleures publications du jour / Habr - Mozilla Firefox (Navigation privée)
...L'option -l affiche la liste de toutes les fenĂȘtres ouvertes, et -x ajoute Ă la sortie le nom de la classe (skype.Skype, Navigator.Firefox etc.). Nous aurons besoin ici de l'ID de la fenĂȘtre (colonne 1), du nom de la classe (colonne 3) et du titre de la fenĂȘtre (derniĂšre colonne).
On peut essayer d'activer une fenĂȘtre avec l'option -a:
$ wmctrl -a skype.Skype -xSi tout s'est bien passĂ©, une fenĂȘtre Skype devrait apparaĂźtre Ă l'Ă©cran. Si Ă la place de l'option -x utilisez l'option -i, donc au lieu du nom de la classe, il sera possible d'indiquer l'ID de la fenĂȘtre. Le problĂšme avec l'ID est qu'il change Ă chaque lancement de l'application et nous ne pouvons pas le connaĂźtre Ă l'avance. D'un autre cĂŽtĂ©, cet attribut dĂ©signe sans ambiguĂŻtĂ© la fenĂȘtre, ce qui peut ĂȘtre important lorsque l'application ouvre plus d'une fenĂȘtre. Nous en parlerons un peu plus loin.
Ă ce stade, nous devons nous souvenir que nous chercherons la fenĂȘtre souhaitĂ©e Ă l'aide d'une regex dans la sortie. wmctrl -lx. Mais cela ne signifie pas que nous devons nĂ©cessairement utiliser quelque chose de complexe. En gĂ©nĂ©ral, le nom de la classe ou du titre de la fenĂȘtre suffit.
En principe, l'idĂ©e principale devrait dĂ©jĂ ĂȘtre claire. Dans les paramĂštres des raccourcis clavier/shortcuts de votre gestionnaire de fenĂȘtres, nous configurons la combinaison souhaitĂ©e pour exĂ©cuter le script.
Comment utiliser des scripts
Tout d'abord, il faut installer des utilitaires en ligne de commande. wmctrl et xdotool:
$ sudo apt-get install wmctrl xdotoolEnsuite, il faut télécharger les scripts et les ajouter dans $PATH. Je les place généralement dans ~/bin:
$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetachSi le rĂ©pertoire ~/bin n'existait pas, il faut le crĂ©er et redĂ©marrer (ou se reconnecter), sinon ~/bin ne sera pas accessible dans $PATH. Si tout est fait correctement, les scripts devraient ĂȘtre accessibles depuis la console et l'auto-complĂ©tion devrait fonctionner avec la touche Tab.
Le script principal showwin prend 2 paramĂštres : le premier est la regex selon laquelle nous allons chercher la fenĂȘtre souhaitĂ©e, et le deuxiĂšme paramĂštre est la commande Ă exĂ©cuter si la fenĂȘtre souhaitĂ©e n'est pas trouvĂ©e.
Vous pouvez essayer d'exécuter le script, par exemple :
$ showwin "Mozilla Firefox$" firefoxSi Firefox est installĂ©, la fenĂȘtre doit recevoir le focus. MĂȘme si Firefox n'a pas Ă©tĂ© lancĂ©, il devrait dĂ©marrer.
Si cela a fonctionné, vous pouvez essayer de configurer l'exécution de commandes sur des combinaisons. Dans les paramÚtres des raccourcis clavier/shortcuts, ajoutez :
- Alt+F: showwin «Mozilla Firefox$» firefox
- Alt+D: showwin «Mozilla Firefox (navigation privée)$» «firefox -private-window»
- Alt+C: showwin «chromium-browser.Chromium-browser N*» chromium-browser
- Alt+X: showwin «chromium-browser.Chromium-browser I*» «chromium-browser -incognito»
- Alt+S: showwin «skype.Skype» skypeforlinux
- Alt+E: showwin «jetbrains-idea» idea.sh
Et cetera. Chaque personne peut configurer des combinaisons de touches et de logiciels comme elle le souhaite.
Si tout a Ă©tĂ© fait correctement, nous devrions pouvoir passer d'une fenĂȘtre Ă l'autre simplement en appuyant sur les touches spĂ©cifiĂ©es ci-dessus.
Je vais dĂ©cevoir les amateurs de Chrome : il est impossible de distinguer une fenĂȘtre normale d'une fenĂȘtre incognito par la sortie. wmctrl Il est impossible de les distinguer, car ils ont les mĂȘmes noms de classes et les titres de fenĂȘtre. Dans les regex proposĂ©s, les symboles N* et I* sont nĂ©cessaires uniquement pour diffĂ©rencier ces expressions rĂ©guliĂšres, afin de pouvoir assigner des fenĂȘtres principales diffĂ©rentes.
Pour rĂ©initialiser la fenĂȘtre principale de la combinaison prĂ©cĂ©dente (en fait pour les regex qui showwin ont Ă©tĂ© appelĂ©es pour la derniĂšre fois), il faut exĂ©cuter le script showwinDetach. J'ai assignĂ© ce script Ă une combinaison de touches Alt+Backspace.
Le script showwin a encore une autre fonction. Lorsqu'il est appelĂ© avec un seul paramĂštre (dans ce cas, le paramĂštre est simplement un identifiant), il ne vĂ©rifie pas du tout les regex et considĂšre toutes les fenĂȘtres comme adaptĂ©es. Cela peut sembler inutile en soi, mais cela nous permet de dĂ©finir n'importe quelle fenĂȘtre comme principale et de basculer rapidement vers cette fenĂȘtre.
J'ai configuré les combinaisons suivantes :
- Alt+1 : showwin «CustomKey1»
- Alt+2 : showwin «CustomKey2»
- âŠ
- Alt+0 : showwin «CustomKey0»
- Alt+Backspace : showwinDetach
Ainsi, je peux lier n'importe quelle fenĂȘtre Ă des combinaisons Alt+1âŠAlt+0. Il suffit d'appuyer sur Alt+1 pour lier la fenĂȘtre actuelle Ă cette combinaison. Je peux annuler le lien en appuyant sur Alt+1, et ensuite Alt+Backspace. Ou fermer la fenĂȘtre, cela fonctionne aussi.
Ensuite, je vais vous parler de quelques dĂ©tails techniques. Vous pouvez les ignorer et simplement essayer de configurer et voir. Mais je recommanderais tout de mĂȘme de comprendre les scripts d'autres personnes avant de les exĂ©cuter sur votre ordinateur :).
Comment distinguer les diffĂ©rentes fenĂȘtres d'une application
En principe, le tout premier exemple «wmctrl -a skype.Skype -x» fonctionnait et peut ĂȘtre utilisĂ©. Mais regardons encore une fois l'exemple avec Firefox, oĂč deux fenĂȘtres sont ouvertes :
0x04400003 0 Navigator.Firefox N/A Google Translate - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Meilleures publications de la journĂ©e / Habr - Mozilla Firefox (Navigation privĂ©e)La premiĂšre fenĂȘtre est en mode normal, tandis que la seconde est en navigation privĂ©e. Ces fenĂȘtres devraient ĂȘtre considĂ©rĂ©es comme des applications diffĂ©rentes et on devrait pouvoir basculer entre elles avec diffĂ©rentes combinaisons de touches.
Il faut complexifier le script qui change les fenĂȘtres. J'ai utilisĂ© la solution suivante : afficher la liste de toutes les fenĂȘtres, faire grep en utilisant une regex, prendre la premiĂšre ligne avec head, extraire la premiĂšre colonne (ce sera l'ID de la fenĂȘtre) avec cut, et basculer vers la fenĂȘtre par ID.
Il devrait y avoir une blague sur les expressions réguliÚres et deux problÚmes, mais en réalité, je n'utilise rien de compliqué. Les regex me sont nécessaires pour spécifier la fin de ligne (le symbole «$») et distinguer «Mozilla Firefox$» de «Mozilla Firefox (Navigation privée)$».
L'équipe est à peu prÚs comme suit :
$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`On peut dĂ©jĂ deviner la deuxiĂšme caractĂ©ristique du script : si grep ne renvoie rien, cela signifie que l'application dĂ©sirĂ©e n'est pas ouverte, et il faut la lancer en exĂ©cutant la commande du deuxiĂšme paramĂštre. Ensuite, il faut vĂ©rifier rĂ©guliĂšrement si la fenĂȘtre souhaitĂ©e s'est ouverte, afin de lui donner le focus. Je ne vais pas trop insister lĂ -dessus, ceux que cela intĂ©resse peuvent consulter le code source.
Quand les fenĂȘtres de l'application ne sont pas discernables
Donc, nous avons appris Ă passer le focus Ă la fenĂȘtre de l'application dĂ©sirĂ©e. Mais que faire si plusieurs fenĂȘtres de l'application sont ouvertes ? Ă laquelle d'entre elles doit-on donner le focus ? Le script ci-dessus donnera probablement le focus Ă la premiĂšre fenĂȘtre ouverte. Cependant, nous souhaiterions plus de flexibilitĂ©. Nous aimerions pouvoir mĂ©moriser quelle fenĂȘtre nous devons cibler et pouvoir nous y dĂ©placer prĂ©cisĂ©ment.
L'idĂ©e Ă©tait la suivante : si nous voulons mĂ©moriser un certain fenĂȘtre pour une combinaison de touches, nous devons appuyer sur cette combinaison lorsque la fenĂȘtre dĂ©sirĂ©e est au premier plan. Par la suite, lorsque nous appuierons sur cette combinaison, le focus sera donnĂ© Ă cette fenĂȘtre. Tant que la fenĂȘtre n'est pas fermĂ©e ou que nous ne rĂ©initialisons pas cette combinaison dans le script. showwinDetach.
L'algorithme du script showwin est Ă peu prĂšs le suivant :
- VĂ©rifiez si nous avons dĂ©jĂ mĂ©morisĂ© l'ID de la fenĂȘtre Ă laquelle nous devons donner le focus.
Si nous l'avons mĂ©morisĂ© et que cette fenĂȘtre existe toujours, nous lui donnons le focus et sortons. - Nous examinons quelle fenĂȘtre est actuellement au premier plan, et si elle correspond Ă notre requĂȘte, nous mĂ©morisons son ID pour y revenir plus tard et nous sortons.
- Nous passons Ă une fenĂȘtre appropriĂ©e si elle existe, ou nous ouvrons l'application nĂ©cessaire.
Pour savoir quelle fenĂȘtre est actuellement au premier plan, nous pouvons utiliser l'outil en ligne de commande xdotool, en convertissant sa sortie en format hexadĂ©cimal :
$ printf "0xx" `xdotool getwindowfocus`Il est plus simple de mémoriser des choses dans bash en créant des fichiers dans un systÚme de fichiers virtuel situé en mémoire. Dans Ubuntu, cela est monté par défaut dans /dev/shm/. Je ne peux rien dire sur d'autres distributions, j'espÚre que quelque chose de similaire existe aussi. On peut vérifier avec la commande :
$ mount -l | grep tmpfsLe script crĂ©era des rĂ©pertoires vides dans ce dossier, comme ceux-ci : /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. De plus, Ă chaque appel, il crĂ©era un symlink /dev/shm/$USER/showwin/showwin_last sur /dev/shm/$USER/showwin/$SEARCH_REGEX. Cela sera nĂ©cessaire pour pouvoir supprimer l'ID de la fenĂȘtre pour une combinaison donnĂ©e Ă l'aide du script. showwinDetach.
Qu'est-ce qui peut ĂȘtre amĂ©liorĂ©
Tout d'abord, les scripts doivent ĂȘtre configurĂ©s manuellement. Ătant donnĂ© la nĂ©cessitĂ© de s'impliquer et de faire beaucoup soi-mĂȘme, beaucoup d'entre vous n'essaieront mĂȘme pas de configurer le systĂšme. S'il Ă©tait possible d'installer simplement un paquet et de configurer tout plus facilement, cela pourrait peut-ĂȘtre gagner en popularitĂ©. Peut-ĂȘtre qu'un jour, mĂȘme l'application serait intĂ©grĂ©e dans les distributions standards.
Et il serait peut-ĂȘtre possible de simplifier les choses. Si, par l'ID de la fenĂȘtre, on peut savoir quel ID de processus l'a créée, et qu'avec l'ID du processus, on peut connaĂźtre la commande qui l'a gĂ©nĂ©rĂ©e, alors il serait possible d'automatiser la configuration. En rĂ©alitĂ©, je ne me suis pas penchĂ© sur la question de savoir si ce que j'ai Ă©crit dans ce paragraphe est possible. Personnellement, cela me convient comme cela fonctionne actuellement. Mais si quelqu'un d'autre que moi trouve cette approche pratique et l'amĂ©liore, je serai ravi d'utiliser une meilleure solution.
Un autre problĂšme, comme je l'ai dĂ©jĂ mentionnĂ©, est que dans certains cas, il est impossible de distinguer une fenĂȘtre d'une autre. Je n'ai observĂ© cela jusqu'Ă prĂ©sent qu'avec le mode incognito dans Chrome/Chromium, mais il est possible qu'il y ait d'autres cas similaires. En dernier recours, il y a toujours des combinaisons universelles. Alt+1âŠAlt+0. Encore une fois, j'utilise Firefox et, pour moi, ce problĂšme n'est pas significatif.
Cependant, un problĂšme qui m'affecte vraiment est que je travaille sur Mac OS et que je n'ai pas pu configurer quelque chose de similaire lĂ -bas. L'utilitaire wmctrl semble pouvoir ĂȘtre installĂ©, mais il ne fonctionne pas bien sur Mac OS. On peut faire quelque chose avec l'application Automator, mais elle est si lente qu'il est inconfortable de l'utiliser mĂȘme lorsqu'elle fonctionne. Je n'ai pas rĂ©ussi Ă configurer les combinaisons de touches pour qu'elles fonctionnent dans tous les programmes non plus. Si quelqu'un trouve une solution, je serais heureux de l'utiliser.
En conclusion
Il s'est avĂ©rĂ© qu'il y avait beaucoup plus Ă dire pour une fonctionnalitĂ© qui semblait si simple. Je voulais transmettre l'idĂ©e et ne pas surcharger le texte, mais je n'ai pas encore trouvĂ© comment l'expliquer simplement. Peut-ĂȘtre qu'un format vidĂ©o serait mieux, mais ici, ce n'est pas trĂšs apprĂ©ciĂ©.
J'ai briĂšvement parlĂ© de ce qu'il y a sous le capot du script et de la façon de le configurer. Je ne suis pas entrĂ© dans les dĂ©tails du script lui-mĂȘme, mais il ne fait que 50 lignes, il n'est pas difficile de le comprendre.
J'espĂšre que quelqu'un d'autre essaiera cette idĂ©e et l'apprĂ©ciera peut-ĂȘtre mĂȘme. Pour ma part, je peux dire que le script a Ă©tĂ© Ă©crit il y a environ 3 ans et qu'il m'est TRĂS pratique. Tellement pratique que cela me cause un sĂ©rieux inconfort lorsque je travaille sur d'autres ordinateurs. Et avec mon MacBook professionnel.
Source : habr.com
