本 FAQ/HOWTO 是关于 Linux 键盘和控制台的,而不是关于 X 的,X 有其自身的处理方式。然而,记录一些与 X 相关的 Linux 键盘和控制台属性似乎是有用的。
首先,当 X 启动时(比如使用 startx
或 xinit
),它会打开第一个未使用的控制台,除非已明确指示所需的控制台,例如 xinit -- vt12
。请注意,当没有设备文件 /dev/tty12
时,这将失败,但当指示的控制台已被使用时,它不会失败。当 X 完成时,它将返回到原始控制台。在它运行时,可以使用 Ctrl-Alt-Fn 切换到 VTn。
XFree86 键盘映射机制比 Linux 机制要弱得多。对于每个键码,最多定义了 4 个符号,分别是用于 4 个键盘映射:plain、shift、mod、mod+shift。修饰符 mod 是什么?它是用符号 Mode_switch
指定的那个。例如,命令 xmodmap keys.dk
,其中文件 keys.dk
包含
keycode 64 = Mode_switch
keycode 113 = Mode_switch
keycode 38 = a A aring Aring
keycode 26 = e E ae AE
keycode 32 = o O oslash Ooblique
将使两个 Alt 键都成为 mod 键,以便 Alt+a 给出 �(a-ring)等。(请注意 oslash 和 Ooblique 的不合逻辑的命名。)这样的 xmodmap
命令可以放在默认情况下在 X 启动时执行的 .xinitrc
shell 脚本中。
从 2.1 版本开始,XFree86 将尽可能地从 Linux 键盘映射初始化其键盘映射。然而,Linux 每个键有 16 个条目(Shift、AltGr、Ctrl、Alt 修饰符的每种组合一个条目),目前每个键有 256 个条目,而 X 每个键有 4 个条目(Shift、Mod 的每种组合一个条目),因此一些信息必然会丢失。
首先,X
读取 Xconfig
文件,其中可能会找到将 LeftAlt、RightAlt、RightCtl、ScrollLock 键定义为 Meta、ModeShift、Compose、ModeLock 或 ScrollLock 的定义 - 请参阅 X386keybd(1),后来的 XFree86kbd(1)。
对于 Mod,采用 LeftAlt 键,除非 RightCtl 被定义为 ModeShift 或 ModeLock,在这种情况下采用 RightCtl,或者 RightAlt 被这样定义,在这种情况下采用 RightAlt。这决定了如何从 16 个 Linux 含义中选择一个键的 4 个 XFree86 含义。请注意,今天的 Linux 默认情况下不区分两个 Ctrl 键或两个 Shift 键。X
确实区分。
现在读取内核键盘映射,并进行通常显而易见的相应 X 绑定。“动作键” Show_Memory、Show_State、Show_Registers、Last_Console、Console_n、Scroll_Backward、Scroll_Forward、Caps_On 和 Boot 的绑定被忽略,死音符号和锁(ShiftLock 除外)以及“ASCII-x”键也是如此。
接下来,使用 Xconfig
文件中的定义。(因此,Xconfig
中 Compose 的定义将覆盖其在 Linux 键盘映射中找到的值。)
与功能键关联的字符串会发生什么?什么也不会发生,X 没有这样的概念。(但是可以在 xterm
中为功能键定义字符串 - 但是请注意,窗口管理器首先获得按键。)
我不知道如何说服 xterm
在按下 Alt 键时应该使用 X 键盘映射;它似乎只是查看其资源 eightBitInput
,并根据它是真还是假,要么设置字符的高位,要么生成一个额外的 Escape 字符(就像 setmetamode(1) 对控制台所做的那样)。