Возвышенный текст 3: Как обернуть выделенный текст в пользовательскую строку / тег / функцию (пример вспомогательного языка laravel) - PullRequest
1 голос
/ 19 июня 2019

Взгляните на этот код:

<p>This is nice text!</p>

Что я хочу достичь, это выбрать This is nice text! и сделать так:

<p>{{ __('This is nice text!') }}</p>

Это базовый примерпомощника по языку ларавеллы.У этого есть больше реализаций tho.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Вообще говоря, самый простой способ обернуть выделенный текст другим текстом - это использовать фрагмент для выполнения задания. Фрагменты кода позволяют вставлять произвольный текст в буфер несколькими различными способами, а также позволяют включать любой выбранный текст в тот момент, когда происходит расширение.

Чтобы увидеть это в действии, вы можете выбрать 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 находится в фрагмент), чтобы вы могли ввести текст:

Sample snippet expansion

Список фрагментов, применимых к текущей ситуации, также автоматически добавляется в палитру команд в виде команд с префиксом Snippet:; Вы можете использовать Tools > Snippets из главного меню или просто открыть командную палитру и выполнить поиск команд, чтобы увидеть фрагменты, применимые к текущей ситуации. Здесь мы можем увидеть наш localize фрагмент; описание взято из тега во фрагменте, и Sublime также напоминает нам о том, как вызвать фрагмент.

Snippet in command palette

Так что теперь возвращаясь к исходному вопросу об упаковке текста, обратите внимание, что тело фрагмента содержит следующее:

{{ __('${0:${SELECTION}}') }}

${0} указывает, куда должен двигаться курсор, когда фрагмент завершен, расширяя поля (из которых нет ни одного), а часть :${SELECTION} говорит, что значением по умолчанию для этого поля должен быть выделенный текст.

Когда вы используете localize Tab метод расширения фрагмента, как указано выше, выделенный текст отсутствует, поэтому курсор просто оказывается в середине строки. Однако, если вы активируете фрагмент из палитры команд, сначала можно выбрать текст. В этом случае выделенный текст заменяется фрагментом, но так как фрагмент захватывает выделение, в результате получается текст, заключающий выделенный фрагмент:

Expansion via command palette

Для таких вещей, которые вы часто делаете, вы также можете использовать команду 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" },    
    ]
},
0 голосов
/ 19 июня 2019

Вы можете использовать пакет "Laravel Blade Highlighter" для возвышенного, он дает вам автоматическое завершение синтаксиса лезвия laravel.С вашим конкретным запросом вы можете просто выделить текст и дважды нажать «{», и он автоматически обернет выделенный текст между {{text}}.Это по умолчанию с возвышенным текстом 3.

Для всех функций, связанных с лезвиями, проверьте пакет Laravel Blade Highlighter здесь: https://packagecontrol.io/packages/Laravel%20Blade%20Highlighter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...