描述 (DESCRIPTION)

loadkeys(1) 能够 通过 调入 指定的 文件 修改 键盘翻译表, 键盘翻译表 通常 用于 内核的 键盘驱动程序; 另外 dumpkeys(1) 可以 根据 键盘翻译表 产生 这些文件.

这些文件 的 结构 大体上 和 xmodmap(1) 的 输入文件 类似. 文件 由 字符集(charset), 键定义(key), 和 串定义 组成, 可以 包含 注释.

注释行 以 !# 字符 开始, 到 行尾 结束, 忽略 其中 任何 字符. 注意, 注释行 不需要 从 第一列 开始, 而 xmodmap(1) 有 这个 要求.

键盘映射(keymap)文件 是 面向行 定义 的; 一个 完整的定义 必须 在 一个 逻辑行上 阐明. 不过 逻辑行 可以 分割 在 多个 物理行 上, 只需 在 各个 物理行尾 添加一个 反斜杠 (\) 即可.

包含文件 (INCLUDE FILES)

一个 键盘映射表 可以 包含 其他 键盘映射表, 就象这样:

include "pathname"

字符集定义 (CHARSET DEFINITIONS)

字符集 定义 的 格式 是:

charset "iso-8859-x"

它 指出 如何 解释 后面的 keysym. 例如, 在 iso-8859-1 中, 符号 mu (或 micro) 的 代码是 0265, 而 iso-8859-7 中的 mu 是 0354.

键值的完整定义 (COMPLETE KEYCODE DEFINITIONS)

键值(keycode) 的 完整定义 形式 如下:

keycode keynumber = keysym keysym keysym...

keynumber 是 按键的 内部 标识值, 大致 相当于 它的 扫描码(scan code). keynumber 可以 用 十进制数, 八进制数, 或 十六进制数 表示. 八进制数 以 零 开始, 十六进制数 以 0x 开始.

keysym 表示 键盘 动作(action), 单个 按键 可以 编联(bind) 多至 256 个 动作. 动作 指 输出 Latin1 字符 或 字符序列, 切换 控制台 或 键盘映射, 以及重启动 机器 等. (可以 用 dumpkeys(1) 获得 完整的 列表, 如 dumpkeys -l .)

keysym 前面 加上 前缀 '+' (加号) 表明 这个 keysym 是 字符, 因而 能够 受到 CapLock 的 影响, 就象 Shift 的 作用 一样 (CapLock 反转 Shift 的 状态). 缺省情况下, 配合 CapLock 能够 产生 ASCII 字母 'a'-'z' 和 'A'-'Z'. 如果 Shift+CapsLock 无法 产生 小写字母, 试在 映射文件 中 加入

keycode 30 = +a  A

当 一个 按键 按下时, 发生 什么 事件 取决于 当时 哪个 修饰键(modifier) 起作用. 键盘驱动程序 支持 8 个 修饰键, 它们是 (任意顺序) Shift, AltGr, Control, Alt, ShiftL, ShiftR, CtrlL 和 CtrlR. 下面 的 表格 列出 各个 修饰键 对应的 权值, 权值 是 2 的 指数:

修饰键
权值
Shift
  1
AltGr
  2
Control
  4
Alt
  8
ShiftL
 16
ShiftR
 32
CtrlL
 64
CtrlR
128

按键 的 有效动作 通过 加权值 获得, 加权值 是 有效修饰键 的 权值和. 缺省情况下 没有 使用 修饰键, 对应的 动作代码 是 0, 也就是说,
当一个键按下 或 弹起 时, 相应 动作 位于 键定义行 的 第一列. 又如, 如果 Shift 和 Alt 键 处于 有效状态, 产生的 动作代码 是 9
(对应 第十列).

通过 编联 适当的 动作, 我们 可以 改变 有效的 修饰键. 例如, 如果 对 某个键 编联了 名称 Shift, 当 这个键 按下 时, shift
修饰键就 生效, 当 这个键 弹起 时, shift 修饰键 状态 就 解除. 如果 对 某个键 编联了 名称 AltGr_Lock, 当 按下 这个键 时,
AltGr 修饰键 就生效, 再次 按下 这个键 就 解除 AltGr 修饰键 状态. (缺省情况下, Shift, AltGr, Control 和 Alt
编联到 同名 按键 上; AltGr 指 右侧 Alt 键.)

注意, 编联 修饰键 时 应该 非常 小心, 否则 键盘映射 可能 无法 使用. 例如, 如果 某个键 的 第一列 定义为 Control, 其他列
定义为 VoidSymbol, 你 就有麻烦 了. 因为 按下 这个键 使 Control 修饰键 生效, 随后 的 动作 应该 来自第五列 (见上表). 因此
当 这个键 弹起 时, 第五列 的 动作 被 采用, 但 这里 是 VoidSymbol, 什么 都 不发生. 这意味着 尽管 你 已经 松开了 这个键, 可是
Control 修饰键 仍然 有效. 反复 敲击 这个键 也 无济于事. 要 避免 这样 的 事情, 你 应该把 所有的 列 定义为 相同的 修饰符, 为此
后面 将要 介绍 一个 常用的 缩写.

keysym 可以 采用 十进制数, 八进制数, 十六进制数 或者 符号表示法. 数字表示 的 形式 和 keynumber
一样, 而 符号表示 类似于 xmodmap(1) 中 用的. 需要注意 数字符号 的 区别. 数字符号 '0', ..., '9' 在
xmodmap(1) 中 被换成 对应的 单词 'zero', 'one', ... 'nine', 防止 和 数字表示法 混淆.

keysym 中 使用 数字表示法 非常 不利于 移植, 这是 因为 不同 的 内核版本 之间, 各键 的 动作代码 可能 不一样,
因此 不鼓励 使用 数字表示法, 除非 内核 支持的 某项键盘动作 在 当前的 loadkeys(1) 中 没有 对应的 符号名称.

下面 介绍 一些 缩写 标记, 它们 能够 增加 可读性, 减少 输入量, 同时也能 减少 输入错误.

首先, 你 可以 给出 一个 映射说明行, 如

keymaps 0-2,4-5,8,12

表明 键定义行 并不 使用 全部的 256 列, 而 只用 指定的 列. (本例为: 映射 plain, Shift, AltGr, Control,
Control+Shift, Alt 和 Control+Alt, 只有 7 列, 而非 256 列.) 如果 没有 定义 这样的 映射说明行, 将 产生 缺省
定义 keymaps 0-M, 此处的 M+1 是 所有 键定义行 中 发现 的 最大项数.

其次, 键定义行尾 的 VoidSymbol 项 可以 不出现. VoidSymbol 表示 一个键盘动作, 它 不产生 输出, 也不出现 其他 效果.
例如, 把 30 号键 定义为输出 'a', 按下 Shift 时 输出 'A', 按下 其他 修饰键 如 AltGr 之类 则什么都 不做, 你 可以 写成

keycode  30 = a A

来 代替 冗长的

keycode  30 = a A       VoidSymbol      VoidSymbol \
VoidSymbol VoidSymbol VoidSymbol ...

为了方便, 你 可以 用 更简洁 的 定义. 如果 键定义行 中, 等号 后面 只有 一个动作码, 它 就可以 拥有 额外的 含义. 如果 这个 动作码 (数字 或 符号 形式) 不是 一个 ASCII 字符, 这 意味着 该 动作码 在 所有 定义了的 行 上 有效. 反过来, 如果 动作码 是 ASCII 字符, 位于 'a', ..., 'z' 或 'A', ..., 'Z' 之间, 对于 不同的 修饰键组合, 有 如下 定义 (下表 列出 两种 可能情况: 动作码 是 一个 小写字母, 表示为 'x', 或者是 一个大写字母, 表示为 'Y'.)

modifier
symbol
none
x                      Y
Shift
X                      y
AltGr
x                      Y
Shift+AltGr
X                      y
Control
Control_x              Control_y
Shift+Control
Control_x              Control_y
AltGr+Control
Control_x              Control_y
Shift+AltGr+Control
Control_x              Control_y
Alt
Meta_x         Meta_Y
Shift+Alt
Meta_X         Meta_y
AltGr+Alt
Meta_x         Meta_Y
Shift+AltGr+Alt
Meta_X         Meta_y
Control+Alt
Meta_Control_x Meta_Control_y
Shift+Control+Alt
Meta_Control_x Meta_Control_y
AltGr+Control+Alt
Meta_Control_x Meta_Control_y
Shift+AltGr+Control+Alt
Meta_Control_x Meta_Control_y

单一修饰键定义 (SINGLE MODIFIER DEFINITIONS)

上述 键定义行 的 格式 总要 定义 全部 M+1 个 可能的
组合, 无论 该行 是不是真的 有 那么多 动作. 然而 还有 另一种 语法定义, 用来说明 只产生 一个 动作的 特定键组合. 如果 你的 键盘映射 只有
少数 不符合 需要, 如 AltGr+function 键, 这个 功能 就特别 有用. 你 可以 制作 一个 小型文件, 在 调入 键盘映射文件后 重定义
所需的 映射. 这种 形式 的 语法 是:

{ plain | <modifier sequence> } keycode
keynumber = keysym

例如:

plain keycode 14 = BackSpace
control alt keycode 83 = Boot
alt keycode 105 = Decr_Console
alt keycode 106 = Incr_Console

这里的 "plain" 指 该键的 基本动作 (就是说, 没有 使用 修饰键 时), 不影响 该键 的 其他 修饰键 组合.

字符串定义 (STRING DEFINITIONS)

除了 注释 和 键定义行, 键盘映射表 还包含 字符串定义. 它们 用于 定义各个 功能键(function key) 的 动作码 输出 些 什么. 字符串定义 的 语法 是:

string keysym = text

text 包括 文本字符, 八进制字符, 或者 三个 escape 序列: \n, \\, 和 \", 分别 代表 换行, 反斜杠, 和 引号. 八进制字符 的 格式 是 反斜杠 后面 列出的 八进制数字, 最多 三个 八进制数字.

组合定义 (COMPOSE DEFINITIONS)

组合(键)定义 的 语法 是:

compose 'char' 'char' to 'char'

描述 两个 字节 怎样 组合成 第三者 (当 使用 少见的 声调符 或 组合键 时). 它 常用来 在 标准键盘 上 输入 声调符 之类.

缩写 (ABBREVIATIONS)

从 kbd-0.96 开始 可以 使用 多种 缩写.

strings as usual
定义 常用 字符串 (而不是 它们 编联的 键).
compose as usual for "iso-8859-1"
定义 常用 compose 组合.

如果 想要 知道 哪些 keysym 能够 用在 键盘映射表 中, 请 使用

dumpkeys --long-info

遗憾的是, 目前 仍然 没有 对 各个 符号 的 说明. 您 可以 从 符号名称 上推测, 或者 参考 内核源程序.

示例 (EXAMPLES)

(小心 使用 keymaps 行, 如 `dumpkeys` 显示的 第一行, 或者 "keymaps 0-15" 之类)

下面的 输入项 交换 左侧 Control 键 和 Caps Lock 键 的 功能:

keycode  58 = Control
keycode 29 = Caps_Lock

正常的时候, 键值 58 是 Caps Lock, 键值 29 是 Control 键.

下面的 输入项 使 Shift 键 和 CapsLock 键 更好用 一点, 象 老式 打字机. 就是说, 按下 Caps Lock 键 (一次 多次 皆可) 使 键盘 进入 CapsLock 状态, 按 任一 Shift 键 解除 该 状态:

keycode  42 = Uncaps_Shift
keycode 54 = Uncaps_Shift
keycode 58 = Caps_On

下面的 输入项 设置 增强形键盘 的 编辑键, 使 它 更象是 VT200 系列 终端:

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

下面是 一个 示范, 将 字符串 "du\ndf\n" 和 AltGr-D 编联. 我们 使用了 "空闲的" 动作码 F100, 通常 它 没有被 使用:

altgr keycode 32 = F100
string F100 = "du\ndf\n"

keymaps - 对键盘映射文件的描述的更多相关文章

  1. 【转】Android-Input 按键字符映射文件&输入设备配置文件

    https://source.android.com/devices/input/key-character-map-files 按键字符映射文件 按键字符映射文件(.kcm 文件)负责将 Andro ...

  2. gentoo 修改键盘映射

    gentoo 上面修改键盘映射分为两种,一种是终端环境,一种是X环境. 终端环境 https://www.emacswiki.org/emacs/MovingTheCtrlKey https://wi ...

  3. NHibernate之映射文件配置说明

    NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...

  4. [Nhibernate]SchemaExport工具的使用(一)——通过映射文件修改数据表

    目录 写在前面 文档与系列文章 SchemaExport工具 SchemaUpdate工具 一个例子 总结 写在前面 上篇文章介绍了使用代码生成器的nhibernate模版来生成持久化类,映射文件等内 ...

  5. VIM键盘映射 (Map)~转载

    VIM键盘映射 (Map) 设置键盘映射 使用:map命令,可以将键盘上的某个按键与Vim的命令绑定起来.例如使用以下命令,可以通过F5键将单词用花括号括起来: :map <F5> i{e ...

  6. Mybatis映射文件

    Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会 ...

  7. MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

    二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...

  8. MyBatis学习(二)、SQL语句映射文件(1)resultMap

    二.SQL语句映射文件(1)resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyB ...

  9. 二、SQL语句映射文件(2)增删改查、参数、缓存

    //备注:该博客引自:http://limingnihao.iteye.com/blog/106076 2.2 select 一个select 元素非常简单.例如: Xml代码 收藏代码 <!- ...

随机推荐

  1. Scala学习(四)——模式匹配与函数组合

    函数组合 让我们创建两个函数: def f(s: String) = "f(" + s + ")" def g(s: String) = "g(&qu ...

  2. Docker—备份、恢复及迁移

    用容器生成镜像 [root@git docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e950a988d ...

  3. leetcode-easy-others-268 Missing Number

    mycode   80.25% class Solution(object): def missingNumber(self, nums): """ :type nums ...

  4. 常用javaScript小常识

    javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...

  5. Error-ASP.NET:在从服务器接收结果时发生传输级错误。 (provider: Session Provider, error: 19 - 物理连接不可用)

    ylbtech-Error-ASP.NET:在从服务器接收结果时发生传输级错误. (provider: Session Provider, error: 19 - 物理连接不可用)  1.返回顶部 1 ...

  6. 【转】JS正则验证邮手机、箱等格式

    function test() { var temp = document.getElementById("text1"); //对电子邮件的验证 var myreg = /^([ ...

  7. kotlin之字符串模板

    所谓字符串模板就是在字符串中添加若干个占位符,内容会在后期指定,也就是说,用模板可以设置字符串动态的部分,模板使用美元符号$设置如i=$i 中 的$i就是一个占位符,其中4后面的i是变量,随着i的变化 ...

  8. 前端必须掌握的 nginx 技能(3)

    概述 作为一个前端,我觉得必须要学会使用 nginx 干下面几件事: 代理静态资源 设置反向代理(添加https) 设置缓存 设置 log 部署 smtp 服务 设置 redis 缓存(选) 下面我按 ...

  9. LoadRunner 技巧之 集合点设置

    LoadRunner 技巧之 集合点设置 Loadrunner 技巧已经整理4篇了,你个一定疑问,这些知识点,网上随处可见.确实,由于长时间没有使用这个工具,造成我的一些概念开始在大脑中模糊,我只是用 ...

  10. delphi 导出excel

    Var FExcel:OleVariant; //excel应用程序 FWorkBook :OleVariant; //工作表 Temsheet:OleVariant; //工作薄 FPicture: ...