需求

我打算使用 markdown 进行日常任务的管理与记录,每个任务的具体记录类似以下的格式:

## 任务标题 (2022.05) 
任务描述

- TODO
  - [ ] XXX
  - [ ] XXX

- LOGS:
  - ...(2022.2.2)
  - ...(2022.3.3)

每当有一个新任务的时候,都要弄出上述一堆格式出来,手工整出来当然比较麻烦,因此想到利用 vscode 的 snippet 功能来实现。

学习

于是上搜索引擎查找关键字 vscode snippet,看了好几篇也没有找到几个讲得特别明白的。无意中发现在 vscode 软件自己的扩展里可以直接搜索 snippets,于是输入 markdown snippets,搜索出了 markdown-snippets 这个扩展。从这个扩展的详情页面上,找到了一些资源,作者不仅编写了一个 vscode 内置代码片段查看器(Snippets Ranger extension),而且写了一篇很详细的 snippet 入门介绍文章

从 vscode 的 markdown-snippets 扩展的资料中看到,vscode 其实是自带了很多的 snippets 的。比如对于 markdown,其 snippets 就保存在 <vscode 安装目录>\resources\app\extensions\markdown-basics\snippets\markdown.code-snippets 这个文件里。打开该文件,我们可以看到官方定义的各级别 heading 等一系列 snippets,我们马上来试验一下。打开一个 markdown 文件,新起一行,输入一个 i,按下 Ctrl-Space,咦,没什么反应呀?

认真检查后发现,Ctrl-Space 快捷键被系统输入法占用去做中英文切换了。我的 win10 只使用搜狗输入法,连系统自带的输入法都卸载干净了,中英文切换都使用左Shift键,根本用不上 Ctrl-Space。由于 win10系统可能的bug,经由控制面板无法成功修改该快捷键,参考这篇文章 对注册表进行修改后,重启电脑再试一下。打开 markdown 文件,新起一行,输入 i,按下 Ctrl-Space,这次成功了,vscode 弹出了一个小窗口,提示我可以选择 heading1 到 heading6 等一系列 snippets。


(2024年2月补充)
经确认,上述无法经由 windows 配置界面取消 Ctrl-Space 快捷键的bug,在 win11 22H2 上依旧存在。因此前述对注册表的修改蛮有用,每次重装系统都要用到,特别总结如下:

  1. 运行注册表编辑器,找到 HKEY_CURRENT_USER/Control Panel/Input Method/Hot Keys
    ——其中的 0000001000000070 分别是简繁中文热键,这两个都要修改
    ——右边键值中,Key Modifiers02 c0 00 00 表示 Ctrl 键,Virtual Key20 00 00 00 表示 Space
  2. 修改 Key Modifiers 的首字节为 00,修改 Virtual Key 的首字节为 ff
  3. 注销系统用户,重新登录即可
  4. 注意,之后切勿打开系统配置界面修改输入法相关热键,否则又要再弄一次

好了,知道 snippets 怎么用了,我们就准备动手写自己需要的 snippets 了。

实现

最终实现的步骤及内容如下。

  1. 新建“用户自定义 snippets”
    在 vscode 主界面,点击菜单 File---Preferences---User Snippets(或者点击侧面工具栏的齿轮---User Snippets),此时系统会列出所有用户自定义的 snippets 文件,以及若干新建 Snippets 的选项。若当前处于“打开目录”的状态下,还会多出New Snippets file for <dir>... 的选项。

    考虑到日常只有我们的日志系统需要用到前述特定片段,因此在确保 vscode 通过Open Folder... 打开我们的日志目录之后,我们选择New Snippets file for <dir>...。输入文件名 daily_task,则保存的用户自定义 snippets 文件就叫 daily_task.code-snippets,保存在我们的日志目录的 .vscode 子目录下。

  2. 实现语法配置
    在新打开的 daily_task.code-snippets 文件里,输入下述内容:

    {
     	"daily_new_task":{
     		"scope": "markdown",
     		"prefix": "任务",
     		"body": [
     			"## ${1:任务标题} (${CURRENT_YEAR}.${CURRENT_MONTH})",
     			"${2:简要描述任务背景}\n",
     			"- TODO",
     			"  - [ ] ${3:当前要完成的步骤}\n",
     			"- LOG",
     			"  - ${4:第一条进度记录}(${CURRENT_YEAR}.${CURRENT_MONTH}.${CURRENT_DATE})",
     		]
     	}
    }
    

    具体语法及其含义参见本文参考文献。

  3. 效果演示
    每当我在 markdown 里输入任务二字,然后按下 Ctrl-Space,就可以看到有个 daily_new_task 的提示,回车后就输入了如下内容:
    自定义 snippets 效果
    此时的光标停在 任务标题 上,且四个字都是处于 选定 的状态,一旦我们输入任意字符,这四个字就会立刻被替换。我们可以看到,除了 任务标题 之外、还有简要描述任务背景当前要完成的步骤第一条进度记录共四小段提示性文字都是被 预选定 的,当我们写完标题后,按下tab键,光标就会跳到 简要描述任务背景 小段并全选之,后面依次类推。这样我们就可以仅通过 tab 键快速输入当前任务的主要内容了。

参考

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐