Alternatywne zarządzanie oknami w systemie Linux

Należę do osób, które ustawiają Caps Lock do przełączania układów, ponieważ jestem zbyt leniwy, aby nacisnąć 2 klawisze, gdy mogę nacisnąć jeden. Przydałyby mi się nawet 2 niepotrzebne klawisze: jednego użyłbym do włączenia układu angielskiego, a drugiego do rosyjskiego. Ale drugim zbędnym klawiszem jest wywołanie menu kontekstowego, które jest na tyle niepotrzebne, że wielu producentów laptopów je wycina. Musisz więc zadowolić się tym, co masz.

Nie chcę też szukać ich ikon na pasku zadań podczas przełączania okien ani łapać nazw podczas przewijania Alt + Tab, przewijanie pulpitów itp. Chcę nacisnąć kombinację klawiszy (najlepiej tylko jeden, ale nie ma już wolnych, niepotrzebnych klawiszy) i od razu dostać się do potrzebnego mi okna. Na przykład tak:

  • Alt+F: Firefox
  • Alt+D: Firefox (przeglądanie prywatne)
  • Alt+T: Terminal
  • Alt+M: Kalkulator
  • Alt+E: Pomysł IntelliJ
  • itp.

Co więcej, naciskając np. dalej Alt+M Chcę zobaczyć kalkulator niezależnie od tego, czy ten program jest aktualnie uruchomiony. Jeśli jest uruchomiony, należy ustawić fokus na jego oknie, a jeśli nie, uruchomić żądany program i przenieść fokus po załadowaniu.

Dla przypadków, których nie uwzględnił poprzedni skrypt, chcę mieć uniwersalne kombinacje klawiszy, które można łatwo przypisać do dowolnego z otwartych okien. Przykładowo mam przypisanych 10 kombinacji z Alt + 1 do Alt + 0, które nie są powiązane z żadnymi programami. Mogę po prostu kliknąć Alt + 1 a okno, które jest aktualnie aktywne, zostanie uaktywnione po kliknięciu Alt + 1.

Pod wycięciem znajduje się opis kilku kolejnych funkcji oraz odpowiedź jak można to zrobić. Ale od razu ostrzegam, że taka personalizacja „dla siebie” może spowodować poważne uzależnienie, a nawet wycofanie się, jeśli będziesz musiał korzystać z systemu Windows, Mac OS, a nawet cudzego komputera z Linuksem.

Tak naprawdę, jeśli się nad tym zastanowić, nie używamy na co dzień tak wielu programów. Przeglądarka, terminal, IDE, jakiś komunikator, menedżer plików, kalkulator i być może to prawie wszystko. Nie ma wielu kombinacji klawiszy potrzebnych do wykonania 95% codziennych zadań.

W przypadku programów, które mają otwartych kilka okien, jedno z nich można wyznaczyć jako główne. Na przykład masz otwartych i przypisanych do wielu okien IntelliJ Idea Alt + E. W normalnych warunkach po naciśnięciu Alt + E otworzy się jakieś okno tego programu, najprawdopodobniej to, które zostało otwarte jako pierwsze. Jeśli jednak klikniesz Alt + E gdy jedno z okien tego programu będzie już aktywne, to właśnie to okno zostanie przypisane jako główne i to właśnie ono będzie fokusowane po naciśnięciu kolejnych kombinacji.

Można zmienić przypisanie głównego okna. Aby to zrobić należy najpierw zresetować kombinację, a następnie przypisać do niej kolejne okno jako okno główne. Aby zresetować kombinację, musisz nacisnąć samą kombinację, a następnie specjalną kombinację resetowania, do której mam przypisaną Alt+Backspace. Spowoduje to wywołanie skryptu, który usunie przypisanie głównego okna dla poprzedniej kombinacji. Następnie możesz przypisać nowe okno główne, jak opisano w poprzednim akapicie. Resetowanie połączonego okna do kombinacji uniwersalnych odbywa się w ten sam sposób.

Wprowadzenie okazało się długie, ale chciałem najpierw powiedzieć, co będziemy robić, a potem wyjaśnić, jak to zrobić.

Dla tych, którzy mają dość czytania

Krótko mówiąc, link do skryptów znajduje się na końcu artykułu.

Ale nadal nie będziesz mógł go od razu zainstalować i używać. Najpierw musisz dowiedzieć się, w jaki sposób skrypt znajduje żądane okno. Bez tego nie będzie możliwe wskazanie skryptowi, gdzie dokładnie należy przenieść fokus. I musisz zrozumieć, co zrobić, jeśli nagle nie zostanie znalezione odpowiednie okno.

I nie będę się skupiał na konfigurowaniu wykonywania skryptów poprzez naciśnięcie kombinacji klawiszy. Na przykład w KDE jest to w Ustawieniach systemowych → Skróty → Skróty niestandardowe. Podobnie powinno być w przypadku innych menedżerów okien.

Przedstawiamy wmctrl

Wmctrl — narzędzie konsolowe do interakcji z X Window Managerem. Jest to kluczowy program dla skryptu. Rzućmy okiem na to, jak możesz z niego skorzystać.

Najpierw wyświetlmy listę otwartych okien:

$ 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)
...

Opcja -l wyświetla listę wszystkich otwartych okien, oraz -x dołącza nazwę klasy do wyniku (Skype.Skype, Nawigator.Firefox itp). Tutaj potrzebujemy identyfikatora okna (kolumna 1), nazwy klasy (kolumna 3) i nazwy okna (ostatnia kolumna).

Możesz spróbować aktywować jakieś okno za pomocą opcji -a:

$ wmctrl -a skype.Skype -x

Jeśli wszystko poszło zgodnie z planem, na ekranie powinno pojawić się okno Skype. Jeśli zamiast opcji -x użyj opcji -i, to zamiast nazwy klasy możesz podać identyfikator okna. Problem z identyfikatorem polega na tym, że identyfikator okna zmienia się przy każdym uruchomieniu aplikacji i nie możemy go znać z wyprzedzeniem. Z drugiej strony atrybut ten jednoznacznie identyfikuje okno, co może być ważne, gdy aplikacja otwiera więcej niż jedno okno. Więcej na ten temat nieco dalej.

Na tym etapie musimy pamiętać, że żądanego okna będziemy szukać za pomocą wyrażenia regularnego na podstawie wyniku wmctrl -lx. Ale to nie znaczy, że musimy użyć czegoś skomplikowanego. Zwykle wystarczy nazwa klasy lub nazwa okna.

Zasadniczo główna idea powinna być już jasna. W globalnych ustawieniach skrótów klawiszowych/skrótów menedżera okien skonfiguruj wymaganą kombinację do wykonania skryptu.

Jak korzystać ze skryptów

Najpierw musisz zainstalować narzędzia konsoli wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

Następnie musisz pobrać skrypty i dodać je $ PATH. Zwykle je wkładam ~/kosz:

$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetach

Jeśli katalog ~/kosz nie było go tam, musisz go utworzyć i uruchomić ponownie (lub zalogować się ponownie), w przeciwnym razie ~/kosz nie trafi $ PATH. Jeśli wszystko zostało wykonane poprawnie, skrypty powinny być dostępne z konsoli, a uzupełnianie tabulatorów powinno działać.

Główny skrypt showwin przyjmuje 2 parametry: pierwszy to wyrażenie regularne, za pomocą którego będziemy szukać wymaganego okna, a drugi parametr to polecenie, które należy wykonać, jeśli żądane okno nie zostanie znalezione.

Możesz spróbować uruchomić skrypt, na przykład:

$ showwin "Mozilla Firefox$" firefox

Jeśli zainstalowana jest przeglądarka Firefox, jej okno powinno być aktywne. Nawet jeśli Firefox nie był uruchomiony, powinien był zostać uruchomiony.

Jeśli to zadziała, możesz spróbować skonfigurować wykonywanie poleceń na kombinacjach. W globalnych ustawieniach skrótów/skrótów dodaj:

  • Alt+F: pokaż „Mozilla Firefox$” Firefoksowi
  • Alt+D: showwin "Mozilla Firefox (przeglądanie prywatne)$" "firefox -private-okno"
  • Alt+C: showwin "przeglądarka-chromowa.przeglądarka-chromowa N*" przeglądarka-chromowa
  • Alt+X: showwin "przeglądarka-chromium.przeglądarka-chrom I*" "przeglądarka-chromium -incognito"
  • Alt+S: showwin „skype.Skype” skypeforlinux
  • Alt+E: showwin „jetbrains-idea” idea.sh

Itp. Każdy może skonfigurować kombinacje klawiszy i oprogramowanie według własnego uznania.
Jeśli wszystko poszło poprawnie, to korzystając z powyższych kombinacji będziemy mogli przełączać się pomiędzy oknami po prostu naciskając klawisze.

Rozczaruję miłośników chromu: może incognirozróżnić zwykłe okno po jego wyjściu wmctrl Nie możesz, mają te same nazwy klas i tytuły okien. W proponowanym wyrażeniu regularnym symbole N* i I* są potrzebne tylko po to, aby te wyrażenia regularne różniły się od siebie i można je było przypisać jako okna główne.

Aby zresetować główne okno poprzedniej kombinacji (właściwie dla wyrażenia regularnego, które showwin wywołany ostatnim razem), musisz wywołać skrypt showwinOdłącz. Mam ten skrypt przypisany do kombinacji klawiszy Alt+Backspace.

Na skrypcie showwin jest jeszcze jedna funkcja. Gdy jest wywoływana z jednym parametrem (w tym przypadku parametr jest tylko identyfikatorem), w ogóle nie sprawdza wyrażenia regularnego, ale uważa, że ​​wszystkie okna są odpowiednie. Samo w sobie wydaje się to bezużyteczne, ale w ten sposób możemy wyznaczyć dowolne okno jako główne i szybko przejść do tego konkretnego okna.

Mam skonfigurowane następujące kombinacje:

  • Alt+1: showwin „CustomKey1”
  • Alt+2: showwin „CustomKey2”
  • ...
  • Alt+0: showwin „CustomKey0”
  • Alt+Backspace: showwinDetach

W ten sposób mogę powiązać dowolne okna z kombinacjami Alt + 1...Alt + 0. Wystarczy kliknąć Alt + 1 Wiążę bieżące okno z tą kombinacją. Klikając, mogę anulować wiązanie Alt + 1a potem Alt+Backspace. Lub zamknij okno, to również działa.

Następnie opowiem Ci o kilku szczegółach technicznych. Nie musisz ich czytać, ale po prostu spróbuj je skonfigurować i zobaczyć. Ale nadal zalecałbym zrozumienie skryptów innych osób przed uruchomieniem ich na swoim komputerze :).

Jak rozróżnić różne okna tej samej aplikacji

W zasadzie pierwszy przykład „wmctrl -a skype.Skype -x” zadziałał i można go użyć. Ale spójrzmy jeszcze raz na przykład z Firefoksem, w którym otwarte są 2 okna:

0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)

Pierwsze okno to tryb normalny, a drugie to przeglądanie prywatne. Chciałbym traktować te okna jako różne aplikacje i przełączać się na nie za pomocą różnych kombinacji klawiszy.

Konieczne jest skomplikowanie skryptu przełączającego okna. Użyłem tego rozwiązania: wyświetl listę wszystkich okien, wykonaj grep przez regex, weź pierwszą linię z głowa, pobierz pierwszą kolumnę (będzie to identyfikator okna) za pomocą ciąć, przejdź do okna według identyfikatora.

Powinien być żart o wyrażeniach regularnych i dwóch problemach, ale tak naprawdę nie używam niczego skomplikowanego. Potrzebuję wyrażeń regularnych, aby móc wskazać koniec linii (symbol „$”) i odróżnić „Mozilla Firefox$” od „Mozilla Firefox (przeglądanie prywatne)$”.

Polecenie wygląda mniej więcej tak:

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

Tutaj możesz już zgadnąć o drugiej funkcji skryptu: jeśli grep nic nie zwróci, oznacza to, że żądana aplikacja nie jest otwarta i musisz ją uruchomić, wykonując polecenie z drugiego parametru. Następnie okresowo sprawdzaj, czy otworzyło się wymagane okno, aby przenieść na nie fokus. Nie będę się na tym skupiał, kto potrzebuje, niech zajrzy do źródeł.

Gdy okna aplikacji nie są rozróżnialne

Nauczyliśmy się więc przenosić fokus na okno żądanej aplikacji. Ale co, jeśli aplikacja ma otwarte więcej niż jedno okno? Na którym powinienem się skupić? Powyższy skrypt najprawdopodobniej przeniesie się do pierwszego otwartego okna. Chcielibyśmy jednak większej elastyczności. Chciałbym móc zapamiętać, którego okna potrzebujemy i przełączyć się na to konkretne okno.

Pomysł był taki: jeśli chcemy zapamiętać konkretne okno dla kombinacji klawiszy, musimy nacisnąć tę kombinację, gdy wybrane okno jest aktywne. W przyszłości, gdy naciśniesz tę kombinację, fokus zostanie przypisany do tego konkretnego okna. Dopóki okno się nie zamknie lub nie zresetujemy tej kombinacji skryptów showwinOdłącz.

Algorytm skryptu showwin coś takiego:

  • Sprawdź, czy zapamiętaliśmy wcześniej identyfikator okna, na które należy przenieść fokus.
    Jeśli pamiętasz i takie okno nadal istnieje, to przenosimy na nie fokus i wychodzimy.
  • Sprawdzamy, które okno jest aktualnie aktywne i jeśli pasuje do naszego żądania, zapamiętujemy jego identyfikator, aby w przyszłości przejść do niego i wyjść.
  • Przechodzimy do przynajmniej jakiegoś odpowiedniego okna, jeśli istnieje lub otwieramy żądaną aplikację.

Możesz dowiedzieć się, które okno jest aktualnie aktywne, korzystając z narzędzia konsoli xdotool, konwertując jego dane wyjściowe do formatu szesnastkowego:

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

Najłatwiejszym sposobem zapamiętania czegoś w bashu jest utworzenie plików w wirtualnym systemie plików zlokalizowanym w pamięci. W Ubuntu jest to domyślnie włączone w /dev/shm/. O innych dystrybucjach nie mogę nic powiedzieć, mam nadzieję, że też będzie coś podobnego. Możesz zajrzeć za pomocą polecenia:

$ mount -l | grep tmpfs

Skrypt utworzy puste katalogi w tym folderze, na przykład: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Dodatkowo przy każdym wywołaniu utworzy dowiązanie symboliczne /dev/shm/$USER/showwin/showwin_last na /dev/shm/$USER/showwin/$SEARCH_REGEX. Będzie to potrzebne, aby w razie potrzeby usunąć identyfikator okna dla określonej kombinacji za pomocą skryptu showwinOdłącz.

Co można poprawić

Po pierwsze, skrypty należy skonfigurować ręcznie. Z pewnością ze względu na konieczność zagłębienia się i zrobienia wielu rzeczy własnymi rękami, wielu z Was nawet nie podejmie próby konfiguracji systemu. Gdyby można było po prostu zainstalować pakiet i łatwiej wszystko skonfigurować, być może zyskałby on na popularności. A potem spójrz, aplikacja zostanie wydana w standardowych dystrybucjach.

A może da się to zrobić łatwiej. Jeśli po identyfikatorze okna można znaleźć identyfikator procesu, który je utworzył, a po identyfikatorze procesu można dowiedzieć się, które polecenie je utworzyło, wówczas możliwa byłaby automatyzacja konfiguracji. Tak naprawdę nie rozumiałem, czy to, co napisałem w tym akapicie, jest możliwe. Fakt jest taki, że osobiście jestem zadowolony z tego, jak to teraz działa. Jeśli jednak ktoś inny niż ja uzna całe podejście za wygodne i ktoś je ulepszy, to chętnie skorzystam z lepszego rozwiązania.

Kolejnym problemem, o czym już pisałem, jest to, że w niektórych przypadkach okien nie da się od siebie odróżnić. Do tej pory zaobserwowałem to tylko w trybie incognito w chromie/chromie, ale być może jest coś podobnego gdzie indziej. W ostateczności zawsze pozostaje możliwość kombinacji uniwersalnych Alt + 1...Alt + 0. Ponownie korzystam z Firefoksa i dla mnie osobiście ten problem nie jest znaczący.

Jednak dla mnie istotnym problemem jest to, że do pracy używam Mac OS i nie mogę tam niczego takiego skonfigurować. pożytek wmctrl Myślę, że udało mi się go zainstalować, ale tak naprawdę nie działa na Mac OS. Z aplikacją można coś zrobić Automator, ale jest tak powolny, że nie jest wygodny w użyciu, nawet gdy działa. Nie udało mi się też ustawić kombinacji klawiszy tak, aby działały we wszystkich programach. Jeśli ktoś nagle wpadnie na rozwiązanie, chętnie z niego skorzystam.

Zamiast zawierania

Okazało się, że jest to nieoczekiwanie duża liczba słów dla tak pozornie prostej funkcjonalności. Chciałem przekazać ideę i nie przeciążać tekstu, ale jeszcze nie wymyśliłem, jak to powiedzieć prościej. Być może byłoby lepiej w formacie wideo, ale tutaj ludziom się to nie podoba.

Mówiłem trochę o tym, co kryje się pod maską skryptu i jak go skonfigurować. Nie wdawałem się w szczegóły samego scenariusza, ale ma on tylko 50 linijek, więc nie jest trudny do zrozumienia.

Mam nadzieję, że ktoś inny wypróbuje ten pomysł i może nawet go doceni. Mogę o sobie powiedzieć, że scenariusz powstał jakieś 3 lata temu i jest dla mnie BARDZO wygodny. Na tyle wygodny, że powoduje poważny dyskomfort podczas pracy z komputerami innych osób. I z działającym MacBookiem.

Link do skryptów

Źródło: www.habr.com

Dodaj komentarz