简介

过去的一周,都睡的很晚,终于做出了Atom上的APICloud语法提示与补全插件:apicloud_autocomplete.个中滋味,感觉还是有必要记录下来的.代码基于 GPL-3.0 开源,所以我可以较为详细的记录一些很难被理解和体会的技术细节.APICloud目前已有Studio,VSCode,Webstrom和Sublime的语法补全插件,但是毫无疑问,我做的这款,是目前为止最好的 -- 唯一的一个支持100%所有API,唯一的一个同时支持模糊匹配和静态推导语法提示插件!

可能你会说,估计是Atom语法补全的扩展机制灵活等等吧!但是,我可以很明确地告诉你,核心逻辑是基于正则匹配的通用逻辑,和Atom没有必然的联系! apicloud_autocomplete ,需要多个技术栈的创造性地混合使用,某种程度上,这个系列的文章,就是写给全栈开发工程师的赞歌!哈哈~

你会耐心读完整个系列文章的N个可能性

  • 你可能想做一个ReactNative或者Weex的API级别的语法提示与补全插件!注意,我说的是精确到特定API的提示,而不是简单的通用语法提示.比如现在有好多jsx语法自动补全的提示,但是并没有能真正提示某个模块的某个方法或者某个属性的ReactNative或者Weex的插件.
  • 你可能对网页数据的针对性抽取感兴趣.从HTML格式的数据中,按照特定规则,抽离特定的数据,正则固然可以,但是我推荐你使用 pup.这个Task,使用了非常复杂的pup使用技巧,值得一读.
  • 你可能对正则表达式的深入使用感兴趣.刚开始,基于Atom的分析树写的,但是通用性太弱,后来就改成基于正则的了.展示了一些复杂的正则用法,比如后向匹配.不得不说,正则表达式式,太强大了!
  • 你可能对较大量数据的清洗和格式化感兴趣.文章将展示一些你可能以后也会需要的shell脚本.顺序很重要!

难点与技术点一览

  • 海量数据,却没有现成的获取模块api信息的通用接口.300多个模块,几千条api,如果一条条录入其方法名,代码模块,没有 30 天,真的很难搞定!但是,我只用了 3 天!简单的shell知识,还是挺有帮助的.
  • 模糊提示.这个是很实用的功能,实现起来还是需要一点点正则技巧的.
  • 静态推导,即根据上下文推断变量正式模块类型.仔细想想,或许你能理解问题的困难之处 -- 你只是一个语法提示,是不能真实地执行代码的,你要做一个静态分析,来推断出某个变量对应的模块的类型,进而在其模块信息内部搜索相关的api提示!

系列文章规划

现在的工作,我很难每天都有时间去写博客.尽量这个系列在周内更新完;如果delay了,还请见谅!当然,插件本身的逻辑代码已经写就,大家可以直接去看github上阅读:apicloud_autocomplete 插件源码

  • (一) 抓取需要的模块信息. -- 会分享一个基于公开文档的完整的模块信息数据压缩包呦!

  • (二) apicloud_autocomplete 架构设计与实现. -- 会着重讲述"模糊匹配"与"静态推导"的正则技巧.

  • (三) 清洗数据,导入插件. --你在看的时候,更多有价值的信息在数据清洗部分;但是我想说的是,当你把完整的真实数据导入既定功能代码中,当插件终于有了完整数据,被赋予完整生命,竟然还能运行的时候,那种兴奋,真的是很难言表!大家有兴趣,有时间,一定要自己搞下这个!

关于 GPL-3.0

我努力寻找商业竞争和技术共享之间的结合点,目前为止我发现基于 GPL-3.0 可以很好地平衡这两点.

  • 他人修改代码后,不可以闭源;
  • 新增代码,不需要采用同样许可证;
  • 不需要对源码的修改之处,提供说明文档;

参考资源

记一个同时支持模糊匹配和静态推导的Atom语法补全插件的开发过程: 序的更多相关文章

  1. SublimeCodeIntel 所有代码提示和补全插件 All Autocomplete 插件搜索所有打开的文件来寻找匹配的提示词

    SublimeCodeIntelSublimeCodeIntel 作为一个代码提示和补全插件,支持 JavaScript.Mason.XBL.XUL.RHTML.SCSS.Python.HTML.Ru ...

  2. Sublime text代码补全插件(支持Javascript、JQuery、Bootstrap框架)

    Sublime text代码补全插件(支持Javascript.JQuery.Bootstrap框架)   插件名称:javascript-API-Completions 支持Javascript.J ...

  3. ExtJs combobox支持模糊匹配

    其实很简单,我们只需要在创建下拉框时,给下拉框添加一个监听事件,代码如下:   //以下监听事件用于对下拉项进行模糊匹配                     ,listeners:{       ...

  4. Atom编辑器折腾记_(13)JS代码智能提示补全(插件:atom-ternjs)

    题外话 官方正式版尽管内置了.autocomplete-plus;最为明显的一个功能就是记忆你已经输入过的名称进行匹配; 可是针对于某些语言来说,还是有些不足的-.当中JS的补全上就明显不足了-所以须 ...

  5. Atom编辑器折腾记_(15)JS代码片段补全(插件:javascript-snippets)

    题外话 这款插件就比較重量级了-.用熟悉了写原生JS的效率要提升非常多--并且,不仅支持JS还包括了nodejs snippet javascript-snippets 插件作者: zenorocha ...

  6. 哇!今天找到一个非常好用的自动补全插件-necomplete.vim

    看别人说的什么xpcomplete,snipte,拿来都不会用,这个necomplete.vim还挺好用的,不用去按C-X,C-O进行补全,把关键字自动的列出来,调用的是用户自定义补全,^u^n^p的 ...

  7. mySql一个字段的值模糊匹配多表多列的查询

    1.dao层/** * 分页查询点卡集合信息 * @param tid 游戏类型编号 * @param gid 游戏编号 * @param searchInfo 包括(点卡名称,游戏名称,点卡面值,游 ...

  8. 记一个社交APP的开发过程——基础架构选型(转自一位大哥)

    记一个社交APP的开发过程——基础架构选型 目录[-] 基本产品形态 技术选型 最近两周在忙于开发一个社交App,因为之前做过一点儿社交方面的东西,就被拉去做API后端了,一个人头一次完整的去搭这么一 ...

  9. 转:使用Mongo Connector和Elasticsearch实现模糊匹配

    原文来自于:http://www.csdn.net/article/2014-09-01/2821485-how-to-perform-fuzzy-matching-with-mongo-connec ...

随机推荐

  1. MongoDB for C#基础入门

    笔者这里采用的是mongoDB官网推荐使用.net驱动: http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_ ...

  2. centos 6.5 中部署开源的Lepus(天兔)监控

    这俩天一直在搞mysql数据库和centos.昨天成功的部署完mysql的主从库配置后,自己想了想是否需要个数据库监控,和执行情况的监控软件,于是就去百度上搜了一下,结果就搜到了今天的‘主角’ Lep ...

  3. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

  4. 【译】用jQuery 处理XML-- jQuery与XML

    用jQuery 处理XML--写在前面的话 用jQuery 处理XML-- DOM(文本对象模型)简介 用jQuery 处理XML--浏览器中的XML与JavaScript 用jQuery 处理XML ...

  5. Spring-Context之四:Spring容器及bean的定义

    Spring框架的核心功能之一就是控制反转(Inversion of Control, IoC),也叫做依赖注入(dependency injection, DI).关于依赖注入的具体内容可以参见Ma ...

  6. hibernate HQL和Criteria

    package com.test; import java.util.Date; import java.util.List; import org.hibernate.Query; import o ...

  7. Bootstrap~表单Form

    回到目录 在进行自己的后台改版时,大体布局都使用了bootstrap,剩下的表单部分没理由不去使用它,对于表单的美化和布局,bootstrap做的也是很不错的,有大气的边框,多功能的按钮及宏观的表单布 ...

  8. 爱上MVC~为CheckBoxFor和RadioButtonFor加个扩展方法吧(希望MVC5把这方法收纳——呵呵)

    回到目录 说在前 我都是喜欢把问题复杂化,还有总是喜欢把问题简单化,偷懒化,这也需就是一个程序员的追求吧,呵呵. 我不太喜欢重复的东西,当你看到页面上有一个以上相同的代码时,那可以说,你的代码有重构的 ...

  9. EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服务器的心跳检测

    回到目录 上一讲中基本实现了对数据库的读写分离,而在选择只读数据库上只是随机选择,并没有去检测数据库服务器是否有效,如服务器挂了,SQL服务停了,端口被封了等等,而本讲主要对以上功能进行一个实现,并对 ...

  10. Java线程:线程的交互

      一.线程交互的基础知识   SCJP所要求的线程交互知识点需要从java.lang.Object的类的三个方法来学习:    void notify()           唤醒在此对象监视器上等 ...