Linux上的中文驱动程式

如何安装及使用chdrv 1.0(下)


这期作者将继续介绍chdrv 1.0的设定,
包括简体字、萤幕、键盘和列印等部份。
另外,有关整个chdrv的运作情形和使用指引,
也将会详细地介绍给各位读者,以供参考。

王佑中


简体字环境的设定

  目前chdrv在简体字环境中的应用很少被讨论。但由於chdrv支援HBF字型,所以确 定可以使用GB码做为内码。不过目前很多以BIG5码为主的系统也支援使用BIG5码下的 简体字环境。本节中也将介绍它们的使用。

以GB为内码

  如果你使用GB码,则你必需使用HBF格式,首先取得cclib.16和cclib16.hbf.修改 /etc/chinese.conf中使用HBF font如下



BEGIN FONT

# 使用国乔的8x16半形字做为chdrv的英文字型

ASCII /usr/local/lib/chinese/kctext16.f00 256 16

# 使用cclib16的字型做为系统的中文字型,且采用HBF格式来描述此字型

HBF /usr/local/lib/chinese/cclib16.hbf

...

END FONT

  设定完成後不要忘了执行chconfig,以更新系统中的组态。一切完成後,再将 cclib.16放入CHFONTDIR所指的路径,重新启动系统即可。不要忘了在你的.profile 档中设定CHFONTDIR变数,否则cclib.16应放在系统预设的/usr/local/lib/chinese 中。通常我们都把字型放在预设的地方。这个预设的路径只有在compile时才能改变 ,如果你想使用一个不同的地方,作者鼓励使用重新compiling来达成目的。

以BIG5为内码

  如果你的目的只是在萤幕上显示简体字,我建议使用本法。因为在chdrv中HBF字 型的速度不如内定格式,且其设定较复杂。在GB版未出现前,自行建立可能只有熟手 才能胜任愉快。

  如果你用BIG5码那问题比较简单,你唯一需要做的工作是取得kcchin15.f15这个 档案,它是国乔字型的一部份。然後把它拷贝到你的系统目录(通常是/usr/local/ lib/chinese)中。

  然後设定/etc/chinese.conf,使它由kcchin16.f00改成kcchin16.f15.然後执行



    # ./chconfig /usr/local/lib/chinese/

系统重新设定後再启动中文DAEMON chdrv即可。当然不要忘了将kcchin16.f15并将 它放入指定目录(通常是/usr/local/lib/chinese)中。

  值得提醒的是在chconfig命令後的路径是不能省略的,如果你犯了错,系统不会 给你任何形式,它只是安静的做一些错误的动作,这曾使我自己迷惑了好一阵子,希 望你不是下一个。

萤幕参数

  chdrv有关萤幕的参数在目前的版本中并不完整,很多该有的参数到目前为止都 还是停留在HARDCODE在程式内的情况。尤其是有关萤幕大小及字型大小的参数都有待 加入,未来SVGALIB甚至其它工作平台(如SUN)的移植都需要这些参数的帮助。目前只 有颜色设定的设定是有效的,它们实际上是不存在於目前的版本之中,但希望能在未 来的版本中出现。

键盘

  目前的键盘是固定的,在後面有完整的键盘使用说明。值得注意的是在chdrv中 的按键和在dos下一般所使用的中文系统完全不同。目前系统提供了一个叫etmode的 命令档来设定和倚天相似的键盘,在使用它前应先确定kdb-0.86以上的版本是否己正 确的安装在您的系统之中。但用它来设定的键般是整体性的效果,所以会在非中文模 式的虚拟萤幕也产生影响,至於其取舍就在你自己的决定了。

  我个人认为,在一开机就执行它是一个好主意,因为它和chdrv本身无关,可以 单独执行。如此一来,一进入chdrv就可以得到一个和倚天相似的操作模式,在将来 加入倚天相容的控制码後,就可以在Linux上得到一个和倚天相容的环境了。

  chdrv提供了一支叫做etmode的程式来载入一份新的键定义,实际上在0.99版之 後这支程式会在chdrv执行时被自动呼叫,所以使用并不必自行去呼叫它。也就是说 一进入chdrv後就可以使用倚天模式的键盘了,在1.0後原先的键盘随时可能被移去, 所以不应该再使用它们。

  如果你不满意预设的键盘定义,你可以自行修改。例如有人不满意chdrv输入 法的切换键和倚天的不太一样,这一点可以很容易的经由修改keys.tw这个档来改 变。keys.tw这个档是一份完整的键盘定义,它除了Linux预设的之外,还加上了一 些chdrv所以用的按键。这些按键在chdrv使用指引一章中将被提及,这里我提示一 个这个档的格式以让想自己修改的人自行修改。

  loadkey的定义档格式很简单,它看起来虽然好像有阶层性的组织,但每一行其 实都是相互独立的。它分为叁个区段,第一个区段定义所有的按键,其格式为



      <modify>  keycode <key code> = identity

<modify>可以是Shift,Alt,Control,AltGR的任意组合,<key code>是0到255 的数字,而identity则可能是一个按键定义或是巨集变数。可用的巨集变数可用 loadkeys -- longinfo得到一个完整的列表。档案中的缩排只是为了方便阅读, 没有实际上的意义,顺序也不重要。第二区段则是所有巨集变数的定义,如


            string F217="\033%Z17@"

这是chdrv使用来定义alt-ctrl-l的字串,在keys.tw的第一区段中有一行


            alt control keycode 17 = F217

其它的键也是用同样的方法设定。在此就不多说了,如有问题可以用


              # man keytable

来查阅说明文件。

列印

  列印字型全采HBF格式,无论系统字型是内定或是HBF。你必须先给定印列字型的 路径


         PFONTPATH $$

然後给定各种字体的字型


        PFONTL   隶书

        PFONTK   楷书

        PFONTM   明体

        PFONTD   内定

即可。这些字型档和HBF定义档都可在上述的位置上找到。本系统是用cnprint来将输 入转成postscript显示,所以你须还有一个postscript印表机或是postscript的转译 器,例如GNU的Ghostscript来做实际输出的动作。在这篇文章中我不介绍cnprint的 使用,但有关它的使用方法可用


                cnprint -h

得到一个完整的解说,总的来说,它只是一个列印程式,对文件档并未做任何额外的 处理,也没有任何特殊的字元或命令。它适合做一些简单文件档的列印工作,比较要 求品质的文件应用TeX来处理,有关中文TeX的使用及安装法将另文说明。

输入法驱动程式

  chdrv提供了使用者可自行设定的输入法表格,一般有时这种方法被称为万能输 入法。在组态档中它是在INPUT区块中,这个区块的关键字是INPUT,其中的每一行代 表一个输入法表格。形式为



BEGIN INPUT

0 /usr/local/lib/chinese/dayi.tbl

1 /usr/local/lib/chinese/NCTU-CSIE-CJ.tbl

...

END INPUT

  上述的表格档是指二进位的表格档,你必须把由def定义档先转换成二进位的tbl 档後才能使用。至於这个表格档的格式自行参考NCTU-CSIE-CJ.def就可以明白了,基 本上和震汉中文中的格式类似,在第四章中将会介绍一个用来将cxterm的tit档转换 成def档的程式。

四、chdrv使用指引

  当你阅读到这,恭喜你己经成功的安装完成chdrv(我希望如此)。如果还是有问 题请看chdrv.FAQ这个档案,在那里我将一些常见的问题收集在一起。在这一章中我 将把chdrv的设计理念和各程式间的关系加以说明。并指出正确的使用方法,如果你 由原始程式安装,chdrv提供了一些额外的公用程式,在本章中也将逐一介绍它们。

如何将chdrv加入系统启动程序中

  chdrv的主程式是chdrv,它会自行检查是否有另一个chdrv程式正在执行,若有 则会告知使用者,在早期的版本中它用chdrv.pid来检查另一个chdrv是否存在。但 1.0後会实际检查记忆体中是有有这个行程存在, 所以山般来说即使当机它也不会 出现重开机後无法再执行的问题。

  chdrv目前的稳定度己可以做为启动程序的一部份,你可以把它加入rc.local中 ,在其中加入



  if [ -x /usr/local/bin/chdrv]; then

      /usr/local/bin/chdrv&
  fi

如何在chdrv中使用键盘

  在chdrv中使用的键盘组合和一般dos下的中文系统大为不同,但由於Linux本身 的键盘就是可以自行重新组态的,所以我们可以自行重新设定。目前chdrv使用了一 些功能键做为系统状态的切换键,因为它们可能会和有些软体的功能键相冲突,所以 并不是一个好的做法,在0.98以後加入了倚天相容模式,不过它们仍只是使用kbd来 把CTRL-SPACE等键转译成相对的功能键。

  在0.9pl9开始我试着定义一组特殊的逸出序列来执行中文系统状态的设定工作, 而将功能键留给应用程式使用,希望在将来的版本可以完全除去功能键的使用。因此 下列的说明只是为了完整起见,大家应避免使用它们,尤其是在应用程式中,因为将 来的版本中,它们可能被完全除去。各位应直接使用後述的倚天模式键盘。


按键 : F9

说明 : 中英文输人法切换键,相当於dos中文系统中常用的ctrl-space键。

       系统会自动记住一上个被使用的中文输入法,如果输入到一半就切换,则系统

       会忘记你上一次的内容。



按键 : F10

说明 : 中文输入法选择键。在按下此键後,在状态列会出现一行



       Select a input method(0-9)?

然後此时按下数字键即可。需注意chdrv在发现你选了一个不适当的输入法时,例如 你没有挂了第叁号输入法,但却选了3时,chdrv会接受你的要求,在状态列的输入法 名称栏会出现[err]的字样,而且也不接受任何输入。按键:F11说明:Mule模式切换 键。Mule在处理时要求以EUC的格式输入,EUC是一种和ISO2022标准相容的编码法, 原本是用於GB码。但目前也被用来处理BIG5码,但由於BIG5码的字数大於ISO2022二 位元组格式的长度,所以BIG5码被分为二段。详细的情形请看MULE中的说明,在此处 只要知道当你使用Mule时记得将Mule模式打开,Mule模式打开时在然态列会出现一个 M字。这个按键目前没有相对应的倚天模式按键。

按键 : F12

说明 : 全形半形切换键。

另外倚天系统中的一些按键也可以被使用,事实上在1.0後我建议应该在所有可能的 情况下都使用倚天模式的键盘。下面是可使用的倚天按键

按键 : CTRL-ALT-[1-9]

说明 : 选择第1-9号输入法。



按键 : CTRL-SPACE

说明 : 中文和英数模式间的切换



按键 : SHIFT-SPACE

说明 : 全型文字和半型文字间的切换。



按键 : SHIFT-ALT-[a-z]

说明 : 共26个巨集键,可在英数模式或是中文模式中使用。

       每一组按键都在chdrv.mac 中被定义,这个档案预设的定义和倚天中的相同。

       所以过去习惯用倚天键盘打字的人可能又发现了一个宝藏。



按键 : CTRL-ALT-R

说明 : 重绘整个萤幕,这和有些软体中可用的ctrl-l来重绘萤幕不同,

       它是chdrv 的一商份,它根据chdrv记录的资料来做重绘的工作。

       当你发现萤幕上有些乱码时不妨试着用它来清除。

注:
kbd是一套用来设定Linux如何把按键组合转译成逸出序列的软体,它利用Linux核心 提供的IOCTL呼叫来设定Linux的内部键盘。它的设定是整体性的,也就是说在设定後 在每一个虚拟键盘上的转译方式都是一样的,Linux目前还不提供区域性的键般设定 。

如何使用逸出序列来控制chdrv

  本节中我将提出一套给中文系统用的逸出序列,它们可用来切换中文系统的状态 。它们可被写在程式之中用来控制中文系统的动作,例如在要求使用者输入中文资料 时可以在自动把输入状态切换至中文输入,而在输入数字时又自动切回英数模式。它 们也可用来查询中文系统的状态,如查询字型快取缓冲区的命中率以决定要设定多大 的缓冲区,或是目前作用中的输入法等。

  本节中的逸出序列在目前的版本尚不完整,但它们应在不久的将来完成,请看版 本随附的NEWS查看它的状况。


格式 : <ESC>%I##;

说明 : 切换输入法的种类,如果选定的输入法在系统中实际上不存在,输入法会进

       入错误状态而拒绝任何输入。在状态列上也会有错误的状态出现。



格式 : <ESC>%I;

说明 : 查询目前的输入法,系统会由标准输入传回一个整数,这个整数的义为

0 英数模式
1 内码模式
2 注音模式
2+# 第#号输入法


格式 : <ESC>%<string>;

说明 : 将<string>不经输入法驱动程式的转译直接送到输出去。

       这通常是在使用kbd 程式设定功能键或组合键定义时使用,

       我们可以用它来定义一些常用的巨集字串。



格式 : <ESC>%Z##;

说明 : 将第##号巨集字串送至输出,同样不经输入法驱动程式的影响。

       这个功能主要是用来定义如倚天中的片语用,在倚天中我们可以设定由

       SHIFT-ALT 组成的组合键。我们虽然可以用上一个格式直接把字串写在

       设定Linux的键盘的定义档中,但如此可能占掉太多的记忆空间,因核心

       中用来放置键盘定义的空间有限,不可能无限制的定义片语。所以片语

       的功能需用此格式定义,如些不论片语的长度多长,我们需的占的空间

       是固定的。



格式 : <ESC>%IN;

说明 : 将中文输入模式切换至英数的输入模式。



格式 : <ESC>%IC;

说明 : 将输入模式设定为中文输入模式。



格式 : <ESC>%Ic;

说明 : 如果目前输入模式为中文则切换成英数,反之亦同。



格式 : <ESC>%IT;

说明 : 游标模式设为英文模式。



格式 : <ESC>%It;

说明 : 游标模式为中文模式。



格式 : <ESC>%IF;

说明 : 进入全型模式。



格式 : <ESC>%If;

说明 : 进入半型模式。



格式 : <ESC>%C;

说明 : 萤幕重新扫描,萤幕上每一个字都会重新计算断字的位置,

       当萤幕上出现不明原因的乱码时被使用来重绘萤幕。

mkmulti使用指引

  chdrv的表格驱动输入法提供了很有弹性的方法让使用者加入新的输入法,为了 载入速度的考量,这个表格档在chdrv实际载入前必须先转换成二进位的格式。mk- multi即是用来做这项工作。它用法为


        mkmulti <source>.def <dest>.tbl

二个参数都不能省,如果只用一个参数,会以标准输出为输出档。另外还有一支程式 叫tit2def.perl用来将cxterm的输入法表格转换成def档,它是一个perl 4.036的命 令档,perl是一个很适合用来处理文字资料的解释式语言。这个程式在一般的Linux 系统内应都存在,但由於cxterm的格式和chdrv的不尽相同,这个程式主要用来处理 表格的第叁部份,其馀的二部份必须人工来完成,不过这二者都很短,一般来说只要 数分钟就可以设定完成。

  随附的NCTU-CSIE-CJ.def就是用这个程式完成,它大约只花了我十几分钟而己。 它的使用方法也很简单,



          tit2def.perl < NCTU-CSIE-CJ.tit > NCTU-CSIE-CJ.def

  至此己将整个chdrv介绍完毕,希望本文能使大家更容易的使用及设定chdrv,若 还有疑问,作者是很愿意和大家同讨论。当然这里还是再提醒大家,很多问题其实早 有答案的,在发问前不妨自己先找找。
(作者E-mail:twchiu2@phys.ntu.edu.tw)