虽然网上已有不少关于sublime编译系统的教程,但他们都没有解决python无法输入,c/c++文件编译无报错无回显等问题。
自定义Sublime的编译系统,完美解决python编译无法输入,C++编译无法报错等问题(基于VS2017)。并设置了8086的编译。
最开始折腾这些的想法是VS过于臃肿,最初折腾了MinGW的GCC和G++编译C,但编译无报错和是不是提示无法定位接口程序之类的十分蛋疼。之后查阅资料发现可以调用VS的cl编译便动了这个想法。不启动VS只是调用VS的编译器。
2018-12-22
更新C++编译报错信息
汇编语言调试模式
后续:
vscode的折腾
调试相关
本文的所有编译脚本均以上传至github
Sublime的编译系统
sublime的编译系统为*.sublime-build,存于Sublime Text 64\Data\Packages\User文件夹下,可以自定义自己的编译系统,基本实例如下
1 | { |
key | meaning |
---|---|
shell_cmd | 调用编译的DOS命令 |
file_regex | 获取编译错误时的信息 |
working_dir | 工作目录 |
selector | 筛选器与自动编译相关,source标识语言文件的定义中寻找*.tmPreferences |
encoding | 编码格式[^1] |
variants | 同一编译模式下的不同选项,可自定义改变一些参数 |
file_patterns | 编译系统应该支持的文件模式,可以自定义设置,形如:[“*.py”] |
[^1]: 编码格式参考链接:https://docs.python.org/3.3/library/codecs.html#id3 |
一些常用的宏变量[^2]可以用于设置编译文件
[^2]: Sublime官方文档: https://www.sublimetext.com/docs/3/build_systems.html
宏选项 | 意义 |
---|---|
$file_path | 当前文件所在路径, 比如 C:\Files. |
$file | 当前文件的完整路径, 比如 C:\Files\Chapter1.txt. |
$file_name | 当前文件的文件名, 比如 Chapter1.txt. |
$file_extension | 当前文件的扩展名, 比如 txt. |
$file_base_name | 当前文件仅包含文件名的部分, 比如 Document. |
$packages | Packages 文件夹的完整路径. |
$project | 当前项目文件的完整路径. |
$project_path | 当前项目文件的路径. |
$project_name | 当前项目文件的名称. |
$project_extension | 当前项目文件的扩展部分. |
$project_base_name | 当前项目仅包括名的部分. |
自定义编译系统
虽然网上已有不少关于sublime编译系统的教程,但他们都没有解决python无法输入,c/c++文件编译无报错无回显等问题。
python编译
由于python通过"shell_cmd":"python -u $file"
已经可以解决编译运行问题,考虑的是如何新建窗口并进行输入和自动关闭。多次试验"shell_cmd":"cmd /k start"
和"shell_cmd":"cmd /c start"
后反应到sublime最下的显示框也是一个cmd窗口,调用cmd /k start
是多此一举。
直接start cmd /c python -u $file_name
即可
C/C++编译
一段时间的应用之后MinGW终于崩溃了,总算是动了解决它的心思。查阅VS2017官方文档[^3],发现可以调用开发者工具将一个DOS命令窗设置为不同的编译环境^4。因而解决问题的基本思路是打开DOS窗口设置为特定的编译环境,编译并运行*.exe。get✔
[^3]: MS官方文档: https://docs.microsoft.com/en-us/cpp/build/setting-the-path-and-environment-variables-for-command-line-builds?view=vs-2017
在Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build
目录中找到了需要的文件,考虑到32位代码更为通用,选择vcvars32.bat"
进行设置。
编译脚本:
1 | @echo off |
若代码编译报错显示错误信息和行号:
成功编译演示:
基于8086的汇编语言编译
8086的汇编语言使用masm编译,奈何大部分机器不支持16位的远古程序因而得借用DOSBox模拟DOS进行编译和链接。关于DOSBox的设置参见
考虑到它是将一个文件夹目录映射为DOS的盘符,因而以下步骤需要将MASM全家桶和编译脚本放入一个固定的文件夹中。
查阅DOSBox的文档发现里面有一点启动选项的设置,果断使用执行name后退出的-exit选项,但效果不好。
最终在脚本中使用exit退出。
dosbox [name] [-exit] [-c command] [-fullscreen] [-userconf] [-conf congfigfilelocation] [-lang languagefilelocation] [-machine machine type] [-noconsole] [-startmapper] [-noautoexec] [-securemode] [-scaler scaler | -forcescaler scaler] [-version] [-socket socket]
name
If “name” is a directory it will mount that as the C: drive.
If “name” is an executable it will mount the directory of “name”
as the C: drive and execute “name”.-exit
DOSBox will close itself when the DOS application “name” ends.-c command
Runs the specified command before running “name”. Multiple commands
can be specified. Each command should start with “-c” though.
A command can be: an Internal Program, a DOS command or an executable
on a mounted drive.-noconsole (Windows Only)
Start DOSBox without showing DOSBox Status Window (console).
Output will be redirected to stdout.txt and stderr.txt
新增调试模式Ctrl+Shift+B进入调试模式