[花果山水帘洞] 在终端内使用超强系列/二笔输入法——uim-fep

终端下东亚文字输入利器。

在终端内使用超强系列/二笔输入法——uim-fep

2016-10-21 / vc12345679

其实我是一次吃烤肉的时候被康哥(Vim上的输入法)忽悠的,以前只能在桌面上用 ibus/scim 用超强系列输入法,现在可以拓展到终端了,特意 mark 一下。

准备工作

首先从 windows 版的相应输入法的各平台发布版本中提取码表。 (太空老师因为怕麻烦,所以大部分超强系列码表都加密了,不过对稍微懂点编码和编程的人来说,都不是问题,具体技术这里就不发布了,请自行尝试;另外太空老师默许此类为自用而破解码表的行为,请善意使用)

终端下的输入法 uim-fep

uim是日本人的作品,是针对 类Unix 平台上的CJK东亚文字输入的解决方案。uim-fep 是其中的前端处理(Front-End Processor),根据主页的说明,uim-fep 适用于 控制台应用(console applications)。

处理码表

uim-fep 采用的码表(utf-8编码)格式如下

编码 (""字符1"" ""字符2"" ""字符3"")

每行一个编码,对应的字符数目不少于1个,可以是符号,可以是utf-8文字,可以是词组、短语;整理好的码表放在 /usr/share/uim/tables/下,后缀名随意,以超强音形为例,取名 cqyx.table。

加入码表

接下来就是修改配置文件,让 uim 能够识别码表。依旧以超强音形的码表 cqyx.table 为例,修改/usr/share/uim/xmload.scm,在 五笔86 或者 郑码 的后面加入下面这堆(其它输入法请修改对应的输入法名称和码表名称)

(define cqyx-init-handler
 (lambda (id im arg)
  (generic-context-new id im ""cqyx.table"" #f)))

(generic-register-im
 'cqyx
 ""zh_CN:zh_TW:zh_HK""
 ""UTF-8""
 (N_ ""超强音形"")
 (N_ ""Chaoqiang Yinxing  input method (Chinese)"")
 cqyx-init-handler)

然后重新加载一下 xmload 模块(需要root权限)

# uim-module-manager --unregister xmload
# uim-module-manager --register xmload

另外,还要在 /usr/share/im-switch.scm 里的 define imsw-iconic-label-alist 内添加一行标签,例如

(cqyx             . ""超"")

或者

(cqyx             . ""Eb"")

理论上,这时你在终端里使用 uim-fep -u cqyx 就能够调出 uim-fep 下的超强音形输入法了,但是...

纠错及配置

左下角确实出现了 cqyx[Eb-] 的字样,却怎么都调不出输入法,别急,这里还要一点点耐心。

搜索了一下,官网上有人说调不出输入法是因为 /usr/share/uim/generic-key-custom.scm 的配置中切换输入法开关的按键设置有问题,为了不在原文件里大动干戈,可以在个人home目录下新建 .uim 进行配置。下面是我目前的配置,具体配置项看英文应该能猜出是什么吧,不细说了,只说一下结果:

  • Ctrl+\ 切换输入法开关(同时配置了Ctrl+Space,但始终不生效,不知道是为什么;常识配置了Shift,也同样不生效)
  • 左右键选字词
  • 空格上屏
  • 最多5个候选
  • 允许预测(比如按A,不仅显示 安,同时还显示 安装 按 艾 澳 等)
(define default-im-name 'cqyx)                                               

(define generic-on-key '(""<IgnoreShift><Control>\\"" ""<Control> ""))
(define generic-on-key? (make-key-predicate '(""<IgnoreShift><Control>\\"" ""<Control> "")))

(define generic-off-key '(""<IgnoreShift><Control>\\"" ""<Control> ""))
(define generic-off-key? (make-key-predicate '(""<IgnoreShift><Control>\\"" ""<Control> "")))

(define generic-next-candidate-key '(""right"" ""<IgnoreCase><Control>n""))
(define generic-next-candidate-key? (make-key-predicate '(""right"")))

(define generic-prev-candidate-key '(""left"" ""<IgnoreCase><Control>n""))
(define generic-prev-candidate-key? (make-key-predicate '(""left"")))

(define generic-commit-key '("" ""))
(define generic-commit-key? (make-key-predicate '("" "")))

(define generic-nr-candidate-max 5)
(define generic-show-prediction-candidates? #t)

使用

  1. 每次打开 bash,用uim-fep -u cqyx打开输入法;
  2. 使用 Ctrl+\ 切换输入法开关状态;
  3. 使用 Ctrl+D 退出输入法。

效果如下

[csw@csw-k29 ~]$ 可以在终端里使用超强音形smr
1:输入法    f 2:输入国    g 3:输入框    k 4:收容    o 5:收入    r [-/7]

另外可在 bashrc 里 alias 一下 fep-uim -u cqyx,使用更方便。

待解决的问题

  • BackSpace 删除键的使用有一些 Bug,请自行体验
  • Ctrl+Space 及 Shift 作为切换开关的配置

附一段处理ibus码表到uim码表的python3脚本

ibus码表只留了 table 和 gouci 部分的纯内容,其它都删了,命名为 cqyx.txt;

输出是按编码的字典序来的,输出文件名 cqyx_uim.txt;

符号部分需要自行添加。

imtable = {}

with open('cqyx.txt') as tablef:
    table = tablef.readlines()
    for line in table:
        code = line.strip().split('\t')
        if len(code) == 2:
            if code[0] in imtable:
                imtable[code[0]].append(code[1])
            else:
                imtable[code[0]] = [ code[1] ]

with open('cqyx_uim.txt','w') as outtxt:
    keys = list(imtable.keys())
    keys.sort()
    for key in keys:
        strw = key+' ('
        for itm in imtable[key]:
                strw += '""'+itm+'"" '
                strw = strw.strip()+')\n'
                outtxt.write(strw)