Ich gehöre zu denen, die die Umschalttaste für den Wechsel der Eingabesprache verwenden, weil es mir zu viel Mühe ist, zwei Tasten zu drücken, wenn ich auch nur eine verwenden kann. Ich hätte sogar gerne zwei unnötige Tasten: eine fürs Englische und eine für das Russische. Aber die zweite unnötige Taste ist die für das Kontextmenü, die so unnötig ist, dass viele Laptop-Hersteller sie weglassen. Also muss ich mit dem auskommen, was ich habe.
Und ich möchte beim Wechseln zwischen Fenstern nicht die Icons in der Taskleiste suchen oder die Titel beim Scrollen durchsehen. Alt+Tab, durch verschiedene Desktops scrollen usw. Ich möchte eine Tastenkombination drücken (idealerweise eine einzige, aber es gibt schon keine freien unnötigen Tasten mehr) und sofort im Fenster landen, das ich brauche. Zum Beispiel so:
- Alt+F: Firefox
- Alt+D: Firefox (Privater Modus)
- Alt+T: Terminal
- Alt+M: Rechner
- Alt+E: IntelliJ Idea
- and so on.
Und beim Drücken von, zum Beispiel, Alt+M möchte ich den Rechner sehen, unabhängig davon, ob dieses Programm gerade läuft oder nicht. Wenn es läuft, sollte das Fenster den Fokus erhalten, wenn nicht, sollte das notwendige Programm gestartet werden und der Fokus übergeben werden, sobald es geladen ist.
Für Fälle, die durch das vorherige Szenario nicht abgedeckt sind, möchte ich universelle Tastenkombinationen haben, denen ich beliebige offene Fenster einfach zuweisen kann. Zum Beispiel habe ich 10 Kombinationen von Alt+1 bis zu Alt+0, die an keine bestimmten Programme gebunden sind. Ich kann einfach Alt+1 drücken, und das Fenster, das gerade im Fokus ist, wird beim Drücken den Fokus erhalten. Alt+1.
Unterhalb eine Beschreibung noch ein paar Funktionen und die Antwort, wie man das machen kann. Ich warne jedoch gleich vor, dass eine solche Anpassung "auf eigene Faust" eine starke Abhängigkeit erzeugen und sogar Entzugserscheinungen hervorrufen kann, wenn man gezwungen ist, Windows, Mac OS oder sogar einen fremden Computer mit Linux zu benutzen.
Tatsächlich verwenden wir im Alltag nicht so viele Programme. Browser, Terminal, IDE, irgendein Messenger, Dateimanager, Taschenrechner – und das war's dann auch schon fast. Man braucht nicht viele Tastenkombinationen, um 95 % der alltäglichen Aufgaben abzudecken.
Für Programme, bei denen mehrere Fenster geöffnet sind, kann eines davon als Hauptfenster festgelegt werden. Zum Beispiel sind mehrere Fenster von IntelliJ Idea geöffnet, die auf Alt+Egesetzt sind. Unter normalen Umständen wird beim Drücken auf Alt+E Es wird sich ein Fenster des Programms öffnen, wahrscheinlich das, das zuerst geöffnet wurde. Wenn Sie jedoch auf Alt+E drücken, während eines der Fenster des Programms bereits im Fokus ist, wird genau dieses Fenster als Hauptfenster festgelegt und der Fokus wird bei nachfolgenden Druckvorgängen auf diese Fenster übergeben.
Das Hauptfenster kann neu zugewiesen werden. Dazu muss die Kombination zuerst zurückgesetzt und dann ein anderes Fenster als Hauptfenster zugewiesen werden. Zum Zurücksetzen der Kombination drücken Sie einfach die Kombination selbst und dann die spezielle Zurücksetzungskombination, bei mir ist sie auf Alt+Backspacegelegt. Dies wird ein Skript auslösen, das die Zuordnung des Hauptfensters für die vorherige Kombination aufhebt. Danach kann ein neues Hauptfenster zugewiesen werden, wie im vorherigen Absatz beschrieben. Das Zurücksetzen des zugewiesenen Fensters auf universelle Kombinationen erfolgt auf ähnliche Weise.
Die Einleitung war lang, aber ich wollte zunächst erklären, was wir tun werden, und anschließend erklären, wie es gemacht wird.
Für diejenigen, die das Lesen satt haben
Kurz gesagt, der Link zu den Skripten befindet sich am Ende des Artikels.
Aber es wird nicht sofort möglich sein, es zu installieren und zu nutzen. Zuerst muss man verstehen, wie das Skript das benötigte Fenster findet. Ohne dieses Wissen kann man dem Skript nicht angeben, wohin genau der Fokus verschoben werden soll. Man muss auch verstehen, was zu tun ist, falls das benötigte Fenster plötzlich nicht vorhanden ist.
Außerdem werde ich nicht darauf eingehen, wie man die Ausführung von Skripten über Tastenkombinationen einrichtet. Zum Beispiel findet man das in KDE unter System Settings → Shortcuts → Custom Shortcuts. In anderen Fenstermanagern sollte es etwas Ähnliches geben.
Einführung in wmctrl
Wmctrl ist ein Konsolen-Tool zur Interaktion mit dem X Window Manager. Es ist das zentrale Programm für das Skript. Lassen Sie uns schnell einen Blick darauf werfen, wie man es verwenden kann.
Zunächst listen wir 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 Übersetzer - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Beste Artikel des Tages / Habr - Mozilla Firefox (Privater Modus)
...Option -l gibt eine Liste aller geöffneten Fenster aus, und -h fügt dem Output den Klassennamen hinzu (skype.Skype, Navigator.Firefox und so weiter). Hier benötigen wir die Fenster-ID (Spalte 1), den Klassennamen (Spalte 3) und den Fenstertitel (letzte Spalte).
Man kann versuchen, ein Fenster mit der Option zu aktivieren -a:
$ wmctrl -a skype.Skype -xWenn alles nach Plan läuft, sollte das Skype-Fenster auf dem Bildschirm erscheinen. Wenn stattdessen die Option -x verwenden Sie die Option -i, kann anstelle des Klassennamens die Fenster-ID angegeben werden. Das Problem mit der ID ist, dass sich die Fenster-ID bei jedem Start der Anwendung ändert, und wir sie nicht im Voraus kennen können. Auf der anderen Seite zeigt dieses Attribut eindeutig auf das Fenster, was wichtig sein kann, wenn die Anwendung mehr als ein Fenster öffnet. Dazu kommen wir später.
An dieser Stelle sollten wir uns merken, dass wir das benötigte Fenster mithilfe von Regex aus der Ausgabe suchen werden wmctrl -lx. Aber das bedeutet nicht, dass wir unbedingt etwas Komplexes verwenden müssen. In der Regel reicht der Klassenname oder der Fenstertitel.
Im Grunde sollte die Hauptidee bereits klar sein. In den Einstellungen für globale Hotkeys/Shortcuts Ihres Fenstermanagers richten wir die gewünschte Kombination zur Ausführung des Skripts ein.
Wie man Skripte verwendet
Zuerst müssen die Konsolenanwendungen installiert werden wmctrl und xdotool:
$ sudo apt-get install wmctrl xdotoolLaden Sie die Skripte herunter und fügen Sie sie in ein $PATH. Ich lege sie normalerweise in das ~/bin:
$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetachWenn das Verzeichnis ~/bin nicht existiert, muss es erstellt werden und das System muss neu gestartet (oder erneut angemeldet) werden, sonst ~/bin geht es nicht in $PATH. Wenn alles korrekt gemacht wurde, sollten die Skripte über die Konsole zugänglich sein und die Autovervollständigung mit Tab sollte funktionieren.
Das Hauptskript showwin nimmt 2 Parameter an: der erste ist der Regex, mit dem wir das gewünschte Fenster suchen werden, und der zweite Parameter ist der Befehl, der ausgeführt werden soll, wenn das Fenster nicht gefunden wurde.
Sie können versuchen, das Skript auszuführen, z. B.:
$ showwin "Mozilla Firefox$" firefoxWenn Firefox installiert ist, sollte das Fenster den Fokus erhalten. Selbst wenn Firefox nicht gestartet wurde, sollte es gestartet werden.
Wenn es geklappt hat, können Sie versuchen, die Ausführung von Befehlen auf Tastenkombinationen einzustellen. Fügen Sie in den globalen Hotkeys/Shortcuts Folgendes hinzu:
- Alt+F: showwin „Mozilla Firefox$“ firefox
- Alt+D: showwin „Mozilla Firefox (Privater Modus)$“ „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
Und so weiter. Jeder kann Tastenkombinationen und Software nach seinen Wünschen anpassen.
Wenn alles korrekt eingerichtet ist, können wir mithilfe der oben angegebenen Kombinationen einfach zwischen den Fenstern wechseln.
Für Liebhaber von Chrome eine Enttäuschung: Ein normales Fenster kann nicht von einem Inkognito-Fenster unterschieden werden. wmctrl Sie haben die gleichen Klassennamen und Fenstertitel. Die vorgeschlagenen Regex-Symbole N* und I* sind nur nötig, damit sich diese regulären Ausdrücke voneinander unterscheiden und unterschiedlichen Fenstern zugewiesen werden können.
Um das Hauptfenster der vorherigen Kombination zurückzusetzen (tatsächlich für den Regex, der showwin das letzte Mal aufgerufen wurde) muss das Skript showwinDetachausgeführt werden. Ich habe dieses Skript auf eine Tastenkombination gelegt. Alt+Backspace.
Das Skript showwin hat außerdem eine weitere Funktion. Wenn es mit einem Parameter aufgerufen wird (in diesem Fall ist der Parameter einfach die ID), überprüft es überhaupt nicht den Regex und hält alle Fenster für passend. Das scheint an sich nutzlos zu sein, jedoch können wir so jedes Fenster als Hauptfenster festlegen und schnell zu diesem Fenster wechseln.
Ich habe folgende Kombinationen eingerichtet:
- Alt+1: showwin «CustomKey1»
- Alt+2: showwin «CustomKey2»
- …
- Alt+0: showwin «CustomKey0»
- Alt+Backspace: showwinDetach
Auf diese Weise kann ich beliebige Fenster mit Kombinationen verknüpfen. Alt+1…Alt+0Schnell einfach durch Drücken von Alt+1 verknüpfe ich das aktuelle Fenster mit dieser Kombination. Ich kann die Verknüpfung aufheben, indem ich Alt+1, und dann auf Alt+Backspacedrücke. Oder ich kann das Fenster schließen, das funktioniert auch.
Nun möchte ich einige technische Details erklären. Diese können ignoriert werden, man kann einfach ausprobieren und sehen, wie es funktioniert. Ich empfehle jedoch, sich zuerst mit den Skripten anderer vertraut zu machen, bevor man sie auf seinem Computer ausführt :).
So unterscheiden Sie verschiedene Fenster einer Anwendung
Im Grunde war das erste Beispiel „wmctrl -a skype.Skype -x“ funktionsfähig und kann verwendet werden. Lassen Sie uns jedoch noch einmal das Beispiel mit Firefox ansehen, in dem 2 Fenster geöffnet sind:
0x04400003 0 Navigator.Firefox N/A Google Übersetzer - Mozilla Firefox
0x04400218 0 Navigator.Firefox N/A Beste Publikationen des Tages / Habr - Mozilla Firefox (Privates Browsen)Das erste Fenster ist der Normalmodus, das zweite ist das Private Browsen. Diese Fenster sollten als unterschiedliche Anwendungen betrachtet werden und können durch verschiedene Tastenkombinationen gewechselt werden.
Es ist notwendig, das Skript zur Fensterumschaltung zu komplizieren. Ich habe folgende Lösung verwendet: Eine Liste aller Fenster ausgeben, grep durch Regex filtern, die erste Zeile mit head, holen Sie die erste Spalte (das wird die Fenster-ID sein) mit Hilfe von cut, wechseln Sie zum Fenster nach ID.
Hier sollte ein Witz über reguläre Ausdrücke und zwei Probleme sein, aber eigentlich verwende ich nichts Kompliziertes. Reguläre Ausdrücke sind nötig, um das Ende einer Zeile (das Zeichen „$“) anzugeben und „Mozilla Firefox$“ von „Mozilla Firefox (Privates Browsen)$“ zu unterscheiden.
Das Team sieht folgendermaßen aus:
$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`Hier kann man bereits auf die zweite Besonderheit des Skripts schließen: Wenn grep nichts ausgibt, bedeutet das, dass die benötigte Anwendung nicht geöffnet ist und gestartet werden muss, indem der Befehl aus dem zweiten Parameter ausgeführt wird. Danach sollte regelmäßig überprüft werden, ob das benötigte Fenster geöffnet wurde, um den Fokus darauf zu übertragen. Ich werde nicht weiter darauf eingehen, wer möchte, kann sich den Quellcode ansehen.
Wenn die Anwendungsfenster nicht unterscheidbar sind
Nun, wir haben gelernt, den Fokus auf das Fenster der gewünschten Anwendung zu übertragen. Aber was ist, wenn mehr als ein Fenster der Anwendung geöffnet ist? Auf welches davon soll der Fokus übertragen werden? Das obige Skript wird wahrscheinlich an das erste geöffnete Fenster übergeben. Wir würden jedoch gerne mehr Flexibilität haben. Es wäre schön, sich zu merken, welches Fenster wir benötigen, und genau zu diesem Fenster zu wechseln.
Die Idee ist folgende: Wenn wir ein bestimmtes Fenster für eine Tastenkombination speichern möchten, müssen wir diese Kombination drücken, während das gewünschte Fenster im Fokus ist. Bei späterem Drücken dieser Kombination wird der Fokus auf genau dieses Fenster gesetzt. Solange das Fenster nicht geschlossen wird oder wir diese Kombination zurücksetzen, bleibt die Zuordnung bestehen. showwinDetach.
Der Algorithmus des Skripts showwin sieht ungefähr so aus:
- Überprüfen, ob wir vorher die ID des Fensters gespeichert haben, dem der Fokus zugewiesen werden soll.
Wenn wir sie gespeichert haben und dieses Fenster weiterhin existiert, setzen wir den Fokus darauf und beenden den Vorgang. - Wir überprüfen, welches Fenster aktuell im Fokus ist, und wenn es unseren Anforderungen entspricht, merken wir uns seine ID für einen späteren Zugriff und beenden den Vorgang.
- Wir wechseln zu einem beliebigen passenden Fenster, falls es existiert, oder öffnen die benötigte Anwendung.
Um das aktuell fokussierte Fenster herauszufinden, können wir das Konsolenwerkzeug xdotool verwenden und dessen Ausgabe in ein hexadezimales Format umwandeln:
$ printf "0x%08x" `xdotool getwindowfocus`Etwas in Bash zu speichern, ist am einfachsten, indem man Dateien im virtuellen Dateisystem erstellt, das im Speicher liegt. In Ubuntu ist dies standardmäßig aktiviert. /dev/shm/. Ich kann nichts zu anderen Distributionen sagen, ich hoffe, dass es so etwas auch gibt. Man kann es mit dem Befehl ansehen:
$ mount -l | grep tmpfsDas Skript wird leere Verzeichnisse in diesem Ordner erstellen, und zwar folgende: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Zusätzlich wird bei jedem Aufruf ein Symlink erstellt /dev/shm/$USER/showwin/showwin_last findet man /dev/shm/$USER/showwin/$SEARCH_REGEX. Dies wird benötigt, um bei Bedarf die Fenster-ID für eine bestimmte Kombination mit Hilfe des Skripts zu löschen showwinDetach.
Was verbessert werden kann
Erstens müssen die Skripte manuell angepasst werden. Viele von Ihnen werden wahrscheinlich sogar gar nicht erst versuchen, das System einzurichten, weil es notwendig ist, sich intensiv mit den Details auseinanderzusetzen und viel manuell zu tun. Wäre es möglich, einfach ein Paket zu installieren und alles einfacher zu konfigurieren, könnte das vielleicht an Popularität gewinnen. Vielleicht würden so auch Anwendungen in die Standard-Distributionen aufgenommen.
Es könnte möglicherweise einfacher sein. Wenn man anhand der Fenster-ID die ID des Prozesses herausfinden könnte, der es erstellt hat, und mit der Prozess-ID dann die Befehlskette ermitteln könnte, die ihn erstellt hat, könnte man die Konfiguration automatisieren. Tatsächlich habe ich nicht genau untersucht, ob das, was ich in diesem Absatz beschrieben habe, möglich ist. Für mich persönlich ist die derzeitige Funktionsweise jedoch in Ordnung. Aber wenn jemand anderes diesen Ansatz als nützlich empfindet und ihn verbessert, freue ich mich, die bessere Lösung zu nutzen.
Ein weiteres Problem, wie ich bereits erwähnt habe, ist, dass man in einigen Fällen die Fenster nicht voneinander unterscheiden kann. Bisher habe ich das nur mit Incognito in Chrome/Chromium beobachtet, aber möglicherweise gibt es das auch anderswo. Im schlimmsten Fall gibt es immer die Möglichkeit von universellen Kombinationen. Alt+1…Alt+0Ich benutze übrigens Firefox, und für mich persönlich ist dieses Problem nicht gravierend.
Ein für mich erhebliches Problem ist jedoch, dass ich beruflich Mac OS verwende und ich dort nichts Ähnliches einrichten konnte. Die Utility wmctrl scheint auf Mac OS nicht richtig zu funktionieren. Ich konnte sie zwar installieren, aber sie funktioniert einfach nicht vernünftig. Automator, aber es läuft so langsam, dass es selbst dann unbequem ist, es zu benutzen, wenn es funktioniert. Ich konnte auch die Tastenkombinationen nicht so einstellen, dass sie in allen Programmen funktionieren. Wenn jemand zufällig eine Lösung findet – ich wäre froh, sie zu nutzen.
Abschließend
Es sind unerwartet viele Worte für so eine scheinbar einfache Funktionalität geworden. Ich wollte die Idee vermitteln und den Text nicht überladen, aber ich habe noch nicht herausgefunden, wie ich es einfacher ausdrücken kann. Vielleicht wäre es im Videoformat besser, aber das kommt hier nicht so gut an.
Ich habe ein wenig darüber erzählt, was im Hintergrund des Skripts passiert und wie man es einrichtet. Ich bin nicht ins Detail des Skripts gegangen, aber es sind nur 50 Zeilen, da ist es nicht schwer, sich einzuarbeiten.
Ich hoffe, dass noch jemand diese Idee ausprobiert und sie vielleicht sogar zu schätzen weiß. Von mir kann ich sagen, dass das Skript vor etwa drei Jahren geschrieben wurde, und es ist für mich SEHR praktisch. So praktisch, dass es ernsthafte Unannehmlichkeiten verursacht, wenn ich mit fremden Computern arbeite. Und auch mit dem Arbeits-MacBook.
Quelle: habr.com
