setxkbmapを切り替えるスクリプト


8

:私は間をトグルすることをbashスクリプトを希望 setxkbmap seしてsetxkbmap us

次に、CtrlEscキーボード>カスタムショートカットを介してそのスクリプトをマッピングするつもりです。

ポイントは、でキーボードのレイアウトを切り替えたいということですCtrlEscape。どうすれば実装できますか?


1
どのDEを使用しますか?
デイジー

3
XKBは、レイアウトを切り替えるキーを設定できます。これはあなたが書きたいものではありませんが、レイアウトのどのペアとどのキーの組み合わせを選択するかを選択するだけでよい、どこかにそれを事前に調理した構成があるでしょう。
Gilles「SO-邪悪なことをやめよう」

回答:


3

実行しているデスクトップ環境がわかりません。ショートカットキーを割り当てる方法はさまざまですが、このスクリプトは、少なくとも私Ubuntu 12.04 boxとでグローバルに機能しArch Linuxます。

#!/bin/bash

(setxkbmap -query | grep -q "layout:\s\+us") && setxkbmap se || setxkbmap us

残念ながら、guiメソッドを使用してレイアウトを変更した場合、これは機能しません。少なくとも、私のxfceボックスにはありません。これは、setxkbmapを使用してレイアウトを切り替える場合にのみ機能します。常に一貫して機能することがわかった唯一の方法xmodmapは、以下の私の答えのように解析することです。
terdon

@terdonそれは少なくとも私のUbuntu 12.04ボックスで動作します、あなたはあなたのシステムでそれを試しましたか?
デイジー2012

はい、信じてください。私はこの種の問題に対処するために長い時間を費やしてきました。私は定期的に3つのキーボードレイアウト(us、fr、es)と2つの物理キーボードを切り替えます。1つはUSレイアウト、もう1つはスペイン語です。tint2パネルのアプレットを使用してキーボードレイアウトを変更しても、の出力に違いはありませんsetxkbmapkeyboard shortcutsLMDEのGUI から設定されたショートカットを使用してレイアウトを切り替える場合も同様です。setxkbmapそれを使用して切り替えるときにのみ変更されます。
terdon

1行で解決できます。ありがとう。
Fredrik、

結局のところ、ホームディレクトリの.shファイルに行を保存しました。次に、。/ toggleLayout.shをctrl-escにマッピングしました
Fredrik

4

同様の質問に対するさまざまな答えがあります。しかし、それらのどれもが私にとって堅牢に機能しません。

次のスクリプトは、すべての場合に機能するはずです。レイアウトをsetxkbmap次のように切り替えると、debianシステムで確実に機能します。

#!/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

スクリプトはxmodmapの出力を解析して、現在のレイアウトが「us」または「se」であるかどうかを確認します。「us」レイアウトでは、SHIFT+ 7は「アンパサンド」にマッピングされます。「us」と「se」のレイアウトのみを切り替える場合、「アンパサンド」をオンに7すると、「us」のレイアウトが使用され、スクリプトが「se」に変わります。に「アンパサンド」がない場合7、スクリプトは「us」に切り替わります。


4

最善の方法は、スクリプトを使用せずに、2層のキーボード(例:)をロードしsetxmodmap "us,se"Ctrl- Escを再定義し、ISO_Next_Groupを送信することです。

メインのデフォルトファイルを編集せずにいくつかのキーを再定義する方法については、xkbこの回答を参照してください(したがって、ルートである必要はありません)。ローカルシンボルファイル(例~/.xkb/symbols/mysymbols:)に、次のように小さなセクションを追加します。

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

PC_CONTROL_LEVEL2は、そのキーのsencondシンボルが(Shiftではなく)Controlで取得されることを示します。

ローカルのキーマップファイル(例:~/.xkb/keymap/mykbd;で作成できますsetxkbmap "us,se" ; setxkbmap -print > ~/.xkb/keymap/mykbd)でxkb_symbols行を変更して「mysymbols(ctr_esc_toggle)」を追加すると、次のようになります。

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

(「se:2」に注意してください。「:2」は「se」シンボル定義をGroup2としてロードすることを示します。さまざまなグループをスタックできます)。

これで次のように読み込むことができますxkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY 。Ctrl-Escで「us」と「se」のレイアウトを切り替えます。

ただし、Escの前にCtrlキーを押したままにする必要があります。他の方法では機能しません(Escapeの仮想修飾子を定義する必要があり、その方法がわかりません)。


1
どのようにleftwin+leftalt+space見えますか?
Hotschke

@Hotschke、ありがとう{ include "pc+us+ru:2+inet(evdev)+group(win_space_toggle)" };
contributorpw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.