> 有部分内容来自网络,一般都有注明出处,如若侵权,请联系我删除,谢谢!
> 文章的图片来自github的图床,图片链接存在github图床(https://raw.githubusercontent.com),该地址可能需要翻墙才能访问,所以图片可能存在加载不成功的情况。
# HOTKEY
## Usage Search(使用查询)
key | desc
- | -
cmd+opt+F7 | 搜索文件中用法,以弹窗方式显示
opt+F7 | 全局搜索引用
cmd+shift+F7 | 高亮显示当前代码域使用到的地方
F3 or shift+F3 | 搜索当前文件的模式下,按向下 or F3跳到下一处,按向上 or shift+F3跳到上一处
tab or tab+shift | 在ctrl+shift+f全局搜索的时候,可以通过tab和来移动输入聚焦,可以脱离鼠标来选择右上角的File mask
## Editing(编辑)
key | desc
- | -
cmd+P | 显示方法的参数,这个方法的强大之处在于,展示了参数之后,在写入传参的时候,弹框会一直存在,让参数更加直观
cmd++ | 展开折叠的代码
cmd+- | 折叠代码
shift+上下方向键 | 有时候用vim插件的jk上下移动太慢了,而且又不能明确知道要用emacsIdeas调整到哪里,可以用idea自带的shift+上下方向键来快速上下移动代码
## debug
key | desc
- | -
cmd+shift+F8 | 查看断点信息
shift+F7 | 智能步入,断点所在行上有多个方法调用,会弹出进入哪个方法
^+F5 | 重启debug服务
cmd+F2 | 终止debug服务
^+cmd+W | 将Add to Watches绑定快捷键,可以快速查看变量或者表达式的值
## Spring Boot 微服务
cmd+8 弹出多个微服务的启动控制窗口,可以通过上下左右移动快速定位到某个微服务,通过快捷键^+shiftF10 Runing,或者通过^+shift+F9 Debuging
## General(通用)
key | desc
- | -
^+cmd+F | 切换全屏模式
^+cmd+C | 清理控制台的日志之类的,需要再keymap里面设置Other | Clear All
## Refactoring(重构)
key | desc
- | -
F5 | 复制文件到指定包路径
F6 | 移动文件到指定包路径
opt+cmd+m | 提取代码为方法
opt+cmd+c | 提出代码为常量
opt+cmd+v | 提出代码为变量
opt+cmd+f | 提出代码为成员变量
opt+cmd+p | 提出代码为方法的形参
opt+cmd+o | 快速去掉多余的import
## Navigation(导航)
key | desc
- | -
alt+F1 | 跳转到当前代码文件很多相关的功能(强大)
cmd+u | 前往当前光标所在方法的父类的方法 / 接口定义
cmd+b | 进入定义处
cmd+opt+b | 进入实现处
cmd+o | 查询当前类可以继承实现的所有方法
cmd+F12 | 展示当前文件的结果大纲(可用于查询变量、方法等)
^+shift+B | 跳转到类型声明处,可以直接从类变量跳到对应的类里面
F12 | 返回前一个工具窗口
shift+esc | 隐藏当前或最后一个活动的窗口,且光标进入代码文件窗口
opt+F1 | 显示当前文件选择目标弹出层,弹出层中有很多目标可以进行选择(如在代码编辑窗口可以选择显示该文件的 Finder)
⌃H | 显示当前类的层次结构(在类的任何地方可以快速跳转到父类、父接口、子类)
^+opt+H | 显示所有调用的层次结构
^+h | 显示类的所有子类型的相关内容
shift+F4 | 在新窗口打开文件
^+F2 | 可以快速跳到idea的菜单栏,然后通过方向键和enter,可以快速进行一下菜单栏的操作,这个快捷键适合其他软件
^+opt+cmd+N | 跳到next method,这个是我自定义的
^+opt+cmd+P | 跳到previous method,这个是我自定义的
跳到光标所在方法的方法名 | 先^+opt+cmd+N再^+opt+cmd+P,如果是最后一个方法就反之
# PLUGIN(插件)
## emacsIdeas 最强大没有之一
> 注意如果和IdeaVim一同使用的话,类似^+W的快捷键要更改,不然会和IdeaVim的屏幕分割快捷键冲突了
#### jump
- Plug-ins | emacsIDEAs | AceJumpSelect 选中当前位置到某个字符
- Plug-ins | emacsIDEAs | HighlightPrevSymbol 高亮跳到上一个一样的字符
- Plug-ins | emacsIDEAs | HighlightNextSymbol 高亮跳到下一个一样的字符
#### emacsIdeas copy
- Plug-ins | emacsIDEAs | AceJumpCopy.Block 复制特定代码块到当前光标(可以是函数里面的整个形参定义)
- Plug-ins | emacsIDEAs | AceJumpCopy.Line 复制特定行到当前光标
- Plug-ins | emacsIDEAs | AceJumpCopy.Quote 复制特定的引用到当前光标,比如某个引号里面的内容
- Plug-ins | emacsIDEAs | AceJumpCopy.String 复制特定的代码到当前光标,一般是某块前后由空格隔开的代码
- Plug-ins | emacsIDEAs | AceJumpCopy.ToLineEnd 从当前位置复制到行尾
- Plug-ins | emacsIDEAs | AceJumpCopy.ToLineStart 从当前位置复制到行首
- Plug-ins | emacsIDEAs | AceJumpCopy.Paragraph 复制某个特定段落,比如类的某段注释
- Plug-ins | emacsIDEAs | AceJumpCopy.Group 复制某块代码,可以使某个判断的条件+整个花括号{}里面的内容
#### emacsIdeas delete
- Plug-ins | emacsIDEAs | AceJumpCut 从当前位置剪切到某个位置
- Plug-ins | emacsIDEAs | AceJumpDelete.Block 删除特定的代码块
- Plug-ins | emacsIDEAs | AceJumpDelete.Line 删除特定的代码行
- Plug-ins | emacsIDEAs | AceJumpDelete.Quote 删除特定的引用代码,比如某个引号里面的内容
- Plug-ins | emacsIDEAs | AceJumpDelete.String 删除特定的二个空格之间的字符
- Plug-ins | emacsIDEAs | AceJumpDelete.Word 删除特定的某个变量方法名(紧挨在一起的代码标识)
- Plug-ins | emacsIDEAs | AceJumpDelete.ToLineEnd 从当前位置删除到行尾
- Plug-ins | emacsIDEAs | AceJumpDelete.ToLineStart 从当前位置删除到行首
- Plug-ins | emacsIDEAs | AceJumpDelete.Paragraph 删除某个特定段落,比如类的某段注释
#### emacsIdeas cut
- Plug-ins | emacsIDEAs | AceJumpCut 从光标当前位置剪切到某个位置
#### emacsIdeas more
AceJumpMove模式,各种快捷键的变种和上面的一样.etc.
## ideaVim
yy 复制当值当前行,或者选中后y复制,然后输入数字n,再输入p,代表连续粘贴n次。
gg 快速移动到文件的开头
G 快速移动到文件的结尾
## CamelCase
opt+shift+u 可以对字符进行驼峰式的不同格式变换,非常实用。
## Grep Console
安装该日志插件,控制台的日志输出可以更加直观,还可以自定义颜色。
## spring assistant(yml或者properties文件编写提示)
编写yml配置文件的时候,可以自动提示,但是这个自动提示貌似自会提示Spring Boot的基础配置,如果是在配置中心的话,其他的第三方依赖配置要在配置中心引入其spring-boot-starter的依赖才能自动提示对应的配置。
***如果对应的依赖引入了之后还不会自动提示,那就需要再idea的模块配置里面将自定义的配置文件加入到配置文件的类别中,如下图:***
![](https://raw.githubusercontent.com/coding-by-feng/oss/master/uPic/EpjOSE.png)
选择右边的第一个Configuration Files,因为通常配置中心新增的都不会是Bootstrap类别的配置文件,如下图,然后点击下面的绿色按钮,也就是最后一个按钮
![](https://raw.githubusercontent.com/coding-by-feng/oss/master/uPic/RWKXhb.png)
再点击下面的+号,选择对一个的yml或者properties,然后确认就ok了。
## RestfulToolkit
这个插件可以自动收集项目的Restful风格的接口,还可以在idea里面直接填写参数调用接口
## MyBatis Log Plugin
自动打印Mybatis的每一个SQL,有时候我们要抽取SQL不是很方便
## Free Mybatis plugin
Mapper与Mapper XML映射之间的调整,方便代码的跟踪查看。
而且还可以自动通过Mapper的方法矫正或者生成Mapper.xml的每个xml节点
# Others(其他)
## 修改包名要注意的地方
修改了包名之后注意在编译输出的目录要清空之前的老的class,不然可能会引起意想不到的冲突。
## 有没有更加智能化的API注释查看方法,比如鼠标+cmd的方式就完整地将注释都展示出来?
ctrl+J
可以搜索keymap需改热键,Quick Documentation
## debug的时候变量的多种不同的View
在Variables右键要跟踪的变量,可以view text,或者view as 其他类型.
## Performance enhancements(性能增加)
idea吃内存确实是有点恐怖,对于调大内存,网上基本都是说调整idea.vmoptions里面的这三个参数:
```
-Xms1024m
-Xmx3000m
-XX:ReservedCodeCacheSize=1024m
```
但是我自己是基于2019.02的版本,发现即使调整了之后重启,idea右下角的内存显示还是原来的Max。
其实要这样调整才能真正生效:
Help->Edit Custom VM Options
打开这个会发现里面的配置还是原来的,在这里更改再重启,右下角的内存Max才会变大,才能生效。
## cmd+shift+A按第二次的时候老是换出Terminal
https://intellij-support.jetbrains.com/hc/en-us/articles/360005137400-Cmd-Shift-A-hotkey-opens-Terminal-with-apropos-search-instead-of-the-Find-Action-dialog
## Bug
有时候会出现复制进来的新文件编译之后没有被输出到target对应的目录,应该是idea潜在的bug,如果点击重新加载文件索引太慢了,一般重启一下重新编译可以解决。
## search(搜索)
全局搜索的时候记得利用好Scope,比如要搜索某个模块,某所最近更改的内容,搜索版本控制的所有更改等等。
## Services
cmd+8可以将多个SpringBoot的服务(微服务)整一个打开控制,可以结合其他快捷键进行启动、重启和停止,不过第一次使用需要再右下角的弹框中点击确认。
此外在Spring Cloud多个微服务的情况下,还可以将不同的微服务分组然后统一对某个组别进行run、debug或者静默断点等操作。
## 使用lombok跟踪bean属性调用栈
opt+F7依然可以看到getter和setter的调用栈。
## SpringBoot Application的热加载
要在debug模式下,设置Hot swap classes and update trigger file if failed,就可以自动热加载class了。
## idea的svn的删除操作
本地删除之后要在,Locally Deleted Files中点击Remove from VCS,然后再回来上面的Default Changelist去执行Commit删除。
# all shortcut
```
新建文件的时候可以这样操作来脱离鼠标:
cmd+1跳到Project目录上下移动到目标目录,然后cmd+shift+A跳出Action,输入new+文件类型或者手动选择文件类型就可以了。
```
```
option+cmd+c 抽取局部字符串为静态变量
cmd+shift+方向键 可以控制模态框的大小,和左右移动编辑区的内容
ctrl+j 展示API文档
ctrl+shift+F,[words 打钩可以搜索是否为单词]
command+D,
commond+F12(file structure)
command+shift+N(search file's name and global)
commond+option+shift+N(search method d variable global)
shirt + option + (向上箭头)/(向下箭头)(move codes up or down)
Command + Option + L(Format code)
option+enter(add javadoc)
option+command+b(jump into the class impl)
command+e(recent file)
command+shift+a(search action)
command+number(window tab jump)
shift(ctrl)+command+del(last(next) edit location)
F11,command+F11,ctrl+number(alphabet)(bookmarks)
option+shift+F(add to favorites)
shift+option+U(toggle case)
command+1,esc(switch between file navigate and edit area)
option+F7(find usage)
shift+option+方向(move caret to next word)
command+方向(move to first or end of line)
ctrl+command+G(sellect all occurrences) HOT
F2(Quickly locate the wrong line)
option+command+V(generate locate variable)
shift+command+enter(generate some code)
option+enter(generate some method)
command+R(replace)
shift+F6(rename)
option+command+V(Extract Variable)
option+command+C(Extract static Variable) HOT
option+command+F(Extract field Variable)
option+command+P(Extract field Variable into method)
option+command+M(Extract some code to be a new method)HOT
shift+command+F8(show all breakPoints)
shift+command+V(copy history)
shift+option+command+U(show maven dependencies)
option+command+U(show class inherit) HOT
ctrl+option+H(call method or be called history)
ctrl+N(Generate anything)
ctrl+w(select something)
ctrl+< or > (move up or down next method) HOT
cmd+option+T (surround) HOT
```
# Problem Solution
## 编译出现莫名其妙的找不到符号的Error
如果找不到符号的错误行数,刚好式同包下的某个类找不到符号报错,那么可能式idea的类编译顺序冲突了,找到报错行上引用到的类,先单独编译应用到的类,再编译报错的类,最后编译整个项目就可以了。
## 非静默模式下断点失效
断点处提示:idea debug no executable code found
这个一般是class和idea的代码不一致导致的。
解决办法:
1、invalidate Caches/Restart
2、rebuild Project
3、class的输出路径正确
4、我自己是因为jboss的On 'update' action 被设置成了Restart Server,热部署应该改为:Update classes and resources
## 某个jar依赖冲突问题的解决
公司项目中cglib的包依赖了二个log4j的包,导致控制台启动会报错。 删除项目输出目录下的lib,设置依赖jar的scope为provided。
![](https://raw.githubusercontent.com/coding-by-feng/oss/master/uPic/7vAT8L.png '')
然后重新部署启动就可以了。
## debug启动微服务莫名其妙卡住的情况
竟然是因为我在某个方法的声明上打了断点,然后我静默断点时就可以debug启动微服务了:
![](https://raw.githubusercontent.com/coding-by-feng/oss/master/uPic/Qtfqng.png '')
于是我果断把断点去掉,然后再检查一遍有没有打到方法声明上的断点,全都取消之后重启debug就可以了。
## 记录Idea关于Maven依赖的一个致命Bug
> 基于版本2019.3.4
公司的微服务架构的用的Maven管理依赖,关于流程flowable的的模块ngbip-flow及其几个子模块我放在一个单独的文件夹下面;
另外的一个项目也是基于微服务架构依赖ngbip-flow及其几个子模块,然后由于启动报了个莫名其妙的错误,于是我删掉了项目对公司自研的所有依赖,重新引入;
但是这个时候idea移动将ngbip-flow的几个模块的依赖强制指向了上面提到的单独的文件夹下面的ngbip-flow几个子模块的代码文件,不走maven去依赖了,我TM是不同的文件夹(不同的工作区间啊,打开的是不同的idea窗口);
最后的硬核解决方法是,将原来的单独文件夹重命名个名字,这个时候另外的项目一下子就自动重新引入ngbip-flow的maven依赖,不会强制走开发机的其他文件夹下面的依赖,然后我再把文件夹名字改回来即可。
## Maven代码不能指向本地工程module代码
如果出现idea的Modules已经存在,但是代码不能通过Maven依赖到已经引入的module时(此时Maven管理界面可能会出现已经引入的model的maven可视化没有出现),这个时候在工程的Modules删除重新引入应该就可以了。