成吨提高开发效率:Intellij Shortcuts精简子集与思维模式
在线精简cheatsheet备查表:intellij.linesh.tw
Github项目:intellij-mac-frequent-keymap

Intellij的快捷键多而繁杂,从官方推荐的keymap,到网络上很多的个人总结,资料可谓浩如烟海。相反,如何从众多的快捷键中快速找到使用频率最高、对工作效率提升最多的快捷键,则成为一个难题。这个cheatsheet速查表,正是为了解决Intellij快捷键学习过程可能遇到的这个问题。
这一年里我拉拉杂杂地阅读了许多Intellij快捷键与使用理念的资料,不管是官方的keymap还是个人的博客,结合平时的工作和个人项目经验,我尝试整理并总结其中最精华的部分,同时通过这个子集来总结、思考与提高效率相关的思维模式和理念。分享出来,希望能顺便给学海中的同学提供有益的帮助。
目标读者和人群
- 想要快速上手Intellij快捷键的同学。多而没有重点的其他资料不用看了,优先学习最精华最常用的快捷键,才是节省时间,提高效率之道
 - 想要不断对比、精简你的快捷键集合的同学。毕竟快键辣么多,记得最有用的就好
 - 备查。这个是最主要的目的,存个书签或者记个网址,需要的时候只要有网络,随时跨平台可查
 - 尝试提高思维层级,从理念和思维模式的视角来看待编程和工具的同学
 
理念与思维模式
IDE与电脑作为工具,永远是高效完成特定工作的辅助。因此我们所谓的高效有了上下文:以完成工作为主,在这个过程工具的作用是辅助工作。那么,所谓高效也即是问,如何更专注于工作本身,更高效地完成工作呢?在一系列落地的快捷键背后,这个围绕快捷键所展开的工作系统,其实质性提高工作效率的理念和思维模式本身是什么呢?我的回答是:
- 更高层次的抽象
 - 声明式使用
 
更高层次的抽象
更高层次的抽象,指的是从代码、从语言本身特性的层面思考编程,而非单纯的文本或者字符串。要把思维从“把这五行代码剪切并复制到一个新的方法里”等把代码当成无意义字符的低层面活动,转变到以作为语言核心的要素和特性为单位的思考,比如类、变量、方法、重命名、重构、if-else、循环、可循环元素等。
在这方面,IDE提供的 Live Template、重构(Refactoring)、部分后向声明等,都是这种思想的产物,允许你从更高的层级(语言特性、与Java高相关的重构)来思考代码,并尽量多地向上屏蔽细节。
声明式使用
声明式使用,指的是直接使用你完成工作所需要的元素(类、字段、方法等),让IDE为你自动补全缺少的声明或定义。这种思想同样贯穿这本工具集的始终,以更语义化(更高阶)的操作来使用工具。
在这方面,IDE提供的 后向声明(Postfix Auto Completion)、自动补全(Auto Completion) 等,都是这种思想的产物。你不需要关注操作所在的上下文,IDE会为你补全,你需要关注的是工作和操作本身。
本cheatsheet如何通用?
像这种cheatsheet的记录,有可能会随时间或版本变迁而不再通用,过多的定制也可能使得追踪和维护成本增加。为了尽可能多地减少维护成本,尽可能长地保持这份cheatsheet的有效性,下列快捷键的选取遵循以下几个原则:
- 仅列出Mac版的快捷键
 - 统一使用Mac OSX 10.5+版本的keymap作为基准
 - 原则上对作为基准的keymap只删不改,即可能删除不需要的快捷键,但非特殊原因则不会更改已默认启用的快捷键
 - 少部分确实需要更改的快捷键,我会采用*星号标明,并标明原因
 
快捷键精简子集
本章主要分七个部分展开总结:生产力大杀器、语言要素生成、编辑、导航、重构、搜索、运行时。版本控制的部分未录入,原因是我倾向于使用命令行提交,而非IDE内置VCS支持。见仁见智。最后一栏是该操作在IDEA中的操作名称,可以在keymap中检索对应的action/shortcut找到。
生产力(Productivity)
| Operation | Mac OSX 10.5+ | Comments | Description | 
|---|---|---|---|
| 模板补全 | ⌘+J | 插入一个符合某结构特征的模板,详解见下 | Insert live template | 
| 命令查询 | ⇧+⌘+S | 以名称的形式查询某个操作或快捷键,是声明式编程思想的完美体现 | Find actions | 
| 意图预测与智能帮助 | ⌥+Enter | 简单重构、移除死代码、结构调整、自动导包等 | Show intention actions | 
模板补全(Live Template)
敲完以下模板补全的keyword之后可以直接通过tab或回车触发模板补全,2…是需要你填充的模板变量。
| Operation | Mac OSX 10.5+ Keyword | Expands to | Comments | 
|---|---|---|---|
| 判空 | ifn | 
if ($1 == null) {} | 
后向声明也有同样功能,读者可拣顺手的用 | 
| 判非空 | inn | 
if ($1 != null) {} | 
|
| 创建索引循环 | fori | 
for (int $1 = 0; $1 < $2; $1++) {} | 
|
| 添加TODO | todo | 
// TODO: $1 | 
非常声明式的用法 | 
| 添加Fixme | fixme | 
// FIXME: 7/19/16 $1 | 
同上 | 
| 类型关系判定 | inst | 
if ($1 instanceof $2) {} | 
|
| System.out | sout | 
System.out.println($1); | 
必须入手的黑技能,调试打log的时候非常有用 | 
后向声明(Postfix Completion)
后向声明是JetBrains系IDE的一项新功能,旨在减少光标经常性的前后移动,提高开发效率,形成这样的编程思维:先使用元素,再考虑变量声明或结构补全。它的主要功能是根据当前元素的属性,提供可能的行为建议,例如使用if-else结构包围、判(非)空、格式化、进行类型转换等。因此,后向声明所能提供的选择视元素(主要是变量)的不同而不同。
所有元素都拥有的一些后向声明选择,仅选择我认为常用的:
| Operation | Postfix Completion Keyword | Expands To | Comments | 
|---|---|---|---|
| 变量声明 | element.var | 
Type $name = element; | 
必备技能,声明式使用的典范 | 
| 转换为类字段 | element.field | 
private $Type element; | 
刚发现的 | 
| 将当前变量打印到输出流 | element.sout | 
System.out.println(element); | 
|
| 返回当前值 | element.return | 
return element; | 
|
| 类型转换 | element.cast | 
(($Type) element) | 
然后,对于特定的元素类型,有的后向声明还有非常实用的选项,比如字符串的判空、布尔值的if-else、列表的循环等等:
| ElementType | Operation | Postfix Completion Keyword | Expands To | Comments | 
|---|---|---|---|---|
| 字符串 | 判空 | string.null | 
if (string == null) {} | 
|
| 判非空 | string.notnull | 
if (string != null) {} | 
||
| 整数 | 分支 | int.switch | 
switch (int) {} | 
|
| 布尔值 | 如果为真 | boolean.if | 
if (boolean) {} | 
|
| 如果为假 | boolean.else | 
if (!boolean) {} | 
||
| 反义 | boolean.not | 
!boolean | 
||
| 列表 | 循环元素 | lists.for | 
for (Type element : lists) {} | 
非常常用 | 
| 带索引循环 | lists.fori | 
for (int i = 0; i < lists.size(); i++) {} | 
编辑(Editing)
| Operation | Mac OSX 10.5+ | Comments | Description | 
|---|---|---|---|
| 基本代码补全 | ^+Space | 一般都用这个补全,变量命名时及方法补全时常用 | Code/Completion/Basic | 
| 智能补全 | ^+⇧+Space | 是否有必要记得两个快捷键?可以统一设成一个 | Code/Completion/SmartType | 
| 语句补全 | ⇧+⌘+Enter | 直接补全当前语句,在括号特别多时非常有用 | Complete Current Statement | 
| 从上方开始一行 | ⌥+⌘+Enter | Start New Line Before Current | |
| 从下方开始一行 | ⇧+Enter | Start New Line | |
| 上移/下移一行 | ⇧+⌥+↑/↓ | 上下移一行。一般用于以单行出现的元素,否则会破坏元素间的关系 | Move Line Up/Down | 
| 上移/下移一个块 | ⇧+⌘+↑/↓ | Move Statement Up/Down | |
| 选中一个代码块 | ⌥+↑ | 常用 | Extend Selection | 
| 取消代码块选中 | ⌥+↓ | Shrink Selection | |
| 重复当前行 | ⌘+D | Duplicate Current Line or Block | |
| 复制并且不删除当前行 | ⌘+C | Edit/Copy | |
| 剪切当前行并复制到粘贴板 | ⌘+X | Edit/Cut | |
| 关闭当前标签 | ⌘+W | 跟通常编辑器快捷键一致 | Edit Tabs/Close | 
| 注释当前行 | ⌘+/ | 随手一注释 | Comment with Line Comment | 
| 优化import | ^+⌥+O | 没啥用 | Optimize Imports | 
| 格式化代码 | ⌥+⌘+L | 没啥用 | Reformat Code | 
语言要素生成(Language Elements/Features)
| Operation | Mac OSX 10.5+ | Comments | Description | 
|---|---|---|---|
| 测试、方法生成 | ^+Enter/ ⌘+N | 非常常用于创建测试方法、构造方法、覆写接口方法、覆写基类方法 | Code/Generate | 
| 创建类、文件、目录 | ⌘+N | 常用 | Code/Generate | 
| 创建override方法 | ^+O | 有用 | Override Methods | 
| 创建接口方法实现 | ^+I | 有用 | Implement Methods | 
导航(Navigation)
| Operation | Mac OSX 10.5+ | Comments | Description | 
|---|---|---|---|
| 转到方法/字段的声明 | ⌘+B | 调试跟代码都很常用 | Navigation/Declaration | 
| 转到方法/字段的实现点 | ⌥+⌘+B | 同上,常用 | Navigation/Implementation(s) | 
| 转到方法/字段类型的类定义处 | ⇧+⌘+B/ ⇧+^+B | 常由下两个快捷键取代 | Navigation/Type Declaration | 
| 当前类与单元测试间跳转 | ⇧+⌘+T | 非常方便 | Navigate/Test | 
| 跳转到当前类的基类 | ⌘+U | 配套食用,效果更佳 | Super Method | 
| 类继承体系 | ^+H | Type Hierarchy | |
| 方法继承层次 | ⇧+⌘+H | Method Hierarchy | |
| 当前方法调用链 | ^+⌥+H | Call Hierarchy | |
| 本类及所有基类方法列表 | ⌘+F12 | File Structure | |
| 类/方法/字段定义的快速预览 | ⌥+Space/ ⌘+Y | 小览实现,一般可以看到方法/字段参数、返回值、前几行实现,快速的信息足够了 | Quick Definition | 
| 方法文档快速预览 | ^+J | 看文档,我不常用 | Quick Documentation | 
| 方法参数快速预览 | ⌘+P | 常用 | Parameter Info | 
| 前一个标签 | ⇧+⌘+[ | 导航常用,不过是否能以其他方式取代,比如声明式使用类查找⌘+O等。仍在探索 | Select Previous Tab | 
| 后一个标签 | ⇧+⌘+] | Select Next Tab | |
| 往上一级 | ⌥+⌘+←/ ⌘+[ | 调代码,跟方法体系时,非常有用,下同 | Navigate/Back | 
| 往下一级 | ⌥+⌘+→/ ⌘+] | Navigate/Forward | |
| 转到下一个错误或警告 | F2 | 代码见红时,常用此快捷键快速定位,并配合万能快捷键⌥+Enter快速修复 | Next Highlighted Error | 
| 提示错误信息 | ⌘+F1 | 不常用 | Error Description | 
| 意图预测与智能帮助 | ⌥+Enter | 简单重构、移除死代码、结构调整、自动导包等 | Show intention actions | 
| project视图 | ⌘+1 | 有时导航项目结构时常用,不知是否有替代方案 | Other/Project | 
| search/find视图 | ⌘+3 | 除了这几个,其他视图都不常用 | Other/Find | 
| run视图 | ⌘+4 | 有时开关测试视图 | Other/Run | 
| debug视图 | ⌘+5 | Other/Debug | |
| VCS视图 | ⌘+9 | Other/VCS | |
| terminal视图 | * ⌘+0 | 自己改过,一是和各种视图快捷键保持一致,另外是原生的⌘+F12实在有点难按 | Other/Terminal | 
| 隐藏所有工具视图 | ⇧+⌘+F12 | 同时开了工程和终端视图时一键回编程页面 | Hide All Tool Windows | 
| 跳转到第…行 | ⌘+L | 属于细节型的活,能少用就多思考替代方案 | Navigate/Line… | 
重构(Refactor)
| Operation | Mac OSX 10.5+ | Comments | Description | 
|---|---|---|---|
| 复制类/目录等 | F5 | Refactor/Copy | |
| 移动类/目录等 | F6 | Refactor/Move | |
| 元素(类/方法/变量/…)重命名 | ⇧+F6 | 最常用的重构快捷键之一了吧 | Refactor/Rename | 
| 类/方法签名修改 | ⌘+F6 | Refactor/Change Signature | |
| 字段(类级别)抽取 | ⌥+⌘+F | Extract/Field | |
| 常量(类级别)抽取 | ⌥+⌘+C | Extract/Constant | |
| 变量(方法级别)抽取 | ⌥+⌘+V | Extract/Variable | |
| 参数(方法级别)抽取 | ⌥+⌘+P | Extract/Parameter | |
| 方法抽取 | ⌥+⌘+M | 最常用的重构快捷键之一 | Extract/Method | 
| 方法内联 | ⌥+⌘+N | Refactor/Inline | 
搜索(Searching)
| Operation | Mac OSX 10.5+ | Comments | Description | 
|---|---|---|---|
| 搜索 | ⌘+F | 通常快捷键 | Find/Find | 
| 替换 | ⌘+R | 正则发挥作用的地方 | Find/Replace | 
| 查找引用点 | ⌥+F7 | 重构或调试的时候经常用到,使用频率高 | Find/Find usages | 
| 查找类 | ⌘+O | 声明式编程,使用频率很高的快捷键 | Navigate/Class | 
| 查找文件 | ⇧+⌘+O | 同上,使用频率很高 | Navigate/File | 
| 查找symbol | ⌥+⌘+O | 基本不用,不知道与上两者有什么区别 | Navigate/Symbol | 
| 全项目文本搜索 | ⇧+⌘+F | 搜索引用点和文本出现、改bug时非常有用 | Find/Find in path | 
| 查找下一个 | ⌘+G | Find/Find Next | |
| 查找上一个 | ⇧+⌘+G | Find/Find Previous | 
运行时(Runtime)
| Operation | Mac OSX 10.5+ | Comments | Description | 
|---|---|---|---|
| 编译 | ⌘+F9 | 调bug时可能是忘了编译最新代码 | Make Project | 
| 运行(最近一个测试) | ^+R | 非常有用,有时可能节省在测试代码和源文件之间的切换 | Run/Run | 
| 调试 | ^+D | Run/Debug | |
| 打断点/取消断点 | ⌘+F8 | Toggle Breakpoints | |
| 查看所有断点 | ⇧+⌘+F8 | View Breakpoints | |
| 跳入 | F7 | Run/Step Into | |
| 跳出 | ⇧+F8 | Run/Step Out | |
| 智能跳入(当前行多个调用时) | ⇧+F7 | ||
| 跳过(下一步) | F8 | Run/Step Over | |
| 求表达式值 | ⌥+F8 | Evaluate Expression | |
| 停止调试 | ⌘+F2 | Run/Stop | 
成吨提高开发效率:Intellij Shortcuts精简子集与思维模式的更多相关文章
- 提高开发效率的 Eclipse 实用操作
		
工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...
 - 合理使用webpack提高开发效率
		
虽然公司有提供现成的脚手架工具,但是作为开发人员懂得必要的相关知识还是很重要的.这样有利于提高我们的开发效率,优化我们的代码. 关于npm scripts 什么是npm scripts npm 允许在 ...
 - IDEA提高开发效率的7个插件
		
IDEA提高开发效率的7个插件 1. 多行编辑 先来体验一下从xml文件拷贝字段新建实体对象 一般我们为了新建多表连接后映射的 ResultMap ,耗费不少时间,那么我们就来试一试这个多行编辑 表字 ...
 - 如何利用 Visual Studio 自带工具提高开发效率
		
Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...
 - 善用VS中的Code Snippet来提高开发效率
		
http://www.cnblogs.com/anderslly/archive/2009/02/16/vs2008-code-snippets.html http://www.cnblogs.com ...
 - 实用手册:130+ 提高开发效率的 vim 常用命令
		
Vim 是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器.这里收录了130+程 ...
 - 10 款提高开发效率的 jQuery/CSS3 组件
		
前端开发是一项十分繁琐而又耗体力的工作,如何更有效率的开发我们的应用,很多人会选择适当地使用一些jQuery插件.今天就要给大家分享10款可以提高开发效率的jQuery/CSS3组件.部分插件可以下载 ...
 - 能够提高开发效率的Eclipse实用操作
		
工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...
 - tomcat免重启随意更改java代码 提高开发效率
		
转载:http://developer.51cto.com/art/201012/241243.htm 做为了一个java开发人员,总是为因为要增加一个类,或是增加删除一个方法,甚至修改一个小处代码而 ...
 
随机推荐
- 这些.NET开源项目你知道吗?.NET平台开源文档与报表处理组件集合(三)
			
在前2篇文章这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧 和这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,大伙热情高涨.再次拿出自己的私货,在.NET平台 ...
 - shiro权限管理框架与springmvc整合
			
shiro是apache下的一个项目,和spring security类似,用于用户权限的管理‘ 但从易用性和学习成本上考虑,shiro更具优势,同时shiro支持和很多接口集成 用户及权限管理是众多 ...
 - [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
			
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
 - 使用Git Bash远程添加分支和简单部署你的静态页面
			
新建一个分支:git branch mybranch(mybranch你的分支名字) 切换到你的新分支: git checkout mybranch 将新分支发布在github上: git push ...
 - github免输用户名/密码SSH登录的配置
			
从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...
 - VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容
			
VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容 一般来说,在对虚拟机里的Ubuntu下的磁盘进行扩容时,都是添加新的分区,而并不是对其系统所在分区进行扩容,如在此链接中http ...
 - hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()的用法
			
javascript中有原型这么一个概念,任何一个构造函数都有它对应的原型(prototype),我们可以给这个原型赋予一些我们想要的属性,像下面这样: function Gadget(name, c ...
 - APP漏洞扫描用地址空间随机化
			
APP漏洞扫描用地址空间随机化 前言 我们在前文<APP漏洞扫描器之本地拒绝服务检测详解>了解到阿里聚安全漏洞扫描器有一项静态分析加动态模糊测试的方法来检测的功能,并详细的介绍了它在针对本 ...
 - 客服小妹是如何泡到手的——C#定时提醒·语音录制·语音播放·文件转录Demo源码——倾情奉献!
			
一.需求提出 客服小妹跟我说,每天要统计新加好友数,得先记下昨天的数目,然后查看今天的数目,还要相减,打字,记录——好麻烦! 又说,客户多的时候,忙起这头忘了那头,文字记录备忘又太费劲! 我说,赐你一 ...
 - .NET基础拾遗(2)面向对象的实现和异常的处理基础
			
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...