如何从命令行优雅地更改键盘布局(setxkbmap 破坏所有快捷键)

如何从命令行优雅地更改键盘布局(setxkbmap 破坏所有快捷键)

有没有办法从命令行更改 Cinnamon 中当前活动的键盘布局?

大多数指南建议的解决方案setxkbmap并不像预期的那样有效:如果调用它,Cinnamon 中的语言指示器本身就会消失,并且 Cinnamon 中配置的现有组合不再起作用。要恢复此功能,必须转到设置并重新启用任何键盘布局设置。

此外,更改布局的方式setxkbmap似乎比 Cinnamon 所期望的要低级:例如,如果您使用 将布局更改为非拉丁布局,则setxkbmap整个系统中的默认组合键将停止工作。(使用 Ctrl-C 轻松测试)。在 Cinnamon 内部切换本机布局时从未发生过这种情况。似乎 的setxkbmap运行级别低于大多数应用程序所期望的级别。

有没有办法改变原生的 Cinnamon(或者 gnome,因为它基于它?)布局并保持键盘组合正常工作?

(通常提出的另一种解决方案是gsettings set org.gnome.desktop.input-sources current 0,但在当前的 Cinnamon 中也不起作用(什么都没有发生))。

当然,我已经测试了所有可能的索引,最多 10 个,尽管我目前只添加了 3 个布局。当手动更改布局时,提到的变量似乎也没有改变。我也尝试了 Cinnamon 环境中存在的类似变量,org.cinnamon.desktop.input-sources但它也没有影响任何东西(与 gnome 版本完全相同)。

答案1

当前最好的解决方案是使用这个xkb-switch接受命令行参数的外部程序()并将其编写成 xbindkeys 或类似程序的脚本。

虽然它是非官方的、外部的、并且用可编译语言编写的,但它实际上非常容易安装,因为它几乎没有依赖关系。

https://github.com/ierton/xkb-switch

$ xkb-switch --help

Usage: xkb-switch -s ARG            Sets current layout group to ARG
       xkb-switch -l|--list         Displays all layout groups
       xkb-switch -h|--help         Displays this message
       xkb-switch -v|--version      Shows version number
       xkb-switch -w|--wait [-p]    Waits for group change and exits
       xkb-switch -W                Infinitely waits for group change
       xkb-switch -n|--next         Switch to the next layout group
       xkb-switch [-p]              Displays current layout group

用于:

xkb-switch -s us
xkb-switch -s de
etc...

此解决方案:

  • 从命令行工作。
  • 速度很快,调用此程序不会引入任何延迟(与切换布局相反setxkbmap)。
  • 正确切换托盘图标区域中的内置布局指示器。(指示器不会像 一样消失或停止工作setxkbmap。)
  • 不会搞乱锁屏上的键盘映射,如果在锁定之前选择了错误的布局,则无法输入正确的密码(就像 一样setxkbmap)。
  • 不会修改主要的组合键,如 Ctrl-C、Ctrl-V:即使在不同的布局下,它们仍然可以使用相同的键(不同于,你明白了setxkbmap)。
  • 遵守所有 Cinnamon 布局机制,例如可以对所有窗口使用相同布局,也可以对每个窗口使用单独的布局。(猜猜看是否setxkbmap如此?)

安装说明在 Github 上。

答案2

您可以使用类似如下的方法:

setxkbmap ru,us

对于俄语布局,保留所有全局热键,如Ctrl + C

这里看到的想法:https://unix.stackexchange.com/questions/316998/how-to-change-keyboard-layout-in-gnome-3-from-command-line

与单纯的 相比,变化的setxkbmap ruxkb_symbols从 扩展{ include "pc+ru+inet(evdev)" };{ include "pc+ru+us:2+inet(evdev)" };(用 进行检查setxkbmap ru -print)。

因此,虽然不确定,但我猜想当ru单独使用时,它会重置所有附加映射并按原样设置布局。同时,它ru,en会将布局设置为俄语,但也会设置所有必要的全局键解释,这些解释取自美国布局。

相关内容