摘要:插件描述語法制表位使用制表位可是在代碼片段中移動光標位置,使用來指定光標的位置數字代表光標的移動的順序,值得注意的時代表光標的最后位置。
實現效果 起因
最近在寫一個全新的項目,在項目中頻繁創建各種類,這就導致很多重復的東西需要頻繁的寫,例如類名,命名空間,繼承關系...那么有沒有一種 辦法能解決這個問題呢?
提出設想我想起了,最初用 sublime text 的時候,可以利用代碼片段功能大段的生成html代碼,當時就覺得十分的方便,那么 vscode 有沒有這個功能呢?經過 google 之后我知道 vscode 是有代碼片段功能的。既然有了想法,也具備了基礎實施條件,那么接下來開始嘗試實現之前的想法。
資料查詢經過一番 google 后發現對于 vscode snippet 介紹都在相對基礎的簡單應用(只是一些插入固定代碼和光標介紹),者顯然無法實現我們生成類名和明明空間的想法,google 無果,那么只能看看 vscode 官方文檔果然有意想不到的收獲,看完官網介紹后,基本就確定此路是可行的。
snippet 示例在 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 中有示例代碼:
Print to console 代碼片段名稱
prefix 插件前綴
body 插件內容可以是字符串,也可以為數組,若為數組每個元素都做為多帶帶的一行插入。
description 插件描述
Snippet 語法 制表位(Tabstops)
使用制表位(Tabstops)可是在代碼片段中移動光標位置,使用$1,$2來指定光標的位置,數字代表光標的移動的順序,值得注意的時$0代表光標的最后位置。如果有多個相同的制表位(Tabstops)會在編譯器里同時出現多個光標(類似編譯器的塊編輯模式)。
占位符(Placeholders)占位符(Placeholders) 是帶默認值的制表位(Tabstops),占位符(Placeholders)的文本會被插入到制表位(Tabstops)所在位置并且全選以方便修改,占位符(Placeholders)可以嵌套使用,比如${1:another ${2:placeholder}}。
選擇項(Choice)占位符(Placeholders)可以有多選值,每個選項的值用 , 分隔,選項的開始和結束用管道符號(|)將選項包含,例如: ${1|one,two,three|},當插入代碼片段,選擇制制表位(Tabstops)的時候,會列出選項供用戶選擇。
變量(Variables)使用 $name 或者 ${name|default} 可以插入變量的值,如果變量未被賦值則插入 default 的值或者空值 。當變量未被定義,則將變量名插入,變量(Variables)將被轉換為占位符(Placeholders)
系統變量如下
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 剪切板里的內容
插入當前日期或時間:
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
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)由三部分組成
正則匹配:使用正則表達式匹配變量值,若變量無法解析則值為空。
格式串:允許引用正則表達式匹配組。格式串允許條件插入和做簡單的修改。
正則表達式匹配選項
下面例子是使用變量轉換(Variable transforms)將帶后綴的文件名轉換為不帶后綴的文件名
${TM_FILENAME/(.*)..+$/$1/} | | | | | | | |-> 無選項設置 | | | | | |-> 引用捕獲組的第一個分組內容 | | | | | |-> 匹配后綴前的所有字符串 | | |-> 文件名(帶后綴)需求實現 要解決的問題
生成Class 的命名空間、類名、選擇繼承關系
問題分析項目目錄結構如下所示
peoject | |----application |--------admin |------------services |----------------TestServices.php
類名可以直接使用 TM_FILENAME_BASE 變量的值即可,命名空間則需要使用 TM_DIRECTORY 變量,以 TestServices.php 為例,TM_DIRECTORY 得到的目錄為 peojectapplicationadminservices我們只需要將peojectapplication 替換為 app 得到 appadminservices 就是我們的明明空間了,至于繼承就是一個選擇項就可以了。既然已經全部知道該如何實現,接下來就是代碼實現的過程了。
代碼實現"service-construct" :{ "prefix": "gen", "body": [ "namespace ${TM_DIRECTORY/.*application/app/}; ", "class $TM_FILENAME_BASE extends ${1|BaseService,BaseController,BaseModel|}", "{", " public function __construct() { $this->model = new }", "}" ], "description": "generate service class" },一些思考
上述代碼基本上完成了我要實現的功能,但是也存在了一些問題,例如:我現在是用 windows 操作系統,因而TM_DIRECTORY 得到的目錄為 peojectapplicationadminservices 若是 linux 系統,此代碼片段是無法正常的生成命名空間的,我做了一些資料的搜索,代碼片段并沒有自定義變量的功能(也許可以,只是我么有找到方法,如果有知道的大牛,請留言賜教。
隨著對 vscode snippet 的深入了解,我之前所設想的方案要用代碼片段的方式實現是有些困難的,vscode 將其作為一個快速生成代碼的解決方案,我們所寫的代碼片段相當于一個帶有填空模板,而對代碼片段的應用就是生成帶有制表符的代碼模板,然后根據制表符順序補全代碼。
至于這個不完美的方案,我打算再研究一下代碼片段是否能完全實現,如果依舊解決不了,就選用其它方案進行嘗試。
Creating your own snippets
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30995.html
摘要:目的是為了減少工作量。入口在選擇圖示的文件,那么這里就是可以自定義的代碼片斷的地方。我舉一個例子你們就明白了,看代碼打印在這段代碼中,是指你要提示的代碼前綴,效果如圖第二個就是我們自定義的代碼片段選擇之后的效果這個就是我們在代碼中定義的。 作為一名前端開發工程師,我們每天都想著代碼怎么抽成組件,公共方法。目的是為了減少工作量。但是你有沒有想過我們一直在寫重復的代碼,比如每天都會寫 im...
摘要:做個記錄,上菜了如何打開配置這里以為例,其他編輯器大概也差不多。時間相關當前年份當前年份的后兩位格式化為兩位數字的當前月份,如當前月份的全稱,如當前月份的簡稱,如當天月份第幾天當天周幾,如當天周幾的簡稱,如當前小時小時制當前分鐘當前秒數。 為什么談到Snippet 今天下午在用vscode做小程序的時候,發現很不方便,因為商店里提供的代碼片段極為有限,而且平時幾乎每天都需要用到代碼片段...
摘要:做個記錄,上菜了如何打開配置這里以為例,其他編輯器大概也差不多。時間相關當前年份當前年份的后兩位格式化為兩位數字的當前月份,如當前月份的全稱,如當前月份的簡稱,如當天月份第幾天當天周幾,如當天周幾的簡稱,如當前小時小時制當前分鐘當前秒數。 為什么談到Snippet 今天下午在用vscode做小程序的時候,發現很不方便,因為商店里提供的代碼片段極為有限,而且平時幾乎每天都需要用到代碼片段...
摘要:學會添加自定義代碼段就可以極大的提高你的開發效率文件首選項用戶代碼片段選擇你需要新建的代碼片段的語言進入代碼片段編輯界面所有的代碼片段需要用或包裹表示制表符空的一行必須用或包裹代表光標第一次出現的位置,代表按下后光標第二次出現的位置一個簡單 學會添加自定義snippet(代碼段)就可以極大的提高你的開發效率 showImg(https://segmentfault.com/img/bV...
閱讀 3540·2019-08-30 12:58
閱讀 923·2019-08-29 16:37
閱讀 2796·2019-08-29 16:29
閱讀 3105·2019-08-26 12:18
閱讀 2365·2019-08-26 11:59
閱讀 3405·2019-08-23 18:27
閱讀 2770·2019-08-23 16:43
閱讀 3301·2019-08-23 15:23