给代码片段加一点魔法

前言

为什么突然会出这么一篇文章呢?
前两天博主在搞自己的个人博客,经过各方面的比对之后,决定选用Hexo来进行搭建。跟着教程走完一套搭建之后,发现在写文章前会出现很多通用的配置。而这些配置如果单纯的CV对时间的损耗很大。由此产生了使用代码片段的想法。并打开了新世界的大门。

什么是代码片段

代码片段是小块可重用代码,可通过右键单击菜单(关联菜单)命令或热键组合插入到代码文件中。 代码片段通常包含常用的代码块(如 try-finally 或 if-else 块),可用于插入整个类或方法。

简单来说:就是我们经常需要复制粘贴的基础代码

其实我们在开发之中经常使用代码片段,只是那些都是插件里面别人已经写好的,我们直接用就好了。比如这样的:

代码片段.gif

上图中,我们在创建一个vue项目时,vueInit就会弹出提醒,选择之后就已经直接给我们搭建好了。这就是代码片段的功效。并且这个还是相对基础的功能,代码片段的世界,比我们想象的庞大的多。

如何创建属于自己的代码片段

创建代码片段的方式很简单,笔者这里使用VScode来举例。
步骤:

  1. 打开VScode,点击左下角的小齿轮
  2. 选中 配置用户代码片段
  3. 在弹出框之中选择 新代码片段
  4. 设置代码片段的名称
  5. 进行代码片段的编写

新建代码片段.gif

代码片段格式是这样的:

{
    "Print to console": {
        "prefix": "hexoMdInit", // 这里是关键字,设置之后,在文件中敲击这几个关键字会出现提示,选择则出现下面body中设置的代码
		"scope": "Markdown,markdown",	// 这里是范围,可以限制只在这几个文件类型之中进行代码片段的使用
        "body": [ // 这里是代码片段的主要部分,其中 ${1},${2},代表代码片段生成之后鼠标的位置,Tab间会跳转到下一个位置。
			"---",
			"title: ${1:${TM_FILENAME/['.md']//g}} ",
			"date:  $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE $CURRENT_HOUR:$CURRENT_MINUTE:$CURRENT_SECOND",
			"tags: ${3}",
			"---",
			"",
			"",
			"${0}"
        ],
        "description": "Create hexo article template"
    }
}

上面是我按照hexo文章格式创建的基础片段。他的功能在于:

  1. 输入 hexoMdInit 产生代码片段。
  2. 该指令只在 md 文档中会出现
  3. 产生内容中 date 将自动写入当前的时间
  4. 产生内容的 title 将自动写入文件名称且将后缀.md去除

除此之外,官方还提供了一些变量相关的参数。并且可以根据正则表达式进行一定程度的修改。

变量

使用$nameor ${name:default},您可以插入变量的值。如果未设置变量,则插入其默认值或空字符串。当变量未知(即未定义其名称)时,将插入变量的名称并将其转换为占位符。

可以使用以下变量:

  • TM_SELECTED_TEXT当前选中的文本或空字符串
  • TM_CURRENT_LINE当前行的内容
  • TM_CURRENT_WORD光标下单词的内容或空字符串
  • TM_LINE_INDEX基于零索引的行号
  • TM_LINE_NUMBER基于单索引的行号
  • TM_FILENAME当前文档的文件名
  • TM_FILENAME_BASE当前文档的文件名,不带扩展名
  • TM_DIRECTORY当前文档的目录
  • TM_FILEPATH当前文档的完整文件路径
  • RELATIVE_FILEPATH当前文档的相对(相对于打开的工作区或文件夹)文件路径
  • CLIPBOARD剪贴板的内容
  • WORKSPACE_NAME打开的工作区或文件夹的名称
  • WORKSPACE_FOLDER打开的工作空间或文件夹的路径
  • CURSOR_INDEX基于零索引的游标号
  • CURSOR_NUMBER基于单索引的游标号

插入当前日期和时间:

  • CURRENT_YEAR本年度
  • CURRENT_YEAR_SHORT本年度的最后两位数
  • CURRENT_MONTH两位数的月份(例如“02”)
  • CURRENT_MONTH_NAME月份的全名(例如“七月”)
  • CURRENT_MONTH_NAME_SHORT月份的简称(例如“Jul”)
  • CURRENT_DATE两位数的月份日期(例如“08”)
  • CURRENT_DAY_NAME日期名称(例如“星期一”)
  • CURRENT_DAY_NAME_SHORT当天的简称(例如“周一”)
  • CURRENT_HOUR24 小时制格式的当前小时
  • CURRENT_MINUTE当前分钟为两位数
  • CURRENT_SECOND当前秒为两位数
  • CURRENT_SECONDS_UNIX自 Unix 纪元以来的秒数

对于插入随机值:

  • RANDOM6 个随机 Base-10 数字
  • RANDOM_HEX6 个随机 Base-16 位
  • UUID版本 4 UUID

对于插入行或块注释,尊重当前语言:

  • BLOCK_COMMENT_START示例输出:PHP/*或 HTML<!--
  • BLOCK_COMMENT_END 示例输出:PHP*/或 HTML-->
  • LINE_COMMENT示例输出:在 PHP 中//

变量变换

转换允许您在插入变量之前修改它的值。转换的定义由三部分组成:

  1. 与变量值匹配的正则表达式,或者当变量无法解析时为空字符串。
  2. 允许从正则表达式引用匹配组的“格式字符串”。格式字符串允许有条件的插入和简单的修改。
  3. 传递给正则表达式的选项。
例子输出解释
"${TM_FILENAME/[\.]/_/}"example-123_456-TEST.js将第一个替换._
"${TM_FILENAME/[\.-]/_/g}"example_123_456_TEST_js替换每个.-``_
"${TM_FILENAME/(.*)/${1:/upcase}/}"EXAMPLE-123.456-TEST.JS改为全部大写
"${TM_FILENAME/[^0-9^a-z]//gi}"example123456TESTjs删除非字母数字字符