利用 Vscode snippets 和項目成員一起提高開發(fā)效率
code snippets 是代碼片段的意思,是 vscode 提供的根據(jù)某字符串快速補全一段代碼的功能,可以提高寫代碼的效率。

vscode 的 snippets 是可以隨項目共享的,多人開發(fā)一個項目的時候,可以維護項目級別的 snippets 并且通過 git 共享,來提高項目開發(fā)效率。
下面我們來詳細(xì)了解下 snippets。
snippets 的功能
snippets 配置的格式如下:
- {
- "For Loop": {
- "prefix": ["for", "for-const"],
- "body": ["for (const ${2:element} of ${1:array}) {", "\t$0", "}"],
- "description": "A for loop."
- }
- }
- prefix 是觸發(fā) snippets 的前綴,可以通過數(shù)組指定多個
- body 是填入到編輯器的內(nèi)容
- description 是 snippets 的描述
其中 body 部分可以通過 ${} 的方式指定光標(biāo)位置、順序、占位字符串、可用的值等,有 5 種語法,我們分別來看一下:
光標(biāo)跳轉(zhuǎn):$1 $2
可以通過 $1、$2 指定光標(biāo)位置,當(dāng)填入 snippets 的內(nèi)容之后,光標(biāo)會設(shè)置到 $1 的位置來編輯,當(dāng)編輯完,可以通過 tab 來跳到 $2。
比如這段配置:
- {
- "測試": {
- "scope": "javascript,typescript",
- "prefix": "test",
- "body": [
- "$1 xxxx",
- "yyyy $2",
- ],
- "description": "光標(biāo)跳轉(zhuǎn)"
- }
- }
效果為:

還有當(dāng)有多個 $1、$2 等,編輯一處其他內(nèi)容也會同步修改,也就是 vscode 的多光標(biāo)編輯。
比如:
- {
- "測試": {
- "scope": "javascript,typescript",
- "prefix": "test",
- "body": [
- "$1 xxxx $1",
- ],
- "description": "多光標(biāo)"
- }
- }
效果為:
通過這種功能可以快速編輯 snippets 中的可編輯內(nèi)容。
占位符:${1: placeholder}
只是光標(biāo)跳轉(zhuǎn)雖然可以快速編輯內(nèi)容,但是不知道編輯的部分是什么,所以 snippets 支持了設(shè)置 placeholder 的值,默認(rèn)會選中該段文本,輸入內(nèi)容即可覆蓋。
比如:
- {
- "測試": {
- "scope": "javascript,typescript",
- "prefix": "test",
- "body": [
- "${1:aaa} xxxx",
- "yyyy ${2:bbb}",
- ],
- "description": "光標(biāo)跳轉(zhuǎn)"
- }
- }
效果為:
可選值:${1|text1,text2,text3|}
占位符的方式就像 input 標(biāo)簽加了個 placeholder 屬性,還是要手動輸入,當(dāng)可編輯區(qū)域是有幾個可選的值的話,就要換成下拉選擇,在 snippets 里就是通過:
${1|text1,text2,text3|} 的方式支持,在 | 和 | 之間填入通過 , 分割的多個選項。
比如:
- {
- "測試": {
- "scope": "javascript,typescript",
- "prefix": "test",
- "body": [
- "${1|神說要有光,卡頌|}"
- ],
- "description": "可選值"
- }
- }
效果為:
變量:$變量名
在模版可編輯位置填入內(nèi)容的時候,有的時候需要用到選中的值、剪貼板的值、文件名、日期等,這些信息通過 snippets 中支持的變量來取。
比如:
- TM_FILENAME: 文件名
- TM_CURRENT_LINE: 當(dāng)前行的內(nèi)容
- CLIPBOARD: 剪貼板內(nèi)容
- WORKSPACE_NAME:workspace 的名字
- WORKSPACE_PATH:workspace 的路徑
- CURRENT_YEAR:當(dāng)前年
- CURRENT_MONTH:當(dāng)前月
- CURRENT_DATE:當(dāng)前日
- RANDOM: 隨機數(shù)
- RANDOM_HEX: 6 位隨機 16 進(jìn)制數(shù)
- UUID: 唯一 id
可以取這些變量的值來填入到光標(biāo)位置,方式就是使用 $TM_FILENAME、$CURRENT_YEAR 的方式。
比如:
- {
- "測試": {
- "scope": "javascript,typescript",
- "prefix": "test",
- "body": [
- "當(dāng)前文件: $TM_FILENAME",
- "當(dāng)前日期: $CURRENT_YEAR/$CURRENT_MONTH/$CURRENT_DATE"
- ],
- "description": "變量"
- }
- }
效果為:
變量轉(zhuǎn)換:${變量名/匹配的正則/替換到的字符串/匹配模式}
支持了變量的填入還不行,因為有的變量的內(nèi)容不合適,需要做一些字符串替換,所以 snippets 只吃了 transform 的功能。
比如 abc-123.js 的文件,
我們通過 $TM_FILENAME 取到文件名,然后把后綴去掉轉(zhuǎn)成大寫填入
- ${TM_FILENAME/(.*)\\.[a-z]+/${1:/upcase}/i}
對文件名 TM_FILENAME 做正則匹配 (.*).[a-z]+,把分組一變成大寫之后返回,匹配模式為忽略大小寫(ignore)。
- {
- "填入文件名": {
- "scope": "javascript,typescript",
- "prefix": "filename",
- "body": [
- "${TM_FILENAME/(.*)\\.[a-z]+/${1:/upcase}/i}"
- ],
- "description": "文件名"
- }
- }
我們實驗下效果:

可以看到,正確的取到了文件名,并且去掉后綴轉(zhuǎn)成大寫填入了。
知道了 snippets 的功能,那么怎么設(shè)置 snippets 呢?snippets 在什么范圍內(nèi)生效呢?
snippets 的范圍
command + shift + p 打開命令面板,輸入 snippet,選擇 configure user snippets:
可以選擇創(chuàng)建全局的、項目范圍的、語言范圍的 snippets:
分別會打開不同位置的文件來添加 snippets。
語言級別的 snippets 是對于特定語言才生效,這個還可以封裝成插件。在插件的 package.json 中配置下即可:
- {
- "contributes": {
- "snippets": [
- {
- "language": "javascript",
- "path": "./snippets.json"
- }
- ]
- }
- }
項目范圍的 snippets 是在項目根目錄的 .vscode/xxx.code-snippets 下面添加的,vscode 啟動的時候會讀取這些文件,然后使之在項目范圍內(nèi)生效。
當(dāng)有一些項目級別的代碼片段可以共享的時候,完全把這個文件提交到遠(yuǎn)程 git 倉庫,然后項目成員都可以共享這些 snippets 設(shè)置。對于一些模版代碼比較多的項目,還是比較有意義的。
總結(jié)
snippets 是 vscode 提供的用于提高開發(fā)效率的一些快速輸入代碼片段的功能,支持光標(biāo)位置的跳轉(zhuǎn)、多光標(biāo)同時編輯、占位符、可選值、變量、變量轉(zhuǎn)換等功能,靈活運用這些功能,可以作出易用的提高開發(fā)效率的 snippets。
snippets 有 global、language、project 3 種生效范圍:global 是全局的設(shè)置;language 是語言級別的設(shè)置,可以進(jìn)一步封裝成插件共享;project 則是項目范圍內(nèi)的,在 .vscode 下的 xx.code-snippets 中,完全可以提交到 git 倉庫,和其他成員共享。
靈活運用 snippets 功能,是可以提高開發(fā)效率的,而且這個也是可以項目級別共享的。希望這篇文章能夠幫大家了解 snippets。
【編輯推薦】