LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2160|回复: 8

自己写了一个输入法, Windows下的五笔

[复制链接]
发表于 2009-12-26 23:54:02 | 显示全部楼层 |阅读模式
嗯, Windows的, 还是五笔? 有病吧? 脑残吧? Windows下那么多输入法了, 五笔的也有很多, 什么极点, 万能, 甚至还有启程之星, 最后这个还是部分开源的五笔输入法呢. 我为什么还要自己写一个呢?

哎, 说来话长啊. 因为我觉得, 输入法就是个很个性化的软件, 每个人都应该有一个他自己的输入法. 如果Suzhe写的scim不够好, 如果Yuking写的fcitx不够好, 我就把他们俩的捏一块儿, 叫做scim-fcitx:-)

后来我不怎么用Linux了, 在公司一直用Windows XP + Cygwin. scim-fcitx肯定是没法再用了, 就琢磨着, 自己写一个吧. 拿Windows DDK下的区位输入法的例子源代码看啊看, 改啊改, 失败, 看不懂, 改不了... 不搞了, 忍一忍算了, 我用极点吧.

这一忍, 就是两三年的时间. 极点这个键跟fcitx不一样, 那个键也不一样, 算了啦, 忍了啦, 我也没有极点的源代码, 我就改变自己的习惯吧, 从了极点的快捷键设置吧. 谁让我看不懂区位输入法的代码呢.

最后让我忍无可忍的是, Cygwin下的X的窗口不能用Windows本地的输入法! 按一下Windows的输入法切换键, 输入法的窗口是切出来的, 但是按什么键都还是打英文. 其它的也就罢了, Emacs也没有! 这让我很受不了, 因为我大部分时间都要用Emacs的, 而Emacs自带的输入法又不是很好用(这是当然的啦, 因为Emacs的键绑定都是"怪怪"的啦, 比如, 候选词向下翻页人家默认的键是C-n, 也就是Control + n哎. 又比如, 我用过的所有输入法里, 取消你当前的输入都是按Escape, Emacs里是按C-g哎).

怎么办? 忍! 极点我都忍了, 这个也忍了吧! 我找来fcitx里的wubi86码表, 倒腾到Emacs的quail里, 有一些gb18030的字quail还不认, 我只好一个一个的删掉, 为了删它们我还专门学习了emacs里的宏, 要不然每删一个"怪"字我都得敲键盘若干下, 还不能敲错...

后来在网上看了海峰五笔的码表, 哇, 好全啊, 囧这个字算什么, 那个表连㍥都能打出来! 给emacs整上, 极点怎么整不会. 嗯, 忍忍吧...

几年过去了. 我已经爱上了Emacs下打中文的快捷键, 我再也受不了极点了. 我要再试一次! 我又找来Windows的DDK, 打开区位输入法的代码, 看啊看, 改啊改, 嗯, 看来我这几年阅读源代码的功力还是有长的, 这回大概看懂了, 再加上网上尤其是启程之星作者(破除封建迷信, 崇尚科学算命)的一篇文章, 我终于把代码给写出来了.

区位输入法是用C写的, 我用了C++. C++的功力又长了不少, 嘿嘿, 窃喜. 很多以前没用过, 不知道有什么用的东西都懂一点了...

慢, 这还不算完. 写输入法有多痛苦写过的人才知道. 就一台机器, 出bug了你好多程序都嘎嘣嘎嘣的崩溃, 用C/C++语言每次改一点代码都还得重新编译, 编出来的程序(就一个dll)还不能直接安装, 在Windows下你得把所有用过了你的输入法的进程统统干掉. 我写了一个C#的程序, 能把系统中所有进程load了哪些dll全部打印, 然后我grep, 然后我用python (Windows自带的) + pywin32写一个脚本, 把那些load了我输入法的进程全部咔嚓... 这个程序还满有用的, 在我更新cygwin的时候需要把所有load了cygwin1.dll的程序全部咔嚓, 或者哪天我想把所有notepad的进程全部咔嚓...

扯远了, 最后要说的是, 因为c/c++调试困难, 我的程序有两个版本, 一个是纯c++写的, 另一个是后来用c++写了一个客户端, 用python3.1写了一个服务端, 模仿了一下scim的代码组织. 这样组织带来一个显而易见的好处是调试更方便了, 客户与服务之间的协议采用纯文本, 我可以用telnet/nc来调试我的输入法服务端:

  1. $(echo 'keyed C \'; #这个是我的输入法激活键, 模仿emacs的quail
  2. > echo keyed a; #模仿输入a
  3. > echo keyed space #模仿输入空格
  4. > )|nc localhost 12345
  5. active: Y #激活了
  6. end: #应答结束
  7. comp: a #编辑串为"a"
  8. hint: [abcdefghijklmnopqrstuvwxy] #后续跟这些字符还可能有候选词, 也是模仿quail
  9. cands: 工 #候选词为"工"
  10. active: Y #状态还是激活
  11. end:
  12. active: Y
  13. commit: 工 #最后一个"空格"表示要提交这个候选词"工"
  14. end:
复制代码


最后还有一点, 我的输入法极其简陋, 这个是故意的, 不喜欢很多花哨的东西. 只有一点花哨的地方: 它的状态显示条只有一个图标, 是半透明的, 输入法为中文输入时透明度下降, 图标看得更清楚, 为英文输入状态时图标变得更透明, 呵呵. 这个图标用的是当前在使用这个输入法窗口的Windows图标. 见我附上的图.

纯c++的代码在http://windows-config.googlecode.com/svn/trunk/gcode/scim, c++ + python的代码在http://windows-config.googlecode.com/svn/trunk/gcode/scim-cs, 你看出来了, 我的输入法名字也叫scim哎, 估计suzhe不能答应, 我以后得改...

事实上, 我给自己的输入法起了个名字, 叫做"影舞笔"! 哈哈哈... 意思是用自己写的输入法, 那简直, 跟佛山无影腿似的, 又跟跳舞似的...

最后, 以上全是用自己的输入法写的... 它不支持中文标点, 你肯定也看出来了吧:-) 以后我也不一定让它支持, 我忍!
 楼主| 发表于 2009-12-26 23:59:10 | 显示全部楼层
忘记贴图了. 靠, 最少要6个字符?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2009-12-27 14:47:55 | 显示全部楼层
牛银啊, 冒出来拜拜
回复 支持 反对

使用道具 举报

发表于 2009-12-28 02:03:19 | 显示全部楼层
呵呵,楼主能不能帮忙为 sunpinyin 写一个 windows ime 的 wraper ?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-28 14:42:18 | 显示全部楼层
Beta, 我估计是没有精力帮忙写这个wrapper, 你可以找个小弟帮你写, 我可以帮忙出出点子:-)

回头有空我会把ywb的文档整理一下, 给有兴趣的同仁参考一二
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-12-28 22:50:14 | 显示全部楼层
http://code.google.com/p/windows-config/wiki/Win32IME

写了一个文档, 放在这个位置, 感兴趣的同仁可以看一下.
回复 支持 反对

使用道具 举报

发表于 2010-1-1 13:49:59 | 显示全部楼层
支持楼主
--字数补丁
回复 支持 反对

使用道具 举报

发表于 2010-1-8 11:55:37 | 显示全部楼层
Post by flonk_zj;2059656
... 这个程序还满有用的, 在我更新cygwin的时候需要把所有load了cygwin1.dll的程序全部咔嚓, 或者哪天我想把所有notepad的进程全部咔嚓...

这句话看完,全身一阵哆嗦
回复 支持 反对

使用道具 举报

发表于 2010-1-11 22:20:00 | 显示全部楼层
楼主很厉害啊,向你学习。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表