第17章 定制您的键盘和滑鼠 -- 转译
电脑的键盘通常含有一些 "特别功能" (special function)键,在此有一
些方法来 "定制"(program)这些特别功能键,使他们能完成特定的功能以适合
您工作的方式。例如,您能够定义一些键来输入那些您常用的命令,或只需按
一个键便能够输入一些程式的片段。

在X中,您能定制的不只是功能键而已,其他一般的键和滑鼠的按钮也都
可定制。对每一个应用程式,您均可指定特别的功能给键盘和滑鼠按钮,或两
者之组合。 (例如在 xedit中您能够结合SHIFT 键和滑鼠的右按钮来让您向前
移动一个单字)。 任何使用X Toolkit的程式均允许使用者利用一个被称之为
键盘转译 (translations) 的设施来执行此种定义,且此种定义藉著正规的
resources 结构传递给应用程式。 (那些不使用X Toolkit的应用程式,同样
地也能够用相同的设施来定制, 但他们需个别的定义所以不能广泛地应用,从
现在起,我们假设每当讨论有关转译的种种,均为对那些使用X Toolkit的应
用程式而言。)

就如同任何的 resources相同,转译是当应用程式执行时才被处置。例如
您能够拥有数个具备不同转译设定的 xedit,在同时一起执行。( 您能够让一
个xedit 适合编辑本文,另一个适合编辑程式码,而另一个适合编辑文书)。

本章讨论转译 -- 包刮他们的定义格式,如何将他们设定到应用程式,和
他们所涵盖功能的□围。我们首先以实例来介绍,逐渐地导引您看到不同的角
度。而後比较正式和周详地讨论转译。最後,我们列出当您使用转译时常会碰
到的错误,并给您一些如何克服这些问题的提示。

17.1 实际使用转译

Toolkit 转译结构最简单的用途便是让您定制您键盘的键。例如,当您使
用xterm 为一个执行一般shell 命令的视窗时,您可能希望定义一些特别功能
键来输入您常用的命令,且希望指定的关系如下:

当我按下这个键时... 我希望这个字串被输入

F1 rm core *.tmp <newline>

利用Toolkit 达到此目的方法为:指定一个值给使用转译的widget中的resources
。此值设定应用程式中所必需的定制 (customisation),且被Toolkit 的 Trans-
lation Manager (转译管理器) 所处理。此 resources属於类别Translation,
且其成员名称几乎一定是translations。

在下一节我们将看到设定到resources 中的值的格式。

17.1.1 如何对一个应用程式指定转译

对前述xterm 的例子,我们定义 (在即将被应用程式读入的resource资料
库中或一些resource档案中) 一个规格类似:

xterm*VT100*Translations: (contd.)
<key>F1: string("rm core *.tmp" 注意:不完整!!

其意为在任何类别 VT100的 xterm widget 中,当键 F1 被按下时,插入
字串 "rm core *.tmp"

不幸的是,并没有这麽简单,转译管理器会把上面的规格解释为 "去掉所
有现存的转译,且加入... " ,所以任何正常的像 " A键是插入一个 A" 这种
系结 (binding)都会消失。为了克服这点,您必需使用一些被称为 directive
(指引)的语法插入在 resource 值之前:

xterm*VT100*Translations: #override(contd.)
<key>F1: string("rm core *.tmp"

通常您会希望保持大部份现存的系结,而只是把您明确指定的值覆盖上去
,所以您一般都是在您的转译表中,指定 #override。

现在这个规格能够开始工作了,藉著启始一个 xterm且把此规格 (在两个
单引号 (')中间的部份) 当成选项 -xrm 的引数来测试他:

xterm -xrm 'xterm*VT100*Translations: ... 等等'

按下特别功能键 F1,您将看到指定的字串成功的插入,但并未包含新列字元
(newline) ,您能够用一点语法的技巧来克服他,像:

xterm*VT100*Translations: #override(contd.)
<key>F1: string("rm core *.tmp"string(0xd)

这解释了以下两点:

1. string()的作用和他的引数相关。您能够直接输入本文 (例如 string(lpq))
,但假如本文包含空白或非字母字元,则必需在本文前後加上双引号。
假如引数是以 "0X" 开头,则将其後解释为十六进位,并插入相对的
ASCII 字元。(例如,0xd是RETURN)

2. 在您指定此功能时可结合一个以上的作用,在上例,我们用到 string()
作用两次,假如我们知道其他的作用,我们也相同能够系结起来。

定义许多的转译在一起

您能够根据需求在一个表中定义许多的转译。假设,我们在前面的转译中增加
系结:

当我按下这个键时... 我希望这个字串被输入

F2 lpq-Plpa3 <newline>

对此的转译为:

<Key>F2: string("lpq-Plpa3"string(0xd)

所以能够将本列加入前面的表中。但是转译管理器的格式规则告诉我们必需将
两个转译以 "\n" 分开且单独成为一列:

xterm*VT100*Translations: #override(contd.)
<key>F1: string("rm core *.tmp"sting(0xd) \n(cond.)
<Key>F2: string("lpq-Plpa3"string(0xd)

以上的形式将造成管理上的困难,您能够藉著包含 "隐藏的新列字元" 来使他
具可读性一些: (新列字元以倒斜线 "\"处理)

xterm*VT100*Translations: #override\n\
<key>F1: string("rm core *.tmp"sting(0xd)\n\
<Key>F2: string("lpq-Plpa3"

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!