分享
 
 
 

X windows系统使用指南(十五)

王朝system·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

第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

利用Toolkit 达到此目的方法为:指定一个值给使用转译的widget中的resources

。此值设定应用程式中所必需的定制 (customisation),且被Toolkit 的 Trans-

lation Manager (转译管理器) 所处理。此 resources属於类别Translation,

且其成员名称几一定是translations。

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

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

对前述xterm 的例子,我们定义 (在即将被应用程式读入的resource资料

库中或一些resource档案中) 一个规格类似:

xterm*VT100*Translations: (contd.)

F1: string("rm core *.tmp") 注意:不完整!!

其意为在任何类别 VT100的 xterm widget 中,当键 F1 被按下时,入

字串 "rm core *.tmp")。

不幸的是,并没有这麽简单,转译管理器会把上面的规格解释为 "去掉所

有现存的转译,且加入... " ,所以所有正常的像 " A键是入一个 A" 这种

系结 (binding)都会消失。为了克服这点,你必需使用一些被称为 directive

(指引)的语法入在 resource 值之前:

xterm*VT100*Translations: #override(contd.)

F1: string("rm core *.tmp")

通常你会希保持大部份现存的系结,而只是把你明确指定的值覆盖上去

,所以你一般都是在你的转译表中,指定 #override。

现在这个规格可以开始工作了,藉着启始一个 xterm且把此规格 (在两个

单引号 ()中间的部份) 当成选项 -xrm 的引数来测试它:

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

按下特殊功能键 F1,你将看到指定的字串成功的入,但并未包含新列字元

(newline) ,你可以用一点语法的技巧来克服它,像:

xterm*VT100*Translations: #override(contd.)

F1: string("rm core *.tmp")string(0xd)

这解释了以下两点:

1. string()的作用和它的引数相关。你可以直接输入本文 (例如 string(lpq))

,但如果本文包含空白或非字母字元,则必需在本文前後加上双引号。

如果引数是以 "0X" 开头,则将其後解释为十六进位,并入相对的

ASCII 字元。(例如,0xd是RETURN)

2. 在你指定此功能时可结合一个以上的作用,在上例,我们用到 string()

作用两次,如果我们知道其它的作用,我们也一样可以系结起来。

定义许多的转译在一起

你可以根据需求在一个表中定义许多的转译。假设,我们在前面的转译中增加

系结:

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

F2 lpq-Plpa3

对此的转译为:

F2: string("lpq-Plpa3")string(0xd)

所以可以将本列加入前面的表中。但是转译管理器的格式规则告诉我们必需将

两个转译以 "\n" 分开且独立成为一列:

xterm*VT100*Translations: #override(contd.)

F1: string("rm core *.tmp")sting(0xd) \n(cond.)

F2: string("lpq-Plpa3")string(0xd)

以上的形式将造成管理上的困难,你可以藉着包含 "隐藏的新列字元" 来使它

具可读性一些: (新列字元以倒斜线 "\"处理)

xterm*VT100*Translations: #override\n\

F1: string("rm core *.tmp")sting(0xd)\n\

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\

F3: insert-selection(CUT_BUFFER0)

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

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

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

机上。设定转译为:

xterm*VT100*Translations: #override\n\

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

string(0xd)\n\

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

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

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所支援

作用的名单。它惟一预设的转译为当你按下任何按钮时降下信件 (mail)的旗帜

(flag)(作用unset())。我们将设定转译让你以键盘来运用这些作用,将这些作

用对应到 "?" 和 "UP" "DOWN"两个方向键如下:

? check() 有新的信件吗?

UP set() 升起信件的旗帜

DOWN unset() 降下信件的旗帜

以下是相关的转译表:

xbiff*Mailbox*Translations: #override\n\

?: check()\n\

Down: unset()\n\

Up: set()

以此测试之:用xrdb从你的resource资料库载入这些设定,然後启动xbiff ,

将指标移到视窗内。重复地按下Up和Down游标控制键以升起和降下信件旗

帜。

找出有哪些作用被提供

你对widget作用将和widget名称遭遇相同的问题:如何找出某个widget到底提

供哪些作用以及它们能做些什麽?同样地,没有一个完美的解答,但有一个合

理的方法来处理:

1. 查看应用程式的指南页。大多数的应用程式有它们自己专门的作用文件

。例如:xbiff 有一节叫做ACTION,而xterm 有两节关於转译和作用的

文件 -- KEY TRANSLATIONS 和 KEY/BUTTON BINDING。

2. 最初的指南页可能给你提示,或甚至直接告诉你它用到何种widget的类

别,所以你可以查看它的widget set文件中的特定的widget。(在 core

版中惟一的widget set为Athena,所以你在此不易出错)。即使指南页未

告诉你widget的类别,当你对系统熟悉之後,你将对一个widget是否为

标准型态较具有概念,如果还是不行 ...

3. 查看程式的原始码,看看用到什麽widget的类别,以及widget提供了哪

些作用。

17.1.3 转译系结作用到一序列事件,不只是单一键

我们已经看到转译让你设定入,转译结构也能让你系结这些作用:它可以是

单一的键,或是一序列的键,或者是事实上一序列任何的X事件。

让我们继续以xbiff 为例,看看如何转译一序列的键盘字元。例如我们定

义字元字串的转译如下:

look check()

raise set()

lower unset()

以下为相关的转译表:

xbiff*Mailbox*Translation: #override\n\

l,o,o,k: check()\n\

r,a,i,s,e: set()

l,o,w,e,r: unset()

以此测试之 -- 载入设定和启动xbiff ,将指标移到视窗内。现在你可藉

着输入完整的字串来升起和降下旗帜。例如键入五个字元 r, a, i, s, e以升

起旗帜。对xbiff 的两个表有几点值得说明:

. 键的名称可以用不同的方式指定。正常的印出字元直接指定 (如"w")

, 其它的字元则拼出全名(如"Down").附录A "文件指引" 告诉你

在何处可查到键的名称,但在本节下面有更简单的方法。

. 对字元字串,你必需一一指定,并以逗点分开

(如"l,o,o,k").

. 转译可允许相同开头的键,例如 "look" 和 "lower" 均拥有相同的开头

"lo",对转译管理器不会形成问题。

找出键的名称

找出转译所需的键的名称,最简单的方法为执行xev ,将指标移到视窗内,按

下你所需的键,则键的名称会出现在括弧内字串keysym和一个十六进位数之後

。例如在xev 的视窗内按下游标控制键DOWN,它的输出如图17 - 1,在其中你

会看到

(keysym 0xff54, Down)

也就是说,键的名称为Down。

┏----------------┓

│ P209. fig 17 - 1 │

│ │

│ │

│ │

│ 图 17 - 1 xev 显示键名称的输出 │

┗----------------┛

你可以在转译中使用任何型态的事件

到目前为止,我们所写的转译都是系结作用到一个按下的键盘字元。但我们曾

说过,转译结构可系结作用到任何事件,而不只於按下键盘而已。可能的事件

型态非常的多,在此我们只提及一小部份:

型态 意义

按下一个键

按下一个键 (只是另一个名称)

放松一个键

按下一个滑鼠按钮

放松一个滑鼠按钮

指标进入视窗内

指标移出视窗外

我们已经使用过按下一个键的事件,让我们系结xbiff 作用到滑鼠按钮以取代之:

xbiff*Mailbox*Translations: #override\n\

Button1: unset()\n\

Button2: check()\n\

Button3: set()

你可以看到语法和前面相似:你先给定一般性的事件型态 (例如 或

),其後跟着你所需事件的事件细节部份 (例如s 和Button3) (

Button 1, 2, 3分别对应到左、中、右按钮)

对一序列的事件的转译

就如同我们定义了一序列按下键事件的转译(set,unset和check),我们当然

也可以定义一序列的滑鼠事件。事实上你转译的一序列的事件可以任意组合在

一起,你可以在一个转译的左边随意混合事件的型态。所以你可以定义如下的

转译表:

xbiff*Mailbox*Translations: #override\n\

Button1, ?, Button3: check()\n\

Button1: u, Button3: unset()\n\

Button1: s, Button3: set()

也就是说,用到check(),你必需依序先按下按钮1 (左按钮),然後按下"?"

键 ,最後按下按钮3 (右按钮)。 这个范例并不是很好,但对於一些危险或不

可取消 (irreversible) 的作用 (例如删除一个档案,或是覆写一个缓冲区的

内容) ,你可以依照这种方式来使用转译。你需要使用一个非常谨慎的命令序

列,才能用到此作用,这样使得使用者不可能因意外而输入此命令。

使用非键盘和非滑鼠事件的转译

通常你是对按下或放松滑鼠按钮或键盘的键定义转译。但我们曾经说过,你可

以对任何事件设定转译,例如指标移入或移出一个widget的视窗。让我们以

xman的主选项视窗 (图10 - 3) 为范例来解释它。这是一个相当人为的范例,

因为它没有任何用途。但无论如何,它很容易被看出在做些什麽操作。

查看xman的指南页,在X DEFAULTS标题下,你将看到概括的xman所用到的widget

的名称和类别:主选择项视窗widget的名称叫topBox,类别名为Command。这

是一个好的猜测,因为在选单操作盒的方法。我们可用第15章所提过的技巧

来确认它,使用以下的命令:

xman -xrm "*Command*backgroundPixmap: scales"

且所有的Command widget将会有鱼鳞状的背景)。

这和我们先前的范例有一个重要的不同:我们所用到的作用不是由特定的应用

程式指定,而是由标准的widget提供 (本例中为Command widget,在 "X

Toolkit Athena Widget"使用手册中有描述)。

在我们定义任何东西之前,先来看一看此widget预设的功用,以便我们能

够了解有些什麽事发生和有哪些widget的作用会做。启动xman,移动指标进入

Help 盒,你会看到盒的外框变成高亮度 -- 这是highlight() 在作用。将指

标移出,盒的外框恢复正常 -- 这是unhighlight() 作用。将指标再度移入

Help 盒,按下一个滑鼠按钮,保持按住不放。则盒内的色彩反转 (盒内的文

字变成预设的背景色,而原来视窗的背景变成视窗的前景色)。-- 这是set()

在作用。继续保持按住滑鼠按钮,将指标移出视窗外,盒内色彩恢复正常 --

这是reset() 在作用。一个正常 "碰触一下" (clicking on) Help盒的次序为:

1. 移动指标进入盒中:highlight()将外框变为高亮度。

2. 按下按钮:set() 反转盒中的色彩。

3. 松开按钮:notify()开始作用,造成程式建立求助视窗(help window)

。在进行中时,盒的色彩保持反相。当视窗建立完成之後,reset()反

转盒内的色彩为正常,但外框仍保持高亮度。

4. 将指标移出视窗:unhighlight()将外框恢复正常。

现在你了解了有哪些作用,我们将定义一些转译来改变原先进出视窗的作

用:

*Command*translations: #override\n\

: reset()\n\

: set()

用这个奇怪的转译表,当你一开始移动指标进入盒中,什麽事也不会发生,但

当你移出指标时,色彩会反转。如果你再度移动指标进入盒中,色彩会变回正

常。其它的作用和前述相同。

使用修饰键来修饰事件规格

有时你指定的转译希能同时按下一或多个修饰键 (modifiers) ,例如你要系

结一个作用到和META键同时按下的一个键,或是当CTRL和SHIFT 同时按下的滑

鼠按钮。到目前为止我们还没有任何办法可指定如此。我们不能用事件序列达

成这点,因为它是依序定义的,而我们需要的是指定同时,例如 "按下X 键且

CTRL键同时被按下"。

欲在转译中指定修饰键,你只需在事件名称之前加上你所需的修饰键名。

例如在xterm 中,定义meta-i为 "贴" 上一次 "剪" 的本文,使用:

*VT100*Translations: #override\

Meta i: insert-selection(PRIMARY, CUT_BUFFER0)

因为这种修饰键/事件型态的组合十分常见,转译管理器允许使用一种缩写的

形式。相等於上面第二列的写法为:

i: insert-selection(PRIMARY, CUT_BUFFER0)

我们可以对滑鼠事件做同样的处理。让我们对xedit 定义转译,使得使用

滑鼠可以在本文上方便地移动,我们首先的尝试如下:

*Text*Translation: #override\

Shift : forward-character()\n\

Shift : forward-word()\n\

Shift : next-line()\n\

Ctrl : backward-character()\n\

Ctrl : backward-word()\n\

Ctrl : previous-line()

如果你测试它,奇怪的现象会发生 -- 游标好像会自行其是,而且本文的

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有