素心如何天上月 (Yong Sun's Blog)

Input code snippets via input method?

星期一 五月 26, 2008

Every professional editor (like Emacs, Vim, TextMate etc) added or is adding snippets feature. I am just thinking, can we implement the snippets inputing as an input method? So you could even input the snippet in your mail client, browser, and any editable area.

[7] 评论
Like this post? del.icio.us | furl | slashdot | technorati | digg
评论:

有意思的主意。目前有些输入法已经部分实现了这个功能,不过不是作为主要的一个特色,和自定义词组差不多。

如果可以方便用于输入代码…好像这个又不是作为输入法应该要做的。有没有比如代码自动补全、可以用tab来在if/then中跳转等等功能?可能用输入法来做不如专用编辑器来的方便。而在普遍意义上的文本编辑中,对snippets的需求又不那么的充分,或者说,没有这样的需求?

发表于 HeaTeR 在 2008年05月26日, 08:25 下午 CST #

不太好办把,文本编辑器内嵌的snippet可以访问当前编辑的文本,文件名等,作出决断。
比如大多数snippet都支持once<TAB>,完成#ifnde XXX_H_, #define ....这样的功能,这里用到了文件名。
还有,snippet需要跳转,比如for<TAB>的时候,完成了for (....) { ^ }按几下<TAB>就可以跳到大括号里面去,从输入法层面上,很难办到。
按键冲突也会造成问题,比如使用<TAB>实现snippet,是由谁来处理<TAB>?有的IDE自己处理得就很好,输入法介入会造成干扰。
最后,缩进控制也是一个问题。输入法该加多少个空格或者是TAB?各种文本编辑器的自动缩进设置不同。

总之,觉得这样做不太好 =_= ...

发表于 quark 在 2008年05月27日, 12:10 上午 CST #

en, 的确访问当前的文件名是个问题,也无法得到当前编辑的类型(可以显式地由用户指定)。不过现在应用程序(包括gtk/gnome等应用)对surrounding text和preedit的支持都已经很充分了,应该有可能实现对TAB跳转定位的支持。只是瞎想想,呵呵...

发表于 Yong Sun 在 2008年05月27日, 08:50 上午 CST #

赞一个!不过我觉得做简单的 expand 的话比较好做,而做复杂的如 TAB 跳转,同步更新甚至动态内容之类的就比较麻烦了。因为这个是独立于编辑器的,而 Linux 下的 X 组建又那么多,撇开那些古老的和 Emacs 、Vim 这种东西不谈,也有 GTK 和 Qt 两套,要么自己做一个平台分别对两套东西进行包装,要么干脆就是最大公约数,总之确实有些困难。不过还是支持一下!做出来说不定会很有意思的~ ^_^

发表于 pluskid 在 2008年05月27日, 12:47 下午 CST #

Hi, pluskid, 你的yasnippet非常棒,我在用呢。那些老的X程序的确就很难支持了,GTK和QT还是有希望的。不过应用程序会首先获得这些keyEvent,然后会不会交给输入法处理还是个问题,呵呵。

发表于 Yong Sun 在 2008年05月27日, 01:51 下午 CST #

不好意思,在这儿提一个和本帖子无关的问题。
你的系列blog,SunPinyin代码导读我看到了第三部分,遇到一个问题。
CSlmBuilder::Discount(),就是在计算打折的时候,上面示例的命令行参数是:
-d ABS,0.0005 -d ABS -d ABS,0.6
也就是说,每个level都用Absolute Discounting来打折,但第二个level没有指定dis,缺省是0,那不就相当于没有打折吗。
而且,我看到源代码CSlmAbsoluteDiscounter里有这样一行注释:
//c == 0 mean this value should be count according to r[]
这句话怎么理解呢,我都没找到r[]。

没别的联系方式,只好贴在这儿了。真心希望你能回复。谢谢!

发表于 lithium 在 2008年06月27日, 06:18 下午 CST #

lithium,您好,可以通过Yong.Sun@Sun.COM联系我。关于未指定打折次数的问题,CSlmAbsoluteDiscounter::init() 会根据CSlmBuilder::CountNr()的结果进行一个自动的估算。

发表于 Yong Sun 在 2008年06月27日, 11:22 下午 CST #

发表一条评论:
该日志评论功能被禁用了。