我一直在尝试找到一种在单用户模式下启用粘滞键的方法,但我唯一能找到的是在桌面窗口环境中。
是否有我需要加载的模块或其他东西?
对于那些最终会问我只能用一只手打字的人,有时我必须在单用户模式下工作。
答案1
看看这个如何。它说loadkeys
理解键符号就像SShift, SCtrl, SAlt
您可以放入控制台键盘映射中的粘性等效项一样。
这archlinux 页面向您展示该做什么。基本上,创建一个小键盘映射文件,用粘性等效项覆盖 Shift 等键。以下可能为您提供所需的一组键码:
dumpkeys |
awk 'NR==1{print}
$4~"Shift|Control|Alt"{printf "%s %s %s S%s\n",$1,$2,$3,$4}'
输出示例:
keymaps 0-255
keycode 29 = SControl
keycode 42 = SShift
keycode 54 = SShift
keycode 56 = SAlt
keycode 97 = SControl
keycode 100 = SAlt
keycode 125 = SAlt
keycode 126 = SAlt
将此数据放入文件中stickyKeys
并加载它
sudo loadkeys stickyKeys
archlinux 页面为您提供了一个合适的 systemd 单元来在启动时加载它。如果出现问题,您可以showkey
在键入按键时显示每个按键代码。
我没有尝试过这一点,但是当您构建内核时,会编译默认的键盘映射。您可以将此键盘映射替换为您想要的键盘映射。如果我们看一下驱动程序/tty/vt/Makefile,我们看到一个规则defkeymap.o
$(obj)/defkeymap.o: $(obj)/defkeymap.c
但目录中没有defkeymap.c
.然而有文件defkeymap.c_shipped
,看起来构建KBuild将删除_shipped
构建的后缀。稍后在 Makefile 中有一条注释和可选规则:
# Uncomment if you're changing the keymap and have an appropriate
# loadkeys version for the map. By default, we'll use the shipped
# versions.
# GENERATE_KEYMAP := 1
ifdef GENERATE_KEYMAP
$(obj)/defkeymap.c: $(obj)/%.c: $(src)/%.map
loadkeys --mktable $< > $@
endif
因此我们可以通过运行来了解如何defkeymap.c
从当前键盘映射创建我们自己的文件
dumpkeys | loadkeys --mktable >defkeymap.c
删除附带的文件并尝试构建内核。使用dumpkeys
给出了一个比默认值大得多的表,尽管我不知道为什么。您可能更愿意找到当前键盘映射的源,例如未压缩的/usr/lib/kbd/keymaps/xkb/gb-intl.map.gz
或类似的,使用您的粘性更改对其进行编辑,然后将此文件提供给loadkeys --mktable
.
请注意,一旦启动,此内置键盘映射可能会被您的操作系统用于设置某些标准配置键盘映射的任何机制提前覆盖。