在OpenVanilla中添加输入法


以表形码输入法为例

转表形码码表为cin档

近几日刚刚购得一个apple ibook,并且安装了openvanilla.org中提供的香草输入法,也看到了一个关于使用自定义输入法的法子,只是这中间要使用cin档案,ZoomQuite前几日说要是有输入法支持(ZQ使用的是一个很个色的输入,就是这个今天说的这个表形码输入法)也要换到Mac平台上来。于是鄙人便在学习过程中转换了这个表形码的码表为OpenVanilla通吃cin档下面写下转换心德

由mb档转为txt档

这个表形码的码表文件据说是在win98中自带的,这个输入法的码表文件就是个WinBX.mb,但这个码表文件并非是一个text档,所以需要把他换成一个text档后才能进行编辑,才能换成一个cin档出来。这里要用到的一个工具就是windows自带的一个[输入法生成器]在这个工具的第2页中即是一个码表的逆转换页,对了,对了,少了一点东西,这个工具在window98的附件中有,但是在win2000与windows xp 中也有一此工具,不过是在安装光盘中罢了。转换完成后,会在码表目录中生成一个同名但不同扩展名的一个文本文件,这个文本文件即我们要的一个格式了

将文本码表进行格式化

我们现在得到的这个码表文件与cin档的表现方式大不相同,转换完成的文件是这个样子

又a arz 
如a aar 
... ... 
但是我们的要的并不这个样的一个结果,cin档的格式应当是这样的
a 又
a 如
a 她 
arz 又 
... ... 
怎么办呢,想到了几个gnu的工具sed与awk,我首先是想到了sed -e 's/[a-z]/\ /g'这样下去想毕大家也知道是不会正确的了,修正sed -e 's/[a-z]/\ &/g',但是这样依然是不行的,他不但把"又"和"a"用space分开了,连"arz"也被分成了"a r z"看来还是要修sed -e 's/[a-z]/\&/',这一步是搞定了,但是怎么才能搞成字在前码在后呢?用awk吧,awk '{print $NF,$1}'这个看来也不行,遇到了像"又a arz"这样的就变成了"arz 又 a",这是一个严重的bug,修正--从想法修正songz老兄提示了一个在sed的时候把他们用不同的分隔符隔开来做,sed -e 's/[a-z]/\;&/' | awk 'FS=";"{print $NF,$1}' ,这就完结了吗?安装完了之后我看到了一个很不好的一面,当我输入一个a 会出现三个字可供选择“又,如,她”,选一个“又”字,出来的却是“arz 又”,看来这个cin档是不支持windows 下这种表示方法的。再来一次吧,awk '{print $1,$NF}'因为我查看了一下这个档中的此类字只发生在26个字母上,并且在后面也对此字进行了全码表示,所以中间的那一个码完全是多余。这下完全去除了、完整的一行应该是cat WinBX.txt | sed -e 's/[a-z]/\;&/' | awk 'FS=";"{print $NF,$1}' | awk '{print $1,$NF}'

进行一个格式到cin档规范

一个正常的cin档是这样

%gen_inp 
%ename BiaoXin 
%cname 表形码输入 
%tcname 表形碼輸入 
%encoding UTF-8 
%selkey 1234567890 
%keyname begin 
a a 
b b 
... 
%keyname end 
%chardef begin 
a 又 
a 如 
a 她 
aaa 姦 
aaa 叒 
... 
%chardef end 
来说一下这几个东西到底是什么神灵
%gen_inp
这是每个cin档的开头每一句,当然了注释不能算做是有效的一行。
%ename
输入法的英文名称
%cname
输入法的中文名称
%tcname
输入法的繁体中文名称
%scname
输入法的简体中文名称
%encoding
字符的编码格式
%selkey
这是选字所要用的键定义
%endkey
这是声明一个字已经输入完成的结果
%keyname begin 和 %keyname end
在这段中间定义的是本输入法所要用到的键映射
%chardef begin 和 %chardef end
这一段中定义的便是字与键的映射表,也就是真正的码表