如何从 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

相关内容