Вставка команды даты в фрагмент возвышенного текста 3
Я пытаюсь создать фрагмент для запуска документа LaTex, в котором заполняются пакеты и все, но я также хочу, чтобы он автоматически указывал дату. У меня есть пакет insertdate, но я не понял, как его использовать. У меня есть код сниппета:
<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>
1 ответ
Прямое расширение фрагмента традиционным способом невозможно (т.е. 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
) со следующим содержимым, которое сделает команду доступной в палитре команд:
[
{
"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
а затем разверните макрос, чтобы вставить фрагмент и дату.
Обратите внимание, что в этом случае tabTrigger
и scope
в sublime-snippet
файл игнорируется, поэтому привязка ключей должна явно их устанавливать.
Этот плагин может быть улучшен при желании; например, вместо запуска run_macro_file
команда, он может просто выполнить каждую из команд из макроса напрямую, сохраняя шаг.
Если у вас было много таких расширений, которые вы хотели сделать со свиданием, вероятно, лучше использовать еще более настраиваемый плагин; используя on_query_completions
обработчик, например, позволил бы запуску происходить без привязки клавиш.
Однако это более сложная тема.