Обернуть код в конструкцию в vscode
В pycharm есть очень полезная горячая клавиша выделение кода -> cmd+alt+T (macOS) -> выбор конструкции в которую хочешь поместить выделенный код (if, while, try и т.д.). Есть ли что-то подобное в vscode? Или может расширение какое нужно?
К ответу могу добавить что можно установить hotkeys 
Что бы не вводить Snippets: Surround with snippet
Ответы (1 шт):
В VSCode эта магия называется snippet (ака фрагмент): https://code.visualstudio.com/docs/editor/userdefinedsnippets
Для JS и PHP расширения устанавливают нормальные фрагменты из коробки, для Python нужно повозиться.
- Добавьте фрагмент. Например, "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" }
- Теперь выделите код, который нужно обернуть, и снова нажмите 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"
}
}