将日期命令插入代码片段 sublime text 3

Inserting date command into snippet sublime text 3

我正在尝试创建一个片段来启动 LaTex 文档,其中已填写包和所有内容,但我还希望它自动填写日期。我有 insertdate 包,但我不知道如何使用它。我有代码段:

<snippet>
    <content><![CDATA[
\documentclass{article}
\usepackage{amsmath}

\title{${1:title}}
\author{...}
\date{[Todays date here automatically]}

\begin{document}
\maketitle

[=10=]

\end{document}
]]></content>
    <!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
    <tabTrigger>document</tabTrigger> -->
    <!-- Optional: Set a scope to limit where the snippet will trigger -->
    <scope>text.tex.latex</scope> -->
</snippet>

无法直接以传统方式扩展代码段(即在本例中为 documentTab)并在代码段中包含一个或多个字段动态更新;为此,您需要额外的胶水插件代码。

InsertDate 包提供了多种在文档中插入日期的方法,但没有提供额外的粘合。下面概述了一种方法的示例。

下面的所有示例都假定名为 Packages/User/NewLatexDocument.sublime-snippet 的文件中包含以下代码段内容;在以下示例中,将该路径替换为代码段的适当路径和文件名。

<snippet>
    <content><![CDATA[
\documentclass{article}
\usepackage{amsmath}

\title{${2:title}}
\author{...}
\date{${1:date}}

\begin{document}
\maketitle

[=10=]

\end{document}
]]></content>
    <description>Create new LaTeX Document</description>
    <tabTrigger>document</tabTrigger>
    <scope>text.tex.latex</scope>
</snippet>

这是您在问题中提供的版本,但请注意,您问题中的版本已损坏,因为 <tabTrigger><scope> 行以 [=20= 终止] 注释序列,这是无效的。

这里特别有趣的是,片段字段已经重新排序,因此 date 字段是第一个,title 是第二个,原因我们将看到一会儿。

了解您的 User 包裹在哪里也很重要;如果您不确定,可以通过菜单中的 selecting Preferences > Browse Packages... 找到位置。在 MacOS 上,菜单位置改为 Sublime Text > Preferences > Browse Packages...

方法 1:通过选项卡触发器展开代码段(无需额外插件)

可以使用选项卡触发器(此处为词 document)调用代码段,但如上所述,没有直接的方法让 InsertDate 包为您插入日期。

然而,您可以做的是使用默认键绑定之一来触发手动日期插入。一个例子是按 F5,它会显示一个日期选项面板,然后插入一个。从那里您可以按 Tab 继续该片段。

请参阅包的文档以了解您可以在此处使用的所有各种密钥,或者了解如何制作自己的自定义绑定以直接以您选择的格式插入。

这不是您想要直接执行的操作,但也是需要最少设置工作量的方法。

方法二:通过宏扩展代码段

通过使用 Sublime 宏,您可以执行单个操作(按键、命令面板输入等)并让这两个操作自动发生;展开代码段并插入日期。

为此,您需要将以下内容保存到 User 包中的 sublime-macro 中。只要您记得您使用的是什么,名称并不重要,因为您很快就会需要它。在我下面的示例中,文件名是 Packages/User/NewLatexDocument.sublime-macro.

[
    { "command": "insert_snippet", "args": {"name": "Packages/User/NewLatexDocument.sublime-snippet"} },
    { "command": "insert_date", "args": {"format": "%x"} },
    { "command": "next_field" },
]

确保 insert_snippet 参数中的文件名与您的代码段名称相匹配。您可能还想将日期格式更改为您喜欢的任何格式。

当您调用宏时,它会插入代码片段,然后触发 insert_date 函数插入日期(这就是为什么 date 字段在前面)并跳到下一个字段,此时您可以开始手动填写代码段的其余部分。

您可以通过从菜单中 selecting Tools > Macros > User > NewLatexDocument 来查看实际效果;最后一项将是您的 sublime-macro 文件的名称。

现在您可以创建一个键绑定来为您触发 macro,这样您就不必从菜单中 select 了。如上,记得保证sublime-macro的文件名是你创建的文件

{
    "keys": ["ctrl+alt+shift+d"],
    "command": "run_macro_file",
    "args": {
        "file": "res://Packages/User/NewLatexDocument.sublime-macro"
    }
},

或者,您可以在 User 包中创建一个 sublime-commands 文件(例如,MyCustomCommands.sublime-commands),其中包含以下内容,这将使命令在命令面板中可用:

[
    {
        "caption": "Create new Latex Document",
        "command": "run_macro_file",
        "args": {
            "file": "res://Packages/User/NewLatexDocument.sublime-macro"
        }
    },
]

方法 3:通过选项卡触发器(w/extra 插件)展开代码段

此示例最接近您想要执行的操作,但需要多做一些工作。另外请注意,它要求您输入完整的扩展文本(例如 document),如果恰好是最佳完成,则不会触发部分匹配。

首先,请确保您已从方法 2 创建了宏,因为此方法使用相同的宏但以不同的方式触发它。

接下来,从菜单中选择select Tools > Developer > New Plugin...并将默认插件的文本替换为以下代码,然后将其另存为.py文件;在我的示例中,我将文件命名为 new_latex_document.py:

import sublime
import sublime_plugin


class NewLatexDocumentCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        # Get the last word of the line the cursor is on
        point = self.view.sel()[0].b
        line = self.view.substr(self.view.line(point))
        word = line.split()[-1]

        # Remove the trigger word
        self.view.replace(edit, sublime.Region(point, point - len(word)), "")

        # Run the macro
        self.view.run_command("run_macro_file", {
            "file": "res://Packages/User/NewLatexDocument.sublime-macro"
        })

这将创建一个名为 new_latex_document 的命令(根据 class 的名称命名,而不是您保存插件的文件的名称),当您调用它时,它将擦除光标所在行的最后一个字,然后 运行 来自上面方法 2 的宏。

现在您需要将以下键绑定添加到您的自定义键:

{
    "keys": ["tab"],
    "command": "new_latex_document",
    "context": [
        { "key": "selector", "operator": "equal", "operand": "text.tex.latex"},
        { "key": "preceding_text", "operator": "regex_match", "operand": "^.*document$", "match_all": true },
        { "key": "following_text", "operator": "regex_match", "operand": "^$", "match_all": true },
        { "key": "num_selections", "operator": "equal", "operand": 1},            
        { "key": "selection_empty", "operator": "equal", "operand": "true", "match_all": true },

    ]
},

分解,这表示 Tab 键应该 运行 我们的新命令,但仅在 text.tex.latex 类型的文件中,其中文本优先光标位置是单词 document,后面没有文本,当文档中只有一个光标时,selection.

现在,当您输入单词 document 后跟 Tab 并且满足这些条件时,自定义命令 运行s,删除触发词 document 然后展开宏以插入代码段和日期。

请注意,在这种情况下,sublime-snippet 文件中的 tabTriggerscope 将被忽略,这就是键绑定需要显式设置它们的原因。

如果需要,可以增强此插件;例如,不用 运行 宁 run_macro_file 命令,它可以直接执行宏中的每个命令,节省一个步骤。

如果您想对日期进行许多此类扩展,最好使用更加个性化的插件;例如,使用 on_query_completions 处理程序将允许触发发生而无需键绑定。

不过,这是一个更高级的话题。