[关闭]
@coder-pig 2023-04-13T17:27:41.000000Z 字数 4199 阅读 303

花3分钟,重拾开发效率神器 → Live Templates

2023


杰哥最近在思考如何提高公司APP的开发效率,以便挤出更多的 学(mo)习(yu) 时间。

其中一个痛点就是:手撕表单界面xml需要频繁CV组件代码,对于这种重复性的操作,使用 Live Templates 可以明显提高开发效率。

它可不是什么新东西了,网上介绍它的文章可谓烂大街,但大都:千篇一律 + 废话多多,不信的读者可以搜几篇看看~

好,不难看出两个要点:定义代码模板快捷键/缩写自动生成代码。接着图文并茂介绍下~

0x1、入门:走马观花

依次打开:SettingsLive Templates,右侧可以看到一些 内置模板

随手点开一个,如:AndroidKotlinnewInstance(),界面结构如下:

使用 两个美元符号$来定义一个变量(参数) ,比如上面的 $fragment$,也可以理解成 占位符。没啥好说,点击 Edit variables 可以对参数进行设置:

变量生成表达式,见名知意,通过 表达式定制代码生成过程中的变量和逻辑,点击下拉可以看到 内置的一些表达式

图中几个表达式的作用:

不用记,用到再查,idea官网都有:《predefined_functions》

对了,支持自定义Expression,ChatGPT说它除了支持Groovy外,还支持Java和Kotlin,但是搜了一圈发现基本都是Groovy写的,em...对这个回答持怀疑态度,哈哈,毕竟经常瞎编~

另外,有一点要注意:设置变量默认值,需要使用双引号(""),不然你会发现设置了默认值却没生效。当然,你也可以把默认值直接写到 Expression表达式 那里,效果也是一样的。

还有,支持指定指令生效的范围,点击Change:

配置起来还是比较简单的,接着随便新建一个 TestFragment,键入 newI + tab 即可快速生成:


0x2、基础:自定义模板

内置的模板肯定是满足不了日常的业务场景的,可以按需自定义。杰哥每次写表单提交页xml真的是头皮发麻,一堆这样的组件要CV:

  1. <TextView
  2. android:id="@+id/cil_total_floor_area"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. app:add_bottom_line="@{ true }"
  6. app:hint="请输入"
  7. app:input_view_dot_num="@{ 0 }"
  8. app:input_view_input_type_number="@{ true }"
  9. app:input_view_int_digit="@{ 8 }"
  10. app:must_fill_in="true"
  11. app:title="总占地面积"
  12. app:unit_text='@{ "m²" }' />

完全可以用自定义模板来简化,Copy下这段代码,ctrl + alt + aadd code template (也可以从Setting一步步打开):

然后点击 右侧+号

这里我选择新建 Template Group,专门拿来放公司的代码模板:

新建后选中模板组Company,新建模板,一般id和title是不同,这里定义成两个变量:

点击 Edit variables 对变量进行编辑:

指定指令生效范围 为xml:

接着随便打开一个xml文件,键入 cil + tab

可以看到:

光标先跳到title,输入 Company Address,id项自动转换并填充 company_address

简单得一批,读者还不赶紧燥起来~


0x3、进阶:自定义中文转英文的Expression

snakeCase()适用于英文的场景,而日常开发中,这个title只会是中文,内置Expression并没有找到 中转英。So,只能动手写一个了。idea提供了一个 groovyScript("groovy脚本代码 / groovy脚本路径", "传入参数") 给我们调用自定义的Expression。

搜了一圈,没发现内置的Expression写在哪个文件里,无奈只能自己推敲摸索了,有知道的读者欢迎评论区告知下~

CV了一段网上的Groovy脚本代码分析:

  1. groovyScript("def result=''; def params=\"${_1}\".replaceAll('[\\\\[|\\\\]|\\\\s]', '').split(',').toList(); for(i = 0; i < params.size(); i++) {result+=' * @param ' + params[i] + ((i < params.size() - 1) ? '\\n' : '')}; return result", methodParameters())

不难看出两个关键要素:(输入 + 输出):

接着就是处理中转英了,那肯定是需要调第三方API的啦,这里直接百度翻译走一波:百度翻译开放平台,注册个账号,个人认证,开通 通用文本翻译,升级 高级版

每个月可以白嫖100w次,基本是够了,实在不够可以充值一波。处理思路也很简单:调翻译接口 + 处理响应结果返回。Groovy不太熟怎么办?问ChatGPT啊~

23333,CV一下代码就行了?就这?我只能说:兄dei,你想多了!这代码TM是错的!!!

比如Sign的加密规则是MD5,而不是sha256:

ChatGPT的确是开发利器,但是 代码的正确性 还得自己掂量掂量!!!后面又让他出了好几种写法,加之反复踩坑,终于折腾出下面的脚本(自己填下appId和appKey就能用):

  1. import groovy.json.JsonSlurper
  2. import java.util.concurrent.CompletableFuture
  3. def query = _1 // 输入的中文参数
  4. def zh_pattern = /[\u4e00-\u9fa5]+/ // 匹配中文的正则
  5. // 百度翻译相关
  6. def appId = 'xxx' // 替换成自己的 App ID
  7. def appKey = 'xxx' // 替换成自己的 App Key
  8. def from = "zh" // 原始语言
  9. def to = "en" // 转换后的语言
  10. // 开启异步任务避免堵塞主线程
  11. def task = CompletableFuture.supplyAsync({
  12. // 构造salt参数
  13. def salt = System.currentTimeMillis().toString()
  14. // 构造Sign参数
  15. def sign = "${appId}${query}${salt}${appKey}".md5()
  16. // 拼接请求URL
  17. def url = "http://api.fanyi.baidu.com/api/trans/vip/translate" +
  18. "?q=${URLEncoder.encode(query, "UTF-8")}" +
  19. "&from=${from}" +
  20. "&to=${to}" +
  21. "&appid=${appId}" +
  22. "&salt=${salt}" +
  23. "&sign=${sign}"
  24. // 获取响应文本,转换为Json对象
  25. def json = new JsonSlurper().parseText(new URL(url).text)
  26. // 异常直接返回,正常返回翻译结果:转小写 + 空格转换为下划线 + 替换,
  27. return json.error_code ? "${json}" : json.trans_result[0].dst.toLowerCase().replaceAll(" ", "_").replace(",", "")
  28. })
  29. // 输入内容不为空 + 字符串长度大于1 + 且由中文组成 → 才触发转换,减少无效调用引起的卡顿
  30. if (query != null && query.toString().length() > 1 && query.toString().matches(zh_pattern)) {
  31. task.thenAccept({ result -> return result })
  32. task.join()
  33. } else {
  34. return "123"
  35. }

接着把脚本复制到 你喜欢的目录下,比如我这里直接放E盘根目录,接着设置下变量id的Expression:

保存完,就是见证奇迹的时刻:

细心你的应该发现了效果图有些 卡顿,笔者猜测:每次字符变化都会触发一次转换,简单的四个字会触发脚本四次,这里虽然我做了限制,2个字符以上才请求,所以其实会触发3次请求。

笔者想到的一个解决思路是:本地起一个服务器做中转等待一段时间间隔,只转发最后的请求,避免重复调用。

不过实施起来还是有些麻烦的,有更好简单思路的童鞋欢迎在评论区指点迷津,万分感激~

对了,最后补充一点,如果你想和别人Share你自定义的模板,可以在 → IDEA的配置路径: (~/Library/Application Support/JetBrains/templates) 找到相应组的xml (我的是AS):

把这个文件夹发过去,对方放到 templates 目录下即可(没有自己建)~

关于Live Templates的探索就到这,希望对你开发效率的提高有所裨益,谢谢~

====== 内容补充分割线 ======

2023.04.12

JB家的IDE 内置两个无法修改的预定义实时模板变量

看不懂,没关系,随手写个简单打印日志的简单模板示例:

接着打开一个kt文件,随便敲点东西,按Ctrl + Alt + T,选择上面的模板,即可实现自动填充:


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注