【问题标题】:Inserting date command into snippet sublime text 3将日期命令插入片段崇高文本3
【发布时间】:2018-04-12 09:11:33
【问题描述】:

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

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

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

\begin{document}
\maketitle

$0

\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>

【问题讨论】:

    标签: latex sublimetext3 sublimetext-snippet


    【解决方案1】:

    不能直接以传统方式扩展一个sn-p(即documentTab)并让sn-p中的一个或多个字段动态更新;为此,您需要额外的胶水插件代码。

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

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

    <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>
    

    这是您在问题中提供的版本,但请注意,您问题中的版本已损坏,因为 &lt;tabTrigger&gt; 和 &lt;scope&gt; 行以 --&gt; 注释序列终止,这是无效的.

    这里特别有趣的是 sn-p 字段已重新排序,因此date 字段是第一个字段,title 是第二个字段,原因我们稍后会看到。

    知道您的User 包在哪里也很重要;如果您不确定,可以通过从菜单中选择Preferences &gt; Browse Packages... 来查找位置。在 MacOS 上,菜单位置改为 Sublime Text &gt; Preferences &gt; Browse Packages...。

    方法一:通过tab触发扩展sn-p(无需额外插件)

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

    但是,您可以做的是使用默认键绑定之一来触发手动日期插入。一个例子是按下 F5,它会显示一个日期选项面板,然后插入一个。从那里你可以按 Tab 在 sn-p 中继续。

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

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

    方法2:通过宏扩展sn-p

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

    为此,您需要将以下内容保存到您的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 参数中的文件名与您的sn-p 的名称匹配。您可能还想将日期格式更改为您喜欢的任何格式。

    当您调用宏时,它会插入 sn-p,然后触发 insert_date 函数插入日期(这就是 date 字段在前的原因)并跳到下一个字段,此时您可以开始手动填写其余的sn-p。

    您可以通过从菜单中选择Tools &gt; Macros &gt; User &gt; NewLatexDocument 来查看此操作;最后一项将是您的sublime-macro 文件的名称。

    现在您可以为您创建一个触发macro 的键绑定,因此您不必从菜单中选择它。如上,记得确保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:通过 tab 触发器扩展 sn-p(带额外插件)

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

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

    接下来,从菜单中选择Tools &gt; Developer &gt; 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 类型的文件,其中光标位置之前的文本是单词 document它后面没有文本,并且文档中只有一个光标且选择为空。

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

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

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

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

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

    【讨论】:

    • 尽管我没有删除 --->,但 sn-p 确实有效,我使用 \today 做了一个解决方法。但我真的很想更多地了解 Sublime,因为我使用它不到一个月,并且将它与 LaTex 和 STATA 一起使用,它已经帮助了我很多。我想我理解你提出的大部分建议,但我需要一些时间来阅读、尝试和理解。非常感谢您的帮助,如果我设法使用您的建议,我会告诉您:)
    • 非常感谢您提供的出色的书面和扩展文档!
    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多