シェルから Sway のキーボード レイアウトを切り替えるにはどうすればいいですか?

シェルから Sway のキーボード レイアウトを切り替えるにはどうすればいいですか?

コマンドラインから Sway の xkb キーボードレイアウトを切り替えるにはどうすればよいですか? レイアウトは次のように構成されています:

input type:keyboard {
    xkb_layout pl,es
    xkb_options grp:win_space_toggle,compose:caps
}

pl次のレイアウトに切り替えるコマンド (現在のレイアウトが の場合はeses現在のレイアウトが の場合は)を用意したいと思いますpl

注記: インデックスを指定してレイアウトを変更できるコマンドがありますswaymsg "input type:keyboard xkb_switch_layout <index>"。現在のインデックスを取得する方法がわからないため、それを使用して次のレイアウトに切り替える方法がわかりません。

答え1

nextSway バージョン 1.5.1 を使用すると、に提供できますxkb_switch_layout。したがって、現在のインデックスと合計アイテム数を取得する必要がなくなります。

swaymsg input "1:1:AT_Translated_Set_2_keyboard" xkb_switch_layout next

type:keyboard残念ながら、識別子の代わりにを使用することはできません。 で識別子を見つけることができますswaymsg -t get_inputs。使用可能なすべてのレイアウトと現在のレイアウトのインデックスを表示するには、 を追加する必要があります--raw

答え2

を実行すると、入力の現在のキーボード レイアウト インデックスを取得できますswaymsg -t get_inputs。これにより、入力の配列とそれに関連付けられた設定を含む JSON が提供されます。

探しているキーはxkb_active_layout_indexとですxkb_layout_names

以下は、私のシステムでコマンドによって生成された出力の例です (関連部分を表示するために切り取られています)。

  (...)
  {
    "identifier": "16700:8467:Dell_KB216_Wired_Keyboard",
    "name": "Dell KB216 Wired Keyboard",
    "vendor": 16700,
    "product": 8467,
    "type": "keyboard",
    "xkb_layout_names": [
      "English (US)",
      "Romanian (standard)"
    ],
    "xkb_active_layout_index": 0,
    "xkb_active_layout_name": "English (US)",
    "libinput": {
      "send_events": "enabled"
    }
  },
  (...)

Sway のトグルの動作をシミュレートするには、次のコードを使用できます。

inputid="YOUR_KEYBOARD_INPUT_IDENTIFIER"

inputdata=$(swaymsg -t get_inputs | jq ".[] | select(.identifier==\"$inputid\")")
index=$(echo "$inputdata" | jq ".xkb_active_layout_index")
layoutcount=$(echo "$inputdata" | jq ".xkb_layout_names | length")
swaymsg input "$inputid" xkb_switch_layout $((($index + 1) % $layoutcount))

Sway バージョン 1.4 を使用

答え3

すでに正しい設定になっています。Super+Space でキーボード レイアウトが変更されます (これがwin_space_toggle意味するところです)。キーボード レイアウトを切り替えるための他のキー設定もあります。これらは man ページで確認できます: man 7 xkeyboard-config

関連情報