Dang,花了一段时间,但这里有一些我认为很简单的东西。
首先,制作这个 sn-p(在一些 sn-ps 文件中):
"try except": {
// "scope": "python",
// "prefix": "tryWrap", // if you want it
"body": [
"${1:${TM_SELECTED_TEXT/^([ \t]*)[\s\S]*$/$1/}}try:",
"${TM_SELECTED_TEXT/^(.*?)$(\r?\n)?/ $1$2/gm}", // note the 'g' flag !!!
"$1except BaseException as ex:"
]
}
然后这个键绑定(在你的keybindings.json):
{
"key": "alt+q",
"command": "editor.action.insertSnippet",
"args": {
"name": "try except",
}
}
sn-p 的中间线:
"${TM_SELECTED_TEXT/^(.*?)$(\r?\n)?/ $1$2/gm}"
实际上将为您选择的每一行运行一次,因为匹配是从 ^ 到同一行的末尾,并且因为全局 g 标志。因此,只要在您的整个选择中找到匹配项,它就会继续运行。
前导空格由${1:${TM_SELECTED_TEXT/^([ \t]*)[\s\S]*$/$1/}} 计算,这将是您选择的第一行。它不是为每一行计算的(尽管它可能是,它只是不必要的混乱)。所以不要选择选择的第一行的前导空白的一部分 - 实际上,只要选择整个标签的前导空白,它似乎工作正常,而不是额外的空间。做对了很容易。
@rioV8 的 sn-p 对我有用(似乎只适用于单行),但可以稍微简化一下。我投了赞成票。
请注意,sn-p 的 3 个部分是相同的:${TM_SELECTED_TEXT/^([ \t]*).*$/$1/}
因此,为了简化结果值(所选文本之前的空格)可以存储在一个值和重用。看到这个:
${1:${TM_SELECTED_TEXT/^([ \t]*).*$/$1/}} // wrapped in tabstop 1
现在你可以在任何其他你想要相同值的地方使用$1。
"snippet": "${1:${TM_SELECTED_TEXT/^([ \t]*).*$/$1/}}try:
$1 ${TM_SELECTED_TEXT/^[ \t]*(.*)$/$1/}
$1except BaseException as ex:"
看到有两个$1 不是转换的一部分,例如try:
$1 :$1 将是您从${1:${TM_SELECTED_TEXT/^([ \t]*).*$/$1/}} 计算的空白
此外,这部分:${TM_SELECTED_TEXT/^[ \t]*(.*)$/$1/} 可以简化为
${TM_SELECTED_TEXT/^[ \t]*//}
它匹配文本之前的前导空白,并用任何内容替换该空白。
结果:
"snippet": "${1:${TM_SELECTED_TEXT/^([ \t]*).*$/$1/}}try:
$1 ${TM_SELECTED_TEXT/^[ \t]*//}
$1except BaseException as ex:"
这只是更干净一点,更不容易出现拼写错误。你只需要做一个标签或者逃脱最后完成。