Вообще говоря, самый простой способ обернуть выделенный текст другим текстом - это использовать фрагмент для выполнения задания. Фрагменты кода позволяют вставлять произвольный текст в буфер несколькими различными способами, а также позволяют включать любой выбранный текст в тот момент, когда происходит расширение.
Чтобы увидеть это в действии, вы можете выбрать Tools > Developer > New Snippet
в главном меню, которое создаст шаблон для вас. Как только это будет сделано, замените все содержимое файла следующим текстом и сохраните фрагмент. Sublime по умолчанию выберет ваш User
пакет в качестве местоположения, и вы можете выбрать любое имя, которое захотите; просто убедитесь, что расширение sublime-snippet
, чтобы Sublime распознал файл. В этом примере я назвал файл localize.sublime-snippet
.
<snippet>
<content><![CDATA[
{{ __('${0:${SELECTION}}') }}
]]></content>
<tabTrigger>localize</tabTrigger>
<description>Localize text</description>
<scope>text.blade</scope>
</snippet>
Как видно, фрагменты представляют собой файлы XML. Ссылка выше на неофициальную документацию по фрагментам, поэтому вкратце мы просто скажем:
- Содержимое раздела
CDATA
представляет собой фрагмент текста, который будет расширяться
$
имеет особое значение в теле фрагмента, поэтому, если вы хотите вставить литерал $
, вам нужно указать \$
вместо
-
tabTrigger
- это фраза, которую вы можете использовать для расширения фрагмента вручную; это необязательно
-
description
- это текстовое описание того, для чего предназначен фрагмент; это необязательно
-
scope
указывает, где применяется фрагмент; это необязательно
Содержимое фрагмента может содержать пронумерованные поля, такие как $0
, $1
и т. Д., И при расширении фрагмента Sublime установит курсор на $1
, чтобы вы могли вводить текст, а затем при переходе на $2
нажимайте Tab и так далее до тех пор, пока все поля не будут заполнены, и курсор переместится на $0
(«выход» фрагмента).
Также стоит отметить, что scope
здесь предполагает, что вы используете пакет Laravel Blade Highlighter для подсветки синтаксиса. Если это не так, тогда при редактировании блейд-файла используйте Tools > Developer > Show Scope Name
и замените text.blade
на первую строку во всплывающем окне.
Теперь, имея фрагмент, мы можем сделать несколько вещей автоматически. Во-первых, находясь в блейд-файле, вы можете ввести текст триггера вкладки и нажать Tab , и содержимое фрагмента развернется, поместив курсор внутри одинарных кавычек (где $0
находится в фрагмент), чтобы вы могли ввести текст:
Список фрагментов, применимых к текущей ситуации, также автоматически добавляется в палитру команд в виде команд с префиксом Snippet:
; Вы можете использовать Tools > Snippets
из главного меню или просто открыть командную палитру и выполнить поиск команд, чтобы увидеть фрагменты, применимые к текущей ситуации. Здесь мы можем увидеть наш localize
фрагмент; описание взято из тега во фрагменте, и Sublime также напоминает нам о том, как вызвать фрагмент.
Так что теперь возвращаясь к исходному вопросу об упаковке текста, обратите внимание, что тело фрагмента содержит следующее:
{{ __('${0:${SELECTION}}') }}
${0}
указывает, куда должен двигаться курсор, когда фрагмент завершен, расширяя поля (из которых нет ни одного), а часть :${SELECTION}
говорит, что значением по умолчанию для этого поля должен быть выделенный текст.
Когда вы используете localize
Tab метод расширения фрагмента, как указано выше, выделенный текст отсутствует, поэтому курсор просто оказывается в середине строки. Однако, если вы активируете фрагмент из палитры команд, сначала можно выбрать текст. В этом случае выделенный текст заменяется фрагментом, но так как фрагмент захватывает выделение, в результате получается текст, заключающий выделенный фрагмент:
Для таких вещей, которые вы часто делаете, вы также можете использовать команду insert_snippet
, чтобы вызвать расширение фрагмента; в таком случае вы сначала выделите текст, чтобы обернуть его, но без выделения фрагмент будет расширяться с помощью курсора внутри одинарных кавычек, как если бы вы делали это вручную.
Например, вы можете создать привязку ключа, например:
{
"keys": ["ctrl+alt+l"],
"command": "insert_snippet",
"args": {
"name": "Packages/User/localize.sublime-snippet"
},
"context": [
{ "key": "selector", "operator": "equal", "operand": "text.blade" },
]
},
Раздел context
здесь делает привязку активной только в файле блейда и не везде аналогично тому, как работает scope
во фрагменте; это потому, что команда insert_snippet
напрямую вставляет фрагмент без каких-либо проверок.
Аналогичным образом вы также можете добавить это в контекстное меню правой кнопкой мыши, создав файл с именем Context.sublime-menu
в пакете User
(то есть в том же месте, в котором вы сохранили фрагмент выше) со следующим содержимым:
[
{ "caption": "-", "id": "end" },
{
"caption": "Localize Blade Text",
"command": "insert_snippet",
"args": {
"name": "Packages/User/localize.sublime-snippet"
},
},
]
Здесь команда меню будет всегда доступна независимо от того, какой файл вы редактируете, потому что, как упоминалось выше, команда insert_snippet
не ограничивает расширение фрагмента на основе scope
. Вы можете решить это с помощью небольшого простого плагина (здесь не рассматривается, так как этот ответ довольно массивный).
Последнее, что следует упомянуть, это то, что в случаях, когда вы используете команду insert_snippet
напрямую (то есть, когда вы не используете палитру команд или Tab методы расширения), вы можете пропустить некоторые шаги здесь.
Команда insert_snippet
может принимать аргумент contents
вместо аргумента name
; в то время как аргумент name
указывает фрагмент, который должен быть раскрыт, аргумент contents
содержит непосредственно содержимое фрагмента. Это избавит вас от необходимости создавать файл sublime-snippet
.
Для вашего примера здесь эта привязка клавиш будет действовать так же, как и вышеупомянутая, но без необходимости существования файла сниппета:
{
"keys": ["ctrl+alt+l"],
"command": "insert_snippet",
"args": {
"contents": "{{ __('${0:${SELECTION}}') }}"
},
"context": [
{ "key": "selector", "operator": "equal", "operand": "text.blade" },
]
},