.\" @(#)keymaps.5 1.10 940130 aeb .TH KEYMAPS 5 "24 April 1998" .SH NAME keymaps \- 对键盘映射文件的描述 .SH "描述 (DESCRIPTION)" \" .IX "keymaps" "" "\fLkeymaps\fR \(em keyboard table descriptions for loadkeys and dumpkeys" "" \" .IX "loadkeys" "keyboard table descriptions" "\fLloadkeys\fR" "keyboard table descriptions" \" .IX "dumpkeys" "keyboard table descriptions" "\fLdumpkeys\fR" "keyboard table descriptions" \" .IX keyboard "table descriptions for loadkeys and dumpkeys" keyboard "table descriptions for \fLloadkeys\fR and \fLdumpkeys\fR" \" .IX "translation tables" .LP .BR loadkeys (1) 能够 通过 调入 指定的 文件 修改 键盘翻译表, 键盘翻译表 通常 用于 内核的 键盘驱动程序; 另外 .BR dumpkeys (1) 可以 根据 键盘翻译表 产生 这些文件. .LP 这些文件 的 结构 大体上 和 .BR xmodmap (1) 的 输入文件 类似. 文件 由 字符集(charset), 键定义(key), 和 串定义 组成, 可以 包含 注释. .LP 注释行 以 .B ! 或 .B # 字符 开始, 到 行尾 结束, 忽略 其中 任何 字符. 注意, 注释行 不需要 从 第一列 开始, 而 .BR xmodmap (1) 有 这个 要求. .LP 键盘映射(keymap)文件 是 面向行 定义 的; 一个 完整的定义 必须 在 一个 逻辑行 上 阐明. 不过 逻辑行 可以 分割 在 多个 物理行 上, 只需 在 各个 物理行尾 添加 一个 反斜杠 (\\) 即可. .SH "包含文件 (INCLUDE FILES)" 一个 键盘映射表 可以 包含 其他 键盘映射表, 就象这样: .LP .RS include "pathname" .RE .SH "字符集定义 (CHARSET DEFINITIONS)" 字符集 定义 的 格式 是: .LP .RS charset "iso-8859-x" .RE .LP 它 指出 如何 解释 后面的 keysym. 例如, 在 iso-8859-1 中, 符号 mu (或 micro) 的 代码是 0265, 而 iso-8859-7 中的 mu 是 0354. .SH "键值的完整定义 (COMPLETE KEYCODE DEFINITIONS)" 键值(keycode) 的 完整定义 形式 如下: .LP .RS .nf .BI keycode " keynumber " = " keysym keysym keysym" \fR... .fi .RE .LP .I keynumber 是 按键的 内部 标识值, 大致 相当于 它的 扫描码(scan code). .I keynumber 可以 用 十进制数, 八进制数, 或 十六进制数 表示. 八进制数 以 零 开始, 十六进制数 以 .B 0x 开始. .LP .I keysym 表示 键盘 动作(action), 单个 按键 可以 编联(bind) 多至 256 个 动作. 动作 指 输出 Latin1 字符 或 字符序列, 切换 控制台 或 键盘映射, 以及 重启动 机器 等. (可以 用 dumpkeys(1) 获得 完整的 列表, 如 .BI " dumpkeys -l" \&.) .LP 在 .I keysym 前面 加上 前缀 '+' (加号) 表明 这个 keysym 是 字符, 因而 能够 受到 CapLock 的 影响, 就象 Shift 的 作用 一样 (CapLock 反转 Shift 的 状态). 缺省情况下, 配合 CapLock 能够 产生 ASCII 字母 'a'-'z' 和 'A'-'Z'. 如果 Shift+CapsLock 无法 产生 小写字母, 试在 映射文件 中 加入 .LP .RS .nf .BI "keycode 30 = +a A" .fi .RE .LP 当 一个 按键 按下时, 发生 什么 事件 取决于 当时 哪个 修饰键(modifier) 起作用. 键盘驱动程序 支持 8 个 修饰键, 它们是 (任意顺序) Shift, AltGr, Control, Alt, ShiftL, ShiftR, CtrlL 和 CtrlR. 下面 的 表格 列出 各个 修饰键 对应的 权值, 权值 是 2 的 指数: .LP .RS .TP 24 .I 修饰键 .I 权值 .TP 24 Shift 1 .PD 0 .TP 24 AltGr 2 .TP 24 Control 4 .TP 24 Alt 8 .TP 24 ShiftL 16 .TP 24 ShiftR 32 .TP 24 CtrlL 64 .TP 24 CtrlR 128 .PD .RE .LP 按键 的 有效动作 通过 加权值 获得, 加权值 是 有效修饰键 的 权值和. 缺省情况下 没有 使用 修饰键, 对应的 动作代码 是 0, 也就是说, 当一个键 按下 或 弹起 时, 相应 动作 位于 键定义行 的 第一列. 又如, 如果 Shift 和 Alt 键 处于 有效状态, 产生的 动作代码 是 9 (对应 第十列). .\" (译注: 作者 对 修饰键 状态 一直 使用 有效(in effect) 一词, 译者 的 理解 是, .\" 修饰键 不能 简单的 以 按下和弹起 确定 其 状态, 键盘驱动程序 能够 重定义 .\" 修饰键 行为, 例如, 按 一下 表示 生效, 再按 一下 表示 解除) .LP 通过 编联 适当的 动作, 我们 可以 改变 有效的 修饰键. 例如, 如果 对 某个键 编联了 名称 Shift, 当 这个键 按下 时, shift 修饰键 就 生效, 当 这个键 弹起 时, shift 修饰键 状态 就 解除. 如果 对 某个键 编联了 名称 AltGr_Lock, 当 按下 这个键 时, AltGr 修饰键 就 生效, 再次 按下 这个键 就 解除 AltGr 修饰键 状态. (缺省情况下, Shift, AltGr, Control 和 Alt 编联到 同名 按键 上; AltGr 指 右侧 Alt 键.) .LP 注意, 编联 修饰键 时 应该 非常 小心, 否则 键盘映射 可能 无法 使用. 例如, 如果 某个键 的 第一列 定义为 Control, 其他列 定义为 VoidSymbol, 你 就 有麻烦 了. 因为 按下 这个键 使 Control 修饰键 生效, 随后 的 动作 应该 来自 第五列 (见上表). 因此 当 这个键 弹起 时, 第五列 的 动作 被 采用, 但 这里 是 VoidSymbol, 什么 都 不发生. 这意味着 尽管 你 已经 松开了 这个键, 可是 Control 修饰键 仍然 有效. 反复 敲击 这个键 也 无济于事. 要 避免 这样 的 事情, 你 应该 把 所有的 列 定义为 相同的 修饰符, 为此 后面 将要 介绍 一个 常用的 缩写. .LP .I keysym 可以 采用 十进制数, 八进制数, 十六进制数 或者 符号表示法. 数字表示 的 形式 和 .IR keynumber 一样, 而 符号表示 类似于 .BR xmodmap (1) 中 用的. 需要注意 数字符号 的 区别. 数字符号 '0', ..., '9' 在 .BR xmodmap (1) 中 被换成 对应的 单词 'zero', 'one', ... 'nine', 防止 和 数字表示法 混淆. .LP 在 .I keysym 中 使用 数字表示法 非常 不利于 移植, 这是 因为 不同 的 内核版本 之间, 各键 的 动作代码 可能 不一样, 因此 不鼓励 使用 数字表示法, 除非 内核 支持的 某项 键盘动作 在 当前的 .BR loadkeys (1) 中 没有 对应的 符号名称. .LP 下面 介绍 一些 缩写 标记, 它们 能够 增加 可读性, 减少 输入量, 同时 也能 减少 输入错误. .LP 首先, 你 可以 给出 一个 映射说明行, 如 .LP .RS keymaps 0-2,4-5,8,12 .RE .LP 表明 键定义行 并不 使用 全部的 256 列, 而 只用 指定的 列. (本例为: 映射 plain, Shift, AltGr, Control, Control+Shift, Alt 和 Control+Alt, 只有 7 列, 而非 256 列.) 如果 没有 定义 这样的 映射说明行, 将 产生 缺省 定义 keymaps 0-M, 此处的 M+1 是 所有 键定义行 中 发现 的 最大项数. .LP 其次, 键定义行尾 的 VoidSymbol 项 可以 不出现. VoidSymbol 表示 一个 键盘动作, 它 不产生 输出, 也不出现 其他 效果. 例如, 把 30 号键 定义为 输出 'a', 按下 Shift 时 输出 'A', 按下 其他 修饰键 如 AltGr 之类 则 什么都 不做, 你 可以 写成 .LP .RS .nf keycode 30 = a A .fi .RE .LP 来 代替 冗长的 .LP .RS .nf keycode 30 = a A VoidSymbol VoidSymbol \\ VoidSymbol VoidSymbol VoidSymbol ... .fi .RE .LP 为了方便, 你 可以 用 更简洁 的 定义. 如果 键定义行 中, 等号 后面 只有 一个 动作码, 它 就可以 拥有 额外的 含义. 如果 这个 动作码 (数字 或 符号 形式) 不是 一个 ASCII 字符, 这 意味着 该 动作码 在 所有 定义了的 行 上 有效. 反过来, 如果 动作码 是 ASCII 字符, 位于 'a', ..., 'z' 或 'A', ..., 'Z' 之间, 对于 不同的 修饰键组合, 有 如下 定义 (下表 列出 两种 可能情况: 动作码 是 一个 小写字母, 表示为 'x', 或者是 一个 大写字母, 表示为 'Y'.) .LP .RS 4 .TP 24 .I modifier .I symbol .TP 24 none x Y .PD 0 .TP 24 Shift X y .TP 24 AltGr x Y .TP 24 Shift+AltGr X y .TP 24 Control Control_x Control_y .TP 24 Shift+Control Control_x Control_y .TP 24 AltGr+Control Control_x Control_y .TP 24 Shift+AltGr+Control Control_x Control_y .TP 24 Alt Meta_x Meta_Y .TP 24 Shift+Alt Meta_X Meta_y .TP 24 AltGr+Alt Meta_x Meta_Y .TP 24 Shift+AltGr+Alt Meta_X Meta_y .TP 24 Control+Alt Meta_Control_x Meta_Control_y .TP 24 Shift+Control+Alt Meta_Control_x Meta_Control_y .TP 24 AltGr+Control+Alt Meta_Control_x Meta_Control_y .TP 24 Shift+AltGr+Control+Alt Meta_Control_x Meta_Control_y .PD .RE .LP .SH "单一修饰键定义 (SINGLE MODIFIER DEFINITIONS)" 上述 键定义行 的 格式 总要 定义 全部 M+1 个 可能的 组合, 无论 该行 是不是 真的 有 那么多 动作. 然而 还有 另一种 语法定义, 用来说明 只产生 一个 动作 的 特定键组合. 如果 你的 键盘映射 只有 少数 不符合 需要, 如 AltGr+function 键, 这个 功能 就特别 有用. 你 可以 制作 一个 小型文件, 在 调入 键盘映射文件 后 重定义 所需的 映射. 这种 形式 的 语法 是: .LP .BR "" { " plain " "| } " keycode .I keynumber .B = .I keysym .LP 例如: .RS .nf plain keycode 14 = BackSpace control alt keycode 83 = Boot alt keycode 105 = Decr_Console alt keycode 106 = Incr_Console .fi .RE 这里的 "plain" 指 该键的 基本动作 (就是说, 没有 使用 修饰键 时), 不影响 该键 的 其他 修饰键 组合. .SH "字符串定义 (STRING DEFINITIONS)" 除了 注释 和 键定义行, 键盘映射表 还包含 字符串定义. 它们 用于 定义 各个 功能键(function key) 的 动作码 输出 些 什么. 字符串定义 的 语法 是: .LP .RS .B string .I keysym .B = .BI "text" .RE .LP .I text 包括 文本字符, 八进制字符, 或者 三个 escape 序列: \fB\\n\fP, \fB\\\\\fP, 和 \fB\\"\fP, 分别 代表 换行, 反斜杠, 和 引号. 八进制字符 的 格式 是 反斜杠 后面 列出的 八进制数字, 最多 三个 八进制数字. .SH "组合定义 (COMPOSE DEFINITIONS)" 组合(键)定义 的 语法 是: .LP .RS .BI "compose '" char "' '" char "' to '" char "'" .RE 描述 两个 字节 怎样 组合成 第三者 (当 使用 少见的 声调符 或 组合键 时). 它 常用来 在 标准键盘 上 输入 声调符 之类. .SH "缩写 (ABBREVIATIONS) 从 kbd-0.96 开始 可以 使用 多种 缩写. .TP .B "strings as usual" 定义 常用 字符串 (而不是 它们 编联的 键). .TP \fBcompose as usual for "iso-8859-1"\fP 定义 常用 compose 组合. .LP 如果 想要 知道 哪些 .I keysym 能够 用在 键盘映射表 中, 请 使用 .LP .RS .nf .B dumpkeys --long-info .fi .RE .LP 遗憾的是, 目前 仍然 没有 对 各个 符号 的 说明. 您 可以 从 符号名称 上 推测, 或者 参考 内核源程序. .LP .SH "示例 (EXAMPLES)" (小心 使用 keymaps 行, 如 `dumpkeys` 显示的 第一行, 或者 "keymaps 0-15" 之类) .LP 下面的 输入项 交换 左侧 Control 键 和 Caps Lock 键 的 功能: .LP .RS .nf keycode 58 = Control keycode 29 = Caps_Lock .fi .RE .LP 正常的时候, 键值 58 是 Caps Lock, 键值 29 是 Control 键. .LP 下面的 输入项 使 Shift 键 和 CapsLock 键 更好用 一点, 象 老式 打字机. 就是说, 按下 Caps Lock 键 (一次 多次 皆可) 使 键盘 进入 CapsLock 状态, 按 任一 Shift 键 解除 该 状态: .LP .RS .nf keycode 42 = Uncaps_Shift keycode 54 = Uncaps_Shift keycode 58 = Caps_On .fi .RE .LP 下面的 输入项 设置 增强形键盘 的 编辑键, 使 它 更象是 VT200 系列 终端: .LP .RS .nf keycode 102 = Insert keycode 104 = Remove keycode 107 = Prior shift keycode 107 = Scroll_Backward keycode 110 = Find keycode 111 = Select control alt keycode 111 = Boot control altgr keycode 111 = Boot .fi .RE .LP 下面是 一个 示范, 将 字符串 "du\\ndf\\n" 和 AltGr-D 编联. 我们 使用了 "空闲的" 动作码 F100, 通常 它 没有被 使用: .LP .RS .nf altgr keycode 32 = F100 string F100 = "du\\ndf\\n" .LP .SH "另见 (SEE ALSO)" .BR loadkeys (1), .BR dumpkeys (1), .BR showkey (1), .BR xmodmap (1) .SH "[中文版维护人]" .B 徐明 .SH "[中文版最新更新]" .BR 2003/05/13 .SH "《中国Linux论坛man手册页翻译计划》" .BI http://cmpp.linuxforum.net .SH "跋" .br 本页面中文版由中文 man 手册页计划提供。 .br 中文 man 手册页计划:\fBhttps://github.com/man-pages-zh/manpages-zh\fR