如何從 shell 切換 Sway 中的鍵盤佈局?

如何從 shell 切換 Sway 中的鍵盤佈局?

如何從命令列在 Sway 中的 xkb 鍵盤佈局之間切換?我的版面配置如下:

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

我希望能夠有一個命令切換到下一個佈局(pl如果當前佈局是es,則es切換到pl)。

筆記:有一個命令swaymsg "input type:keyboard xkb_switch_layout <index>"允許您更改指定其索引的佈局。我不知道如何使用它切換到下一個,因為我不知道如何獲取當前索引。

答案1

使用 sway 版本 1.5.1,我可以提供nextxkb_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_indexxkb_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))

使用搖擺版本1.4

答案3

您已經擁有正確的配置。 Super+Space 應該改變你的鍵盤佈局(這就是win_space_toggle意思)。還有其他用於切換鍵盤佈局的按鍵配置,您可以在手冊頁中找到它們:man 7 xkeyboard-config

相關內容