主要始因是在写 Note 和 WiKi 时,需要在文章前插入 Mate,每写一篇都需要重复输入,很麻烦;转到 VS Code 后,最开始是用扩展 vscode-fileheader 来实现的,虽然有些不足,但也够用。但后来看文档时发现居然代码片段这个东西,自定义更强,而且还是原生自带的,就果断的把用了不到一天的 vscode-fileheader 禁用。

代码片段说明

Snippet 是一种通过 前缀 + 快捷键 的方式来插入源代码中的代码片段,方便输入一些重复性的代码。代码片段分全局片段和指定语言片段,前者对所有文件生效,后者只针对特定语言。下面以默认示例来说明:

{
    "Print to console": {
        "prefix": "log",
        "body": [
            "console.log('$1');",
            "$2"
        ],
        "description": "Log output to console"
    }
}

其中:

  • pring to console: 代码片段名称
  • prefix: 触发前缀
  • body: 代码主体
    • $1、$2 为制表符
  • description: 描述

关于 body 语法

制表符

制表符即之前出现过的 $1、$2,当插入代码片段时,可用 Tab 键使光标按顺序在制表符间移动。其中 $0 表示最终停留的位置,如果不同位置使用同一个制表符,将同步更新。

占位符

占位符是带有默认值的制表符,如 `$1{1:draft}:

  • 可以有多个默认值
    • ${1|draft, public|},包裹在管道符之间,使用逗号分割;注:没有冒号
  • 可嵌套
    • ${1:tag1 ${2:tag2}}

变量

使用 $name 可以插入变量,如文件名和日期等;以下仅仅选几个常用的:

  • TM_FILENAME:当前文档的文件名
  • TM_FILENAME_BASE:当前文档的文件名(无后缀名)
  • TM_DIRECTORY:当前文件目录
  • TM_FILEPATH:当前文件的完整文件路径
  • CLIPBOARD:剪贴板的内容

日期和时间相关:

  • CURRENT_YEAR:年份
  • CURRENT_MONTH:月份
  • CURRENT_DATE:天
  • CURRENT_HOUR:小时
  • CURRENT_MINUTE:分钟
  • CURRENT_SECOND:秒

创建代码片段

{
    // insert Markdown WiKi Mate;
    "Mate WiKi": {
        "prefix": "matew",
        "body": [
            "---",
            "date: $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE $CURRENT_HOUR:$CURRENT_MINUTE",
            "position: $1",
            "status: ${2|draft,public|}",
            "title: '$TM_FILENAME_BASE$4'",
            "url: $0"
            "---"
        ]
    }
}

美中不足的是,使用变量获取的标题如果不想要,不能直接取消。

关于快捷键

  • 设置代码片段:Shift + Command + P,输入 snippets,选择对应语言即可;
  • 修改设置中的 "editor.tabCompletion"true,便可直接使用 Tab 键直接插入代码片段。

参考


  • 2018-07-02
    • 创建
  • 2018-08-14
    • 增加新建代码片段的快捷键