前言
越用VSCode越有一种轻便感,麻雀虽小,五脏俱全,又有微软在做背书,同步设置什么的也很方便,要是国产也能有这样的好工具就好了。
之前在编写博客时,总觉得代码块、标题的输入有些麻烦,偶然发现可以使用代码段功能来解决这一问题,遂记录一下。
代码段功能
VSCode提供的代码段功能,主要是通过输入预先设置好的“前缀”字符,触发输出对应的代码段。
该功能具有三种作用域:
- 全局(global),该类代码段被存放在软件内部的文件中,不会随着项目的关闭而失效。在创建后除非手动删除该代码段文件,否则它会一直存在。
- 文件夹(folder),该类代码段被存放在选定目录下
.vscode
隐藏文件夹中,这个代码段只适用于当前文件夹。 - 文件类型(file type),该类代码段与全局作用域代码段类似,被存放在软件内部的文件中。但这类代码段只适用于用户指定的文件类型,严格的匹配文件后缀。
三类代码段文件的书写格式是一致的,给个简单的例子如下:1
2
3
4
5
6
7
8
9
10
11
12{
"Add a Markdown code block":{
"scope": "",
"prefix": "amcb",
"body": [
"```",
"$1",
"```"
],
"description": "Add a Markdown code block"
}
}
所有的代码段都书写在xx.code-snippets
文件中的花括号内,每一个代码段包含四个属性:
scope:作用文件类型,多种类型之间用逗号隔开。如果值为空,或不写该属性,默认所有类型文件都支持该代码段。同时该属性仅支持全局和文件夹作用域,因为文件类型作用域代码段本身已经指定了该属性。
prefix: 触发代码段的“前缀”字符。
body:代码段主体内容,格式为字符串数组,也就是说每行代码都需要用引号括起。
description:代码块的描述,输入“前缀”时会有提示。
除此之外,在代码段主体的书写上还有一些规则:1
2
31、每个字符串元素就代表一行,在单行内可以使用\r或者使用\n换行。
2、行内不能使用tab键缩进,只能使用空格或者\t缩进。
3、用$1表示敲击回车或者tab键一次后光标定位的位置。$2,$3,$4,...同理。
利用代码段功能方便Markdown博客编写
了解这个功能后,就可以应用它来帮助在VSCode中编写Markdown格式的博客。
我通常习惯在一个固定的工作区编写我的博客,所以新建一个“文件夹域”的代码段文件,如下:
书写代码段:1
2
3
4
5
6
7
8
9
10 "Add a Markdown code block":{
"scope": "markdown",
"prefix": "amcb",
"body": [
"```",
"$1",
"```"
],
"description": "Add a Markdown code block"
}
这时在.md文件中还不能直接使用,因为VSCode默认没有开启quickSuggestions。
打开当前工作区的settings.json
,添加如下配置:1
2
3
4
5
6
7"[markdown]":{
"editor.quickSuggestions": {
"other": "on",
"comments": "off",
"strings": "off"
}
}
这样以后,虽然代码段是有提示了:
可是还有很多不必要的提示,比如前文中出现的语句也会被加入到提示中来,有些麻烦:
于是我到VSCode官方文档中寻找,看看有没有什么办法,发现这其实是因为”editor.quickSuggestions”这个设置的属性粒度不够细致造成的,它将文件的内容区分为字符串、注释和其他,也就是说只要我启用了其他,那么文件中非注释和非字符串的内容都会被提示,我的个人建议是增加一个snippets属性,将该属性从other中划分出来,就可以完美的解决我的需求😄。
顺便一提VSCode有两种设置方式,用户设置和工作区(Workplace)设置,前者应用于全局,后者存在于项目根目录的.vscode
默认文件夹内,可以对当前项目覆盖用户设置(优先级更高)。
关于更多设置优先级相关,官网有更详细的解释。所以之前做的配置实际上是覆盖了用户配置。
最终还是选择了这种配置:1
2// on、off、onlySnippets
"editor.tabCompletion": "onlySnippets"
即:使用tab自动补全,但仅对于代码段使用。
这样虽然不会有输入建议提示,但胜在简洁,只需要把代码段的前缀设置的相对短,并记住即可,基本上我常用的也就是Markdown代码块和标题,用于填补Markdown All in One插件的缺点。
后记
后续可能给VSCode提个issue,建议一下关于粒度划分问题。