提干式id补齐和re补齐

最早在 水木Emacs版的这个贴子 里讨论了这种补齐,一开始只是id补齐:

刚刚写了一段补齐的elisp程序,目的是想要比自带的dabbrev补齐少敲几下键盘。

在用dabbrev补齐的时候,它会按照前缀是不是匹配来补齐,这样做有时候不能省 按键次数。举个例子,如果你有好几个变量都是以相同的前缀开头,比如从 variable_0variable_10 (当然,只是举个相同前缀的例子,实际情况 应该不会以0到10来结束),那么补齐的时候会按照某种顺序一个一个的试。相同 前缀越长,你在补齐之前需要打上去的字数也越多;相同前缀的名字越多,你需 要敲补齐键选择的次数也越多。

也就是说关键字母并不一定都是在前缀里,你应该可以自己选择关键字母去补齐。

参考ecomplete里的代码,我写的这个补齐只要打两个关键字母v和0,它就会把所有包含v和0 的单词给列出来让你选,这样补齐之前就可以只打两个字符,补齐之后也只要做两 次选择了。

很快 wuhaochi同学 建议应该做一个基于正则表达式的任意字符串(而不是仅限 于identifier)的补齐,我很高兴的实现了。

其实类似的人机接口在firefox的地址栏里也可以见到,输入几个字,在任意位置 匹配这些字的历史url就会被过滤出来让你挑选(也就是补齐)。

见图(只要打3个字母,就允许我补齐相当长的字串,所以经常能省打很多字):

re-completion.png

使用这种补齐方式的优点是(与eclipse等IDE中的java上下文智能补齐相比):

  1. 适用于任何编程语言。
  2. 便宜。
  3. 效率。

当然,缺点也很明显:

  1. 只能补齐当前buffer中已经出现过了的字或字串(这个已经做了改进,所有可 见的buffer都会参与匹配,如果没找到的话,还会继续进入 (buffer-list) 中不可见的部分去查找)。
  2. 由于1)中提到的改进,以及本身实现的头脑简单性,有可能会进入类死循环, 需要按 C-g 退出。
  3. 补齐函数名之后,不能很轻易的看见该函数的参数列表是乍定义的。

具体实现见 github代码