以传统方式(即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>
and<scope>
行以-->
无效的注释序列终止。
这里特别有趣的是,片段字段已重新排序,因此该date
字段是第一个字段,而title
是第二个字段,原因我们稍后会看到。
知道你的User
包裹在哪里也很重要;如果您不确定,您可以通过Preferences > Browse Packages...
从菜单中选择来找到该位置。在 MacOS 上,菜单位置Sublime Text > Preferences > Browse Packages...
改为。
方法一:通过 tab 触发器扩展代码片段(无需额外插件)
可以使用选项卡触发器(这里是单词 )调用代码段document
,但如上所述,没有直接的方法可以让InsertDate
包为您插入日期。
但是,您可以做的是使用默认键绑定之一来触发手动日期插入。一个例子是按F5,它显示一个日期选项面板,然后插入一个。从那里您可以按Tab以继续在片段中。
请参阅包的文档以了解您可以在此处使用的所有各种键,或者了解如何制作自己的自定义绑定以直接以您选择的格式插入。
这不是您想要直接做的事情,但它也是需要最少工作量来设置的方法。
方法2:通过宏扩展代码段
通过使用 Sublime 宏,您可以执行单个操作(按键、命令面板输入等)并自动执行这两个操作;展开代码段并插入日期。
为此,您需要将以下内容保存到包中的 asublime-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
),这将使命令在命令面板中可用:
[
{
"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
,其中光标位置之前的文本是document
其后没有文本的单词,并且当文档中只有一个光标时一个空的选择。
现在,当您输入document
后面的单词Tab并且满足这些条件时,自定义命令将运行,删除触发词document
,然后展开宏以插入片段和日期。
请注意,在这种情况下,文件中的 thetabTrigger
和 thescope
将sublime-snippet
被忽略,这就是键绑定需要显式设置它们的原因。
如果需要,可以增强此插件;例如run_macro_file
,它可以直接执行宏中的每个命令,而不是运行命令,从而节省一个步骤。
如果您想对日期进行许多此类扩展,则最好使用自定义程度更高的插件;例如,使用on_query_completions
处理程序将允许触发发生而无需键绑定。
然而,这是一个更高级的话题。