最近在写一个全新的项目,在项目中频繁建立各类类,这就致使不少重复的东西须要频繁的写,例如类名,命名空间,继承关系...那么有没有一种 办法能解决这个问题呢?php
我想起了,最初用 sublime text
的时候,能够利用代码片断功能大段的生成html代码,当时就以为十分的方便,那么 vscode
有没有这个功能呢?通过 google
以后我知道 vscode
是有代码片断功能的。既然有了想法,也具有了基础实施条件,那么接下来开始尝试实现以前的想法。html
通过一番 google
后发现对于 vscode snippet
介绍都在相对基础的简单应用(只是一些插入固定代码和光标介绍),者显然没法实现咱们生成类名和明明空间的想法,google
无果,那么只能看看 vscode
官方文档果真有意想不到的收获,看完官网介绍后,基本就肯定此路是可行的。linux
在 File > Preferences (Code > Preferences on macOS)
中选择 User Snippets
在弹出框里选择对应的代码片断语言,我这里使用的是php正则表达式
"Print to console": { "prefix": "log", "body": [ "console.log('$1');", "$2" ], "description": "Log output to console" }
在打开的 php.json
中有示例代码:json
Print to console
代码片断名称prefix
插件前缀body
插件内容能够是字符串,也能够为数组,若为数组每一个元素都作为单独的一行插入。description
插件描述使用制表位(Tabstops)但是在代码片断中移动光标位置,使用$1
,$2
来指定光标的位置,数字表明光标的移动的顺序,值得注意的时$0
表明光标的最后位置。若是有多个相同的制表位(Tabstops)会在编译器里同时出现多个光标(相似编译器的块编辑模式)。windows
占位符(Placeholders) 是带默认值的制表位(Tabstops),占位符(Placeholders)的文本会被插入到制表位(Tabstops)所在位置而且全选以方便修改,占位符(Placeholders)能够嵌套使用,好比${1:another ${2:placeholder}}
。数组
占位符(Placeholders)能够有多选值,每一个选项的值用 ,
分隔,选项的开始和结束用管道符号(|
)将选项包含,例如: ${1|one,two,three|}
,当插入代码片断,选择制制表位(Tabstops)的时候,会列出选项供用户选择。app
使用 $name
或者 ${name|default}
能够插入变量的值,若是变量未被赋值则插入 default
的值或者空值 。当变量未被定义,则将变量名插入,变量(Variables)将被转换为占位符(Placeholders)
系统变量以下this
TM_SELECTED_TEXT
当前选定的文本或空字符串TM_CURRENT_LINE
当前行的内容TM_CURRENT_WORD
光标下的单词的内容或空字符串TM_LINE_INDEX
基于零索引的行号TM_LINE_NUMBER
基于一索引的行号TM_FILENAME
当前文档的文件名TM_FILENAME_BASE
当前文档的文件名(不含后缀名)TM_DIRECTORY
当前文档的目录TM_FILEPATH
当前文档的完整文件路径CLIPBOARD
剪切板里的内容插入当前日期或时间:google
CURRENT_YEAR
当前年(四位数)CURRENT_YEAR_SHORT
当前年(两位数)CURRENT_MONTH
当前月CURRENT_MONTH_NAME
本月的全名(’七月’)CURRENT_MONTH_NAME_SHORT
月份的简称(’Jul’)CURRENT_DATE
当前日CURRENT_DAY_NAME
当天的名称(’星期一’)CURRENT_DAY_NAME_SHORT
当天的短名称(’Mon’)CURRENT_HOUR
当前小时CURRENT_MINUTE
当前分钟CURRENT_SECOND
当前秒当前语言的行注释或块注释:
BLOCK_COMMENT_START
块注释开始标识,如 PHP /*
或 HTML <!--
BLOCK_COMMENT_END
块注释结束标识,如 PHP */
或 HTML -->
LINE_COMMENT
行注释,如: PHP //
或 HTML <!-- -->
下面片则会生成 PHP / Hello World /
{ "hello": { "scope": "php", "prefix": "hello", "body": "$BLOCK_COMMENT_START Hello World $BLOCK_COMMENT_END" } }
变量转换(Variable transforms) 容许变量在插入前改变变量的值,变量转换(Variable transforms)由三部分组成
下面例子是使用变量转换(Variable transforms)将带后缀的文件名转换为不带后缀的文件名
${TM_FILENAME/(.*)\\..+$/$1/} | | | | | | | |-> 无选项设置 | | | | | |-> 引用捕获组的第一个分组内容 | | | | | |-> 匹配后缀前的全部字符串 | | |-> 文件名(带后缀)
生成Class 的命名空间、类名、选择继承关系
项目目录结构以下所示
peoject | |----application |--------admin |------------services |----------------TestServices.php
类名能够直接使用 TM_FILENAME_BASE
变量的值便可,命名空间则须要使用 TM_DIRECTORY
变量,以 TestServices.php
为例,TM_DIRECTORY
获得的目录为 peoject\application\admin\services
咱们只须要将peoject\application\
替换为 app
获得 app\admin\services
就是咱们的明明空间了,至于继承就是一个选择项就能够了。既然已经所有知道该如何实现,接下来就是代码实现的过程了。
"service-construct" :{ "prefix": "gen", "body": [ "namespace ${TM_DIRECTORY/.*application/app/};\n", "class $TM_FILENAME_BASE extends ${1|BaseService,BaseController,BaseModel|}", "{", "\tpublic function __construct() \r\n {\n\t\t\\$this->model = new \r\n\t}", "}" ], "description": "generate service class" },
上述代码基本上完成了我要实现的功能,可是也存在了一些问题,例如:我如今是用 windows
操做系统,于是TM_DIRECTORY
获得的目录为 peoject\application\admin\services
如果 linux
系统,此代码片断是没法正常的生成命名空间的,我作了一些资料的搜索,代码片断并无自定义变量的功能(也许能够,只是我么有找到方法,若是有知道的大牛,请留言赐教。
随着对 vscode snippet
的深刻了解,我以前所设想的方案要用代码片断的方式实现是有些困难的,vscode
将其做为一个快速生成代码的解决方案,咱们所写的代码片断至关于一个带有填空模板,而对代码片断的应用就是生成带有制表符的代码模板,而后根据制表符顺序补全代码。
至于这个不完美的方案,我打算再研究一下代码片断是否能彻底实现,若是依旧解决不了,就选用其它方案进行尝试。