Sublime Text提供了构建系统,允许用户运行外部程序,这使得我们可以在Sublime Text中对源代码进行编译和运行。本文对个人配置C/C++的过程加以记录整理。
特别地,我查阅了很多资料,并没有发现一个令我满意的中文乱码解决方案。乱码问题主要是由于Sublime Text默认的utf-8编码和Windows控制台默认的gbk(cp936)编码产生冲突,使用-fexec-charset与-finput-charset又会产生很多局限性。在此,我采取的办法是将Windows控制台的编码临时改为utf-8(cp65001)(详情见后文)。
注:本文只适用于Windows系统。
MinGW
首先要确保计算机中已经安装好MinGW,并且环境变量中存在以下几项:
变量 | 值 |
---|---|
C_INCLUDEDE_PATH | your\path\to\MinGW\include(MinGW\include的路径) |
LIBRARY_PATH | your\path\to\MinGW\lib(MinGW\lib的路径) |
Path | your\path\to\MinGW\bin(MinGW\bin的路径) |
若不存在这几项,则手动更改添加这几项到环境变量,然后重启。
可以通过命令行来简单判断是否设置成功:Win+R
打开cmd
,分别输入gcc
和g++
,若都有提示而不是找不到相关命令则是设置成功。
Sublime
打开Sublime Text,若是英文,则寻找“Tools->Build System->New Build System…”;若是中文,则寻找“工具(T)->编译系统(U)->新建编译系统…”。
新建的这个文件可以任意起一个名字,如cpp.sublime-build或者c++.sublime-build。我们将使用这个文件来定制构建系统。
在此之前,我们可以参考一下Sublime Text自带的C/C++构建系统文件,该文件存在于Sublime Text的安装路径下的Packages子目录中,在该子目录中,我们找到C++.sublime-package,这可以当成是一个zip压缩包,将其复制到其他位置并重命名为c++.zip,解压该文件,我们将会看到其中有两个文件C Single File.sublime-build和C++ Single File.sublime-build。这两个文件分别是C和C++的构建系统文件。
C Single File.sublime-build:
{
"shell_cmd": "gcc \"${file}\" -o \"${file_path}/${file_base_name}\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c",
"variants":
[
{
"name": "Run",
"shell_cmd": "gcc \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
}
]
}
C++ Single File.sublime-build:
{
"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c++",
"variants":
[
{
"name": "Run",
"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
}
]
}
这两个文件采用JSON格式,最外层花括号里是一个个键值对。部分键的描述如下:
键 | 描述 |
---|---|
shell_cmd | 一个字符串,指定要执行的shell命令。 |
file_regex | 包含要在构建输出上运行以匹配文件信息的正则表达式的字符串。匹配的文件信息用于启用结果导航。 |
working_dir | 一个字符串,指定要在其中执行cmd或shell_cmd的目录 。 |
selector | 当Tools->Build System->Automatic设置为true时使用。Sublime Text使用这个范围选择器来为活动视图找到合适的构建系统。 |
encoding | 构建系统输出的编码,使用Python编解码器名称。默认为“utf-8”。 |
variants | 变体字典的列表。如果构建系统的选择器与活动文件匹配,变体名称将出现在命令面板中,以便于访问。使用变体,可以在同一个.sublime-build文件中指定多个构建系统任务。 |
配置文件中还出现了形如${}
的部分,这个部分被称为变量,变量也可以省去{}
。
变量将在"shell_cmd"或"working_dir"选项中指定的任何字符串中展开。如果需要在这些选项中指定一个字面值$
,则必须用\
转义。因为JSON也使用反斜杠来转义,所以$
需要被写成\\$
。部分变量的描述如下:
变量 | 描述 |
---|---|
$file |
活动视图中文件的完整路径(包括文件夹)。 |
$file_path |
活动视图中包含该文件的文件夹的路径。 |
$file_name |
活动视图中文件的文件名(无文件夹路径)。 |
$file_base_name |
活动视图中文件的文件名(不包括扩展名)。 |
$file_extension |
活动视图中文件的文件名的扩展名。 |
更多内容可参考:http://www.sublimetext.com/docs/build_systems.html,https://sublime-text-unofficial-documentation.readthedocs.io/en/latest/reference/build_systems/configuration.html。
默认的C Single File.sublime-build和C++ Single File.sublime-build提供的shell_cmd命令是编译当前文件,变体Run中提供的shell_cmd命令是执行编译好的文件。若执行的文件有输出,则它将输出在Sublime Text内建的窗口中。然而,这种方法会导致程序无法进行输入,为此,我们往往是创建一个cmd窗口在那里执行程序。
按照C Single File.sublime-build和C++ Single File.sublime-build的框架我们在新建的构建系统文件中稍作修改,即可实现在cmd窗口运行程序,完整内容如下:
C:
{
"shell_cmd": "gcc \"${file}\" -o \"${file_base_name}\" && start cmd /c \"chcp 65001 & cls & \"${file_path}/${file_base_name}\" & pause\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c",
"variants":
[
{
"name": "Build",
"shell_cmd": "gcc \"${file}\" -o \"${file_base_name}\""
},
{
"name": "Run",
"shell_cmd": "start cmd /c \"chcp 65001 & cls & \"${file_path}/${file_base_name}\" & pause\""
},
{
"name": "Multiple files Build & Run",
"shell_cmd": "gcc *.c -o \"${file_base_name}\" && start cmd /c \"chcp 65001 & cls & \"${file_path}/${file_base_name}\" & pause\""
}
]
}
C++:
{
"shell_cmd": "g++ \"${file}\" -o \"${file_base_name}\" && start cmd /c \"chcp 65001 & cls & \"${file_path}/${file_base_name}\" & pause\"",
"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
"working_dir": "${file_path}",
"selector": "source.c++",
"variants":
[
{
"name": "Build",
"shell_cmd": "g++ \"${file}\" -o \"${file_base_name}\""
},
{
"name": "Run",
"shell_cmd": "start cmd /c \"chcp 65001 & cls & \"${file_path}/${file_base_name}\" & pause\""
},
{
"name": "Multiple files Build & Run",
"shell_cmd": "g++ *.cpp -o \"${file_base_name}\" && start cmd /c \"chcp 65001 & cls & \"${file_path}/${file_base_name}\" & pause\""
}
]
}
shell_cmd中,start cmd
即为打开cmd;/c
表示一旦这个cmd被打开,程序不用等待cmd后面的内容执行完毕,就返回到调用start的环境里;chcp 65001
表示将当前打开的cmd窗口编码切换为utf-8(cp65001);cls
表示清屏;pause
表示暂停(即最后会显示按任意键继续);&
连接相邻的两个命令;另外,使用*
通配符可以匹配working_dir下所有C/C++文件,来实现一个简单的项目。
我们将写好的构建系统文件保存(一般来说保存在用户目录的AppData\Roaming\Sublime Text 3\Packages\User下,不建议直接修改C Single File.sublime-build与C++ Single File.sublime-build文件),编辑好C/C++即可按快捷键Ctrl+Shift+B
来选择构建系统(此时应该能看到自己的配置),以后只需按Ctrl+B
默认使用之前选择的配置。