在 Sublime Text 中启动构建系统时的默认消息

Default message when Build System starts in Sublime Text

提问人:IGRACH 提问时间:2/7/2023 更新时间:2/12/2023 访问量:49

问:

当您运行Sublime Build并完成时,会显示一条消息[Finished ](如图所示)。我想在每个构建开始时添加默认消息,就像“[Started]”一样:

enter image description here

此外,最好在构建系统启动时添加本地时间,例如 [开始 22:20:23]

sublimetext3 sublimetext2 sublimetext sublime-text-plugin

评论

0赞 MattDMo 2/11/2023
您使用的是什么操作系统?
0赞 IGRACH 2/11/2023
Windows 10 64 位,我正在使用 Sublime 的便携式版本。

答:

1赞 MattDMo 2/12/2023 #1

(至少)有三种方法可以做到这一点。第一种方法是将功能添加到代码的开头,以便打印出所需的信息。此方法的缺点是,仅当代码开始运行时打印消息,而不是在生成开始时打印。根据您使用的语言,无论是编译还是解释,以及代码库的大小,这可能是一个很大的滞后。


第二种方法是通过 shell 文件运行构建,该文件使用 .在 Windows 上,这需要您已安装 - Git BashCygwin 是获取它的两种常见方式。以下脚本接受任意数量的参数,这些参数在打印“Started”和日期后运行。bashbash

#!/bin/bash

echo "[Started at `date`]"
# check to see if we have at least 1 arg
if [ $1 ]
    then
        # replace this process w/ arg(s) so `exec.py` (the Sublime
        # build system) gets the proper return value
        exec "${@}"
fi

将此文件另存为 .build.shPATH

现在,查看您正在使用的构建系统的文件,特别是 or 行。如果它是 ,您需要做的就是将其复制并粘贴(带双引号)到下面的构建系统中。如果是 ,则将后面的数组/列表转换为单个字符串。因此,例如,如果您在 Windows 上使用默认的 Python 构建系统,则会变成 .从本质上讲,您正在将数组转换为在命令提示符下键入的内容,从而保持以 (like ) 开头的 Sublime 内部变量不变。.sublime-build"shell_cmd""cmd""shell_cmd""cmd""cmd":"cmd": ["py", "-u", "$file"]py -u $file$$file

接下来,选择“工具”→“生成系统”→“新建生成系统...”。擦除其内容并粘贴到以下模板中:

{
    "shell_cmd": "bash -c \"build.sh new_cmd_goes_here\"",
    "working_dir": "$file_path",
    // "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    // "selector": "source.python",
    // "env": {"PYTHONIOENCODING": "utf-8"}
}

替换为您刚刚在上述步骤中创建的命令字符串。因此,对于我们的 Python 示例,该行将变为:new_cmd_goes_here

"shell_cmd": "bash -c \"build.sh py -u $file_name\"",

如果需要,可以取消注释生成系统模板中注释掉的行。

当您完成构建系统的编辑后,只需点击保存,例如将其命名为 。您无需更改保存文件的目录,因为 Sublime 会自动将其放入您的目录中。CtrlSPython (start message).sublime-buildPackages/User


第三种选择是修改以满足您的需求。这需要了解 Python 和 Sublime 的内部结构。您可以在此处找到有关构建系统如何工作以及如何扩展它们的基础知识。Packages/Default/exec.py

简而言之,如有必要,您可以另存为 ,将 read_only 标志设置为。接下来,将类的名称更改为 。然后,紧接着定义为 ,添加一行调用 (ST3) 或 (ST4) 将所需的字符串写入输出。在 ST4 中,我使用了:Packages/Default/exec.pyPackages/User/exec_with_dt.pyFalseExecCommandExecWithDtCommandself.procAsyncProcessself.append_string()self.write()

from datetime import datetime as dt
self.write("[Started " + dt.now().strftime("%Y-%m-%d %H:%M:%S") + "]\n")

我还没有在 ST3 中对此进行测试,但以下内容应该在那里起作用:

from datetime import datetime as dt
self.append_string(None, "[Started " + dt.now().strftime("%Y-%m-%d %H:%M:%S") + "]\n")

保存文件,然后使用以下内容创建新的生成系统:

{
    "target": "exec_with_dt",
    "cmd": ["py", "-u", "$file"],
}

我不推荐这种方法,除非你真的知道自己在做什么,并且 shell 脚本方法不足以满足你的需求。可能需要进行其他编辑以确保与原始功能完全并行,因此请仔细阅读。例如,您可能希望修改和更改其代码以运行命令,只是为了将所有内容保留在内部。exec_with_dt.pyexec.pyExecEventListenerExecWithDtEventListenerexec_with_dt