【进阶】在 Sublime Text 编写 Build System

· · 科技·工程

建议先阅读:上期回顾:【重制】如何在 NOI 系列比赛中使用 Sublime Text

这是我们去年的 Build System:

{
    "shell_cmd": "g++ \"${file}\" -O2 -std=c++14 -o \"${file_path}/${file_base_name}\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c++",

    "variants":
    [
        {
            "name": "Run",
            "shell_cmd": "ulimit -s 114514 && g++ \"${file}\" -O2 -std=c++14 -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
        }
        ,
        {
            "name": "Debug",
            "shell_cmd": "g++ \"${file}\" -g -O2 -std=c++14 -o \"${file_path}/${file_base_name}\""
        }
    ]
}

是时候升级了!

首先我们的目标:

  1. 可以选择在命令窗口里运行
  2. 快速 gdb 调试

为了不让所有东西都挤在 g++.sublime-build 文件里,我们这里选择写几个脚本。

窗口运行

关键就是调用 gnome-terminal

记得开栈,然后最后把当前进程替换成一个 bash,防止窗口消失:

#!/bin/bash

g++ "$1" -o "$2" -std=c++14 -O2

if [ $? -eq 0 ]; then
    gnome-terminal -- bash -c " ulimit -s 114514; ./'$2'; exec bash "
else
    echo "CE"
fi

然后也可以加个 /bin/time 来看时间和动态空间:

#!/bin/bash

g++ $1 -o $2 -std=c++14 -O2

if [ $? -eq 0 ]; then
    gnome-terminal -- bash -c " ulimit -s 114514; /bin/time -f 'Time: %U s\nMemory: %M KB' ./$2; exec bash "
else
    echo "CE"
fi

快速 gdb 调试

编写 debug.sh

编译后调用 gdb 并开启图形化,

记得不要开 O2,不然 RE 信息可能会丢失:

#!/bin/bash

g++ "$1" -o "$2" -std=c++14 -g

if [ $? -eq 0 ]; then
    gnome-terminal -- bash -c " gdb '$2' -ex 'tu e' "
else
    echo "CE"
fi

最后全部贴进 Build System 就行了。

脚本路径可以是绝对路径,每道题公用,

或者每道题有个对于的脚本文件也可以:

{
    "shell_cmd": "g++ \"${file}\" -O2 -std=c++14 -o \"${file_path}/${file_base_name}\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c++",

    "variants":
    [
        {
            "name": "Run",
            "shell_cmd": "ulimit -s 114514 && g++ \"${file}\" -O2 -std=c++14 -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
        }
        ,
        {
            "name": "Shell",
            "shell_cmd": "bash \"${file_path}/run.sh\" \"${file}\" \"${file_base_name}\""
        }
        ,
        {
            "name": "Time",
            "shell_cmd": "bash \"${file_path}/time.sh\" \"${file}\" \"${file_base_name}\""
        }
        ,
        {
            "name": "Debug",
            "shell_cmd": "bash \"${file_path}/debug.sh\" \"${file}\" \"${file_base_name}\""
        }
    ]
}