Skip to content

Instantly share code, notes, and snippets.

@kneep
Created October 14, 2014 01:38
Show Gist options
  • Save kneep/007ca13f18c267079edd to your computer and use it in GitHub Desktop.
Save kneep/007ca13f18c267079edd to your computer and use it in GitHub Desktop.

Visual Studio支持CMake语法高亮和智能代码补全

摘要

Visual Studio对新编程语言的支持是非常强大的,但很少有人有能力并下决心去利用这个平台。David Golub却是其中之一,他为Visual Studio带来了对CMake的支持。

正文

Visual Studio对新编程语言的支持是非常强大的,但很少有人有能力并下决心去利用这个平台。David Golub却是其中之一,他为Visual Studio带来了对CMake的支持。

Visual Studio的CMake工具功能包括:

  • CMake代码语法高亮
  • 为CMake的命令和变量提供成员选择列表框
  • 输入CMake命令的时候会提示参数
  • CMake代码括号匹配
  • 支持插入CMake代码片段(snippet)
  • 在Visual Studio的编辑器中,当光标位于一个标准的CMake命令或变量之上的时候,按下F1就可以得到基于上下文的帮助内容
  • 通过Visual Studio的Tools菜单就可以访问CMake的图形用户界面和文档

InfoQ:我们有些读者不熟悉CMake,你能告诉我们它是用来干什么的吗?

David Golub:CMake是一个跨平台的makefile生成工具,主要用于C和C++编程。在各种操作系统中,有很多工具可以用于编译C和C++代码,每种工具都有自己的makefile和项目文件格式。举个例子,Windows上的项目可能会使用Visual Studio的项目文件,而Linux项目则会使用GNU makefile。CMake提供了一种语言,开发者可以用它来定义项目的结构以及各种必要的配置步骤,它是跨平台的。CMake工具能处理这些代码,根据程序的目标平台,生成对应的makefile或项目文件。 在我刚刚开始为Visual Studio开发CMake工具的时候,我在Organic Motion工作,这家公司开发了3D动作捕获系统OpenStage以及其他一些产品。虽然OpenStage只能在Windows上运行,但是代码树是用CMake来创建的,这样既容易在将来需要的时候把代码移植到其他平台,也可以充分利用CMake的高级配置功能,这些功能在某些方面要比原生的Visual Studio项目文件更强大。

InfoQ:你为Visual Studio开发CMake插件花了多少工作量?

David:我为Visual Studio开发CMake工具前后大约花了一年时间,从2012年4月开始,到2013年5月发布第一个候选版本。我都是用晚上和周末的时间来完成这个项目的,鉴于我的工作职责所在,只有在这些时间我才有空。

InfoQ:开发过程中有哪些方面比你预想的要简单得多,或困难得多?

David:Visual Studio的SDK强大得不可置信,开发者可以利用它来为这个最佳IDE添加对任何编程语言的完整支持。但是,在有些情况下,SDK的文档还有点不足,要搞明白某些功能怎么用,必须要反复试验几次。举个例子,在实现括号匹配的时候,Visual Studio收到的范围对象(span object)里面并不包含字符在文件中的索引号,却包含了字符间空格的索引号。如果你尝试通过构建一个范围对象,指定相同起始和结束的索引号,来加亮单个字符,那结果就是什么都没加亮。弄明白Visual Studio SDK所有晦涩之处是最难搞的部分。

InfoQ:这个插件的哪部分工作最难实现?

David:为实现智能补全去解析代码,和编译器解析代码是不一样的。编译器的目的是接受句法正确的代码,输出可执行文件。如果被编译的代码有语法错误,编译器会产生对应的错误信息并终止执行。而另一方面,智能补全必须在程序员输入的时候就工作。在它被触发的任何时间点上,编辑器中的代码都不大可能是一个句法上完全正确的程序。并且,智能补全的解析必须要很快才行。开发者希望他们输入的瞬间就可以得到补全提示。为了解决这些挑战性问题,我编写了一组解析函数,这些函数能解析各种智能补全触发点需要的信息,却不需要构建抽象的语法树。

David Golub是MangoDB的工程师,在那里,他是MongoDB管理服务小组的成员,担任Windows专家的角色。在来到MangoDB之前,他在耶鲁大学和哥伦比亚大学学习了计算机科学,之后2012年到2013年之间在Organic Motion工作。他也同时管理着 Greater New York Roads网站。他很喜欢徒步,喜欢走荒郊野路去探索各种有趣的地点。

参考英文原文:Syntax Highlighting and IntelliSense support for CMake

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment