Skript zum Umschalten von setxkbmap

8

Ich hätte gerne ein Bash-Skript, das zwischen: setxkbmap seund umschaltet setxkbmap us.

Dann möchte ich dieses Skript CtrlEscüber die Tastatur> benutzerdefinierte Verknüpfungen zuordnen.

Der Punkt ist, dass ich das Tastaturlayout mit wechseln möchte CtrlEscape. Wie kann ich das umsetzen?

Fredrik
quelle
1
Welches DE benutzt du?
Gänseblümchen
3
XKB kann einen Schlüssel zum Wechseln zwischen Layouts einrichten. Dies ist nichts, was Sie schreiben möchten, aber es gibt wahrscheinlich eine vorgekochte Konfiguration dafür irgendwo, wo Sie nur auswählen müssen, welches Layoutpaar und welche Tastenkombination Sie bevorzugen.
Gilles 'SO - hör auf böse zu sein'

Antworten:

3

Ich weiß nicht, welche Desktop-Umgebung Sie ausführen und wie Sie eine Tastenkombination zuweisen können, aber dieses Skript funktioniert global, zumindest auf meiner Ubuntu 12.04 boxund Arch Linux:

#!/bin/bash

(setxkbmap -query | grep -q "layout:\s\+us") && setxkbmap se || setxkbmap us
Gänseblümchen
quelle
Leider funktioniert dies nicht, wenn Sie das Layout mit einer GUI-Methode ändern. Zumindest nicht auf meiner xfce-Box. Dies funktioniert nur, wenn Sie setxkbmap zum Wechseln von Layouts verwenden. Der einzige Weg, wie ich festgestellt habe, dass immer konsequent funktioniert, ist das Parsen xmodmapwie in meiner Antwort unten.
Terdon
@terdon es funktioniert zumindest auf meiner Ubuntu 12.04 Box, hast du das auf deinem System versucht?
Gänseblümchen
Ja, glauben Sie mir, ich habe mich lange mit dieser Art von Problem beschäftigt. Ich wechsle regelmäßig zwischen 3 Tastaturlayouts (us, fr, es) und zwischen zwei physischen Tastaturen, eine mit US-Layout und eine mit Spanisch. Wenn ich das Applet auf meinem tint2-Bedienfeld verwende, um das Tastaturlayout zu ändern, gibt es überhaupt keinen Unterschied in der Ausgabe von setxkbmap. Gleiches gilt, wenn ich das Layout mithilfe einer Verknüpfung wechsle, die über die keyboard shortcutsGUI auf meinem LMDE eingerichtet wurde. setxkbmapändert sich nur, wenn ich damit wechsle.
Terdon
Wirklich ordentlich mit einzeiliger Lösung. Vielen Dank.
Fredrik
Am Ende habe ich die Zeile in einer .sh-Datei in meinem Home-Verzeichnis gespeichert. Dann zugeordnet ./toggleLayout.sh zu ctrl-esc
Fredrik
4

Es gibt verschiedene Antworten auf ähnliche Fragen . Keiner von ihnen funktioniert jedoch robust für mich.

Das folgende Skript sollte in allen Fällen funktionieren. Es funktioniert auf meinem Debian-System auf jeden Fall, wenn Sie Layouts wechseln mit setxkbmap:

#!/bin/bash
seven=`xmodmap -pke | grep "keycode  16" | awk '{print \$5}'` 
## If this is the "us" layout
if [ $seven == "ampersand" ]; then
    setxkbmap se
else
  setxkbmap us
fi

Das Skript analysiert die Ausgabe von xmodmap, um festzustellen, ob das aktuelle Layout "us" oder "se" ist. Im "us" -Layout ist SHIFT+ 7"kaufmännisches Und" zugeordnet. Wenn Sie nur zwischen den Layouts "us" und "se" 7wechseln, bedeutet "kaufmännisches Und", dass Sie das Layout "us" verwenden und das Skript in "se" geändert wird. Wenn Sie kein "kaufmännisches Und" aktiviert haben 7, wechselt das Skript zu "uns".

terdon
quelle
4

Der beste Weg wäre, kein Skript zu verwenden, sondern eine zweischichtige Tastatur (z. B. :) zu laden setxmodmap "us,se"und die Ctrl- neu Esczu definieren , um ISO_Next_Group zu senden

In dieser Antwort auf xkb erfahren Sie, wie Sie einige Schlüssel neu definieren können, ohne die Hauptstandarddateien bearbeiten zu müssen (daher muss kein Root vorhanden sein). Fügen Sie in die lokale Symboldatei (z. B. ~/.xkb/symbols/mysymbols:) einen kleinen Abschnitt ein als:

partial modifier_keys 
xkb_symbols "ctrl_esc_toggle" {
    key <ESC> {
        type[Group1]="PC_CONTROL_LEVEL2",
        symbols[Group1]= [ Escape,     ISO_Next_Group ]
    };
};

PC_CONTROL_LEVEL2 teilt mit, dass das Sencond-Symbol für diesen Schlüssel mit Control (anstelle von Shift) erhalten wird.

und in der lokalen Keymap-Datei (zB : ~/.xkb/keymap/mykbd; Sie können sie mit erstellen setxkbmap "us,se" ; setxkbmap -print > ~/.xkb/keymap/mykbd) ändern Sie die Zeile xkb_symbols, um "mysymbols (ctr_esc_toggle)" hinzuzufügen, sodass Sie Folgendes haben:

xkb_symbols   { include "pc+us+se:2+inet(evdev)+terminate(ctrl_alt_bksp)+compose(rwin)+mysymbols(ctr_esc_toggle)"   };

(Beachten Sie, dass "se: 2" und ": 2" die Definitionen der "se" -Symbole als Gruppe2 laden. Sie können verschiedene Gruppen stapeln.)

Sie können es jetzt laden mit: xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY Dann wechselt Strg-Esc zwischen den Layouts "us" und "se".

Beachten Sie jedoch, dass Sie vor Esc die Strg-Taste drücken (und gedrückt halten) müssen. Auf die andere Weise funktioniert es nicht (es würde die Definition eines virtuellen Modifikators für Escape erfordern, und ich weiß nicht, wie es geht)

Pablo Saratxaga
quelle
1
Wie würde es leftwin+leftalt+spaceaussehen?
Hotschke
@Hotschke, danke{ include "pc+us+ru:2+inet(evdev)+group(win_space_toggle)" };
Contributorpw