如何提高开发生产力 - 完整版
引言: 本文章将分四大板块介绍提高程序员生产力的方案,最大化利用你的IDE ,其中Live Template篇,插件篇非常值的一看, 用好才能提速增效
Productity Guide篇
自行打开 IDEA - help - My productity (旧版本叫Productity Guide) , idea统计的生产力特性,熟练掌握这些特性,开发事半功倍
Tips: 大部分特性包含快捷键操作,快捷键因为WIN MAC或者idea键位不同,然后IDEA提供了多种版本快捷键,所以选择自己适合的即可(sublime /eclipse/vs等),如果你没有适合的,或者你刚从其他工具转到idea来,那么我建议选择idea classic , 因为你换了操作系统之后键位不会变化太大
以下是根据Used排名,筛选出比较重要的功能介绍
-
Syntax aware selection(语法感知选择):为什么这里用得这么多,因为平时我们会双击一个单词来选择这个单词也会被统计计入
-
Windows:
CTRL+W
-
MAC:
⌘W
-
-
Basic code completion (基础代码补全): 输入. 就会自动唤醒,无需按快捷键,但是需要掌握
- Windows:
Ctrl+空格
- MAC:
⌃Space
- Windows:
-
Go to declaration(转到声明):实际我个人用得不多,建议 CTRL 加鼠标左键,无鼠标用户需要掌握
-
Windows:
Ctrl+B
-
MAC:
⌘B
-
Go to implementation (实现类跳转) : 实际我个人用得不多,建议
Ctrl+ALT+鼠标左键
, 无鼠标用户需要掌握- Windows:
Ctrl+Alt+B
- MAC:
⌥⌘B
- Windows:
-
Complete statement (语句智能补全) : 这个功能五星推荐 ,不仅仅是帮你补全你输入的一半字符串,而且当你一个语句发现少一个分号的时候
;
, 直接 ALT+SHIFT+ENTER帮你补全上,当你输入if的时候没有帮你加括号的时候,当你语句排版很乱的时候,按一下,奇迹就会出现-
Windows:
Ctrl+Shift+Enter
-
MAC:
⇧⌘⏎
-
-
Search Everywhere (随处搜索): 双击Shift searchAll , 按TAB切换相关TAB,也可以记住下面的快捷键,一次定位
-
Windows:
Shift+Shift
随处搜索Ctrl+N
搜索类 ,Ctrl+Shift+N
搜索文件 ,Ctrl+Alt+Shift+N
for 字段和方法,Ctrl+Shift+A
搜索Actions ( IDEA模块功能关键字) -
MAC:
⇧+⇧
随处搜索⌘N
搜索 类,⇧⌘N
搜 文件,⌥⇧⌘N
for 字段和方法⇧⌘A
搜索 Actions(操作)
-
-
File structure popup (文件结构弹出): 超级好用的一个功能,找方法或者找全局变量超级快 , 也可以快速找内部类
-
Windows:
Ctrl+F12
-
MAC:
⌘F12
-
-
Speed search in trees(树形结构快速搜索): 在树状视图中均可用,比如在左边项目结构中
-
Use Introduce Variable to quickly declare variables (使用引入变量快速声明变量): tips , 直接把光标放在语句中即可,系统会自动识别,不用全选你要声明的变量
-
Windows:
Ctrl+Alt+V
-
MAC:
⌥⌘V
-
-
CamelCase prefixes in code completion(驼峰前缀搜索): 有一定用,但是又用得不多
-
Highlight method throws (高亮方法抛出异常): 这个真没用 , 比如选了第二个FileFoundException之后,会高亮箭头所指代码
-
Windows:
Ctrl+Shift+F7
-
MAC:
⇧⌘F7
-
-
Override or implement a method (重写或实现方法) : 一定要记住,非常重要的功能
- Windows:
Ctrl+O
重写方法Ctrl+I
实现方法 - MAC:
⌘O
重写方法,⌘I
实现方法
- Windows:
-
Go to class (转到类) : 实用,建议记住
-
Windows:
Ctrl+N
-
MAC:
⌘N
-
-
Go to file (转到文件): 记住,重要
-
Windows:
Ctrl+Shift+N
-
MAC:
⇧⌘N
-
-
Comment or uncomment a block (注释或取消注释块):实用,记住
- Windows:
Ctrl+/
单行注释Ctrl+shift+/
多行注释 - MAC:
⌘/
单行注释⌃⇧/
多行注释
- Windows:
-
Finish lookup with smart enter (使用智能回车完成查找):同 Complete statement (语句智能补全) , jetbrains换个名字继续炫
- Windows:
Ctrl+Shift+Enter
- MAC:
⇧⌘⏎
- Windows:
-
Editor delete line (编辑器删除行): 实用,要记住 , 按一下光标所在那一行直接就删掉了,ctrl+z回滚刚刚的操作
- Windows:
Ctrl+Y
- MAC:
⌘Y
- Windows:
-
Evaluate expression (计算表达式): 实用,仅调试时候有效 , 对着表达式右键可以出来一个弹框,可以自己输入表达式计算
-
Windows:
ALT+鼠标点击表达式
-
MAC:
⌥ + 鼠标点击表达式
-
-
Surround statement with (语句环绕): 很好用的功能,一般用来环绕try catch 或者if,不过后面把try catch写入模板后,这个功能用得也不多
-
Windows:
Ctrl+Alt+T
-
MAC:
⌥⌘T
-
-
Type-matching completion after new (new关键字后面的类型匹配补全):输入new后再输快捷键,会帮你进行类型匹配补全,不实用,现在补全都是很智能的,都直接把ArrayList放在第一个,不需要你按快捷键了, 没什么用
-
Windows:
Ctrl+Shift+空格
-
MAC:
⌃⇧Space
-
-
Rename (重命名): 类名、方法名、变量名,使用的地方都会一起改,很实用
-
Windows:
Shift+F6
-
MAC:
⇧F6
-
-
Postfix completion (后缀补全):快捷键. 具体有哪些后缀补全可以进入Preferences | Editor | General | Postfix Completion 中查看,可以记住一些简单的,var , new ,if 等。
-
Windows:
Ctrl+J
展示后缀补全列表 -
MAC:
⌘J
同上
-
-
Edit breakpoint (编辑断点):
- Windows:
对着断点右键
- MAC:
对着断点右键
- Windows:
-
Second basic completion (二次基础补全) : 同 Basic code completion (基础代码补全)快捷键,作用是可以看到不允许访问的类和成员(属性、方法)
- Windows:
Ctrl+空格
- MAC:
⌃Space
- Windows:
-
Surround expression with (表达式环绕): 同 Surround statement with (语句环绕)
- Windows:
Ctrl+Alt+T
- MAC:
⌥⌘T
- Windows:
-
Recent files popup (最近文件弹窗):主要是你最近打开的文件 , 实际体验用得不多
-
Windows:
Ctrl+E
-
MAC:
⌘E
-
-
Show Diagram Popup (显示类图弹窗):打开UML类图,常见的有以下几种关系: 泛化, 实现,关联,聚合,组合,依赖
-
Windows:
Ctrl+Alt+U
-
MAC:
⌥⌘U
-
-
Show Diagram (显示类图):同上,只是会在一个新的窗口打开
- Windows:
Ctrl+Alt+Shift+U
- MAC:
⌥⇧⌘U
- Windows:
-
Smart type casting(智能转换) : 缺点要带个括号 , 比如String s = ( , 就能变成 String s = ( String )
- Windows:
Ctrl+Shift+空格
- MAC:
⌃⇧Space
- Windows:
-
Show usages (显示使用的地方)) : 我一般一般会用Ctrl+鼠标左键代替 , mac为 ⌘加鼠标左键
-
Windows:
Ctrl+Alt+F7
-
MAC:
⌥⌘F7
-
-
Finish lookup with special characters ( 用特殊字符结束智能补全): 在智能补全中,
. , ; 空格
都可以结束智能补全 -
New scratch file (新增暂存文件): 创建一个缓存文件,选中高亮的语法,比如Java高亮
-
Windows:
Ctrl+Alt+shift+Insert
-
MAC:
⌃⇧N
-
-
Database Table Editor (数据库表编辑器): 对着表或者库双击即可打开编辑器
-
Quick Documentation popup (快速文档弹出): 光标定位某个类的时候,按快捷键,即可显示对这个类的文档描述
-
Windows:
Ctrl+Q
-
MAC:
⌃J
-
-
Go to symbol (转到symbol): 创建一个缓存文件,选中高亮的语法,比如Java高亮
-
Windows:
Ctrl+Alt+Shift+N
-
MAC:
⌥⇧⌘N
-
Replace By when using lookup (代码补全替换):所选名称将覆盖插入符号右侧名称的其余部分。这对于将一个方法或变量名称替换为另一个方法或变量名称特别有用。
-
Windows: 代码补全后
Tab
-
MAC: 代码补全后
Tab
-
-
Global method name completion (全局方法名补全):如果有一个静态方法,在你项目里面,jar包里面,JDK里面,输入前缀, 按 Ctrl+空格 (Mac上
⌃Space
) 2次 ,即可自动引入和补全 按ALT+Enter
(Mac上⌥⏎
补全), 事实上ALT+Enter
有很多功能,比如说一句话是错误的,你按一下,会给你修复建议。-
Windows:
ALT+Enter
-
MAC:
⌥⏎
-
-
Tag Name Completion(Tag名称补全):XML中,如果你输入了一个tag但是没有定义,输入两次Ctrl+空格会帮你自动引入定义, 比如xml中没有定义task schema,你输入了task之后,使用快捷键就会帮你自动引入了
-
Windows: 2次
Ctrl+空格
-
MAC: 2次
⌃Space
-
-
Switcher (切换器):
-
Windows:
Ctrl+Alt+Shift+N
-
MAC:
⌥⇧⌘N
-
-
Select In popup (弹窗选择): 用得不多,无鼠标用户用的
- Windows:
ALT+F1
- MAC:
⌥F1
- Windows:
-
Move code element left/right(向左/向右移动代码元素): 有用,想移动参数顺序的时候
-
Windows:
Ctrl+Alt+shift+左/右箭头
-
MAC:
⌥⇧⌘←
and⌥⇧⌘→
-
-
Quick Documentation in lookups(查找快速文档): 如图可以清晰看到类有几个构造函数
-
Windows: 查看文档
Ctrl+Q
查看参数 :Ctrl+P
进入:Ctrl+B
-
MAC: 查看文档
⌃J
查看参数 :⌘P
进入:⌘B
-
-
Move inner class to upper level (将内部类移动到上层):
-
Windows:
F6
-
MAC:
F6
-
-
JAR Files Diff (Jar文件差异):看看jar升级了什么东西,也可以用于自己的jar . 文件夹比较也可以这么玩
-
Windows:
Ctrl+D
-
MAC:
⌘D
-
-
Directory Diff (文件夹比对): 同上
-
Highlight implementing or overriding members (高亮实现和重写的方法):比如你实现某接口的什么方法,就能够高亮这些方法。
-
Windows:
Ctrl+Shift+F7
-
MAC:
⇧⌘F7
-
-
Inspect Code in Bulk(批量代码检查): Code | Inspect Code 用处不大
-
Quick Definition in lookup lists (查阅列表中的快速定义)
-
Windows:
Ctrl+Shift+I
-
MAC:
⇧⌘I
-
-
Use wildcards when navigating to a class, file, or symbol by name(按名称导航到类、文件或符号时使用通配符) :
-
*
代表任意数量的任意字符 -
空格
标记模式的结束,前面的字符串不仅仅是前缀,而且被视为整个模式
-
-
Horizontal scrolling (水平滚动) : 需要掌握,比较重要 , 按住Shift滑动鼠标
-
Highlight method exit points(突出显示方法退出点): 高亮一个方法里面所有return的地方,仅仅高亮return那一行,无实际作用
-
Windows:
Ctrl+Shift+F7
-
MAC:
⇧⌘F7
-
-
Completion in Find Bar (查找栏中唤醒智能补全) : 在查找栏中输入快捷键
-
Windows:
Ctrl+空格
-
MAC:
⌃Space
-
-
Multiple carets Code (多个插入符号代码): 按住快捷键,然后用鼠标点击,形成多个光标 , 没用的知识又增加了
-
Windows:
Shift+Alt
-
MAC:
⇧⌥
-
-
Recent changes (最近更改):看看最近改了什么,可以点击,没什么用
-
Windows:
Alt+Shift+C
-
MAC:
⌥⇧C
-
-
Change completion variants sorting (改变补全候选项的排序): 点击那3个点,不建议更改智能排序,不推荐
Postfix Completion篇
后缀补全一般来说,还是有一些方便的地方,在new一个对象的时候,在引入变量的时候等
我们看一些常见的高频的后缀补全
-
new
String.new =======> new String() //其他对象也可
-
var
new String().var =======> String s = new String();//
-
其他的比如 if , for , iter , lambda, sout , try 等,我是不推荐的,毕竟 , live Template更香,能替代这些功能,且用着也很别扭
我们来自定义Postfix
Key表示你定义的关键字,不要与现有的重复,Minimum Language Level , 最小支持语言版本,1.3默认的就行,用到了高等级特性就要改成1.8 ,比如lambda , Applicable expression types , 适用的表达式类型。指的是你输入的表达式,比如你输入了 aa , 这里就是说的aa的类型,一般无需设置。固定EXPREXPREXPR表示你输入的表达式, 固定ENDENDEND表示光标结束位置。
- 比如如下图,创建一个list,即可形成一个实例化ArrayList的语句,代码中只需要输入 Integer.list , Long.list即可生成一个句子。
-
比如下图,形成一个JSON序列化的句子,只需要对str后面加上jsonParse即可
-
比如下图,判断是否为空,也很高频
Live Template篇
前言
Live Template是一个预定义模板工具
适用范围
- 什么样的代码适合设置模板
- 代码风格统一的
- 使用频率高的
- 比如new一个对象
- 代码简单,无业务属性
简介
入口
可以看到,有很多预定义模板,有些我们平时用得很多,需要掌握,最基础的,像 iter / fori / psf /psvm/ soutv 等,要记住和熟练运用,达到事半功倍的效果。
使用
快捷键:
CTRL + J唤醒 liveTemplate
CTRL+ALT+J 唤醒liveTemplate 两个的区别 , 这个是只唤醒带$SELECTION$
标签的,上面一个唤醒所有
下面我们来演示一下:
- 比如我想引入一个Logger
- 比如说我有个查询的方法,需要查询数据库
-
比如这行语句会抛异常,我需要捕获,只需要在这一行按快捷键CTRL+ALT+J , 即可唤醒你设置的预定义模板 , 与传统的 surround with最大的不同就是,加入了LOG.error这句话,更方便
配置
根据上面的适用范围,我们可以抽一个我们平时用得比较多的代码配置成一个模板。比如定义一个字符串类型的变量,大多数人会开始敲private String xxx
,像这种完全可以定义为一个预定义模板
这样简单的配置,只需要输入 ps ,即可达成private String 的效果
平时大家是怎么new一个对象的呢?
这里就用到了简单的变量了, $VAR$
是一个自定义变量, $CLASS_NAME$
也是一个自定义变量 , 你需要对这些自定义变量进行赋值才行,点击右边的Edit variables .
可以看到自定义变量用了2个表达式, 这两个表达式都是系统已经定义好的。
- suggestVariableName() 是系统自己填写变量名
- completeSmart是唤醒系统智能补全组件
那么系统有哪些常用的内置表达式呢? 我挑选几个比较重要的讲一下
- className() 获取当前编辑器页面的类名
- clipboard() 剪切板
- completeSmart() 唤醒智能补全组件
- currentPackage() 当前类所在的包名
- filePath() 当前文件所在路径
- groovyScript() groovy脚本路径, 很重要,玩出花样就靠他了
- methodName() 方法名
- methodParameterTypes() 方法参数类型
- methodParameters() 方法参数
- methodReturnType() 方法返回值
- qualifiedClassName() 当前类全限定名
- suggestVariableName() 系统自己填写变量名
- user() 当前系统登录用户
基本有了groovyScript脚本之后就可以为所欲为了。
以上文的try catch为例, try catch中比较重要的就是获取方法的参数(PS: 如果你要获取上下文的参数会稍微麻烦一点,需要用groovy读取整个Java文件并解析,当然可以做)
$SELECTION$
是一个比较特殊的内置变量,表示选中你的关键字,或者你选中的关键字(语句、段落都可以),唤醒带有$SELECTION$
的模板需要使用CTRL+ALT+J
快捷键,无法自动唤醒。
这里PLACEHOLDERSPLACE_HOLDERSPLACEHOLDERS用到了简单的grovvy脚本
groovyScript("_1.collect { it + ' = {}'}.join(', ') ", methodParameters())
_1 是传递进来的,表示 groovyScript() 表达式的第一个参数 , 就是methodParameters() , 这里拿到的结果是 param1={}, param2={}
ide也是支持外部groovy源码文件的,上面这样写不是很方便
groovyScript("/Users/admin/code/idea/script/setall.groovy",SELECTION,filePath())
然后你就可以用IDEA来编写groovy源码了,调试起来更容易 , groovy语法基本全面兼容Java语法,所以没有学习成本。
如何更进一步利用groovy
以生成所有的set 方法为例,先看效果
1. 文件法
a. 通过filePath() 获取到文件路径,读取这个文件到StringBuilder里面
File file = new File(currentPath);
StringBuilder stringBuilder = new StringBuilder();
try {
FileInputStream fileInputStream = new FileInputStream(file);
byte[] buf = new byte[1024];
int length = 0;
while ((length = fileInputStream.read(buf)) != -1) {
stringBuilder.append(new String(buf, 0, length));
}
fileInputStream.close();
} catch (Exception e) {
}
b. 使用正则获取包名
String regex = "import\\s([a-zA-Z_][a-zA-Z0-9_]*)+([.][a-zA-Z_][a-zA-Z0-9_]*)+[.]%s;";
regex = String.format(regex, varName);
//正则差早包名
java.util.regex.Pattern PACKAGE_PATTERN = java.util.regex.Pattern.compile(regex, java.util.regex.Pattern.CASE_INSENSITIVE);
java.util.regex.Matcher matcher = PACKAGE_PATTERN.matcher(stringBuilder.toString());
if (matcher.find()) {
String packageName = matcher.group(0).replace(";", "").replace("import ", "");
}
c. 找到lib文件夹实例化UrlClassLoader
URLClassLoader urlClassLoader = null;
if (srcs != null) {
File parent = srcs.getParentFile();
File target = new File(parent, "target");
if (!target.exists()) {
return "没有target文件夹";
}
File WEBINFfiles = new File(target, parent.getName() + "/WEB-INF");
if (!WEBINFfiles.exists()) {
return "没有找到WEB-INF文件夹";
}
File[] files1 = WEBINFfiles.listFiles();
List<URL> list = new ArrayList<>();
for (File file1 : files1) {
if (file1.getName().equals("lib")) {
for (File listFile : file1.listFiles()) {
URL url = listFile.toURI().toURL();
list.add(url);
}
} else if (file1.getName().equals("classes")) {
URL url = file1.toURI().toURL();
list.add(url);
}
}
urlClassLoader = new URLClassLoader(list.toArray(new URL[]{}));
d. 使用urlClassLoader加载这个class
Class<?> aClass = urlClassLoader.loadClass(packageName);
java.lang.reflect.Method[] declaredMethods = aClass.getDeclaredMethods();
//有了这个class就可以反射获取方法
2. 源码法
源码法需要用到_editor这个内置对象,需要有一定的源码基础
def document = editor.getDocument()
//获取PSIJavaFile
def psiJavaFile = com.intellij.psi.PsiDocumentManager.getInstance(editor.getProject()).getPsiFile(document);
//获取行号偏移量
//int line = lineNumber.toInteger()
//def startOffset = document.getLineStartOffset(line)
//获取鼠标偏移量,上面的可能不太准,所以直接获取鼠标
def mouseOffset = editor.getCaretModel().getOffset()
//一般是标识符
def psiReferenceStart = psiJavaFile.findReferenceAt(mouseOffset)
def psiClass = null;
//不管怎么样,最终目的就是通过这个语句,找到对应的PSiClass
if(psiReferenceStart instanceof com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl){
psiClass = ((com.intellij.psi.impl.source.PsiJavaCodeReferenceElementImpl) psiReferenceStart).resolve();
}else if(psiReferenceStart instanceof com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl){
def localVariable = ((com.intellij.psi.impl.source.tree.java.PsiReferenceExpressionImpl) psiReferenceStart).
getReference().resolve();
def type = localVariable.getType();
psiClass = type.resolve();
}
def psiMethods = psiClass.getMethods()
课后作业
有了这些基础,大家就可以自行写一个 set get方法的 live template了
插件篇
常用的插件相信大家都有安装一些 ,我推荐的是少见但是很好用的插件
MoFar
一款单元测试插件,嵌入在IDE里面,不用切换界面即可对自己写的代码进行调试,不用重启项目即可对更新的代码进行调试。加快测试代码效率, 如下图
项目地址: 点我直达
点击图片播放动画以下为常用的插件
- Alibaba Java Code Guidelines:阿里巴巴出品的代码规范插件,可以帮助程序员规范自己的代码,检测出潜在的问题,改善代码质量
- CodeGlance:可以在编辑器右侧显示代码的缩略图,方便快速定位和浏览代码
- RestfulToolkit:一套 RESTful 服务开发辅助工具集,可以根据 URL 跳转到对应的方法定义,提供一个服务树的显示窗口,以及一个简单的 HTTP 请求工具
- Easy Code:可以根据数据库表或者 Java 类生成 CRUD 代码,支持多种模板和框架
- GsonFormat:可以根据 JSON 数据生成 Java 类,支持多种注解和命名规则
- Statistic:可以统计项目的代码总行数,分别显示各个类型文件的总行数
- Rainbow Brackets:可以给配对的括号显示相同的颜色,并且实现选中区域代码高亮的功能
- Translation:一个翻译插件,支持谷歌、有道、百度三种翻译,还有一个变量命名的功能
- Lombok:一个简化 Java 代码的插件,可以通过注解来生成 getter、setter、toString、equals 和 hashCode 等方法
- Maven Helper:一个分析 Maven 依赖冲突的插件,可以显示依赖树,查找和处理依赖冲突
- GenerateAllSetter:一个效率插件,可以对变量类生成对类的所有 setter 方法的调用