需求
我打算使用 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 上依旧存在。因此前述对注册表的修改蛮有用,每次重装系统都要用到,特别总结如下:
- 运行注册表编辑器,找到
HKEY_CURRENT_USER/Control Panel/Input Method/Hot Keys
——其中的00000010
与00000070
分别是简繁中文热键,这两个都要修改
——右边键值中,Key Modifiers
为02 c0 00 00
表示 Ctrl 键,Virtual Key
为20 00 00 00
表示 Space 键 - 修改
Key Modifiers
的首字节为00
,修改Virtual Key
的首字节为ff
- 注销系统用户,重新登录即可
- 注意,之后切勿打开系统配置界面修改输入法相关热键,否则又要再弄一次
好了,知道 snippets 怎么用了,我们就准备动手写自己需要的 snippets 了。
实现
最终实现的步骤及内容如下。
-
新建“用户自定义 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
子目录下。 -
实现语法配置
在新打开的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})", ] } }
具体语法及其含义参见本文参考文献。
-
效果演示
每当我在 markdown 里输入任务
二字,然后按下Ctrl-Space
,就可以看到有个daily_new_task
的提示,回车后就输入了如下内容:
此时的光标停在 任务标题 上,且四个字都是处于 选定 的状态,一旦我们输入任意字符,这四个字就会立刻被替换。我们可以看到,除了 任务标题 之外、还有简要描述任务背景、当前要完成的步骤、第一条进度记录共四小段提示性文字都是被 预选定 的,当我们写完标题后,按下tab
键,光标就会跳到 简要描述任务背景 小段并全选之,后面依次类推。这样我们就可以仅通过tab
键快速输入当前任务的主要内容了。