Intellij Live Templates 的简单使用

不会偷懒的程序员不是好程序员。

日常工作中的重复性劳动还是比较多的,比如内容大部分不变的格式化代码,尤其 Java 编程中常会出现而且长度往往还比较夸张。

以常常要定义的数据库表名称、列名称等常量为例,其内容一般为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
    public static final String TABLE_NAME = "book";

    public static final String COLUMN_ID = "id";

    public static final String COLUMN_AUTHOR = "author";

    public static final String COLUMN_PRICE = "price";

    public static final String COLUMN_PAGES = "pages";

    public static final String COLUMN_NAME = "name";

这里面 TABLE_NAME 基本是不变的,而列名变量名称 COLUMN_XXX 也往往和实际列名相关,更别提还有前面不变的一长串修饰符 + 类型名 public static final String。这些内容如果每次都要手动输入实在太麻烦,但是不写这么长又不合规范,总的来说是个劳心劳力的活计。刚好现代 IDE 和编辑器的 Live Templates 功能可以解决这个麻烦。

最简单的 Live Template 就是把长长的代码字符串用简写别名标记,然后输入简写后自动识别扩展为正确的代码。Intellij 里面的自动扩展按键为 Tab,而且 Intellij 还预定义了很多常用的简写,比如上面例子里的 public static final String ,其简写为 psfs:

psfs.gif

这样的用法极其类似 C 的宏,实际就是 IDE 智能化的进行了字符串的替换工作,原理不难理解。

下面进一步看看 Intellij 的对应设置如何:

  1. 进入 Intellij 的 File -> Settings… 菜单(或者直接使用快捷键 Ctrl + Alt + S)
  2. 找到 Editor 选项下的 Live Templates(或者直接在搜索框中输入 Live Templates)
  3. 在内容选择框中找到 plain 选项,点击打开,找到 psfs 条目
    settings.PNG

这样就可以看到这个简单模板的设置情况,其中的常用项目说明如下:

  • Abbreviation:简写,IDE 会自动识别这部分内容
  • Description:模板功能描述,可以在智能补全窗口看到
  • Template text:完整的代码内容,会替换简写的内容
  • Applicable in …:说明简写的适用范围,如这个例子里面就是适用于 Java 和 Groovy 语言的声明语句中

预定义好的模板虽然有不少,但是大多比较强调泛用性,可能没有个人常用的功能,终究需要自己定义一些常用的模板。 先从最简单的模仿开始 —— Intellij 很贴心的提供了这个功能 —— 点击设置界面右侧的 Duplicate 按钮即可:

  1. 修改 Abbreviation 为 prsfs
  2. 修改 Description 为 private static final String
  3. 修改 Template text 为 private static final String
  4. 其余设置不变,而后点击 OK 确认或者 Apply 应用
    duplicate.gif

而后,在编辑器界面输入 prsfs 可以看到弹出智能补全窗口,显示对此模板的描述,而后按 Tab 即可替换代码:

prsfs.gif

简单的 Live Template 只能做到替换功能,还比价原始,可用性并不强。实际的工作中有可能会遇到很多格式化的代码是根据具体情况而变化的,比如:

  • 需要程序包名或完整类名
  • 变量名和变量内容相关,但无法提前规定好

这样的模板才能算是实用性较强的东西,但是其实也不难定义。

  1. 先定义一个临时的模板组来管理示例模板:
    1. 点击 Add 按钮(+ 图标)或用快捷键 Alt + Insert
    2. 选择 Template Group…
    3. 输入组名称 example(可以自定义)
      example.gif
  2. 添加新的模板内容:
    1. 点击 Add 按钮(+ 图标)或用快捷键 Alt + Insert

    2. 选择 Live Template

    3. 编辑模板内容:

      • Abbreviation: fclname
      • Description: full class name
      • Template text: private static final String FULL_CLASS_NAME = "$class$";

      $…$ 是变量定义,其中包裹着变量名,如这个例子变量即 class

    4. 点击蓝色的 Define 选择模板应用范围为 Java 的声明语句(declaration)

      define.gif

    5. 确定变量取值

      1. 点击按钮 Edit variables
      2. class 对应的 Expression 选项中选择函数 qualifiedClassName()
        edit.gif
  3. 使用 OK 确定模板编辑

而后,在编辑器界面确认:

fclname.gif

详细设置步骤不再赘述,只需要将模板中用到变量的地方同样输入变量 $variableName$ 即可,例如:

1
String $name = "$name";

这样,只需要输入一次变量 name,就会自动填补出全部内容。 当然,实际工作碰到的情况会更复杂,比如:变量名大写但内容小写,或者变量名是驼峰字但内容是下划线分隔的。看起来很麻烦的功能其实都有相应的辅助函数可以使用,而要明白所有的辅助函数的作用,则要使用自带的帮助文档,可以再 Edit variables 窗口找到:

help.PNG

而后,就可以在文档中找到所有辅助函数,而且函数的参数可以是变量名称。

注意:必须先确定模板的应用范围,才能在 Expression 下拉列表里面找到可用的函数。

那么,对于一个要求变量名和内容相等,但变量名必须大写且用下划线分隔的模板,其内容可以是:

1
String $name = "$content";

而后,将 name 的 Expression 设置为 capitalizeAndUnderscore(content)

注意:content 两边没有 $ 包裹

所以,对于开头提到的数据库模板可以是如下设置:

tname.PNG
column.PNG
edit.PNG

注意

  • 在 column 的变量设置窗口中,使用旁边的箭头将想要第一个确定内容的变量上移(本例中为 cName
  • 勾选 Skip if defined 的作用是不对已定义内容的变量进行修改,光标自动移动到下一个变量处(如果没有,或者无需修改则到行尾)

总的来说,如今软件项目处处强调标准化、规格化,总会碰到大量的格式化代码,借助 Live Template 功能可以简化不少编码的劳动,再借助各种框架,实际写代码就会轻松不少了。 另外,其实有时间的时候阅读以下 Intellij 自带的 Live Templates 代码也有很大帮助,要慢慢培养自己高效编程的习惯。