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

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

setxkbmap se:とを切り替えるbashスクリプトが必要です setxkbmap us

私の意図は、CtrlEscキーボード>カスタムショートカットを介してそのスクリプトをマッピングすることです。

要点は、スイッチのキーボードレイアウトを使用したいことですCtrlEscape。どのように実装できますか?

答え1

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

#!/bin/bash

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

答え2

最善の方法は、スクリプトを使用するのではなく、キーボードの2つのレイヤー(例えば:)をロードしてオーバーライドしてsetxmodmap "us,se"ISO_Next_GroupCtrlEsc送信することです。

見ているこの答えは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は、キーの2番目のシンボルがCtrl(Shiftではない)によって取得されることを示します。

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

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

(「se:2」、「:2」は、「se」シンボル定義をグループ2にロードする指示です。さまざまなグループをスタックできます)。

これで、次のようにロードできます。xkbcomp -I$HOME/.xkb ~/.xkb/keymap/mykbd $DISPLAY Ctrl-Escを押すと、「us」と「se」のレイアウトが切り替わります。

ただし、Escを押す前にCtrlを押す必要があり、他の方法は機能しません。 (Escape用のダミー修飾子を定義する必要がありますが、どうすればよいかわかりません。)

答え3

同様の質問には複数の回答があります質問。しかし、それらのどれも私のために働かない。

次のスクリプトはすべての状況で動作するはずです。以下を使用してレイアウトを切り替えると、私のDebianシステムで確実に動作します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

このスクリプトは xmodmap の出力を解析し、現在のレイアウトが「us」か「se」かを確認します。 「us」レイアウトでは、+SHIFT7「&」にマップされます。 「us」と「se」のレイアウトのみを切り替える場合、「&」をオンにすると7「us」のレイアウトを使用し、スクリプトが「se」に変更されることを意味します。 「&」がオンでない場合、7スクリプトは「us」に切り替わります。

答え4

同じ言語のバリアントを切り替える場合(例:us langとバリアントintlを持つus langの間):

#!/bin/bash

setxkbmap -query | grep -q 'variant:\s\+intl') && setxkbmap -layout us || setxkbmap -layout us -variant intl

関連情報