【问题标题】:Extension that creates object from all selected variables从所有选定变量创建对象的扩展
【发布时间】:2019-11-19 10:24:56
【问题描述】:

我正在寻找一个可以采用这样的功能的 vscode 扩展;

const hello = () => {
    const name = () => {}
    const age = () => {}
    const height = () => {}
    const location = () => {}
}

并在函数中添加创建所有声明变量的对象:

const hello = () => {
    const name = () => {}
    const age = () => {}
    const height = () => {}
    const location = () => {}
    return { name, age, height, location }
}

【问题讨论】:

    标签: visual-studio-code vscode-snippets


    【解决方案1】:

    您可以使用 sn-p 和键绑定来做到这一点。

    在你的 sn-p 文件中:

    "return object": {
      "prefix": "_ro",
      "body": [
        "$TM_SELECTED_TEXT",
    
        // "\treturn { ${TM_SELECTED_TEXT/\\s*const\\s+(.*)\\b.*(\\n)*/$1, /g} }", 
    
        "${TM_CURRENT_LINE/^(\\s*).*$/$1/}return { ${TM_SELECTED_TEXT/\\s*const\\s+(.*)\\b[^\\}]*((\\}\\s)|(\\}))/$1${3:+, }/g} }",
    
      ],
      "description": "Return Object"
    },
    

    还有一些您选择的键绑定:

      {
        "key": "alt+b",
        "command": "editor.action.insertSnippet",
        "args": {
          "name": "return object"
        }
      },
    

    sn-p 看起来毛茸茸的,但大部分都是微调,也许你可以不用它。注释代码将产生:

    return { name, age, height, location, } // 注意最后一个条目后额外的,

    我将解释完整的转换:

    "${TM_CURRENT_LINE/^(\\s*).*$/$1/}return { ${TM_SELECTED_TEXT/\\s*const\\s+(.*)\\b[^\\}]*((\\}\\s)|(\\}))/$1${3:+, }/g} }",

    第一部分 ${TM_CURRENT_LINE/^(\\s*).*$/$1/} 只是插入与您在选择的最后一行之前相同数量的空白以用于缩进。

    这部分${TM_SELECTED_TEXT/\\s*const\\s+(.*)\\b[^\\}]*((\\}\\s)|(\\}))/ 将变量/函数名称、您的“姓名”、“年龄”等放入正则表达式的捕获组 1。

    regex101 demo

    该正则表达式末尾的[^\\}]*((\\}\\s)|(\\})) 部分用于确定是否有另一个行条目,如果有,则将, 添加到变量列表的末尾。因此,如果最后有 }\s 将进入捕获组 3。如果最后只有 } 并且您的选择中没有其他以下行将是捕获组 4 并且不会有捕获组 3 .

    这很重要,因为${3:+, } 是一个条件转换,它表示是否有组 3 - 最后一个条目不会有,因为选择中它后面没有换行符 - 如果有组 3 添加,。所以完整的正则表达式转换会产生

    return { name, age, height, location }

    因此,为了使缩进和逗号正确,并且在 vscode 中进行必要的双重转义,需要进行大量的内务处理。实际的正则表达式非常简单。这是一个演示:


    用法:请确保完全选择所需的代码范围 - 就像在演示中一样 - 例如,不要部分选择第一行或最后一行。

    【讨论】:

    • 这真的很酷。它不适用于大多数这样的功能:const userReadById = (id: number) => userFindOne({ id }).
    • 嗯,不,这与您在问题中的示例不同 - 例如,我在正则表达式中使用的不是const。我可以看看它是否可以针对这个新用例进行修改。将const 设为可选...可能就足够了。
    • 请编辑您的问题以包括这个新示例的精确格式和您想要的结果的精确格式。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多