web-dev-qa-db-ja.com

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

setxkbmap sesetxkbmap usを切り替えるbashスクリプトが欲しいのですが。

次に、私の意図は、そのスクリプトをにマップすることです CtrlEsc キーボード>カスタムショートカットを使用します。

ポイントは、キーボード配列を次のように切り替えたいということです。 CtrlEscape。どうすればそれを実装できますか?

8
Fredrik

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

#!/bin/bash

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

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

次のスクリプトはすべての場合に機能するはずです。 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」かを確認します。 「私たち」のレイアウトでは、 SHIFT+7 「アンパサンド」にマッピングされます。 「us」と「se」のレイアウトのみを切り替える場合は、「アンパサンド」をオンにします 7 「us」レイアウトを使用していて、スクリプトが「se」に変更されることを意味します。 「アンパサンド」がオンになっていない場合 7、スクリプトは「us」に切り替わります。

4
terdon

最良の方法は、スクリプトを使用せずに、2層キーボード(例:setxmodmap "us,se")をロードして、 Ctrl-Esc ISO_Next_Groupを送信します

メインのデフォルトファイルを編集せずにいくつかのキーを再定義する方法については、 xkbに関するこの回答 を参照してください(したがって、rootである必要はありません)。ローカルシンボルファイル(例:~/.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の仮想修飾子を定義する必要があり、その方法がわかりません)

4
Pablo Saratxaga