如何在 Linux 中更改控制台键盘映射?

如何在 Linux 中更改控制台键盘映射?

我想在控制台中交换Esc和(而不是在 X 中,并使用),我该怎么做?CapsLockxev

我的操作系统是 Ubuntu。

答案1

操纵键盘布局的工具虚拟控制台loadkeysdumpkeysshowkey。阅读它们的手册页并了解它们的复杂性。

请注意,这些工具只能在虚拟控制台中使用,不能在 gnome 等图形环境中的终端仿真器中使用。要了解两者的区别,请阅读这个问题和答案

以下是一个简短的指南,可帮助您完成您想做的事情:

  1. 保存当前的键盘布局:

     $ dumpkeys > backup.kmap
    

    如果出现问题,您可以使用以下命令恢复您的键盘映射:

     $ sudo loadkeys backup.kmap
    

    如果键盘太乱以致您甚至无法做到这一点,那么您唯一的选择(不涉及古老的内核魔法)就是重新启动。

  2. 检查您的按键分配了哪些键码:

     $ showkey
    

    现在按下ESC键和CAPSLOCK键。键码应显示在屏幕上。记下键码。在我的系统上, 的ESC键码为 1,CAPSLOCK的键码为 58。showkey将在 10 秒不活动后终止(至少在我的 ubuntu 10.04 上是这样的)。

  3. ESC请注意 dumpkeys 中的和键的名称CAPSLOCK

     $ dumpkeys | grep 1
     ...
     keycode   1 = Escape
     ...
     $ dumpkeys | grep 58
     ...
     keycode  58 = CtrlL_Lock
     ...
    
  4. 请注意 dumpkeys 中的键映射行:

     $ dumpkeys | head -1
     keymaps 0-127
    
  5. 创建一个用于切换的键盘映射文件ESCCAPSLOCK

     keymaps 0-127
     keycode   1 = CtrlL_Lock
     keycode  58 = Escape
    
  6. 加载键盘映射:

     $ sudo loadkeys swap_esc_capslock.kmap
    
  7. 测试:测试CAPSLOCK按键很明显。只需按下CAPSLOCK按键并检查其他按键是否以大写形式显示。要测试按键,ESC您可以使用CTRL+V后跟ESC。它应该会打印^[。CTRL+V 使 shell 逐字打印下一个按键,而不是对其进行解释。

要在每次重启时加载此修改,请在文件中输入以下行/etc/rc.local

/usr/bin/loadkeys /path/to/swap_esc_capslock.kmap

从各个页面收集的信息,包括但不限于:

答案2

如果您只想拥有两个键,请使用ctrl:nocaps而不是(另一个名称 capslock 仍然非常无用)。ctrl:swapcapscapslocks

X11:(另请参阅/usr/share/X11/xkb/rules/base.lst:)

sudo vim /etc/default/keyboard
    XKBOPTIONS="ctrl:swapcaps"
udevadm trigger --subsystem-match=input --action=change
sudo restart lightdm

文本控制台:(从setupcon窃取)

#!/bin/sh
. /etc/default/console-setup 
. /etc/default/keyboard
ckbcomp $acm_option $rules_option -model "$XKBMODEL" \
            "$XKBLAYOUT" "$XKBVARIANT" "$XKBOPTIONS" \
            | gzip -9 2>/dev/null >/etc/console-setup/cached.kmap.gz
loadkeys /etc/console-setup/cached.kmap.gz

答案3

在Ubuntu(22.04)上,控制台键由SystemD服务keyboard-setup(提早运行 - 登录之前运行)。/lib/systemd/system/keyboard-setup.service

该服务将运行/lib/console-setup/keyboard-setup.sh,将生成新的KeyMap setupcon -k(或使用缓存版本)。

现在在和setupcon中都可以找到 (package: console-setup ) ;它们是相同的 (shell 脚本),给定 /bin --> /usr/bin。/bin/setupcon/usr/bin/setupcon

如果没有缓存的kmap.gz文件,则会在以下名称setupcon -k中生成一个keymap文件。/etc/console-setup/cached_.*.kmap.gzcached_UTF-8_del.kmap.gzloadkeys

配置setupcon来源于(两者):

  • /etc/default/console_setup
  • /etc/默认/键盘

因为setupcon -k,这些配置文件(shell脚本)设置的相关变量(值适合我):

  • charmap = UTF-8
  • 退格键=del
  • XKBLAYOUT=我们
  • XKBModel = PC105
  • XKBVARIANT=
  • XKBOPTIONS=

(注意:localectl set-x11-keymap .../etc/default/keyboard。如果需要,请阅读man localectl,有命令可以获取XKB*变量的可能值。)

配置值被传递给/bin/ckbcomp,这是一个 perl 脚本,用于解析所有类型的 X 文件以生成键映射(在标准输出上)。

ckbcomp脚本允许用户添加。它将/etc/console-setup/remap.inc在生成的键盘映射末尾添加 的内容。(注意:当 CHARMAP 不是 UTF-8 时,compose.$CHARMAP.inc也会包含在 之前remap.inc)。

remap.inc文件包含示例,如果您想使映射永久存在,就应该使用它。

因此,对 OP 问题的答案是:

    ## run as root on a console
    cd /etc/console-setup

    {
        echo 'keycode 1 = CtrlL_Lock'
        echo 'keycode 58 = Escape'
    } > remap.inc ## Keep the comments? Use '>> remap.inc'.

    ## Remove cached items, so setupcon -k generates a new keymap.
    rm -f cached_*kmap.gz cached_keyboard_setup.sh

    reboot

Debian 也有 console-setup 和 console-setup-linux 软件包。所以它可能在那里也能用。我个人还没有检查过它在 Debian 上是否能用。

相关内容