Обернуть код в конструкцию в vscode

В pycharm есть очень полезная горячая клавиша выделение кода -> cmd+alt+T (macOS) -> выбор конструкции в которую хочешь поместить выделенный код (if, while, try и т.д.). Есть ли что-то подобное в vscode? Или может расширение какое нужно?

К ответу могу добавить что можно установить hotkeys введите сюда описание изображения

Что бы не вводить Snippets: Surround with snippet


Ответы (1 шт):

Автор решения: Pak Uula

В VSCode эта магия называется snippet (ака фрагмент): https://code.visualstudio.com/docs/editor/userdefinedsnippets

Для JS и PHP расширения устанавливают нормальные фрагменты из коробки, для Python нужно повозиться.

  1. Добавьте фрагмент. Например, "try-catch-finally". Нажмите Ctrl-P и выберите команду Snippets: Configure snippets, откроется список языков, выберите Python.
  • Сразу скажу, что фрагменты хранятся криво, в виде массива строк в JSON. Каждый раз, как я добавляю новый фрагмент, хочется пристрелить тех, кто это придумал.
  • В открывшемся файле python.json введите фрагмент
        "Try-Except-Finally" : {
        "prefix": "try",
        "body": [
            "try:",
            "\t${0:${TM_SELECTED_TEXT}}",
            "except ${1:Exception} as ${2:e}:",
            "\tpass",
            "finally:",
            "\tpass"
        ],
        "description": "Try-Except-Finally"
    }
    
  1. Теперь выделите код, который нужно обернуть, и снова нажмите Ctrl-P. На сей раз выберите команду Snippets: Surround with snippet. Выпадет окошко со списком фрагментов, выберите Try-Except-Finally. Профит!

Теперь несколько слов о том, где прячется магия.

Области для редактирования в фрагментах помечаются переменными вида $1, $2, и так далее. Курсор сначала устнавливается в область $1, затем по табуляции перескакивает в $2 и так далее, до $0. Да, $0 - это последняя позиция в списке областей редактирования.

В описание области можно добавить значение по-умолчанию. Например, ${1:Exception} означает, что в область $1 по-умолчанию будет вставлен текст Exception.

Но в качестве подстановки можно писать не просто литеральную строку, но указать переменную ${что-нибудь} Список переменных для подстановки есть в документации

Для Surround with snippet необходима подстановка переменной ${TM_SELECTED_TEXT}, значение которой равно выделенным строкам на момент вызова команды. Если в сниппете нет подстановки этой переменной, такой фрагмент игнорируется командой Surround with snippet.

Если вам интересно, вот мой файл python.json с фрагментами

{
    "For loop": {
        "prefix": "for",
        "body": [
            "for ${1:item} in ${2:items}:",
            "\t${0:${TM_SELECTED_TEXT}}"
        ],
        "description": "For loop"
    },
    "Try-Except-Finally" : {
        "prefix": "try",
        "body": [
            "try:",
            "\t${0:${TM_SELECTED_TEXT}}",
            "except ${1:Exception} as ${2:e}:",
            "\tpass",
            "finally:",
            "\tpass"
        ],
        "description": "Try-Except-Finally"
    },
    "Try-Finally" : {
        "prefix": "try",
        "body": [
            "try:",
            "\t${0:${TM_SELECTED_TEXT}}",
            "finally:",
            "\t${1:pass}"
        ],
        "description": "Try-Finally"
    },
    "Try-Except" : {
        "prefix": "try",
        "body": [
            "try:",
            "\t${0:${TM_SELECTED_TEXT}}",
            "except ${1:Exception} as ${2:e}:",
            "\t${3:pass}"
        ],
        "description": "Try-Except"
    },
    "If-Only": {
        "prefix": "if",
        "body": [
            "if ${1:condition}:",
            "\t${0:${TM_SELECTED_TEXT}}"
        ],
        "description": "If-Only"
    },
    "If-Else": {
        "prefix": "if",
        "body": [
            "if ${1:condition}:",
            "\t${0:${TM_SELECTED_TEXT}}",
            "else:",
            "\t${2:pass}"
        ],
        "description": "If-Else"
    }
}
→ Ссылка