当前位置:操作系统 > Unix/Linux >>

XWindow系统使用指南--第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")string(0xd)

  你可以放置任意多个你所需的 "隐藏的新列字元" , 且几乎在任何地方均可,

  它们只是被忽略而已。 (只要和转译管理器相关,甚至你每隔一个单字便使用

  一个也没关系。但千万不要在一个规格的 resource 特徵部份使用它们,它们

  无法被resource manager解释,也没有相同的效果。) 如果你感觉有些混淆,

  不用担心。简单地说,resource结构需要的是要在一列中的一个resource规格

  的 "值" 的部份,而转译管理器以分开的列来分开 (也就是以\n终结),而使用

  者刚好以每一个实际分开的列代表一个意义以增加可读性,所以规则很简单:

  在除了最後一列的每一个转译列均加上一个 "\n"。

  17.1.2 转译可系结许多型式的作用

  上述的 xterm□例,展示了如何能够当你按下一个键时,插入任意的字串。但

  转译结构的功能比这更多 -- 它可以系结任何widget所提供的作用到按键,让

  我们详细一点地看一下这些作用。

  前述的例子,我们在 xterm的 VT100 widget完成了键F1和F2在 string()

  上的对应。我们将仍以 xterm为例,说明更多的作用。

  查阅xterm 的指南页,在标题KEY TRANSLATIONS 和 KEY/BUTTON BINDINGS

  你将发现列有数个作用。我们将定义一个转译对应键F3到insert-selection()

  作用之上,所以我们可以用键盘来取代滑鼠,将先前 "剪"下的本文 "贴"出。

  指南页告诉我们此作用需要一个引数,从列出的预设系结,我们可以看出预设

  的 "剪贴" 结构为使用 CUT_BUFFER0, 所以我们将CUT_BUFFER0当作引数。我们

  的resource规格是:

  xterm*VT100*Translations: #override\n\

  <key>F3: insert-selection(CUT_BUFFER0)

  到目前为止,这只是一点小小的便利。然而,假定说你花了许多时间在本文文

  件上工作,你用 tbl格式化,你用 nroff在萤幕上预视 (preview)它们,用

  troff 排版,且将输出送到你的一个用过滤器 (filter) 为tr2printer的印表

  机上。设定转译为:

  xterm*VT100*Translations: #override\n\

  <key>F3: string("ed") insert-selection(CUT_BUFFER0)\

  string(0xd)\n\

  <key>F4: string("tbl") insert-selection(CUT_BUFFER0)\

  string("| nroff -man") string(0xd)\n\

  <key>F5: string("tbl") insert-selection(CUT_BUFFER0)\

  string("| troff -man -t | tr2printer") string(0dx)

  xterm 会确定这些转译是以xrdb自资料库载入或是在一个resource档案中,并

  加以处理。现在当你启始xterm,用滑鼠 "剪"取你所需的工作的档案名称。接

  下来,便可按F3键编辑它,按F4键预视它,和按F5键在硬拷贝上排版它。

  更多的widget作用□例 -- xbiff

  查阅xbiff 的指南页:在ACTIONS 的标题下,你将看到Mailbox widget所支援

  作
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,