Alternative Fensterverwaltung unter Linux

Ich gehöre zu denen, die Caps Lock-Schaltlayouts verwenden, weil ich zu faul bin, um zwei Tasten zu drücken, wenn Sie eine drücken können. Ich hätte sogar gerne 2 unnötige Tasten: Mit einer schalte ich das englische Layout ein und mit der zweiten die russische. Die zweite unnötige Taste ist jedoch ein Aufruf des Kontextmenüs, das so unnötig ist, dass es von vielen Herstellern von Laptops abgeschnitten wird. Sie müssen sich also mit dem zufrieden geben, was Sie haben.


Und wenn ich zwischen Fenstern wechsle, möchte ich nicht nach deren Symbolen in der Taskleiste suchen, die Namen beim Scrollen durch Alt + Tab , Scrollen durch Desktops usw. Ich möchte eine Tastenkombination drücken (im Idealfall gibt es eine, aber es gibt keine freien unnötigen Tasten ) und sofort in das Fenster, das ich brauche. Zum Beispiel so:


  • Alt + F: Firefox
  • Alt + D: Firefox (Privates Browsen)
  • Alt + T: Terminal
  • Alt + M: Rechner
  • Alt + E: Idee
  • usw.

Außerdem möchte ich durch Drücken von beispielsweise Alt + M den Taschenrechner anzeigen, unabhängig davon, ob dieses Programm gerade ausgeführt wird. Wenn es läuft, muss seinem Fenster der Fokus zugewiesen werden. Wenn nicht, starten Sie das gewünschte Programm und übertragen Sie den Fokus, wenn es geladen wird.


Für Fälle, die vom vorherigen Szenario nicht abgedeckt werden, möchte ich universelle Tastaturkürzel haben, denen Sie einfach eines der geöffneten Fenster zuweisen können. Zum Beispiel habe ich 10 Kombinationen von Alt + 1 bis Alt + 0 zugewiesen, die an keine Programme gebunden sind. Ich kann einfach Alt + 1 drücken und das Fenster, das gerade scharfgestellt ist, erhält den Fokus, wenn Alt + 1 gedrückt wird.


Unter dem Schnitt finden Sie eine Beschreibung einiger weiterer Funktionen und eine Antwort darauf, wie Sie dies tun können. Aber ich werde Sie sofort warnen, dass eine solche Anpassung "für sich selbst" eine starke Abhängigkeit hervorrufen und bei Bedarf sogar zum Absturz führen kann. Verwenden Sie Windows, Mac OS oder sogar einen anderen Computer mit Linux.


Wenn Sie darüber nachdenken, verwenden wir nicht jeden Tag viele Programme. Ein Browser, ein Terminal, eine IDE, eine Art Messenger, ein Dateimanager, ein Taschenrechner und vielleicht fast alles. Es sind nicht viele Tastenkombinationen erforderlich, um 95% der täglichen Aufgaben abzudecken.


Bei Programmen, bei denen mehrere Fenster geöffnet sind, kann eines davon als Hauptfenster zugewiesen werden. Beispielsweise sind mehrere IntelliJ Idea-Fenster geöffnet, die Alt + E zugewiesen sind . Unter normalen Umständen wird durch Drücken von Alt + E ein Fenster dieses Programms geöffnet, höchstwahrscheinlich dasjenige, das zuerst geöffnet wurde. Wenn Sie jedoch Alt + E drücken, während sich eines der Fenster dieses Programms bereits im Fokus befindet, wird dieses Fenster als Hauptfenster zugewiesen und der Fokus wird beim nächsten Drücken der Kombination auf dieses Fenster übertragen.


Das Hauptfenster kann neu zugewiesen werden. Dazu müssen Sie zuerst die Kombination zurücksetzen und ihr dann ein anderes Fenster als Hauptfenster zuweisen. Um eine Kombination zurückzusetzen, müssen Sie die Kombination selbst drücken und dann eine spezielle Reset-Kombination, die ich Alt + Rücktaste zugewiesen habe. Dadurch wird ein Skript aufgerufen, das die Zuweisung des Hauptfensters für die vorherige Kombination aufhebt. Anschließend können Sie ein neues Hauptfenster zuweisen, wie im vorherigen Absatz beschrieben. Das Zurücksetzen eines gebundenen Fensters auf universelle Kombinationen ist ähnlich.


Die Einführung erwies sich als lang, aber ich wollte zuerst sagen, was wir tun werden, und dann erklären, wie es geht.


Für diejenigen, die müde vom Lesen sind


Kurz gesagt, ein Link zu den Skripten am Ende des Artikels.


Aber egal, es wird nicht funktionieren und sofort installieren und verwenden. Zuerst müssen Sie herausfinden, wie das Skript das richtige Fenster findet. Ohne dies funktioniert es nicht, dem Skript genau mitzuteilen, wo es sich konzentrieren soll. Und Sie müssen verstehen, was zu tun ist, wenn plötzlich kein passendes Fenster gefunden wurde.


Ich werde mich nicht darauf konzentrieren, wie die Skriptausführung durch Drücken von Tastenkombinationen konfiguriert wird. In KDE finden Sie dies beispielsweise unter Systemeinstellungen → Verknüpfungen → Benutzerdefinierte Verknüpfungen. Dies sollte auch in anderen Fenstermanagern der Fall sein.


Wir stellen vor: wmctrl


Wmctrl ist ein Konsolendienstprogramm für die Interaktion mit X Window Manager. Dies ist ein Schlüsselskriptprogramm. Lassen Sie uns einen kurzen Blick darauf werfen, wie Sie es verwenden können.


Listen Sie zunächst die geöffneten Fenster auf:


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

Die Option -l zeigt eine Liste aller geöffneten Fenster an, und -x fügt der Ausgabe den Klassennamen ( skype.Skype , Navigator.Firefox usw.) hinzu. Wir benötigen die Fenster-ID (Spalte 1), den Klassennamen (Spalte 3) und den Fensternamen (letzte Spalte).


Sie können versuchen, ein Fenster mit der Option -a zu aktivieren:


 $ wmctrl -a skype.Skype -x 

Wenn alles nach Plan lief, sollte ein Skype-Fenster auf dem Bildschirm angezeigt werden. Wenn Sie die Option -i anstelle der Option -x verwenden , können Sie die Fenster-ID anstelle des Klassennamens angeben. Bei id besteht das Problem darin, dass sich die Fenster-ID bei jedem Start der Anwendung ändert und wir sie nicht im Voraus kennen können. Andererseits gibt dieses Attribut ein Fenster eindeutig an, was wichtig sein kann, wenn eine Anwendung mehr als ein Fenster öffnet. Darüber etwas weiter.


Zu diesem Zeitpunkt müssen wir uns daran erinnern, dass wir das gewünschte Fenster mit Regex gemäß der Ausgabe von wmctrl -lx suchen . Dies bedeutet jedoch nicht, dass wir etwas Kompliziertes verwenden müssen. In der Regel ist ein Klassenname oder Fenstername ausreichend.


Grundsätzlich sollte der Grundgedanke schon klar sein. In den globalen Hotkeys / Shortcuts-Einstellungen für Ihren Fenstermanager konfigurieren wir die gewünschte Kombination, um das Skript auszuführen.


Verwendung von Skripten


Zuerst müssen Sie die Konsolendienstprogramme wmctrl und xdotool installieren:


 $ sudo apt-get install wmctrl xdotool 

Als nächstes müssen Sie die Skripte herunterladen und zu $ PATH hinzufügen. Normalerweise lege ich sie in ~ / bin :


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

Wenn es kein ~ / bin-Verzeichnis gab , muss es erstellt und neu gestartet (oder angemeldet) werden, sonst gelangt ~ / bin nicht in $ PATH . Wenn alles richtig gemacht wurde, sollten die Skripte über die Konsole zugänglich sein und die Tab-Vervollständigung funktionieren.


Das Hauptskript von showwin verwendet zwei Parameter: Der erste ist Regex, mit dem nach dem gewünschten Fenster gesucht wird, und der zweite Parameter ist der Befehl, der ausgeführt werden muss, wenn das gewünschte Fenster nicht gefunden wurde.


Sie können versuchen, ein Skript auszuführen, zum Beispiel:


 $ showwin "Mozilla Firefox$" firefox 

Wenn Firefox installiert ist, sollte der Fokus auf seinem Fenster liegen. Auch wenn Firefox nicht lief, sollte es gestartet sein.


Wenn sich herausstellt, können Sie versuchen, die Ausführung von Befehlen zu Kombinationen zu konfigurieren. Fügen Sie in den Einstellungen für globale Hotkeys / Verknüpfungen Folgendes hinzu:


  • Alt + F: Firefox "Mozilla Firefox $" anzeigen
  • Alt + D: showwin "Mozilla Firefox (Privates Browsen) $" "firefox -private-window"
  • Alt + C: showwin "Chrom-Browser. Chrom-Browser N *" Chrom-Browser
  • Alt + X: showwin "Chrom-Browser.Chrom-Browser I *" "Chrom-Browser -Inkognito"
  • Alt + S: showwin "skype.Skype" skypeforlinux
  • Alt + E: showwin "jetbrains-idea" idea.sh

Und so weiter. Kombinationen von Schlüsseln und Software können von jedem nach seinen Wünschen konfiguriert werden.
Wenn alles richtig gelaufen ist, können wir gemäß den obigen Kombinationen mit einem einfachen Tastendruck zwischen den Fenstern wechseln.


Ich werde Chromliebhaber enttäuschen: Es ist inkognito, ein gewöhnliches Fenster von der wmctrl-Ausgabe zu unterscheiden , sie haben dieselben Klassennamen und Fensterkopfzeilen. Im vorgeschlagenen regulären Ausdruck werden die Zeichen N * und I * nur benötigt, damit sich diese regulären Zeichen voneinander unterscheiden und ihnen als Hauptfenster unterschiedliche Fenster zugewiesen werden können.


Um das Hauptfenster der vorherigen Kombination zurückzusetzen (tatsächlich für reguläre Ausdrücke , bei denen showwin zum letzten Mal aufgerufen wurde), müssen Sie das Skript showwinDetach aufrufen . Ich habe dieses Skript der Tastenkombination Alt + Backspace zugewiesen.


Das showwin- Skript hat eine weitere Funktion. Wenn es mit einem Parameter aufgerufen wird (in diesem Fall ist der Parameter nur ein Bezeichner), überprüft es Regex überhaupt nicht und betrachtet alle Fenster als geeignet. An sich scheint dies jedoch nutzlos zu sein. Auf diese Weise können wir jedes Fenster als Hauptfenster festlegen und schnell zu diesem bestimmten Fenster wechseln.


Ich habe solche Kombinationen konfiguriert:


  • Alt + 1: showwin "CustomKey1"
  • Alt + 2: showwin "CustomKey2"
  • ...
  • Alt + 0: showwin "CustomKey0"
  • Alt + Rücktaste: showwinDetach

Auf diese Weise kann ich beliebige Fenster an Alt + 1 ... Alt + 0- Kombinationen binden. Durch Drücken von Alt + 1 binde ich das aktuelle Fenster an diese Kombination. Ich kann die Bindung durch Drücken von Alt + 1 und dann Alt + Rücktaste aufheben. Oder schließe das Fenster, das funktioniert auch.


Weiter werde ich einige technische Details erzählen. Sie können sie nicht lesen, sondern nur versuchen, zu konfigurieren und zu sehen. Aber ich würde trotzdem empfehlen, die Skripte anderer Leute zu verstehen, bevor Sie sie auf Ihrem Computer ausführen :).


So unterscheiden Sie verschiedene Fenster einer Anwendung


Im Prinzip hat das allererste Beispiel von „wmctrl -a skype.Skype -x“ funktioniert und kann verwendet werden. Aber schauen wir uns noch einmal das Beispiel mit Firefox an, in dem 2 Fenster geöffnet sind:


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

Das erste Fenster ist der normale Modus und das zweite das private Browsen. Ich möchte diese Fenster als unterschiedliche Anwendungen betrachten und mit unterschiedlichen Tastenkombinationen zu ihnen wechseln.


Sie müssen das Skript zum Wechseln zwischen Fenstern komplizieren. Ich habe diese Lösung benutzt: zeige eine Liste aller Fenster an, mache grep by regex, nimm die erste Zeile mit head , hole die erste Spalte (dies wird die Fenster-ID sein) mit cut , wechsle zum Fenster mit id.


Es sollte einen Witz über reguläre Ausdrücke und zwei Probleme geben, aber in der Tat verwende ich nichts Kompliziertes. Ich benötige Stammkunden, damit ich das Zeilenende (das Zeichen "$") angeben und zwischen "Mozilla Firefox $" und "Mozilla Firefox (Private Browsing) $" unterscheiden kann.


Der Befehl sieht ungefähr so ​​aus:


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

Hier können Sie bereits die zweite Funktion des Skripts erraten: Wenn grep nichts zurückgegeben hat, ist die gewünschte Anwendung nicht geöffnet und Sie müssen sie starten, indem Sie den Befehl über den zweiten Parameter ausführen. Überprüfen Sie dann regelmäßig, ob das rechte Fenster geöffnet wurde, um den Fokus zu erhalten. Ich werde mich nicht darauf konzentrieren, diejenigen, die es brauchen, werden sich die Quelle ansehen.


Wenn Anwendungsfenster nicht unterscheidbar sind


Wir haben also gelernt, den Fokus auf das Fenster der gewünschten Anwendung zu übertragen. Was aber, wenn mehr als ein Fenster einer Anwendung geöffnet ist? Auf welches sollte ich mich konzentrieren? Das obige Skript wird höchstwahrscheinlich an das erste geöffnete Fenster übergeben. Wir möchten jedoch mehr Flexibilität. Ich möchte mir merken können, welches Fenster wir benötigen und zu diesem Fenster wechseln.


Die Idee war: Wenn wir uns ein bestimmtes Fenster für eine Tastenkombination merken wollen, müssen wir diese Kombination drücken, wenn das gewünschte Fenster im Fokus ist. Wenn Sie in Zukunft auf diese Kombination klicken, wird der Fokus auf dieses bestimmte Fenster gelegt. Bis sich das Fenster schließt oder wir diese showwinDetach-Skriptkombination zurücksetzen.


Der showwin-Skriptalgorithmus sieht ungefähr so aus:


  • Überprüfen Sie, ob wir uns zuvor an die ID des Fensters erinnert haben, an das der Fokus übergeben werden soll.
    Wenn Sie sich erinnern und ein solches Fenster noch vorhanden ist, übertragen wir den Fokus darauf und beenden es.
  • Wir schauen uns an, welches Fenster gerade im Fokus steht, und wenn es zu unserer Anfrage passt, werden wir uns an seine ID erinnern, um es in Zukunft aufzurufen und zu beenden.
  • Wir gehen zu mindestens einem geeigneten Fenster über, wenn es existiert, oder öffnen die gewünschte Anwendung.

Mit dem Konsolendienstprogramm xdotool können Sie herausfinden, welches Fenster gerade im Fokus steht, indem Sie die Ausgabe in ein hexadezimales Format konvertieren:


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

Sich in bash an etwas zu erinnern, ist der einfachste Weg, Dateien in einem virtuellen Dateisystem im Speicher zu erstellen. Unter Ubuntu ist dies standardmäßig in / dev / shm / verbunden . Über andere Distributionen kann ich nichts sagen, ich hoffe, dass es das auch gibt. Sie können den Befehl sehen:


 $ mount -l | grep tmpfs 

Das Skript erstellt leere Verzeichnisse in diesem Ordner wie folgt : / dev / shm / $ USER / showwin / $ SEARCH_REGEX / $ WINDOW_ID . Zusätzlich wird bei jedem Aufruf symlink / dev / shm / $ USER / showwin / showwin_last auf / dev / shm / $ USER / showwin / $ SEARCH_REGEX erstellt . Dies wird benötigt, um die Fenster-ID für eine bestimmte Kombination bei Bedarf mithilfe des showwinDetach- Skripts zu entfernen.


Was kann verbessert werden?


Zunächst müssen die Skripte von Hand konfiguriert werden. Sicherlich werden viele von Ihnen nicht einmal versuchen, das System zu konfigurieren, da sie sich intensiv mit Ihren Händen beschäftigen müssen. Wenn es möglich wäre, das Paket einfach zu platzieren und alles einfacher zu konfigurieren, würde es vielleicht an Popularität gewinnen. Und da, schauen Sie sich die Standard-Distributionen an, würden sie die Anwendung kaputt machen.


Und vielleicht geht es auch einfacher. Wenn Sie anhand der ID des Fensters die ID des Prozesses, der es erstellt hat, und anhand der ID des Prozesses ermitteln können, von welchem ​​Team es erstellt wurde, können Sie die Konfiguration automatisieren. Tatsächlich habe ich nicht verstanden, ob das, was ich in diesem Absatz geschrieben habe, möglich ist. Tatsache ist, dass es für mich persönlich so ist, wie es jetzt funktioniert. Aber wenn jemand anders als ich den ganzen Ansatz als zweckmäßig erachtet und jemand ihn verbessert, werde ich gerne die beste Lösung verwenden.


Ein weiteres Problem ist, wie ich bereits schrieb, dass in einigen Fällen Fenster nicht voneinander unterschieden werden können. Bisher habe ich das nur mit Inkognito in Chrom / Chrom gesehen, aber vielleicht gibt es woanders etwas ähnliches. Im Extremfall gibt es immer eine Variante der Universalkombinationen Alt + 1 ... Alt + 0 . Auch hier benutze ich Firefox und für mich persönlich ist dieses Problem nicht signifikant.


Ein bedeutendes Problem für mich ist jedoch, dass ich Mac OS für die Arbeit verwende und dort so etwas nicht konfigurieren kann. Es scheint in der Lage zu sein, das Dienstprogramm wmctrl zu liefern, aber es funktioniert nicht wirklich unter Mac OS. Mit der Automator- Anwendung kann etwas getan werden, aber sie ist so langsam, dass es nicht bequem ist, sie selbst dann zu verwenden, wenn sie funktioniert. Ich konnte die Tastenkombinationen auch nicht so konfigurieren, dass sie in allen Programmen funktionieren. Wenn plötzlich jemand eine Lösung findet, verwende ich sie gerne.


Anstelle einer Schlussfolgerung


Es stellte sich unerwartet eine Menge Worte für eine so scheinbar einfache Funktionalität heraus. Ich wollte die Idee vermitteln und den Text nicht überladen, aber ich habe noch nicht herausgefunden, wie ich es leichter sagen kann. Vielleicht wäre es im Videoformat besser, aber sie mögen es nicht so.


Ich habe ein wenig darüber gesprochen, was sich unter der Haube des Skripts befindet und wie man es konfiguriert. Ich habe nicht auf die Details des Drehbuchs selbst eingegangen, aber es sind nur 50 Zeilen, es ist nicht schwer zu verstehen.


Ich hoffe, dass jemand anderes diese Idee probiert und sie vielleicht sogar schätzt. Ich kann für mich selbst sagen, dass das Drehbuch vor ungefähr 3 Jahren geschrieben wurde und es für mich SEHR praktisch ist. Es ist so praktisch, dass es ernsthafte Beschwerden verursacht, wenn Sie mit den Computern anderer Leute arbeiten. Und mit einem funktionierenden Macbook.


Skript-Link

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


All Articles