Как вставить буквенный текст из привязки клавиш, не вызывая подстановок - PullRequest
0 голосов
/ 20 апреля 2020

Я новичок в VSCode, и у меня есть постоянная необходимость создавать последовательности обучения на клавиатуре, чего, похоже, нет в VSCode IDE. Следуя советам нескольких сайтов, я получил расширение для marcos и в качестве обходного пути делал пользовательские сочетания клавиш.

Это было довольно сложно, поскольку, по-видимому, единственный основной список команд находится на вкладке «Сочетания клавиш». и, во-вторых, практически нет документации по этим сотням отдельных команд. (В частности, я не смог найти какого-либо главного списка аргументов, принятых каждой командой).

В любом случае, я имел некоторый успех в создании пользовательских комбинаций клавиш, которые я Однако мне нужна одна конкретная проблема, с которой я постоянно сталкиваюсь, заключается в том, что единственный способ, которым я вижу способ вставки заданного c литерального текста, - это команда "type" , однако это, очевидно, действительно делает попробуйте ввести каждый символ и разрешить стиль клавиатуры и т. Д. c. замены авто-огня. Мне это не нужно или не нужно, и мне нужно иметь возможность остановить это или найти какой-то другой (практичный) способ вставки моего литерального текста без любой реинтерпретации, подстановки или других сочетаний клавиш (или любого другого средства делает это).

Вот мой текущий набор команд привязки клавиш:

    "EditLitPropToGet": [
        {"command": "type", "args": {"text": "get "}},
        "cursorWordRight",
        "cursorRightSelect",
        {"command": "type", "args": {"text": "() { return "}},
        "cursorEnd",
        "cursorWordStartLeft",
        {"command": "type", "args": {"text": "; }"}},
        "cursorWordRight",
        "cursorWordRight",
        "cursorWordStartLeft"
    ]

Цель этого, когда он расположен в начале первого слова в этой строке:

referenceGravity: this.surfaceGravity * (this.radius**2),

, чтобы затем превратить его в эту строку:

get referenceGravity() { this.surfaceGravity * (this.radius**2); },

Это прекрасно работает, пока не дойдет до второй команды type:

        {"command": "type", "args": {"text": "() { return "}},

До этого запуска строка выглядит следующим образом:

get referenceGravity: this.surfaceGravity * (this.radius**2),

с выбранным символом двоеточия. Предполагается, что приведенная выше команда type делает следующее:

get referenceGravity() { return  this.surfaceGravity * (this.radius**2),

Но на самом деле происходит следующее:

get referenceGravity() { return }) this.surfaceGravity * (this.radius**2),

Очевидно, это потому, что она видит type текст как ввод с клавиатуры и вызывает закрытие стилей для "()" и "{}".

Как мне просто вставить буквальный текст?

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

Также я не хочу слепо массово отключать все расширения, стили и т. Д. c в начале, если это означает, что я должен вслепую включать их все в конце. Я готов попробовать что-то , например , но если у меня уже есть что-то отключенное, оно не должно включать его повторно, потому что не знает, что ранее было включено / отключено. Если это просто отключить / включить одну указанную настройку c, это нормально, я могу смириться с необходимостью исправления этого при необходимости.


Просто чтобы обновить это, я принял ответ @Mark, потому что он дал решение для этого конкретного случая c. Однако, что касается общего вопроса: « Как я могу вставить буквальный текст? », я считаю, что я наконец-то понял, что говорили люди: вы можете использовать insertSnippet, чтобы вставить буквальный текст, у вас просто есть чтобы избежать вещей, которые могут рассматриваться как команды Textmate / RegEx ("$" и "`" с "\"). Так что это должно работать:

    "EditLitPropToGet": [
        {"command": "editor.action.insertSnippet", 
            "args": {"snippet": "get "}},
        "cursorWordRight",
        "cursorRightSelect",
        {"command": "editor.action.insertSnippet", 
            "args": {"snippet": "() { return "}},
        "cursorEnd",
        "cursorWordStartLeft",
        {"command": "editor.action.insertSnippet", 
            "args": {"snippet": "; }"}},
        "cursorWordRight",
        "cursorWordRight",
        "cursorWordStartLeft"
    ]

1 Ответ

2 голосов
/ 20 апреля 2020

Просто чтобы показать вам, как версия преобразования фрагмента, это связывание клавиш:

{
  "key": "ctrl+k ctrl+1",             // or whatever you want
  "command": "editor.action.insertSnippet",
    "args": {
      "snippet": "get ${TM_SELECTED_TEXT/^(\\w*):(.*),$/$1() {$2/}; },"
  }
},

производит желаемый результат. Сначала нужно выбрать строку, но это можно очень легко автоматизировать внутри макроса (или просто связать команду cursorLineEndSelect. Этот макрос будет содержать только две команды: cursorLineEndSelect и вставит приведенный выше фрагмент.


Пример макроса с использованием нескольких команд, я не знаю синтаксис для ctf0.macros, который выглядит более мощным:

 "multiCommand.commands": [

     {
      "command": "multiCommand.yourMacroNameHere",
      "interval": 2000,
      "sequence": [
        "cursorEnd",
        "cursorHomeSelect",
        {
          "command": "editor.action.insertSnippet",
          "args": {
            "snippet": "get ${TM_SELECTED_TEXT/^\\s*(\\w*):(.*),$/$1() {$2/}; },"
          }
        },
        "cursorDown"
      ]
    },

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

Я бы перезагрузил vscode (через палитру команд) после внесения этих изменений на всякий случай.

Опять же, демонстрация выглядит медленно, но это просто для демонстрации отдельных шагов с опцией interval. В противном случае это является мгновенным.

snippet transform


Если вы хотите использовать свой макрос, используйте вместо этого type команду insertSnippet команда:

    // {"command": "type", "args": {"text": "() { return "}},
    {
      "command": "editor.action.insertSnippet",
      "args": {
        "snippet": "() { return }"
      }
    },
* 1 031 *, который, похоже, не вызывает автоматическое закрытие скобок. Для фрагментов требуется экранирование большего количества символов, чем для команды type, но не в вашем случае.
...