实现效果。最近,我正在写一个全新的项目。项目中经常创建各种类,导致经常写很多重复的东西,比如类名、命名空间、继承关系等。..那么有办法解决这个问题吗?我想到了这个主意。记得刚开始用sublimetext的时候,可以用代码片段功能生成大的html代码。当时觉得很方便。vscode有这个功能吗?谷歌后,我知道vscode有代码片段功能。既然有了一个idea,也具备了基本的实现条件,那就开始尝试把之前的idea实现起来。经过一些资料查询,发现vscodesnippet的引入是一个比较基础和简单的应用(只是插入固定代码和游标介绍)。很显然,我们无法实现我们生成类名和空位的想法。谷歌无果,只能看vscode的官方文档,有意想不到的收获。看了官网的介绍,基本确定这条路是可行的。Snippet示例在File>Preferences(macOS上为Code>Preferences)中选择UserSnippets,并在弹出框中选择相应的代码片段语言。我正在使用php"Printtoconsole":{"prefix":"log","body":["console.log('$1');","$2"],"description":"Logoutputtoconsole"}在打开的php.json中有示例代码:单独的行。description插件说明SnippetSyntax制表位(Tabstops)使用制表位(Tabstops)在代码片段中移动光标位置,使用$1,$2指定光标位置,数字代表光标移动的顺序,值得注意的是$0表示光标的最后位置。如果有多个相同的制表位(Tabstops),编译器中会同时出现多个光标(类似于编译器的块编辑模式)。占位符占位符是具有默认值的制表位。Placeholders的文字会插入到Tabstops的位置并且全部选中,方便修改,Placeholders可以嵌套,比如${1:another${2:placeholder}}。选择(Choice)占位符(Placeholders)可以有多个选择值,每个选项的值用,分隔,选项的开头和结尾用竖线符号(|)括起来,例如:${1|one,two,three|},当插入代码片段并选择Tabstops时,会列出选项供用户选择。变量(Variables)使用$name或${name|default}来插入变量的值。如果未分配变量,则插入默认值或空值。当变量未定义时,会插入变量名,并将变量(Variables)转换为占位符(Placeholders)。系统变量如下TM_SELECTED_TEXT当前选中的文本或空字符串TM_CURRENT_LINE当前行的内容TM_CURRENT_WORD光标下的单词内容或空字符串TM_LINE_INDEX从零开始的索引行号TM_LINE_NUMBER从一开始的索引行号TM_FILENAME当前文档文件nameTM_FILENAME_BASE当前文档文件名(无后缀)TM_DIRECTORY当前文档目录TM_FILEPATH当前文档完整文件路径CLIPBOARD剪贴板中的内容插入当前日期或时间:CURRENT_YEAR当前年份(四位)CURRENT_YEAR_SHORT当前年份(两位)CURRENT_MONTH当前月份CURRENT_MONTH_NAME月份的全称('July')CURRENT_MONTH_NAME_SHORT月份的简称('Jul')CURRENT_DATE当前日期CURRENT_DAY_NAME日期名称('Monday')CURRENT_DAY_NAME_SHORT日期的简称('Mon')CURRENT_HOUR当前小时CURRENT_MINUTE当前分钟CURRENT_SECOND当前第二行当前语言的注释或块注释:BLOCK_COMMENT_START块注释开始标志,如PHP/*或HTMLLINE_COMMENT行注释,如:PHP//或HTML下面这一段会生成PHP/HelloWorld/{"hello":{"scope":"php","prefix":"hello","body":"$BLOCK_COMMENT_STARTHelloWorld$BLOCK_COMMENT_END"}}变量变换(Variabletransforms)允许在变量之前插入要改变一个变量的值,变量变换(Variabletransforms)由三部分组成。正则匹配:使用正则表达式匹配变量值,如果无法解析变量,则值为空格式字符串:允许引用正则表达式匹配组。格式字符串允许有条件的插入和简单的修改。正则表达式匹配选项下面的例子是使用变量转换(Variabletransforms)将带后缀的文件名转换为不带后缀的文件名${TM_FILENAME/(.*)\\..+$/$1/}||||||||->没有选项设置||||||->参考捕获组第一组内容||||||->匹配后缀前的所有字符串|||->Filename(带后缀)需求实现问题待解决GenerateClass命名空间、类名、select继承关系问题分析项目目录结构如下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_BASEextends${1|BaseService,BaseController,BaseModel|}","{","\tpublicfunction__construct()\r\n{\n\t\t\\$this->model=new\r\n\t}","}"],"description":"generateserviceclass"},一些思考上面的代码基本完成了我想要实现的功能,但是也存在一些问题,比如:我现在使用的是windows操作系统,所以目录通过TM_DIRECTORY获取如果peoject\application\admin\services是linux系统,这段代码无法正常生成命名空间。查了一下资料,代码片段没有自定义变量的功能(也许可以,但是我们还没找到方法,有大牛知道的请留言赐教。用对vscodesnippet的深入理解,很难实现我在使用codesnippets之前设想的解决方案,vscode将其作为一种快速生成代码的解决方案,我们写的codesnippet相当于一个填空模板,而代码片段的应用就是生成一个带有tabs的代码模板,然后按照tabs的顺序补全代码。至于这个不完美的方案,我打算研究一下代码片段是否可以完全实现。如果它仍然无法解决,我会尝试其他解决方案。参考链接Creatingyourownsnippets
