开发工具 有关自动补全 (auto complete) 与输入片段 (snippet), 用过 textmate 的进来下~

zw963 · 2012年03月09日 · 最后由 autocomplete 回复于 2017年03月18日 · 10399 次阅读

嗨~ 各位用过 textmate 的 fellows, 小弟有个问题要问你们!

首先说下两者的区别:

auto complete, 是根据特定的辞典,以及上下文内容,(相当智能化的) 自动补全. yasnippet, 就是类似于 textmate 的 bundle, 主要用于自动补全事先定义的片段, 通过定制复杂的 bundle, 也可以实现相当复杂的补全,甚至可以嵌套 ;-)

我没有用过 textmate, 我想问下,到底在 textmate 下面是如何处理以上两个问题 的。我使用的是 Emacs, 一切都需要自己定制。汗... 但是在自动补全这一块, 一直没有形成太规律的一个习惯。

主要是因为以下原因。

前提条件:

  1. 以上两个功能,我都使用的是同一个快捷键,那就是传说中的 tab. (两者如果不是独立的快捷键,那当然没有问题了,不过我就是喜欢两个在一起)

  2. auto-complete 优先于 yasnippet 被执行。只有没有满足前者的情况下,才会 执行后者。

  3. auto-complete 可以选择在输入第几个字符的时候被激活,而且可以设定响应 时间,我之前用的默认:在输入第 2 个字符时,激活自动补全提示,响应时间为 0.8 秒。

依据以上条件,就形成了以下策略:

  1. 策略 1: 首先,运行 auto-complete, 自动补全以后,再运行 yasnippet.
  2. 策略 2: 首先,yasnippet, 超过指定的字符以后,才激活 auto-complete.

用示例来说明:

假设期望在 Ruby 中补全 for 循环:

第一种情况:键入 fo, 会自动提示 for, 按一下 tab, 补全为 for, 再按下 tab,补全为 for 循环结构,第一个 tab 是 auto, 第二个是 yas.

第二种情况:设定至少 4 个字符才激活 auto-complete. 此时,bundle 的定义应该满足以下条件才会不发生冲突: 1) bundle 长度在三个字符以内。这样总是激活 bundle. 2) bundle 的长度非常长或不经常被使用. 我现在用的是第二种情况。在两种之间摇摆过几次。

唧唧歪歪半天,也没说问题是啥,哈哈。

提问如下:

textmate 是否具有类似 auto-complete 的功能? 如果有,是使用什么策略和 bundle 共存?分开两个快捷键吗? 如果是一个快捷键,在输入几个字符的情况下被自动激活的?

TextMate 是按 Esc 匹配文件里面有的单词。

楼主头像很像毛老头年轻的照片。

#1 楼 @huacnlee, 哦。那就是 bundle 和自动完成分开两个快捷键了. 会不会自动提示完成,让你提前看到按下 esc 后,会匹配的单词呢? 我是发现了,如果在一起,无论你怎么配置,都会有一定的冲突。

#2 楼 @huacnlee 你是第一个这么说我的。哈哈。不过这张照片,也是第一次网上用。

没有必要列出来,Esc 的瞬间是很快的,比你还手按上下来的快。

没仔细用过 TextMate,不过一般同时支持 complete 和 snippet 的软件,触发的时候应该是把两者中匹配的项都加到候选列表,可以在列表中选择,或者继续输入,缩小候选范围。auto-complete 不是也有 yasnippet 的 source 吗。

#5 楼 @neutralevil

嗨~ 谢谢你。问题已解决。解决的办法出奇的简单,就是调整了优先级,优先补全 yasnippet 即可。之前我的插件其实是单独各自使用的,现在是通过 autocomplete 来调用 yasnippet.

实现一个智能提示功能需要 ajax、数据库、jsp/php、算法等很多知识, 如果数据量大,还需要特殊优化 一个小功能,花费太大精力很不划算 92find.com 上的一个 js 插件实现了搜索框自动补全托管服务, 只要一行 javascript 代码就可以实现百度、淘宝搜索框提示的全部功能 比如:汉字拼音匹配、拼音前缀匹配、模糊搜索、智能容错,还可以自定义提示词汇及其排序权重 花五分钟我的网站就可以部署同百度、淘宝一样强大好用的输入提示功能 同时兼容 IE、Firefox、Safari、Chrome、Opera 各种浏览器 兼容 ios、Android、Windows

需要 登录 后方可回复, 如果你还没有账号请 注册新账号