20200928更新 添加 預(yù)定義函數(shù) groovyScript 的使用方式
live template是什么?
live template是一個(gè)預(yù)定義的代碼模板,其中的內(nèi)容能夠根據(jù)上下文信息自動(dòng)推斷.
首先放下效果圖
相對(duì)于手動(dòng)打出整塊代碼,很簡(jiǎn)潔有沒(méi)有?如果這種毫無(wú)技術(shù)含量的代碼都通過(guò)live template 來(lái)自動(dòng)生成,有下面兩個(gè)好處
1. 有更多的時(shí)間關(guān)注于業(yè)務(wù)邏輯,核心代碼可以更優(yōu)雅
2. 減少低級(jí)錯(cuò)誤出現(xiàn)的可能,之前手寫(xiě)拼錯(cuò)和括號(hào)錯(cuò)位真是血和淚的教訓(xùn)
筆者很早之前就注意到這個(gè)功能,也查看過(guò)官方文檔和博客,都不能盡如人意.本文會(huì)以上面為例,從頭到尾完成一個(gè)live template,并介紹其大部分功能
一個(gè)完整的示范
-
新建一個(gè)live template
image.png -
填寫(xiě)縮寫(xiě)和說(shuō)明
image.png
這樣使用時(shí)如果輸入了對(duì)應(yīng)的縮寫(xiě),會(huì)有如下的提示
-
設(shè)置模板的作用范圍
剛創(chuàng)建模板時(shí)idea應(yīng)該會(huì)提示設(shè)置作用范圍,我這里是已經(jīng)設(shè)置過(guò)了,所以提示更改, 這里應(yīng)該相差不大
image.png
這里我只勾選了在表達(dá)式
和語(yǔ)句
時(shí)輸入會(huì)觸發(fā), 其他情況下不會(huì)觸發(fā).例如在方法外輸入unq,ide不會(huì)給任何提示
image.png 設(shè)置模板
live template中模板變量使用$
包裹的,并且是可復(fù)用的,下面的模板就是將會(huì)變動(dòng)的字段提取為變量
Object result = $CACHE_NAME$.get(String.valueOf($PARAMETER$),
x -> getSession().createCriteria($RETURN_TYPE$.class)
.add(Restrictions.eq("$END$$PARAMETER$", $PARAMETER$)).setMaxResults(1)
.uniqueResult());
return result == null ? null : ($RETURN_TYPE$) result;
- 設(shè)置強(qiáng)大的
預(yù)定義函數(shù)
關(guān)于預(yù)定義函數(shù)參見(jiàn)官方文檔
進(jìn)入編輯變量頁(yè)面,對(duì)變量設(shè)置需要的函數(shù)(這里很坑,我還以為是在模板里直接使用預(yù)定義函數(shù),結(jié)果是預(yù)定義函數(shù)要附在變量上
),個(gè)人認(rèn)為這個(gè)功能很強(qiáng)大
image.png
這里可以調(diào)整變量的填充順序,設(shè)置需要的預(yù)定義函數(shù),這里就簡(jiǎn)單介紹下用到的兩個(gè)函數(shù)
1. complete() 光標(biāo)跳轉(zhuǎn)到該變量位置時(shí)會(huì)打開(kāi)智能補(bǔ)全,不確定要用什么就用它
2. methodReturnType() 使用當(dāng)前方法的返回類(lèi)型設(shè)置當(dāng)前變量
image.png
進(jìn)階篇: 使用預(yù)定義函數(shù)groovyScript
groovyScript使用Groovy提供更強(qiáng)大的能力,例如打印當(dāng)前類(lèi)中所有實(shí)例字段的名稱(chēng).演示前說(shuō)明幾點(diǎn)
- groovyScript的Expression可以是一段groovy代碼,也可以是指向Groovy腳本文件的絕對(duì)位置,它執(zhí)行后需要返回一個(gè)字符串表示結(jié)果
- groovyScript中可以使用_editor,表示當(dāng)前編輯器窗口,是EditorImpl的實(shí)例
下面開(kāi)始演示
IDEA添加必備jar包
IDEA安裝路徑/lib目錄添加 qdox jar包,我們需要用它去讀取源文件定義 groovy腳本文件
這段腳本讀取當(dāng)前編輯器窗口對(duì)應(yīng)的java源文件,讀取并返回所有實(shí)例字段的名稱(chēng)
//FieldPrinter.groovy
import com.thoughtworks.qdox.JavaProjectBuilder
import java.nio.charset.StandardCharsets
import java.util.stream.Collectors
def builder = new JavaProjectBuilder();
builder.setEncoding(StandardCharsets.UTF_8.toString())
def file = new File(_editor.getVirtualFile().getPath())
builder.addSource(file)
def clazz = builder.getClasses().iterator().next();
def fieldNames = clazz.getFields().stream().filter({f -> !f.isStatic()}).map({f -> f.getName()}).collect(Collectors.toList())
return fieldNames.stream().collect(Collectors.joining(","));
-
定義 live template
image.png -
運(yùn)行結(jié)果
image.png
-
$END$
是特殊的預(yù)定義變量,表示模板結(jié)束后的光標(biāo)位置 - idea有很多預(yù)定義的live template.很值得參考