Gestion alternative des fenĂȘtres sous Linux

Je fais partie de ceux qui mettent en place des dispositions de commutation de verrouillage des majuscules parce que je suis trop paresseux pour appuyer sur 2 touches lorsque vous pouvez appuyer sur une. Je voudrais mĂȘme avoir 2 clĂ©s inutiles: j'en utiliserais une pour activer la mise en page en anglais et la seconde pour le russe. Mais la deuxiĂšme touche inutile est un appel au menu contextuel, qui est si inutile qu'il est coupĂ© par de nombreux fabricants d'ordinateurs portables. Vous devez donc vous contenter de ce que vous avez.


Et lorsque je change de fenĂȘtre, je ne veux pas chercher leurs icĂŽnes dans la barre des tĂąches, jeter un coup d'Ɠil aux noms lorsque je fais dĂ©filer Alt + Tab , faire dĂ©filer les bureaux, etc. Je veux appuyer sur une combinaison de touches (idĂ©alement, il n'y en a qu'une, mais il n'y a plus de touches inutiles gratuites ) et entrez immĂ©diatement dans 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: IdĂ©e IntelliJ
  • etc.

De plus, en appuyant, par exemple, Alt + M, je veux voir la calculatrice, que ce programme soit en cours d'exĂ©cution ou non. S'il est en cours d'exĂ©cution, sa fenĂȘtre doit recevoir le focus, et sinon, dĂ©marrez le programme souhaitĂ© et transfĂ©rez le focus lors du chargement.


Pour les cas qui ne sont pas couverts par le scĂ©nario prĂ©cĂ©dent, je souhaite disposer de raccourcis clavier universels auxquels vous pouvez facilement affecter n'importe laquelle des fenĂȘtres ouvertes. Par exemple, j'ai 10 combinaisons attribuĂ©es de Alt + 1 Ă  Alt + 0 qui ne sont liĂ©es Ă  aucun programme. Je peux simplement appuyer sur Alt + 1 et la fenĂȘtre actuellement mise au point recevra le focus lorsque Alt + 1 sera enfoncĂ©.


Sous la coupe, une description de quelques fonctionnalitĂ©s supplĂ©mentaires et une rĂ©ponse Ă  la façon de procĂ©der. Mais je vous avertis immĂ©diatement qu'une telle personnalisation "pour vous-mĂȘme" peut provoquer une forte dĂ©pendance et mĂȘme se casser si nĂ©cessaire, utiliser Windows, Mac OS ou mĂȘme l'ordinateur de quelqu'un d'autre avec Linux.


En fait, si vous y rĂ©flĂ©chissez, nous n'utilisons pas de nombreux programmes tous les jours. Un navigateur, un terminal, un IDE, une sorte de messager, un gestionnaire de fichiers, une calculatrice et, peut-ĂȘtre, c'est presque tout. Peu de combinaisons de touches sont nĂ©cessaires pour couvrir 95% des tĂąches quotidiennes.


Pour les programmes qui ont plusieurs fenĂȘtres ouvertes, l'une d'entre elles peut ĂȘtre affectĂ©e comme principale. Par exemple, plusieurs fenĂȘtres IdĂ©e IntelliJ sont ouvertes, affectĂ©es Ă  Alt + E. Dans des conditions normales, appuyer sur Alt + E ouvrira une fenĂȘtre de ce programme, probablement celle qui a Ă©tĂ© ouverte en premier. Cependant, si vous appuyez sur Alt + E alors que l'une des fenĂȘtres de ce programme est dĂ©jĂ  mise au point, cette fenĂȘtre sera affectĂ©e comme principale et la mise au point lui sera transfĂ©rĂ©e la prochaine fois que la combinaison sera pressĂ©e.


La fenĂȘtre principale peut ĂȘtre rĂ©affectĂ©e. Pour ce faire, vous devez d'abord rĂ©initialiser la combinaison, puis lui attribuer une autre fenĂȘtre comme principale. Pour rĂ©initialiser une combinaison, vous devez appuyer sur la combinaison elle-mĂȘme, puis sur une combinaison de rĂ©initialisation spĂ©ciale, je l'ai affectĂ©e Ă  Alt + Backspace . Cela invoquera un script qui dĂ©sattribuera la fenĂȘtre principale pour la combinaison prĂ©cĂ©dente. Et puis vous pouvez attribuer une nouvelle fenĂȘtre principale comme dĂ©crit dans le paragraphe prĂ©cĂ©dent. La rĂ©initialisation d'une fenĂȘtre liĂ©e Ă  des combinaisons universelles est similaire.


L'introduction s'est avérée longue, mais je voulais d'abord dire ce que nous ferons, puis expliquer comment le faire.


Pour ceux qui en ont assez de lire


Bref, un lien vers les scripts Ă  la fin de l'article.


Mais tout de mĂȘme, cela ne fonctionnera pas et sera immĂ©diatement installĂ© et utilisĂ©. Vous devez d'abord comprendre comment le script trouve la bonne fenĂȘtre. Sans cela, il ne fonctionnera pas pour dire au script exactement oĂč se concentrer. Et vous devez savoir quoi faire si vous ne trouvez pas soudainement une fenĂȘtre appropriĂ©e.


Et je ne me concentrerai pas sur la façon de configurer l'exĂ©cution du script en appuyant sur les combinaisons de touches. Par exemple, dans KDE, c'est dans ParamĂštres systĂšme → Raccourcis → Raccourcis personnalisĂ©s. Dans d'autres gestionnaires de fenĂȘtres, cela devrait Ă©galement l'ĂȘtre.


Présentation de wmctrl


Wmctrl est un utilitaire de console pour interagir avec X Window Manager. Il s'agit d'un programme de script clĂ©. Jetons un coup d'Ɠil Ă  la façon dont vous pouvez l'utiliser.


D'abord, listez les fenĂȘtres ouvertes:


$ wmctrl -lx 0x01e0000e -1 plasmashell.plasmashell N/A Desktop — Plasma 0x01e0001e -1 plasmashell.plasmashell N/A Plasma 0x03a00001 0 skype.Skype N/A Skype 0x04400003 0 Navigator.Firefox N/A Google  - Mozilla Firefox 0x04400218 0 Navigator.Firefox N/A     /  - Mozilla Firefox (Private Browsing) ... 

L'option -l affiche une liste de toutes les fenĂȘtres ouvertes et -x ajoute le nom de la classe ( skype.Skype , Navigator.Firefox , etc.) Ă  la sortie. Nous aurons besoin de l'id de la fenĂȘtre (colonne 1), du nom de la classe (colonne 3) et du nom de la fenĂȘtre (derniĂšre colonne).


Vous pouvez essayer d'activer une fenĂȘtre en utilisant l'option -a :


 $ wmctrl -a skype.Skype -x 

Si tout s'est dĂ©roulĂ© comme prĂ©vu, une fenĂȘtre Skype devrait apparaĂźtre Ă  l'Ă©cran. Si vous utilisez l'option -i au lieu de l'option -x , vous pouvez spĂ©cifier l'ID de fenĂȘtre au lieu du nom de classe. Avec id, le problĂšme est que l'id de la fenĂȘtre change Ă  chaque dĂ©marrage de l'application et que nous ne pouvons pas le savoir Ă  l'avance. En revanche, cet attribut indique uniquement une fenĂȘtre, ce qui peut ĂȘtre important lorsqu'une application ouvre plusieurs fenĂȘtres. À ce sujet un peu plus loin.


À ce stade, nous devons nous rappeler que nous rechercherons la fenĂȘtre souhaitĂ©e en utilisant l' expression rĂ©guliĂšre en fonction de la sortie de wmctrl -lx . Mais cela ne signifie pas que nous devons utiliser quelque chose de compliquĂ©. Habituellement, un nom de classe ou un nom de fenĂȘtre est suffisant.


En principe, l'idĂ©e de base doit dĂ©jĂ  ĂȘtre claire. Dans les paramĂštres globaux des raccourcis / raccourcis de votre gestionnaire de fenĂȘtres, nous configurons la combinaison souhaitĂ©e pour exĂ©cuter le script.


Comment utiliser les scripts


Vous devez d'abord installer les utilitaires de console wmctrl et xdotool :


 $ sudo apt-get install wmctrl xdotool 

Ensuite, vous devez télécharger les scripts et les ajouter à $ PATH . Je les mets 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 showwinDetach 

S'il n'y avait pas de rĂ©pertoire ~ / bin , alors il doit ĂȘtre crĂ©Ă© et redĂ©marrĂ© (ou connectĂ©), sinon ~ / bin n'entrera pas dans $ PATH . Si tout est fait correctement, les scripts doivent ĂȘtre accessibles Ă  partir de la console et la complĂ©tion des onglets devrait fonctionner.


Le script showwin principal prend 2 paramĂštres: le premier est regex, par lequel nous rechercherons la fenĂȘtre dĂ©sirĂ©e, et le second paramĂštre est la commande qui doit ĂȘtre exĂ©cutĂ©e si la fenĂȘtre dĂ©sirĂ©e n'a pas Ă©tĂ© trouvĂ©e.


Vous pouvez essayer d'exécuter un script, par exemple:


 $ showwin "Mozilla Firefox$" firefox 

Si Firefox est installĂ©, l'accent doit ĂȘtre mis sur sa fenĂȘtre. MĂȘme si Firefox n'Ă©tait pas en cours d'exĂ©cution, il aurait dĂ» dĂ©marrer.


Si cela s'est avéré, vous pouvez essayer de configurer l'exécution des commandes sur une combinaison. Dans les paramÚtres de raccourcis clavier / raccourcis globaux, ajoutez:


  • Alt + F: showwin "Mozilla Firefox $" firefox
  • Alt + D: showwin "Mozilla Firefox (navigation privĂ©e) $" "firefox -private-window"
  • Alt + C: showwin "navigateur chrome. Navigateur chrome N *" navigateur chrome
  • Alt + X: showwin "chrome-browser.Chromium-browser I *" "chromium-browser -incognito"
  • Alt + S: showwin "skype.Skype" skypeforlinux
  • Alt + E: showwin "jetbrains-idea" idea.sh

Et ainsi de suite: des combinaisons de touches et de logiciels que chacun peut configurer Ă  sa guise.
Si tout s'est bien passĂ©, alors selon les combinaisons ci-dessus, nous pouvons basculer entre les fenĂȘtres avec une simple touche.


Je vais dĂ©cevoir les amateurs de chrome: il est incognito de distinguer une fenĂȘtre ordinaire de la sortie wmctrl , ils ont les mĂȘmes noms de classe et les mĂȘmes en-tĂȘtes de fenĂȘtre. Dans l'expression rĂ©guliĂšre proposĂ©e, les caractĂšres N * et I * ne sont nĂ©cessaires que pour que ces habituĂ©s diffĂšrent les uns des autres et qu'ils puissent ĂȘtre affectĂ©s Ă  diffĂ©rentes fenĂȘtres comme fenĂȘtres principales.


Pour rĂ©initialiser la fenĂȘtre principale de la combinaison prĂ©cĂ©dente (en fait pour regex, qui showwin a Ă©tĂ© appelĂ© pour la derniĂšre fois), vous devez appeler le script showwinDetach . J'ai ce script affectĂ© Ă  la combinaison de touches Alt + Backspace .


Le script showwin a une autre fonctionnalitĂ©. Lorsqu'il est appelĂ© avec un paramĂštre (dans ce cas, le paramĂštre n'est qu'un identifiant), il ne vĂ©rifie pas du tout l'expression rĂ©guliĂšre et considĂšre que toutes les fenĂȘtres sont appropriĂ©es. En soi, cela semble inutile, cependant, de cette façon, nous pouvons dĂ©signer n'importe quelle fenĂȘtre comme principale et passer rapidement Ă  cette fenĂȘtre particuliĂšre.


J'ai configuré de telles combinaisons:


  • Alt + 1: showwin "CustomKey1"
  • Alt + 2: showwin "CustomKey2"
  • ...
  • Alt + 0: showwin "CustomKey0"
  • Alt + Retour arriĂšre: showwinDetach

De cette façon, je peux lier toutes les fenĂȘtres aux combinaisons Alt + 1 ... Alt + 0 . En appuyant simplement sur Alt + 1, je lie la fenĂȘtre actuelle Ă  cette combinaison. Je peux dissocier en appuyant sur Alt + 1 , puis sur Alt + Retour arriĂšre . Ou fermez la fenĂȘtre, cela fonctionne aussi.


De plus, je dirai quelques dĂ©tails techniques. Vous ne pouvez pas les lire, mais essayez simplement de les configurer et de les voir. Mais je recommanderais quand mĂȘme de comprendre les scripts des autres avant de les exĂ©cuter sur votre ordinateur :).


Comment distinguer diffĂ©rentes fenĂȘtres d'une mĂȘme application


En principe, le tout premier exemple de «wmctrl -a skype.Skype -x» fonctionnait et peut ĂȘtre utilisĂ©. Mais regardons Ă  nouveau l'exemple avec Firefox, dans lequel 2 fenĂȘtres sont ouvertes:


 0x04400003 0 Navigator.Firefox N/A Google  - Mozilla Firefox 0x04400218 0 Navigator.Firefox N/A     /  - Mozilla Firefox (Private Browsing) 

La premiĂšre fenĂȘtre est en mode normal et la seconde est la navigation privĂ©e. Je voudrais considĂ©rer ces fenĂȘtres comme des applications diffĂ©rentes et y basculer en utilisant diffĂ©rentes combinaisons de touches.


Vous devez compliquer le script qui change de fenĂȘtre. J'ai utilisĂ© cette solution: afficher une liste de toutes les fenĂȘtres, faire grep par regex, prendre la premiĂšre ligne avec head , rĂ©cupĂ©rer la premiĂšre colonne (ce sera l'id de la fenĂȘtre) avec cut , 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 fait je n'utilise rien de compliqué. J'ai besoin de réguliers pour pouvoir indiquer la fin de la ligne (le caractÚre «$») et faire la distinction entre «Mozilla Firefox $» et «Mozilla Firefox (navigation privée) $».


La commande ressemble Ă  ceci:


 $ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1` 

Ici, vous pouvez dĂ©jĂ  deviner la deuxiĂšme fonctionnalitĂ© du script: si grep n'a rien retournĂ©, alors l'application souhaitĂ©e n'est pas ouverte et vous devez l'exĂ©cuter en exĂ©cutant la commande Ă  partir du deuxiĂšme paramĂštre. Et puis vĂ©rifiez pĂ©riodiquement si la fenĂȘtre de droite s'est ouverte pour lui donner le focus. Je ne me concentrerai pas sur cela, ceux qui en ont besoin regarderont la source.


Lorsque les fenĂȘtres d'application ne sont pas distinguables


Nous avons donc appris Ă  transfĂ©rer le focus vers la fenĂȘtre de l'application souhaitĂ©e. Mais que faire si plusieurs fenĂȘtres d'une application sont ouvertes? Sur laquelle dois-je me concentrer? Le script ci-dessus passera, trĂšs probablement, Ă  la premiĂšre fenĂȘtre ouverte. Cependant, nous aimerions plus de flexibilitĂ©. Je voudrais pouvoir me souvenir de quelle fenĂȘtre nous avons besoin et passer Ă  cette fenĂȘtre.


L'idĂ©e Ă©tait la suivante: si nous voulons nous souvenir d'une certaine fenĂȘtre pour une combinaison de touches, alors nous devons appuyer sur cette combinaison lorsque la fenĂȘtre souhaitĂ©e est mise au point. À l'avenir, lorsque vous cliquerez sur cette combinaison, l'accent sera mis sur cette fenĂȘtre particuliĂšre. Jusqu'Ă  la fermeture de la fenĂȘtre ou une rĂ©initialisation de cette combinaison de scripts showwinDetach .


L' algorithme de script showwin ressemble Ă  ceci:


  • VĂ©rifiez si nous nous sommes dĂ©jĂ  souvenus de l'identifiant de la fenĂȘtre Ă  laquelle le focus doit ĂȘtre passĂ©.
    Si vous vous en souvenez et qu'une telle fenĂȘtre existe toujours, nous y transfĂ©rons le focus et sortons.
  • Nous regardons quelle fenĂȘtre est actuellement au point, et si elle correspond Ă  notre demande, alors nous nous souviendrons de son identifiant pour y aller Ă  l'avenir et quitter.
  • Nous passons Ă  au moins une fenĂȘtre appropriĂ©e si elle existe ou ouvrons l'application souhaitĂ©e.

Vous pouvez dĂ©couvrir quelle fenĂȘtre est actuellement au point en utilisant l'utilitaire de console xdotool, convertissant sa sortie au format hexadĂ©cimal:


 $ printf "0x%08x" `xdotool getwindowfocus` 

Se souvenir de quelque chose dans bash est le moyen le plus simple de créer des fichiers dans un systÚme de fichiers virtuel en mémoire. Sur Ubuntu, ceci est connecté par défaut dans / dev / shm / . Je ne peux rien dire sur les autres distributions, j'espÚre que cela existe aussi. Vous pouvez voir la commande:


 $ mount -l | grep tmpfs 

Le script crĂ©era des rĂ©pertoires vides dans ce dossier, comme ceci: / dev / shm / $ USER / showwin / $ SEARCH_REGEX / $ WINDOW_ID . De plus, Ă  chaque appel, il crĂ©era un lien symbolique / dev / shm / $ USER / showwin / showwin_last sur / dev / shm / $ USER / showwin / $ SEARCH_REGEX . Cela sera nĂ©cessaire afin de supprimer l'ID de fenĂȘtre pour une combinaison spĂ©cifique si nĂ©cessaire en utilisant le script showwinDetach .


Ce qui peut ĂȘtre amĂ©liorĂ©


Tout d'abord, les scripts doivent ĂȘtre configurĂ©s Ă  la main. Certes, en raison de la nĂ©cessitĂ© de se plonger et de faire beaucoup avec vos mains, beaucoup d'entre vous n'essaieront mĂȘme pas de configurer le systĂšme. S'il Ă©tait possible de simplement mettre le paquet et de tout configurer plus facilement, alors il gagnerait peut-ĂȘtre en popularitĂ©. Et lĂ , regardez les distributions standard, elles entailleraient l'application.


Et peut-ĂȘtre plus facile peut ĂȘtre fait. Si l'ID de la fenĂȘtre vous permet de trouver l'ID du processus qui l'a crĂ©Ă© et l'ID du processus pour savoir quelle Ă©quipe l'a crĂ©Ă©, vous pouvez automatiser la configuration. En fait, je ne comprenais pas si ce que j'avais Ă©crit dans ce paragraphe Ă©tait possible. Le fait est que pour moi personnellement, cela correspond Ă  la façon dont cela fonctionne maintenant. Mais si pour quelqu'un d'autre que moi, toute l'approche semble pratique et que quelqu'un l'amĂ©liore, alors je serai heureux d'utiliser la meilleure solution.


Un autre problĂšme, comme je l'ai dĂ©jĂ  Ă©crit, est que dans certains cas, les fenĂȘtres ne peuvent pas ĂȘtre distinguĂ©es les unes des autres. Jusqu'Ă  prĂ©sent, je n'ai vu cela qu'avec incognito en chrome / chrome, mais peut-ĂȘtre ailleurs, il y a quelque chose de similaire. Dans les cas extrĂȘmes, il existe toujours une variante des combinaisons universelles Alt + 1 ... Alt + 0 . Encore une fois, j'utilise Firefox et pour moi personnellement ce problĂšme n'est pas significatif.


Mais un problĂšme important pour moi est que j'utilise Mac OS pour le travail et je ne pouvais rien configurer de tel lĂ -bas. Il semble ĂȘtre en mesure de fournir l'utilitaire wmctrl , mais il ne fonctionne pas vraiment sur Mac OS. Quelque chose peut ĂȘtre fait avec l'application Automator , mais elle est si lente qu'il n'est pas pratique de l'utiliser mĂȘme lorsqu'elle fonctionne. Je ne pouvais pas non plus configurer les combinaisons de touches pour qu'elles fonctionnent dans tous les programmes. Si tout Ă  coup quelqu'un trouve une solution - je serai heureux de l'utiliser.


Au lieu d'une conclusion


Il s'est avĂ©rĂ© de maniĂšre inattendue beaucoup de mots pour une fonctionnalitĂ© aussi simple en apparence. Je voulais transmettre l'idĂ©e et ne pas surcharger le texte, mais je n'ai pas encore trouvĂ© comment le dire plus facilement. Ce serait peut-ĂȘtre mieux en format vidĂ©o, mais ils n'aiment pas ça comme ça.


J'ai parlĂ© un peu de ce qui se trouve sous le capot du script et comment le configurer. Je ne suis pas entrĂ© dans les dĂ©tails du script lui-mĂȘme, mais ce n'est que 50 lignes, ce n'est pas difficile Ă  comprendre.


J'espĂšre que quelqu'un d'autre tentera cette idĂ©e et l'apprĂ©ciera peut-ĂȘtre mĂȘme. Je peux dire par moi-mĂȘme que le script a Ă©tĂ© Ă©crit il y a environ 3 ans et qu'il est TRÈS pratique pour moi. Il est si pratique qu'il provoque une gĂȘne grave lorsque vous travaillez avec les ordinateurs d'autres personnes. Et avec un macbook fonctionnel.


Lien de script

Source: https://habr.com/ru/post/fr483846/


All Articles