【问题标题】:vscode surround text with snippet with correct indentation带有正确缩进的片段的 vscode 环绕文本
【发布时间】:2022-10-17 09:11:53
【问题描述】:

我正在尝试使用try..except 块创建一个围绕所选文本的sn-p。这就是我在 keybindings.json 文件中的内容:

{
    "key": "ctrl+p'",
    "command": "editor.action.insertSnippet",
    "when": "editorHasSelection",
    "args": {
        "snippet": "try:\r\n\t${TM_SELECTED_TEXT}\r\nexcept BaseException as ex:"
    }
}

这在大多数情况下都有效,除非我选择整行缩进代码,它会在行首插入 try 。我希望它的行为类似于Command+/,它在文本开始之前添加#

如何让我的 sn-p 表现得那样?

【问题讨论】:

    标签: visual-studio-code vscode-snippets


    【解决方案1】:

    您必须在每行前面插入一个可能的空格并删除中间行的空格:

      {
        "key": "ctrl+p'",
        "command": "editor.action.insertSnippet",
        "when": "editorHasSelection",
        "args": {
            "snippet": "${TM_SELECTED_TEXT/^([ \t]*).*$/$1/}try:
    ${TM_SELECTED_TEXT/^([ \t]*).*$/$1/}	${TM_SELECTED_TEXT/^[ \t]*(.*)$/$1/}
    ${TM_SELECTED_TEXT/^([ \t]*).*$/$1/}except BaseException as ex:"
        }
      }
    

    【讨论】:

    • 它没有像Command+/。有没有办法我可以看到作为Command+/ 命令的一部分传递的参数?
    • @Asdfg 您要求 try 在您选择满的行,这个sn-p的行为是这样的,你想从Cmd+/那里得到什么?
    • @Asdfg 没有参数传递给评论命令
    • 我不想要Cmd+/。我希望这个 sn-p 表现得像 Cmd+/
    • 我认为这只适用于一条选定的线路......应该是可以修复的。
    【解决方案2】:

    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:"
    

    这只是更干净一点,更不容易出现拼写错误。你只需要做一个标签或者逃脱最后完成。

    【讨论】:

    • 如果可能,将尝试为多行修复此问题。
    • 谢谢你在这里帮助我。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多