Re:从零开始教你使用 Sublime Text( 四 )

windows 下的命令行为 cmd,所以第一行为 "cmd": ,后面的命令可以是一个字符串,也可以是字符数组 。其中 ${file} 为当前文件的地址,${file_path} 为目录,${file_base_name} 为文件去掉后缀的名称 。举例来说,如果我的编译对象是 C:\Users\[数据删除]\Desktop\a.cpp,那么 ${file} 对应的就是 'C:\Users\[数据删除]\Desktop\a.cpp',${file_path} 就是 C:\Users\[数据删除]\Desktop,${file_base_name} 就是 a 。所以例子第一行的意义就是用 g++编译当前文件并在 cmd 中运行可执行文件,并在运行结束后执行 echo.$pause 命令 。其效果相当于 DevC++ 中的编译运行 。需要注意这里不能写成 "cmd /c g++ -Wall -std=c++14 -O2 ${file} -o ${file_path}/${file_base_name} && start cmd /c ${file_path}/${file_base_name} & echo.&pause",因为会出现两个 & 之间的优先级错误 。
例子的第二行用于显示编译错误,效果如下:

Re:从零开始教你使用 Sublime Text

文章插图
主要效果是显示中间的红框,如果去掉这句话则只会在控制台中显示错误信息 。
关于为什么正则表达式是 ^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$?其实是用来匹配错误信息的 。
前面两个 .. 匹配了 C:,然后 [^:]* 往后一直匹配到第一个冒号前,所以在上图中 (..[^:]*) 匹配了 D:\0-mine\az.cpp 。然后 :([0-9]+):?([0-9]+)?:? 匹配了行号和列号,即图中的 :12:28:,之后一个空格一直匹配到末尾,即为具体的错误信息 error: expected ';' before 'printf' 。
第三行 working_dir 表示要执行命令的位置,"working_dir": "${file_path}" 相当于在当前文件目录中执行该命令 。
第四行 selector 表示这个编译系统的适用范围,格式为 source.后缀,如我要给 C++ 程序使用则为 source.c++ 。当没有填写时则默认范围为所有文件 。
最后一行是编码,用于显示和匹配错误信息 。一般为 utf-8 或者 cp936 。如果你发现编译错误时没有红框,可能是你编码填错了 。
这个编译运行 C++ 程序的方法是不需要装插件的,所以考场上你也可以使用 。而且可以进一步精简 。
可以发现 ${file} 对应的是绝对地址,所以 working_dir 在这里其实是没有必要的,可以省略 。selector 也可以省略,所以简化之后只剩下三行代码:
{    "cmd": ["cmd","/c","g++","-Wall","-std=c++14","-O2","${file}","-o","${file_path}/${file_base_name}","&&","start","cmd","/c","${file_path}/${file_base_name} & echo.&pause"],    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",    "encoding": "cp936"}第一行为普通的命令,第二行和第三行在理解后也不难背,所以完全可以在考场上使用 。
附:Ubuntu 下可用的编译运行 C++ 的编译系统:
{    "shell_cmd": "g++ -Wall -O2 '${file}' -o '${file_path}/${file_base_name}' && gnome-terminal -- bash -c \"time '${file_path}/${file_base_name}'; read -p 'Press any key to continue...'; exit; exec bash\"",    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",    "working_dir": "${file_path}",    "selector": "source.c, source.c++",    "encoding":"cp936",}

经验总结扩展阅读