切换键盘布局

切换键盘布局

最终目标

我使用 Arch Linux 作为bspwm我的窗口管理器和sxhkd热键守护进程。我想在我的应用程序中映射某个特定的组合键山西香港发展研究中心以便它在不同的键盘布局中随机播放。例如:

# Shuffle through keyboard layouts
super + e
    *action to be executed*

语言环境

首先,我不知道是否需要添加塞尔维亚语区域设置,因为我只想(有时)激活塞尔维亚语键盘布局。我的想法是键映射就足够了。为了以防万一,我生成了塞尔维亚语言环境;所以现在当我运行时localectl list-local,输出是:

en_US.UTF-8
sr_RS.UTF-8
sr_RS.UTF-8@latin

这些分别对应:

  • 美国英语语言环境 – UTF-8 编码
  • 塞尔维亚的塞尔维亚语言环境 – 西里尔字母 – UTF-8 编码
  • 塞尔维亚的塞尔维亚语言环境 – 拉丁文字 – UTF-8 编码

键位图

我想要使​​用的三种布局(能够随机播放)是:

  • us= 美国英语
  • sr-cy= 西里尔字母塞尔维亚语
  • sr-latin= 拉丁文塞尔维亚语

我知道我可以编辑/etc/vconsole.conf和设置KEYMAP=sr_cy而不是us或使用localectl set-keymap sr_cy.

以下是我的担忧接着就,随即:

  1. 这不是一个优雅的解决方案。
  2. 我无法在不同的布局之间切换。我每次都必须运行命令并指定所需的布局。
  3. 即使我注销或重新启动系统后,这种更改是否会在全局范围内持续存在?如果答案是肯定的,我可能会遇到麻烦。我在 LUKS 加密上使用 LVM,为了解密我的磁盘,我需要us布局。因此,如果我在重新启动之前忘记切换西里尔字母,那就永远再见了。

问题

有什么方法可以让我添加多个键盘映射/etc/vconsole.conf并使其us成为默认键盘映射吗?如果是这样,我需要做什么才能在它们之间切换。这是一个简单的命令还是我需要一个小脚本?如果这不是一个选择,那么实现我的最终目标的最佳方法是什么。

我尝试寻找拥有多个键盘映射的答案,但找不到任何适用于我的问题的内容。我会很感激一个解决方案,甚至是意见和建议,特别是如果它能增进我的知识。先感谢您!

答案1

您收到“加载新键盘描述时出错”,因为setxkbmap实际上需要与您在命令中设置的布局名称不同的布局名称。

如果运行localectl list-keymaps | grep sr,您将如预期得到: sr-cysr-latin

如果运行localectl list-locales | grep sr,您还将得到预期结果:sr_RS.UTF-8sr_RS.UTF-8@latin

但是,localectl list-x11-keymap-layouts| grep sr不返回任何内容,而是必须使用另一个两个字母的缩写:localectl list-x11-keymap-layouts| grep rs它返回rs用于 X11 下的塞尔维亚语键盘布局。

因此,对于Cyrillic您实际需要使用的setxkbmap rs情况,默认为西里尔字母布局,

要激活Latin布局,您必须专门为塞尔维亚键盘布局启用此变体,因为它不是默认布局:setxkbmap -layout rs -variant latin

我自己使用这个命令:setxkbmap -layout rs,rs,de,us -variant latin,,,dvp -option 'grp:alt_shift_toggle'。这会执行以下操作:

  • 添加塞尔维亚布局作为我的默认值并设置拉丁它的变体
  • 添加塞尔维亚布局及其默认值(西里尔字母)
  • 添加德语其默认布局
  • 添加我们布局并设置德沃夏克程序员它的布局
  • Alt+Shift添加使用组合键在布局之间切换的选项。

和必须以相同的顺序设置,如果没有为变体设置任何内容(意味着逗号后面没有任何内容),它将使用该语言的默认值-layout-variant

我已启用这些区域设置/etc/locale.gen并使用命令生成sudo locale-gen

如果我用 localectl 列出它们:

localectl list-locales
C.UTF-8
de_DE.UTF-8
en_DK.UTF-8
en_US.UTF-8
sr_RS.UTF-8
sr_RS.UTF-8@latin

我的默认 localectl 如下所示:

localectl status
System Locale: LANG=en_US.UTF-8
               LC_NUMERIC=sr_RS@latin
               LC_TIME=sr_RS@latin
               LC_MONETARY=sr_RS@latin
               LC_PAPER=sr_RS@latin
               LC_NAME=sr_RS@latin
               LC_ADDRESS=sr_RS@latin
               LC_TELEPHONE=sr_RS@latin
               LC_MEASUREMENT=sr_RS@latin
               LC_IDENTIFICATION=sr_RS@latin
    VC Keymap: sr-latin
   X11 Layout: rs,latin

我使用 Arch Linux 和 I3 作为平铺管理器,这行在我的~/.config/i3/config

exec --no-startup-id sleep 6 && setxkbmap -layout rs,rs,us,de -variant latin,,dvp, -option 'grp:alt_shift_toggle'

加载布局并通过简单的组合键启用布局切换。

我也有

exec --no-startup-id gxkb

它将代表当前键盘布局的图标添加到我的 i3blocks 栏中。

我知道 OP 不使用相同的配置,但我认为这可以很容易地转换为他们的设置。

答案2

我经常setxkbmap在 Dvorak 和 QUERTY 之间切换。我有一个 bash 脚本~/.local/bin/toggle_kbd(包含在我的 中PATH),我的窗口管理器已将其绑定到快捷方式。它只是运行一个 case 语句来将我的键盘设置为当前不是的键盘。我正在使用中列出的键盘映射名称localectl list-keymaps

#!/usr/bin/env bash

case $(setxkbmap -query | grep layout | awk '{ print $2 }') in
          us) setxkbmap sr-cy ;;
       sr-cy) setxkbmap sr-latin ;;
    sr-latin) setxkbmap us -variant altgr-intl ;;
           *) setxkbmap us -variant altgr-intl ;;
esac

每当 X 重新启动时,它也会重置为您所在区域的键盘(启动时使用的普通键盘)。这循环遍历它们而不是设置特定的一个。我不知道这对你来说有多大,但剧本的想法可以很容易地适应这一点。

答案3

由于缺乏声誉,我无法发表评论。我不知道答案,只是想分享一下我的想法。

首先是最坏的情况。您能否通过创建 USB 记忆棒等外部驱动器并从其启动来从内部驱动器恢复文件,从而从无法输入密码的情况中恢复过来?也许你可以尝试这样做,为最坏的情况做好准备。

我从未使用过 localectl,它对于您的需求来说似乎过于强大,只需更改键盘布局,因为它也控制其他软件的本地化。我通常使用setxkbmap.我很确定但不保证,您使用 setxkbmap 所做的更改会随 X 服务器一起消失,因此重新启动会重置,但我不提供任何保证。然而,这可以测试:制作美国键盘映射的副本,交换两个密钥(至少一个是解密密码的一部分),应用该副本,重新启动系统,现在您可以检查是否仍然应用新布局(我希望我的意思很清楚,如果您的密码是:asdf,则交换 f 和 g,看看您是否必须输入 asdf 或 asdg)。

为了让这对你有用,我当然假设了很多事情。如果你不使用X,那么这根本没有用。

相关内容