我想在控制台中交换Esc和(而不是在 X 中,并使用),我该怎么做?CapsLockxev
我的操作系统是 Ubuntu。
答案1
操纵键盘布局的工具虚拟控制台是loadkeys
、dumpkeys
和showkey
。阅读它们的手册页并了解它们的复杂性。
请注意,这些工具只能在虚拟控制台中使用,不能在 gnome 等图形环境中的终端仿真器中使用。要了解两者的区别,请阅读这个问题和答案。
以下是一个简短的指南,可帮助您完成您想做的事情:
保存当前的键盘布局:
$ dumpkeys > backup.kmap
如果出现问题,您可以使用以下命令恢复您的键盘映射:
$ sudo loadkeys backup.kmap
如果键盘太乱以致您甚至无法做到这一点,那么您唯一的选择(不涉及古老的内核魔法)就是重新启动。
检查您的按键分配了哪些键码:
$ showkey
现在按下ESC键和CAPSLOCK键。键码应显示在屏幕上。记下键码。在我的系统上, 的ESC键码为 1,CAPSLOCK的键码为 58。
showkey
将在 10 秒不活动后终止(至少在我的 ubuntu 10.04 上是这样的)。ESC请注意 dumpkeys 中的和键的名称CAPSLOCK:
$ dumpkeys | grep 1 ... keycode 1 = Escape ... $ dumpkeys | grep 58 ... keycode 58 = CtrlL_Lock ...
请注意 dumpkeys 中的键映射行:
$ dumpkeys | head -1 keymaps 0-127
创建一个用于切换的键盘映射文件ESC:CAPSLOCK
keymaps 0-127 keycode 1 = CtrlL_Lock keycode 58 = Escape
加载键盘映射:
$ sudo loadkeys swap_esc_capslock.kmap
测试:测试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:swapcaps
capslocks
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.gz
cached_UTF-8_del.kmap.gz
loadkeys
配置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 上是否能用。