vscode snippets

学习snippets目的

  • 提升开发效率
  • 使自己代码看起来越加整洁,让自己爽,让别人爽
  • 装**

进门方法

使用快捷键ctrl+shift+p,打开命令窗口,输入nippets,配置代码片段

snippets分类

  1. 全局代码片段,级只要能用vscode打开且编辑的文档均可使用
  2. 指定编程语言的snippets,比如cxx对应的file name是cpp.json,此方法只能在指定的代码文件中使用,系统使用后缀名判定

举例

在代码中输入main,弹出候选框

mainpre

选择确认,自动补全替换代码

mainnext

语法

先拿出一个例子,有图有真相,有图好说话

"main": {
		"prefix": "main",
		"body": [
			"int main(int argc, char const *argv[])",
			"{",
			"	${1:/* code */}",
			"	return 0;",
			"}\n"
		],
		"description": "Code snippet for main()"
	}

注:照猫画虎就好,如果想学json语法,请自行脑补

  1. 整个文件就是一个json对象,{}

  2. 每一个代码片段就是json对象中一个子对象,”main“就是key,‘:’后就是value

  3. prefix(必须):shortcuts,说人话就是触发代码片段的快捷键

  4. body(必须):替换的代码主体(把你输入的触发代码替换)

  5. description(非必须):就是你给自己代码一个简单描述,图片中显示的那里就是

        "Header Include-Guard": {
            "prefix": "guard",
            "body": "#ifndef ${1}\n#define $1\n\n${2}\n\n#endif /* end of include guard: $1 */\n"
        }
    
  6. body其实也是一个json对象,其中value可以是一个字符串,也可以是一个数组

  7. 排版随意,建议漂亮点,可以使用,但是底限是语法要正确

占位符

  1. $0是结束位置,不是第一个位置。

    $0是结束位置,不是第一个位置。

    $0是结束位置,不是第一个位置。

  2. $n,表示第n个位置,比如$1表示光标自动跳转到的位置,切换位置使用tab,可依据自己习惯配置。

  3. 光标跳转期间,遇到$0,则跳转表示结束了,跳转此后失效。

  4. 占位符可以存在默认值,使用${n:xxx},比如举例中main的$

  5. 占位符不限制默认参数数量,可以存在多个,光标到这个位置是,会列出所有选项供你选择

        "function comment": {
            "prefix": "fc",
            "body": [
                "/**********************************************************************",
                " * @brief ${1:function_name}",
                " * @return false:$2,   true:$3}",
                " * @param ${4|void,bool,int,double,string|}",
                " **********************************************************************/$0",
            ],
            "description": "function comment"
        }
    

    效果如图:

    占位符多选

变量

  1. 文件相关变量

    变量名 变量存在的意义
    TM_SELECTED_TEXT 当前选定的文本或空字符串
    TM_CURRENT_LINE 当前行的内容
    TM_CURRENT_WORD 光标下的单词内容或空字符串
    TM_LINE_INDEX 基于零索引的行号
    TM_LINE_NUMBER 基于单索引的行号
    TM_FILENAME 当前文档的文件名
    TM_FILENAME_BASE 当前文档没有扩展名的文件名
    TM_DIRECTORY 当前文档的目录
    TM_FILEPATH 当前文档的完整文件路径
    CLIPBOARD 剪贴板的内容
    WORKSPACE_NAME 已打开的工作空间或文件夹的名称
  2. 时间相关变量

    变量名 变量存在的意义
    CURRENT_YEAR 当前年份
    CURRENT_YEAR_SHORT 当前年份的最后两位数
    CURRENT_MONTH 月份为两位数(例如'02')
    CURRENT_MONTH_NAME 月份的全名(例如'June')(中文语言对应六月)
    CURRENT_MONTH_NAME_SHORT 月份的简称(例如'Jun')(中文语言对应是6月)
    CURRENT_DATE 这个月的哪一天
    CURRENT_DAY_NAME 当天是星期几(例如'星期一')
    CURRENT_DAY_NAME_SHORT 当天是星期几的简称(例如'Mon')(中文对应周一)
    CURRENT_HOUR 24小时时钟格式的当前小时
    CURRENT_MINUTE 当前分
    CURRENT_SECOND 当前秒
  3. 注释相关变量(没感觉到存在意义,可能我没找到合适的场景吧)

    变量名 变量存在的意义
    BLOCK_COMMENT_START 输出:PHP /*或HTML格式<!--
    BLOCK_COMMENT_END 输出:PHP */或HTML格式-->
    LINE_COMMENT 输出:PHP //或HTML格式

注:是变量名,而不是宏,请使用$进行取值操作

其他语法

自己探索刚高深的语法吧,只要能帮到自己。

附常用的snippets

{
    "file header comments": {
        "prefix": "fhc",
        "body": [
            "/***********************************************************************",
            " * @file $TM_FILENAME",
            " * @ingroup ${1:${TM_FILENAME_BASE/(.*)/${1:/downcase}/i}}",
            " * @author fl",
            " * @date $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE",
            " * @brief ${2:$TM_FILENAME file}",
            "***********************************************************************/\n",
            "$0"
        ]
    },
    "function comment": {
        "prefix": "fc",
        "body": [
            "/**********************************************************************",
            " * @brief ${1:function_name}",
            " * @return false:$2,   true:$3}",
            " * @param ${4|void,bool,int,double,string|}",
            " **********************************************************************/$0"
        ],
        "description": "function comment"
    },
    "define c type for cpp file": {
        "prefix": "externc",
        "body": [
            "#ifdef __cplusplus",
            "extern \"C\" {",
            "#endif \n",
            "$0",
            "#ifdef __cplusplus",
            "}",
            "#endif //__cplusplus"
        ]
    },
    "Typedef": {
        "prefix": "td",
        "body": "typedef ${1:int} ${2:MyCustomType};"
    },
    "Typedef Struct": {
        "prefix": "tds",
        "body": "typedef struct \n{\n\t$1\n}${2:MyCustomType};"
    },
    "printf": {
        "prefix": "print",
        "body": "printf(\"${1:%s }\\n\", $2);$3"
    },
    "void function": {
        "prefix": "voidf",
        "body": "void ${1:f}($2) \n{\n\t$3\n}"
    },
    "int function": {
        "prefix": "intf",
        "body": "int ${1:f}($2) \n{\n\t$3\n}"
    },
    "any function": {
        "prefix": "func",
        "body": "${1:int} ${2:name}($3) \n{\n\t$5\n\treturn ${4:0};\n}"
    },
    "#define": {
        "prefix": "#def",
        "body": "#define ${1}\t\t\t${2:0}\t// $1\n$0"
    },
    "#ifdef": {
        "prefix": "#ifdef",
        "body": "#ifdef $1\n\n\n#endif // $1\n$0"
    },
    "#ifndef": {
        "prefix": "#ifndef",
        "body": "#ifndef $1\n\n\n#endif // $1\n$0"
    },
    "#include <>": {
        "prefix": "#Inc",
        "body": "#include <${1:.h}>"
    },
    "#include \"\"": {
        "prefix": "#inc",
        "body": "#include \"${1:.h}\""
    },
    "Define and For Loop": {
        "prefix": "dfor",
        "body": "size_t ${1:i};\nfor (${1:i} = ${2:0}; ${1:i} < ${3:count}; ${1:i}${4:++}) {\n\t$5\n}"
    },
    "Header Include-Guard": {
        "prefix": "guard",
        "body": "#ifndef ${1}\n#define $1\n\n${2}\n\n#endif /* end of include guard: $1 */\n"
    },
    "Do While Loop": {
        "prefix": "do",
        "body": "do {\n\t$0\n} while($1);"
    },
    "fprintf": {
        "prefix": "fprintf",
        "body": "fprintf(${1:stderr}, \"${2:%s}\\\\n\", $3);$4"
    },
    "scanf": {
        "prefix": "scanf",
        "body": "scanf(\"${1:%s}\\n\", $2);$3"
    },
    "Struct": {
        "prefix": "st",
        "body": "struct ${1:name_t} {\n\t$2\n};"
    },
    "write file": {
        "prefix": "wf",
        "body": "FILE *${1:fp};\n${1:fp} = fopen (\"${2:filename.txt}\",\"w\");\nif (${1:fp}!=NULL)\n{\n\tfprintf(${1:fp},\"${3:Some String\\\\n}\");\n\tfclose (${1:fp});\n}"
    },
    "read file": {
        "prefix": "rf",
        "body": "FILE *${1:fp};\n${1:fp} = fopen (\"${2:filename.txt}\",\"r\");\nif (${1:fp}!=NULL)\n{\n\tfscanf(${1:fp},\"${3:Some String\\\\n}\", ${3:&var});\n\tfclose (${1:fp});\n}",
        "description": "read file opeartion including fopen, fscanf and fclose."
    },
    "main": {
        "prefix": "main",
        "body": [
            "int main(int argc, char const *argv[])",
            "{",
            "\t${1:/* code */}",
            "\treturn 0;",
            "}\n"
        ],
        "description": "main(…)"
    },
    "do": {
        "prefix": "do",
        "body": "do\n{\n\t${1:/* code */}\n} while (${2:/* condition */});\n",
        "description": "Do While Loop "
    },
    "while": {
        "prefix": "while",
        "body": "while(${1:/* condition */})\n{\n\t${2:/* code */}\n}\n",
        "description": "While Loop"
    },
    "for": {
        "prefix": "for",
        "body": "for(int ${1:i} = 0; ${1:i} < ${2:count}; ${1:i}++)\n{\n\t${3:/* code */}\n}\n",
        "description": "For Loop "
    },
    "if": {
        "prefix": "if",
        "body": "if(${1:/* condition */})\n{\n\t${0:/* code */}\n}\n",
        "description": "if(…)"
    },
    "else": {
        "prefix": "else",
        "body": "else \n{\n\t${1:/* code */}\n}",
        "description": "else {…}"
    },
    "elseif": {
        "prefix": "elseif",
        "body": "else if(${1:/* condition */})\n{\n\t${0:/* code */}\n}\n",
        "description": "else if(…)"
    },
    "ifelse": {
        "prefix": "ifelse",
        "body": "if(${1:/* condition */})\n{\n\t${2:/* code */}\n} else\n{\n\t${0:/* code */}\n}\n",
        "description": "if(…) else"
    },
    "ifelif": {
        "prefix": "ifelif",
        "body": "if(${1:/* condition */})\n{\n\t${2:/* code */}\n} else if(${3:/* condition */})\n{\n\t${4:/* code */}\n} else\n{\n\t${0:/* code */}\n}\n",
        "description": "if(…) else if(…) else"
    },
    "forever": {
        "prefix": "forev",
        "body": "for(;;)\n{\n\t${0:/* code */}\n}\n",
        "description": "Forever Loop"
    },
    "return": {
        "prefix": "return",
        "body": "return ${1:/* code */};",
        "description": "return"
    },
    "switch": {
        "prefix": "switch",
        "body": [
            "switch (${1})",
            "{",
            "case ${2: /*case*/}:",
            "\t$3",
            "\tbreak;",
            "default:",
            "\tbreak;",
            "}"
        ],
        "description": "switch {...}"
    },
    "case": {
        "prefix": "case",
        "body": [
            "case ${1: /*case*/}:",
            "\t$2",
            "\tbreak;"
        ],
        "description": "case (...)"
    },
    "enum": {
        "prefix": "enum",
        "body": [
            "enum ${1:}",
            "{",
            "\t$2",
            "};\n"
        ],
        "description": "enum ..."
    },
    "struct": {
        "prefix": "struct",
        "body": [
            "struct ${1}",
            "{",
            "\t$2",
            "};\n"
        ],
        "description": "struct ..."
    },
    "union": {
        "prefix": "union",
        "body": [
            "union ${1}",
            "{",
            "\t$2",
            "};"
        ],
        "description": "union {...}"
    },
    "#include": {
        "prefix": "#include",
        "body": "#include <$1>",
        "description": "#include <..>"
    },
    "#ifelif": {
        "prefix": "#ifelif",
        "body": [
            "#if $1",
            "\t$3",
            "#elif $2",
            "\t$4",
            "#endif"
        ]
    }
}
posted @ 2020-04-14 00:16  flxx  阅读(730)  评论(0编辑  收藏  举报