Sublime配置C/C++编译环境与中文乱码的解决

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,分别输入gccg++,若都有提示而不是找不到相关命令则是设置成功。

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默认使用之前选择的配置。

上一篇:代码编辑器sublime


下一篇:Sublime 复制到word 如何保留样式?