Привязать нажатие клавиши к команде оболочки, которая использует текущий файл в коде Visual Studio - PullRequest
0 голосов
/ 13 июня 2018

Есть ли способ создать связывание клавиш для выполнения команды оболочки над файлом?что-то вроде:

{
    "key": "ctrl+shift+e",
    "command": "run",
    "command": "touch $file",
    "when": "editorTextFocus"
}

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

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

с ответом Marks здесь, я мог бы разрешить свой случай, который был запущен командой android с некоторым ярлыком.После этого я решил создать руководство на своем GitHub, надеюсь, это поможет.

GitHub: LucasMMota

Запуск сценария оболочки с сочетаниями клавиш

ВВ этом примере я установил комбинацию клавиш для запуска перезагрузки Android в моем собственном реактивном проекте.

    1. Установите расширение макросов для выполнения нескольких команд.
  • После установки перейдите в «Настройки»> «Настройки» (или cmd +,)
  • Найдите конфигурацию макросов и используйте ее для редактирования в пользовательских настройках или просто добавьте следующее в свои пользовательские настройки:
  • Теперь, когда у нас есть набор команд, нам нужно установить ярлык триггера.Перейдите в «Настройки»> «Комбинации клавиш» (или cmd + k), откройте keybindings.json и отредактируйте так:
  • Сохраните настройки пользовательских настроек и keybindings.json соответственно

Привязка формата файла и отступа с помощью ярлыка сохранения

keybindings.json:

{
        "key": "cmd+s",
        "command": "macros.saveContentAndIndent",
        "when": "editorTextFocus && !editorReadonly"
    },

User Settings:

"macros": {
        "saveContentAndIndent": [
            "editor.action.formatDocument", // format
            "workbench.action.files.save", // as I used Save shorcut, I add the save bind again.
        ],
        //....
}
0 голосов
/ 16 мая 2019

Получите Command Runner или macro-commander расширение

Я создал расширение macro-commander, чтобы решить эту проблему схакерское решение.Это улучшенная версия расширения macros, которая выполняет команды по порядку (синхронно) и позволяет вводить filepath / folderpath в команду.Команды можно запускать в терминале VS Code пользователя или в скрытом фоновом терминале.

ОБНОВЛЕНИЕ : На сегодняшний день (несколько месяцев спустя) я понял, к моему большому разочарованию, существовало расширениеэто, вероятно, может сделать то, что вы (и я) хотели.Это Command Runner , написанный edonet.Если бы я знал об этом, я, вероятно, никогда бы не сделал свое расширение.

Command Runner не имеет столько общих возможностей (несколько команд, пользовательский ввод или javascript), но у него лучший UX и онвероятно, расширение, которое вы (читатель) должны попробовать в первую очередь.Однако, если Command Runner не может сделать то, что вы ищете, то, возможно, макро-коммандер, хотя и с меньшей элегантностью.

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

0 голосов
/ 14 июня 2018

[См. Мое редактирование ниже - теперь это сделать намного проще.]

Я нашел способ сделать то, что вы хотите, но это немного хак.Как вы, наверное, знаете, связать задачу легко, если вы можете создать задачу в .vscode / tasks.json и использовать что-то вроде следующего:

{
  "key": "shift+escape",
  "command": "workbench.action.tasks.runTask",
  "args": "Start server and process files"
},

Гораздо сложнее запустить скрипт черезсвязывание клавиш без уже существующей задачи.Однако вы можете попробовать следующее, которое использует команду "workbench.action.terminal.runSelectedText",.Но сначала нам нужно вставить скрипт в выделение, чтобы:

Использовать расширение macros (что немного грубо), чтобы мы могли связать несколько команд.В ваших пользовательских настройках :

"runCommandInTerminal": [

   {
     "command": "type",
     "args": {
        "text": "node -v"
     }
  },
  { 
    "command": "cursorMove",
    "args": {
       "to": "wrappedLineStart",
       "by": "wrappedLine",
       "value": 1,
       "select": true
    }
  },
  "workbench.action.terminal.runSelectedText",
  "editor.action.clipboardCutAction",
  //  "workbench.action.terminal.focus"
],

Это общий пример настройки "runCommandInTerminal", которую вы можете затем связать с любым аккордом клавиш, который пожелаете в keybindings.json, например

{
    "key": "ctrl+shift+e",
    "command": "macros.runCommandInTerminal"
},

Ваш пример немного сложнее, потому что вы хотите получить доступ к чему-то вроде ${file}, что вы не можете сделать в настройках, только tasks.json и launch.json.К счастью, есть команда, которая получит текущий файл: "copyFilePath".Поэтому попробуйте

"runCommandInTerminal": [

      "copyFilePath",
      {
        "command": "type",
        "args": {
          "text": "touch "
        }
      },
      "editor.action.clipboardPasteAction",
      { 
      "command": "cursorMove",
        "args": {
        "to": "wrappedLineStart",
        "by": "wrappedLine",
        "value": 1,
        "select": true
        }
      },
      "workbench.action.terminal.runSelectedText",
      "editor.action.clipboardCutAction",
      // "workbench.action.terminal.focus"
],

Сначала получите путь к файлу, затем выведите первую часть команды сценария "touch".

Затем добавьте путь к файлу в конец команды.

Переместите курсор для выбора предыдущего.

Запустите выделение в терминале.

Вырежьте выделение из редактора.

Это можно запустить с помощьюваше связывание клавиш.Вы увидите, что сценарий набирается и вырезается, но код вашего редактора не изменится.Лучше всего запускать его из пустой строки в редакторе, но вы можете запустить его с начала строки несвязанного кода, если хотите (но отступ может быть утерян).

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


РЕДАКТИРОВАТЬ май 2019:

Поскольку мой первоначальный ответ (как@Джефф указал) vscode добавил команду sendSequence.И возможность использовать переменные с этой командой.Так что теперь вопрос ОП гораздо проще выполнить:

{
  "key": "alt+x",
  "command": "workbench.action.terminal.sendSequence",
  "args": {"text": "touch ${file}"}
}

в вашем файле keybindings.json.См. переменные с помощью команды sendSequnce .

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