端末から現在のgnomeキーボードレイアウトを取得する方法は?


13

bashスクリプトで使用するには、ユーザーが現在使用しているgnomeキーボードレイアウトを取得する必要があります。たとえば、ユーザーがキーボードレイアウトをに設定した場合、これを表示en-usするbashコマンドが必要です。

どうすればその情報を入手できますか?

更新:

setxkbmap -query残念ながら機能していません。以下は、en(最初のコマンド)およびde(2番目のコマンド)レイアウトがアクティブ化された出力です。キーボードレイアウトの切り替えは、gnomeセッションの構成と何らかの関係があるようです

setxkbmap -query 
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

setxkbmap -query
rules:      evdev
model:      pc105
layout:     us,de
variant:    ,
options:    terminate:ctrl_alt_bksp,lv3:ralt_switch,grp:alts_toggle

Update2:

setxkbmap -print #with en-us layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};
setxkbmap -print #after switching to german layout
xkb_keymap {
    xkb_keycodes  { include "evdev+aliases(qwerty)" };
    xkb_types     { include "complete"  };
    xkb_compat    { include "complete"  };
    xkb_symbols   { include "pc+us+de:2+inet(evdev)+level3(ralt_switch_for_alts_toggle):1+level3(ralt_switch_for_alts_toggle):2+group(alts_toggle)+level3(ralt_switch)+terminate(ctrl_alt_bksp)"    };
    xkb_geometry  { include "pc(pc105)" };
};

悲しいことに、それはbashのではないですが、libxklavierを使用すると、ここにあなたが求めて何をすべきか[Pythonの例] [1]です:[1]:cgit.freedesktop.org/libxklavier/tree/tests/test_gi.py
風船

1
<rant> xkbは文書化されていない地獄です!これらの複数のレイアウト定義は、確実に機能しません。私にとっては、突然ランダムに切り替わり、一時停止後、定義されたレイアウトのどれが有効で、さらに悪いことには、接続されたキーボードごとに独立して決定されました。はい、xkbはキーボードごとに異なるレイアウトを実際に持つことができますが、これは私が知る限りどこにも文書化されていません。xkb、真剣に、始めてはいけない!</ rant>
クリスチャン

回答:


9

Stackoverflowでの同様の質問によると、次のトリックが必要です。

setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'

現在、Xを使用できる* nixマシンがないため、確認できませんでした(自宅ではありません)...


1
setxkbmap -printを実行すると、次が返されます。これがOPに役立つとは思わない。xkb_keymap { xkb_keycodes { include "evdev+aliases(qwerty)" }; xkb_types { include "complete" }; xkb_compat { include "complete" }; xkb_symbols { include "pc+us+inet(evdev)" }; xkb_geometry { include "pc(pc105)" }; };
風船

あなたは現在「私たち」のレイアウトをアクティブにしていますか?これは、入力が与えられると、上記のステートメントが出力として生成するものです(これら2文字のみ: "us")。別のレイアウトに切り替えるとどのように見えますか?
イジー

2
ご回答有難うございます。残念ながら、これはトリックを行っていません。両方の時間に私たちを取得します。出力を表示するために質問を編集しました。
ftiaronsem

試してみる価値がありました。-vパラメーターを(複数回)指定してみてください。これにより、冗長性が高まり、より多くの情報が得られます。-queryと同様に両方で動作するはず-printです。マルチ言語のセットアップがないため、必要な詳細が提供されているかどうかわかりませんが、-vここでの3回の出力は「適用ルール」と「キーマップ」に分割されます。後者は完全な情報であると思われるため、最初の部分に「現在アクティブな部分」を含めることができます。
イジー

再度感謝しますが、残念ながらこれもうまくいきませんでした。レイアウト変更の前後で同じ出力。冗長性とは無関係。
ftiaronsem

4

Ubuntu 17.10以降の場合

GNOMEを使用するUbuntu 17.10では、入力ソースを切り替えても現在の gsettings値は変更されません。代わりあるMRU-ソース一覧表示キーM OST R ecently U SED入力ソースは。

$ gsettings get org.gnome.desktop.input-sources mru-sources
[('xkb', 'se'), ('xkb', 'us')]

そのリストの最初のソースは現在のものであるため、現在のレイアウトを取得するためのonelinerは次のようになります。

gsettings get org.gnome.desktop.input-sources mru-sources | sed -r "s/\S*\s'([^']+).*/\1/"

Ubuntu 17.10システムでUnityを使用する場合、この回答は適用されないことに注意してください。Unityでは、以前と同じように機能し続けます。


3

Ubuntu 13.04以前の場合

xkblayout-stateツールを使用できます。説明、コンパイル、インストール、および使用法については、README.mdファイルを参照してください。

次のコマンドは、必要なことを正確に実行します。

xkblayout-state print "%s"

Ubuntu 13.10以降の場合

Ubuntu 13.10では、この意味でいくつかの優れた改善が行われ、次の単純なbash関数を使用できます。

get_current_xkblayout () {
      current_input_nr=$(gsettings get org.gnome.desktop.input-sources current | \
          awk '{ print $NF }')
      shift=$(( 2 * ( $current_input_nr + 1 )))
      gsettings get org.gnome.desktop.input-sources sources | tr -d "\',[]()" | \
          awk -v cur="$shift" '{ print $cur }'
}

次のコマンドも13.10で機能します。

setxkbmap -query | awk -F"(,|[ ]+)" '/layout:/ { print $2 }'

または:

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'

2

キーボードのCtrl+ Alt+ Tを押すだけで、ターミナルが開きます。開いたら、以下のコマンドを実行します。

setxkbmap -query

これはあなたが見るべきものです

ここに画像の説明を入力してください


迅速な回答をありがとう、残念ながらこれは機能しません。出力は次のとおりです(最初にenレイアウト、2番目にde):
ftiaronsem

質問の編集として貼り付けられた書式設定のため
...-ftiaronsem

1
迅速な返信ありがとうございます。これは私が見ているものを含んでいますが、ドイツ語のレイアウトを選択したかアメリカのレイアウトを選択したかはわかりません。または私は何かを見逃しましたか?
ftiaronsem

2

ターミナルを使用して、「pt」と「us」の間で変更するテストを実行し、変更するたびに、使用中のキーボードレイアウトを収集しました。

アクティブなキーボードレイアウトを取得する

setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}'
  • 設定を印刷します。 setxkbmap -print
  • 重要な行を収集します。 grep xkb_symbols
  • 最初の「+」記号の後の文字列を取得します。 awk -F"+" '{print $2}'

「us」レイアウトがアクティブな出力は次のとおりです。 us


レイアウト間の切り替え

sudo setxkbmap -option grp:alt_shift_toggle pt

切り替え先の言語コード「pt」を読み取る場所を渡します。

ここに画像の説明を入力してください

注: Ubuntu 12.04(Precise Pangolin)でGnomeを使用しています


ご回答有難うございます。問題は、ユーザーがタスクバーアプレットを使用してレイアウトを切り替える傾向があることです。cmdからレイアウトを切り替えている場合は機能しますが、ユーザーがタスクバーアプレットで切り替えた場合は機能しません。
ftiaronsem

@ftiaronsem、あなたはその部分について前に言及していません:)私はそれを調べて、可能であれば私の答えを更新します!
ズールー

0

Ubuntu 13.10以降の場合

(以前のリリースで動作するかどうかはわかりません)

current_layout=gsettings get org.gnome.desktop.input-sources current | awk '{print $2}'
gsettings get org.gnome.desktop.input-sources sources | grep -Po "'[[:alpha:]]+'\)" | sed -ne "s/['|)]//g;$(($current_layout+1))p"

他のオプションを表示するには:

gsettings list-recursively org.gnome.desktop.input-sources
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.