Sublime Text 中的 build 编译系统详解

简介

这篇文章介绍 Sublime Text 中的 Build System,掌握如何配置编译系统可以提高我们开发和测试程序的效率。 下面主要是通过 C++ build 的一个配置案例来理解它是怎么运作的:

首先,我们通过 prv 来打开 C++ Build 的配置文件

可以看到,定义了 C 和 C++ 两个不同的 build 文件,我们打开其中一个

C++ Single File.sublime-build

json 复制代码
{
    "shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",

    "variants":
    [
        {
            "name": "Run",
            "shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
        }
    ]
}

• 这个字段指定了构建 C++ 文件时执行的命令。 • 在这个配置中,命令是:

bash 复制代码
g++ "${file}" -o "${file_path}/${file_base_name}"

• g++:GNU C++ 编译器,用于编译当前文件。

• ${file}:表示当前在 Sublime Text 中打开的 C++ 文件的完整路径。

-o "${file_path}/${file_base_name}":

• -o:指定输出文件。

• ${file_path}:是当前文件所在的文件夹路径。

• ${file_base_name}:是文件名(不包含扩展名)。

• 这个命令将在源文件的同一目录下生成一个与源文件同名的可执行文件(但没有 .cpp 扩展名)。

2. file_regex:

• 这是一个正则表达式,用于帮助 Sublime Text 解析编译器的错误信息,并让你能够快速定位到出错的文件和行号。

• 在这个配置中,正则表达式是:

ini 复制代码
^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$

解析如下:

• ^(..[^:]*)::捕获文件路径(直到第一个冒号 : 为止)。

• ([0-9]+)::捕获行号。

• ([0-9]+)?:可选地捕获列号(如果提供)。

• (.*):捕获编译器的错误信息。

这使得你在点击编译输出中的错误时,能够直接跳转到相应的代码行。

3. working_dir:

• 指定执行 shell 命令时的工作目录。

• ${file_path} 将工作目录设置为当前打开的 C++ 文件所在的目录。

4. selector:

• 此字段定义了构建系统适用于哪些文件类型。

• 在这个配置中,选择器是:

复制代码
source.c, source.c++

source.c 是什么意思?

这是 scope selector(域选择器),前面的 source 就表示域或范围。 Sublime Text 中 scope 是树状结构组织的,source 表示文件类型或者语言类型。

比如:

• source.c: 表示 C 语言的源文件

• source.c++: 表示 C++ 语言的源文件

Sublime Text 还有其他许多不同的 scope selectors,比如:

编程语言(Programming language):

• source.python: Python files (.py).

• source.go: Go files (.go).

标记语言(Markup language):

• text.html: HTML files (.html).

• text.xml: XML files (.xml).

• text.markdown: Markdown files (.md).

配置文件(Configuration Files):

• source.json: JSON files (.json).

• source.yaml: YAML files (.yaml).

纯文本(Plain Text):

• text.plain: Plain text files (.txt).

特殊文件类型(Special Cases):

• text.html.markdown: Markdown files with HTML support.

• text.xml.xsl: XSL (eXtensible Stylesheet Language) files.

上面的 scope 都是文件类型的,其实 Sublime Text 中还有其他类型的 scope,比如:

• keyword.control.c++: 表示 C++ 语言中的控制关键字(比如 if, for 等等).

• string.quoted.double.c++: 表示 C++ 中的双引号字符串

怎么查看当前文本的 scope?

把光标放在编辑区的某段字符上

  • 在 Windows/Linux 中,我们可以按 Ctrl + Alt + Shift + P

  • 在 MacOS 中,我们可以按 CMD + Alt + P

5. variants:

• variants 部分定义了额外的构建配置,你可以手动触发这些配置。

• 在这个配置中,有一个名为 "Run" 的变体。

• name:该变体的名称,可以从构建菜单中选择(或使用快捷键触发)。

• shell_cmd:这个命令首先编译文件,然后如果编译成功,运行生成的可执行文件:

bash 复制代码
g++ "${file}" -o "${file_path}/${file_base_name}" && "${file_path}/${file_base_name}"

• &&:确保只有在编译成功后才运行可执行文件。

全文完!

如果你喜欢我的文章,欢迎关注我的微信公众号 deliverit。

相关推荐
进击的荆棘4 分钟前
Linux系统——库的原理与制作之ELF文件的形成与加载的过程(下)
linux·动静态库
CrazyMo_13 分钟前
鸿蒙高级——内存专用之linux-reserve-memory 方案简介
linux·运维·服务器
灯澜忆梦32 分钟前
【Linux】#5 | 文件与目录基础操作命令
java·linux·运维
SWAGGY..44 分钟前
【C++进阶】:(10)哈希表的原理与实现——从哈希函数到哈希桶
c++·哈希算法·散列表
码匠许师傅1 小时前
【C++三方组件】redis-plus-plus:现代 Redis C++ 客户端
java·c++·redis
wuminyu1 小时前
stackChunkOop内部结构与GC屏障的配合工作原理剖析
java·linux·c语言·jvm·c++
青衫客361 小时前
从网卡到 Socket:再探 Linux 网络协议栈与 iptables 数据包处理流程
linux·网络·网络协议
承渊政道1 小时前
Linux网络学习【TCP Socket编程实战:connect的断线重连与客户端访问Linux验证】
linux·网络·学习·ubuntu·tcp·socket编程
小π军1 小时前
C 和 C++ 是否都支持函数的重载?
java·c语言·c++
sunoo-2291 小时前
嵌入式Linux驱动学习笔记(第3-6天):从misc封装、platform总线到设备树、中断与单总线外设实战
linux·arm开发·驱动开发·笔记·单片机·学习