将日期命令插入片段sublime文本3

时间:2018-04-12 09:11:34

标签: latex sublimetext3 sublimetext-snippet

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

field_order

1 个答案:

答案 0 :(得分:2)

不能直接以传统方式扩展代码段(例如document Tab )并且动态地在代码段中包含一个或多个字段更新;为此你需要额外的胶水插件代码。

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

以下所有示例都假定名为Packages/User/NewLatexDocument.sublime-snippet的文件中的以下代码段内容;在以下示例中,使用代码段的相应路径和文件名替换该路径。

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

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

\begin{document}
\maketitle

$0

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

这是您在问题中提供的版本,但请注意,您的问题中的版本已被删除,因为<tabTrigger><scope>行以-->评论终止序列,无效。

这里特别感兴趣的是,代码段字段已经重新排序,因此date字段是第一个字段而title是第二个字段,原因我们会看到片刻。

了解User包裹的位置也很重要;如果您不确定,可以从菜单中选择Preferences > Browse Packages...来查找位置。在MacOS上,菜单位置为Sublime Text > Preferences > Browse Packages...

方法1:通过制表符触发器扩展片段(无额外插件)

可以使用标签触发器(此处为单词document)来调用代码段,但如上所述,没有直接的方法可以将InsertDate包装到为你插入日期。

>可以使用其中一个默认键绑定来触发手动日期插入。一个例子是按 F5 ,它显示一个日期选项面板,然后插入一个。从那里,您可以按 Tab 继续阅读代码段。

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

这不是您想要做的事情,但它也是需要设置最少工作量的方法。

方法2:通过宏

扩展代码段

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

为此,您可以将以下内容保存到sublime-macro包中的User。只要你记住你使用过的东西,这个名字并不重要,因为你马上需要它。在下面的示例中,文件名为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字段为先的原因)并跳到下一个字段,在该字段中你可以开始手动填写其余的片段。

您可以从菜单中选择Tools > Macros > User > NewLatexDocument来查看此操作;最终项目将是您的sublime-macro文件的名称。

现在您可以为您创建一个触发macro的键绑定,这样您就不必从菜单中选择它。如上所述,请记住确保sublime-macro的文件名是您创建的文件。

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

或者,您可以使用以下内容在sublime-commands包中创建User文件(例如,MyCustomCommands.sublime-commands),这将使命令调色板中的命令可用:< / p>

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

方法3:通过制表符触发器(带附加插件)扩展片段

这个例子最接近你想要做的但是它需要更多的工作。另请注意,它要求您输入完整的扩展文本(例如document),并且如果碰巧是最佳完成,则不会触发部分匹配。

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

接下来,从菜单中选择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的命令(根据类的名称命名,而不是您保存插件的文件的名称),当您调用它时,将删除该行的最后一个单词光标所在的位置,然后从上面的方法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类型的文件,其中光标位置之前的文本是单词{{ 1}}后面没有文字,当文档中只有一个光标,选择为空时。

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

请注意,在这种情况下,document文件中的tabTriggerscope将被忽略,这就是密钥绑定需要明确设置它们的原因。

如果需要,可以增强此插件;例如,它不是运行sublime-snippet命令,而是直接从宏执行每个命令,省去了一步。

如果您想要使用日期进行许多此类扩展,那么使用更加自定义的插件可能会更好;例如,使用run_macro_file处理程序将允许在不需要键绑定的情况下进行触发。

然而,这是一个更高级的主题。