以前一直使用notepad++作为首选编辑器,不过看到最近很流行sublime text这个东西,试用了一下,他的语法高亮和Snippets都很不错,以及牛逼的goto anything...

不过在notepad++里面有个自带的插件NPP Exec,可以自己配置自定义的指令,来实现一些功能,比如我直接配置了gcc的编译命令,那么就可以不离开编辑器直接编译当前正在编写的代码,这个功能对于写个小程序和脚本之类的都很方便。

不过在sublime里面确没找到对应的插件,在它的Tools->build system
下面有一些内置的配置,不过没有我需要的gcc的配置文件,于是从网上找文档,尝试自己写一个

网上找了半天,只找到一个相关的文档 http://docs.sublimetext.info/en/latest/reference/build_systems.html

不过这个也讲得很简略,简单来说,就是需要自己添加一个新的build命令,选择Build->Build System->New Build System... 来添加一个新的build功能。

sublime现阶段所有的配置都是通过文件来实现的,而没有对应界面,所以。。。看文档写配置文件吧。。

按照文档的说法,sublime的build配置是一个JSon格式的文件,使用.sublime-build作为后缀

首先把最终的配置文件贴一下,然后再详细解释

1 {
2     "cmd": ["build_gcc","$file"],
3     "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
4     "selector": "source.c"
5 }

上面第2行是必须要有的一行,表示用于执行的命令,一般第一个表示执行的命令,之后的每个参数使用引号括起来作为单独的一项(注意没有空格),其中的$file表示当前激活的文件的全路径和文件全名

 剩下两行都是可选的,第3行的作用是捕获上面命令的输出,后面是需要捕获的内容,使用Perl格式的正则表达式,如果没有这一句的话,编辑器会执行命令,但是什么都不会输出

第4行 是选择器,意思是当让编辑器自动选择编译方案时候,这个对应于什么类型的文件

 

至于cmd里面的build_gcc,是因为我想在编译成功之后,运行一下这个文件,于是写了一个build_gcc.bat的批处理,放到path路径里面,批处理是这样写的

1 del /F /Q temp4gcc.exe
2 gcc -std=c99 -o temp4gcc.exe %1
3 temp4gcc.exe

 

不过在sublime运行之后,提示错误,看起来这个cmd是不可以使用批处理了,所以又用C简单写了一个程序,内容基本上和批处理相同

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main(int argc, char const *argv[])
 5 {
 6     if (argc != 2){
 7         printf("Usage:build_gcc filename\n");
 8         return 0;        
 9     }
10     char exec[200] = "gcc -std=c99 -o E:\\work\\temp4gcc.exe ";
11     strcat(exec,argv[1]);
12     system("del /F /Q E:\\work\\temp4gcc.exe");
13     system(exec);
14     system("E:\\work\\temp4gcc.exe");
15     return 0;
16 }

不过这个写的还是不严谨,功能也不强,不过管他呢,对我来说,功能够用就好

把这个小程序编译为build_gcc.exe,放到path里面,现在在在sublime选择刚才的新加的命令,然后运行 Tools->Build 或者 Ctrl+B

ok,程序结果出来了,不过貌似有些多余的东西。。。。

sublime在捕获输出的时候,如果发现输出内容编码不爽,会直接报一个错。。。

因为这个构建功能实际上是由一个exec.py来实现的
,所以简单修改一下这个文件来去掉这个讨厌的输出

首先把安装目录下的Data\Packages\Default\exec.py复制到Data\Packages\User下面

然后在文件中搜索 Decode error - output not 这句,然后整行删掉,然后使用python -O -m py_compile exec.py来重新编译一下,

再在sublime编译一下那个C的小程序。ok

不过这个还是有点小缺点的,就是现在还不支持输入内容,也就是说没法交互,不过我只是把它定义在“运行小程序”上,这个也不是什么大问题,如果需要交互调试之类的有更强大的IDE可以选用