如何以编程方式更改键盘布局?

如何以编程方式更改键盘布局?

我想运行一个 shell 命令或脚本,将我的每个 Ubuntu Precise 盒子配置为使用 Dvorak 键盘布局作为默认(也是唯一)布局。使用早期版本,我能够在 /etc/default/keyboard 中设置 XKBVARIANT,但当我在 Precise 中进行此更改(并重新启动)时,键盘布局似乎不受影响(在控制台和 gnome 中均如此)。

我也尝试将 XKBMODEL 设置为 pc105 并将 XKBLAYOUT 设置为 us,但这似乎没有帮助。

我知道我可以使用“键盘布局”工具设置 gnome 的布局...但我希望更改影响控制台,并且我希望自动执行该过程。我该如何实现这一点?

编辑:

为了澄清起见,我想知道如何(仅使用脚本或命令行)将键盘布局更改为 Dvorak 作为 Gnome 和控制台的默认和唯一键盘布局。我希望此更改是持久的(重启后仍然有效),就像通过键盘布局工具进行更改时一样。

编辑:

让我换一种说法。如果我自己安装了操作系统(我没有这样做,因为操作系统是由虚拟机基础结构安装的),我可以在安装时选择所需的键盘布局,并且该布局将在整个系统范围内持续应用。我如何更改布局,使其看起来像我在安装过程中设置的一样?

答案1

我也使用 Ubuntu 12.04,并一直在努力解决这个问题。使用 Jason Coombs 对他自己问题的回答作为起点,我能够使用 /etc/default/keyboard 设置我的键盘选项(对我来说,ctrl:nocaps 和 compose:menu),并让这些选项在控制台重新启动后保持不变。但是,LightDM/Unity 会在重新启动时忽略该设置。需要澄清的是,我没有在 Unity 中设置任何键盘首选项,因此 Unity应该默认采用系统默认键盘设置,但由于某种原因没有使用键盘选项。

我注意到,如果我登录后运行以下命令,Unity 会突然开始识别我的系统默认键盘选项:

设置xkbmap

我没有向 setxkbmap 提供任何参数,我只是在没有任何选项的情况下调用它,它读取并应用系统默认地图。

为了使此操作在任何用户登录时自动发生(至少是任何拥有 Gnome 或 Unity 桌面的用户),我制作了以下 setxkbmap.desktop 文件,并将其放在 /etc/xdg/autostart/ 目录中:

[桌面条目]
类型=应用程序
TryExec=/usr/bin/setxkbmap
执行=/usr/bin/setxkbmap
隐藏=false
无显示=真
X-GNOME-自动启动已启用=true
名称[en_US]=系统键盘修复
名称=系统键盘修复
Comment[en_US]=将系统范围的键盘设置应用于会话
注释=将系统范围的键盘设置应用于会话

此修复似乎使键盘选项在整个系统范围内保持一致,除了在登录之前 LightDM 控制我的屏幕的短暂时间之外。

答案2

setxkbmap在 2024 年仍然有效,但与 GNOME Shell 配合不佳:托盘图标没有反映出变化,并且不再可能通过配置的热键进行切换(直到重新启动)。

各种方法这些年来,用于切换键盘的( gsettings set …, gdbus call…) 不断发展,但它们不再起作用。gsettings …使用现已弃用的键,并且gdbus …使用org.gnome.Shell.Eval也因不安全而被弃用的键。可以Eval使用ramottamado/eval-gjs,但要小心假货!

扩展至https://extensions.gnome.org/extension/5952/eval-gjs不是由我上传或维护的。请不要安装此扩展。

这促使我创建了自己的 GNOME Shell 扩展,专门用于解决该问题:以编程方式切换键盘布局。它还公开了 D-Bus 接口,但不使用任何不安全的 eval。您可以从GNOME 扩展网站或建立它来自源头安装后使用非常简单。只需使用您需要的布局调用 D-Bus 接口即可,例如:

gdbus call \
    --session \
    --dest org.gnome.Shell \
    --object-path /me/madhead/Shyriiwook \
    --method me.madhead.Shyriiwook.activate "de"

更多详情请参阅自述

答案3

!!! 未完成的答案 !!!(如果您知道如何改进这个答案,请删除此警告)

您可以使用命令setxkbmap。例如

setxkbmap de

将当前布局设置为德语。使用

setxkbmap us

您可以将其设置为美国布局。

警告:我认为此命令还会重置其他语言选项。例如,当我运行此命令时,语言图标会消失。因此,如果您更改为西里尔文、中文、希腊文等,则很难改回拉丁字母布局。但该命令setxkbmap可能是一个很好的提示,可以继续研究如何切换布局。

答案4

setxkbmap -option grp:alt_shift_toggle en

相关内容