使用 Sublime Text 3 API,如何自定义选项卡的设计?

Using the Sublime Text 3 API, how would one customize a tab's design?

我正在创建一个 sublime 插件,它可以为 windows 和 TerminalView 为 MacOS / Linux.

做类似的事情

在开始之前,我不是来这里征求有关此类插件的任何建议的。出于多种原因,我决定自己创建一个,并且(至少目前)对其他人所做的事情不感兴趣。

该插件打开一个选项卡,读取作为输入输入的任何文本,将其通过管道传输到 stdin,然后读取 stdout 并将文本插入到选项卡中。还有很多工作要做,但要为第一个 "iteration" 添加一个完成 - 如果你愿意,我试图让选项卡看起来不像 sublime text 选项卡,更像 windows ' 终端 - CMD.

不用说我惨败了,我来这里是为了你的帮助。

所以,在基本层面上,有谁知道我如何通过 sublime API(通过插件代码)执行以下操作:

TerminalView 在这方面做得很好。这是该页面的屏幕截图,解释了我最终想要实现的目标:

我还想说,我已经通过上面的 API 链接进行了相当彻底的查看,并且还搜索了整个 google,但是我没有遇到任何有用的东西。

有谁知道我可以使用的功能或者我可以设置的 属性 来更改选项卡的文本颜色和背景颜色?

非常感谢所有输入(除了其他插件建议):)

需要记住的一点是,如果您不是在真空中进行,那么在 Sublime 中开发插件会更容易。也就是说,即使你对使用别人的解决方案不感兴趣(例如,我经常开发自己的插件而不是使用现有的插件),看看别人是如何完成与你类似的事情的re try to do 是一个非常宝贵的学习工具。

因此,我建议不仅要查看 TerminalView package that you mentioned, but also Terminus(它相似但适用于所有平台)。即使您不打算使用它们,也可以检查它们的代码以了解它们的工作原理。

也就是说,一般来说,文本呈现的颜色由 color scheme 控制,它与应用于该特定文件的语法定义结合使用。语法使用规则将一个或多个 scopes 应用于文件中的每个字符,配色方案使用匹配这些 scopes 的规则来知道将它们呈现为什么颜色。

例如,Python.sublime-syntax 文件包含一个规则,该规则将单词 def 识别为定义函数并将 storage.type.function.python 的范围应用于它。 Monokai.sublime-color-scheme 文件包含一条规则,规定匹配 storage.type.function 的内容应显示为斜体蓝色文本。因此,如果您使用该配色方案并编辑 Python 文件,单词 def 将显示为蓝色和斜体。

这样的功能对于终端插件来说并不完全有用,因为规则必须能够明确匹配已知文本,但终端理论上可以显示任何你想要的内容。所以这不是要走的路,或者至少不完全是要走的路;您在原始问题中提到的 TerminalView 包允许您根据需要应用语法,但总体上仍使用以下方法。

以编程方式,您可以使用 view.add_regions() API 端点执行与此类似的操作,我们稍后会看到一些注意事项。

您可能已经看到了这个 API 功能的效果,即使您不知道。它可以在与每一行相关联的装订线中应用图标,以及将轮廓、下划线等形式的图形标记应用到缓冲区中的文本。

例如,linter 可能会在装订线中包含一个黄色圆圈图标,以向您显示有问题的行,并在文本周围使用彩色轮廓来向您显示问题所在。

它的用途之一是将彩色区域应用于文本。事实上,这就是 TerminalView 和 Terminus 为在其终端中实现此特定功能所做的工作。但是,它可以应用的区域颜色仍然由使用的配色方案控制。因此,除非您希望仅限于当前配色方案中存在的颜色,否则您需要提供一个自定义配色方案以供您的插件使用。

例如,在您的 User 包中创建一个名为 Test.sublime-color-scheme 的文件,其中包含以下内容:

{
    "globals":
    {
        "foreground": "white",
        "background": "#000001",
        "caret": "white",
    },
    "rules":
    [
        {
            "name": "Green on Black",
            "scope": "terminal.green.black",
            "foreground": "green",
            "background": "black"
        },
        {
            "name": "Black on Green",
            "scope": "terminal.black.green",
            "foreground": "black",
            "background": "green"
        }
    ]
}

这是一个非常简约的配色方案,将整体文本颜色设置为白色,将背景颜色设置为几乎但不完全是黑色(原因我们稍后会介绍)。它还包括两个规则,一个知道如何在黑色背景上将文本着色为绿色,一个知道如何在绿色背景上将文本着色为黑色。

有了这个,创建一个新的空视图并使用 lorem 代码片段填充一些示例文本,然后使用 Sublime 控制台 运行 命令 view.settings().set("color_scheme", "Test.sublime-color-scheme") ,您应该会看到文件的背景变为黑色(连同选项卡),而文本仍为白色。

现在,回到控制台,执行以下命令:

view.add_regions("green_black", [sublime.Region(163, 175)], "terminal.green.black")
view.add_regions("black_green", [sublime.Region(184, 191)], "terminal.black.green")

结果是一个如下所示的文件:

这里发生的事情是第一个区域中的文本被范围 terminal.green.black 着色,这使得 exercitation 文本显示为黑色背景上的绿色文本。第二个范围类似地使 laboris 文本在绿色背景上变黑。

需要指出的是,整体背景颜色几乎(但不完全)是黑色。这样做的原因是,如果您应用与整体背景色具有相同背景色的区域,它将反转前景色和背景色以应用对比度。

结果是这两个示例都显示为绿色背景上的黑色文本。通过让整体背景颜色略有不同(但仍然与黑色几乎无法区分),您提供的颜色将被直接应用。

一个更完整的示例将要求您让示例配色方案具有您感兴趣的前景色和背景色的所有可能组合,以便您有更多的工作范围。

同样,您的代码需要在文本颜色不是默认颜色的任何地方应用区域。 add_regions() 的第一个参数是一个唯一键,用于引用列表中它正在着色的区域。因此,至少为每种可能的颜色使用不同的区域名称也很重要;如果您重复使用相同的密钥,区域列表将会改变。

关于问题的第二部分,如上所示,物理选项卡的颜色以及代表文件的区域由 background 属性 中的配色方案控制在该特定视图中使用。所以在这个例子中,无论你通常使用什么配色方案,"terminal tab" 的背景颜色将始终是黑色。

从您陈述问题的方式(以及您在评论中的澄清)中不清楚您指的是物理选项卡(在上面的屏幕截图中名为 Terminal (bash))还是选项卡的内容(即 shell输出)。

据我所知,不可能使物理选项卡的颜色与选项卡内容的颜色不同;他们总是保持联系在一起。-