简述本文
习惯 emacs 快捷键的用户使用 PyCharm 或可参考本文
BTW: 因为快捷键的说明就已经占了很大的篇幅,所以其他的诸如 Template, Snippet设置等,略。
导入配置
从旧的 MBP 上到处配置,然后初始化新机器 PyCharm Professional 的时候导入配置,直接看图:
导出
1.先导出: "File -> Export Settings",导出一个 zip 文件:
导入
2.接着导入: 不用解压 zip 文件:
如果您对我设置的快捷键配置有兴趣,我单独导出了一份快捷键配置放在Google Drive。
据我所知,所有的 jetbrain ide 貌似都可以共用这份 key amp。
key-map配置
warning & watch out:
1.有必要说明一下,没有 100% 兼容 emacs,做不到 2.如果您不熟悉 emacs,请关闭本文 3.Patience required (常文预警)
配置大纲
总是记不住快捷键的话,建议把快捷键分类即可;其实日常编程中,需要实际遇到的快捷种类非常有限:
- 1.编辑基本的 (比如: 选中,矩形操作,注释,删除,复制-移动行,移动-收缩block)
- 2.代码补全 (包括基本的语句补全,类型补全,以及包等补全)
- 3.代码重构 (重命名某个变量-包括所有用到它的地方,抽取方法,类等)
- 4.代码协助 (代码格式化,参数类型,定义等信息,快速搜索)
- 5.代码导航 (源码跳转,类型声明,定义等),文本出现地方查询
- 6.插件模块使用等 (例如 maven 管理工程,创建 Django 项目等等) --- 略,工种不同插件不同
- 7.调试&构建&运行
大约 6-7 个方面,不管采用哪种 key-map 都脱离不了这些范畴。
- 用的多了,形成肌肉记忆最好,如果不行那就在手边放一个 check list 吧。
约定: 下面 M 即
Meta
(Alt),C
即Control
基本编辑
拷贝粘贴
基本和 emacs 一致,不同的是,这里多了一个拷贝 M + c
,并且保留了 C + k
。
- 可惜的是它没有保留
M + y
对剪切板进行循环选择(kill ring/clip history)
撤销: ctl + shift + -
,(我更喜欢 C + x, u
,或者 C + /
,后者可能冲突)
重做: ctl + shift + z
(Redo)
粘贴: ctl + y
剪切: C + w
, C + k
复制: M + c
(默认行选中,不需要先选中), M + w
(需要先选中)
注意: 如果不选中,那么默认的都是行操作。
选中
用鼠标最快,其次用 shift + 方向键
,但高效的选中不是这样的,是基于块的,基于出现次数的。
选中个某变量出现的地方等 (特别集体替换的时候)
所有出现的地方: M + J
,然后不断按,不断选中,直到没有可选。
- 放弃一个选中,
M + shift + J
。 - 选中所有匹配,则是
ctl + M + shift + J
。
(之后就可以进行批量替换了,结束请按 ESC
,或者 ctl + G
)
块选中,ctl + M + W
,减少选中的块范围 ctl + shift + W
- 不断按键,不断选中或者减少选中范围
选中全部文件 ctl + x, h
(一致)。
-
ctl + x
和 emacs 一样是许多键的前缀(prefix key),后面根据按键不同有不同的功能-
ctl + x, H
选中所有 -
ctl + x, b
切换buffer,这里是切换文件 -
ctl + x, s
保存文件 (没有必要,IDEA自动保存)
-
该 IDE 中额外的
* ctl + x, P
切换到前一个文件(如果有前一个文件的话)
* ctl + x, N
切换到后一个文件(如果有后一个的话)
按两次 ctl+x
是表示在选中的前后跳转(经常用于匹配范围或者括号)。必须先选中。
文件的前后跳转是 ctl + shift + >
和 ctl + shift + <
,一致。
BTW:
- 光标的移动和 Emacs一致
ctl + p
,ctl + n
,ctl + b
,ctl + f
- 选中一行(mark set)
ctl + @
,即ctl + shift + 2
,然后用键盘移动光标 (取消ctl + g
)- 原本 emacs 中 C + Space 就可以 set mark,但是多数时候 GUI 冲突
注释
分为选中和不选中,两种注释方式,IDEA 这里略略不同于 emacs。
注释或者取消注释,统一用
M + ;
(默认都是采用行注释)
但没有选中的情况下,会根据语言的注释风格,比如 C 语言倾向于在本行代码的后面添加注释,类似如下:
c
i = 1 /*i 表示计数器*/
emacs
中取消注释,一定要先选中 本行所有注释内容;但是 idea 中可以不用,只要是同一行的,都能取消注释。且 IDEA 注释完本行,自动跳转到下一行; 且倾向于行注释,即使你选择的是块,这一点比较 stupid 。
补充:
- IDEA 即使选中也会注释掉整行,而不是注释包裹内容 (因为他统一采用行注释嘛)
- 块注释
clt + shift + /
,即ctl + ?
。块注释不一定有用,需要语言支持。
复制上一行
command + d
,这一点和其他微软的编辑器貌似是一致的。
- 多行重复的话,那就先选中吧
增加一个空行
C + j
不起总用
在下面增加一行,但光标不跳转到下一行,请 shift + enter
。(可能无效)
在本行之前增加一个新行 C + M + enter
。
删除空行
最快捷的方式删除下面的一个空行: C + shift + j
。
上下交换
分为行交换,块交换
M + shift + 上、下键
,可以很方便的上移或者下移内容 (行或者块 -- 块需要先选中)。
如果不选中,要移动整块的话,先把光标移动到某个块(最小块)范围内,然后 ctl + shift + 上,下键
。
- 最小块匹配的意思,如果IDE向下找,最先匹配不到一个 block,那么它默认认为 行 就是一个 block,相当于移动行了,此时等同于
M + shift + 上下键
例如下面两个块:
```bash public static void main(String args[]) { (new MoveDemo()).start(); }
要整块移动,请放在块的首行或者尾行。(移动块其实是基于移动行的)
收缩&展开
这个需要自己配置,Emacs 中没有
这个很简单 ctl + -
以及 ctl + +
( shift
可加可不加)。
- 注意也要在块的行首或者行尾
全部展开,全部缩放,它原装的是 ESC + 右方向键
(无效),以及 ctl + shift + =
(有效),我这里统一修改一下:
-
ctl + x, -
收缩所有 -
ctl + x, +
展开所有
讲真,看代码的时候,全部收缩很有用。
打开 shell
不同于 emacs 里面的 shell mode
M + X, 输入terminal
,或者 M + F12
,再按一次关闭。
- 总是可以通过
m + x
找到各种 action,比如说 change buffer。
感觉还不错。
补全
基本的补全是需要你敲击字母的前几个字母(自动提示),然后它会自动弹出来一个 popup 的提示弹窗。
基本补全
这个时候按 ctl + p
或者 ctl + n
进行选择你需要的项目,然后回车 enter
即可
没有选中?就是去焦点了 (popup 弹框消失了)
如果需要再次显示 popup 弹窗,M + /
即可,比如我敲击 Ran
,然后此时不巧,失去焦点了,需要再次弹窗,就按 M + /
。(也就是 eclipse 里面的 alt + /)
如果要取消弹窗,请直接 ESC
即可(C + g
效果一样)。
按一次 M + /
提示有时候会显示没有建议提示,比如我想查看 MAX_VALUE
的在什么地方定义的。
- 按一次不行,那么按两次试试 (针对变量非常有效),此时一般能找到其定义,并自动引入处理
语法补全
全行,语法补全 (根据当前上下文语境,进行补全):
ctl + shift + enter
- 补句末的分号(比如变量或者基本逻辑写完了,句尾的分号让系统自动填充)
- 逻辑语句不完整,比如写了一个 for,然后比较懒,像让系统补齐
for in :
这种
比如我写了一个 if
想进行补全的后面的时候,直接 ctl + shift + enter
即可,或者写完一个 if 条件,需要跳转到另外的地方时,我不需要一行行的跳转到 {}
里面,我直接 ctl + shift + enter
,它自动跳转到里面(同时还给你把语法补齐了,即额外添加了一个冒号或者{}),超级快。
智能导入包
导入包
-
M + 回车
(按两次M+/
导入变量的时候会自动导入包),这里是比较直接的导入。
包有歧义时,比如有两个包都有这个变量,它一般不会提示你选择哪个包的变量,所有这个时候 M + /
两次就比较适合了,它给你选择的机会。
需要写完变量,立即按两次 M+/
来选择性导入。
一般而言, M + enter
不会导错包
智能键入
比
M + /
更加智能,它会过滤一些不需要的选项,减少 popup 窗口的 item
可以这么理解:
M + /
基本提示,M + /
更多提示,太多了,我又想让你自动过滤一些个选项 M + C + /
默认的按键是 ctl + shift + space
,很可惜,这会调出 MPB 默认的 手写板输入这个应用。
- 不过它提供了一个备选键,
clt + M + /
原理: 它会根据当下块的变量环境,自动过滤一些,然后给你一个推荐的 popup 窗口供你选择(实际上就是从上下文看有哪些变量,上下文一般是函数的参数以及上面或者下面的局部变量,一般是上面)。
有时候按一次不管用的时候(没有提示的时候),请尝试看看按两次试试(扩大上下文范围)。
- 比如类内的成员函数返回值属性,这个时候按一次在当前上下文(即函数块)找不到,但是当你按两次时,就能从整个类的范围内寻找,即询问你返回哪个类属性。
替换补全
补全,然后替换已经存在的代码
场景解释:
这个也很常见,比如 WindowConstants.DISPOSE_ON_CLOSE
,现在要改成 WindowConstants.DONOTHING_ON_CLOSE
。
当你键入 WindowConstants
之后,按下 m + /
进行提示,然后你选择,如果这个时候这直接回车,那么结果就会变成:
c
WindowConstants.DO_NOTHING_ON_CLOSEDISPOSE_ON_CLOSE
显然,这不是正确的结果,这个时候,如果要进行替换类型的补全,那么可以用这样的方式:
简单一句话,当 Popup 窗口给你提示的时候,不要按下 Enter,请按 Tab 或者 Esc + Tab.
我这里直接按 Tab
即可,即用 Tab
替代 enter
就是替换补全了。(完整的命令应该是 Esc + Tab
)
代码包裹
选中一个块,然后用一些语句包裹起来,比如 if
,比如 for
,最常见的是 try,catch
。
-
ctl + M + t
,它会弹出一个 popup,然后根据需要选择一个框即可
方便吧。
代码重构
这里大部分人其实用不到的,除非你要升级自己的代码或者接受的是别人的老代码。
主要分为两个方面:
- 重命名类的重构 (refactoring)
- 抽取类的重构 (extract) : 抽取类属性(域)或者局部变量,抽取类内的方法
重命名
这里主要是指批量重命名,方式有很多,可以用之前的选中技巧:
-
M + j
,M + shift +j
,M + shift + ctl + j
(人为判断)
也可以用 emacs 的 M + s
或者 m + %
进行查找替换(不够专业,慢)。
专业的做法是: shift + F6
。
- 默认把所有匹配的地方全部选中,然后直接键入新名字然后回车即可。
- 如果涉及到
getter
,那么它修改完毕之后会询问你是否要修改它(默认是否,需要用鼠标点击是)
BTW: 我个人用的更多的是 M + j
逐个选中其出现的地方,确定是需要被替换的内容,才替换
抽取变量
抽取变量,属性?
一般是一些匿名的变量或者调用,突然要给它命名或者接受一个函数的返回值,那么此时,不需要把光标移动前面,然后给定义类型,定义变量名。这么做太慢了。
直接 ctl + m + v
。
例如:
cpp
getAllUsersInfo('tokenXXXXX') // 懒得写返回值?用快捷键吧
然后我要拿到这个返回值,怎么办?移动光标,然后命名类型,然后再定义变量?
直接 ctl + M + v
,这是它自动定义类型,然后提示你输入变量的名字(当然它一般默认返回值的名字是 process
或者另外的名字,通常都需要根据实际情况重新命名)
BTW: 写完之后,先按下 Enter或者 Tab,然后直接跳转下一行(shift+enter)。不需要再把光标跳转行尾,太傻了。
抽取常量
实际上,抽取变量,特别是常量,最常见的是
ctl + M + c
,c 就是 constant 的意思。
例如 "test.txt"
,如果要把 txt
抽取成常量,那么直接选中 txt
,然后 ctl + M + c
即可。
(IDE会询问你,抽取的变量放在什么地方,在弹出框中选择即可; 如果只有一个地方可以放,它默认放在全局)
把函数实现中的某个变量抽取出去,当成一个变量,比如我的函数内部有一个语句:
java
System.out.println('你好');
现在我想把这个 "你好",当做这个函数的参数(param),调用的时候传入,而不是我这里写死。
现在把它抽取出成一个函数变量, ctl + M + p
,然后给这个变量命名即可,此时调用的地方是自动处理好的。
```java
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("input." + TXT));
ArrayList
private static void printSotedArray(ArrayList
用用就知道了。
总结一下,抽取变量就两种:
- 抽取常量
ctl + M + c
- 抽取方法参数
ctl + M + p
-
补全返回值或者给语句命名(最好有返回值,IDE可以根据这个判断类型)
ctl + M + v
(注意此处有可能是重命名,此时引用或者使用该变量的地方全部会被重新命名)
抽取方法
如果有一段代码明显是重复的,或者你就是想要抽取出来做成一个方法。
- 选中那一段代码段 (要被抽取出去单独命名的)
-
ctl + M + m
,就是抽取 method
它会提供一个可以预览的窗口,并根据你所在的语言要你选择重构的返回值,函数名字,以及参数(param)。
(不清楚的话,可以点击 preview 更加清晰的了解)
有时候可能不太理想,那么请根据需要进行适当的调整即可。
协助工具
格式化
直接 ctl + M + shift + l
,不管有没有选中代码块,ide 都会询问你是否要格式化整个文件或者告诉IDE一个region,然后还有一些优化选项。
经验: 不要让它全局格式化,有时候不是你想要的(虽然很整齐),最好选中代码后再格式化。
如果没有选中,IDE 自动格式化整个文件。
实际上,也可以通过 M+x, reformat
,此时比较智能。
查看参数信息
M + /
或者C + M + /
提示无效的时候
函数的参数是啥(想看参数原型),忘记了,比如已经写了如下语句:
java
frame.setSize(/*???*/);
这个时候 M + /
或者ctl + M + /
是不管用的,它只会给出应该填入的参数可选值,并不会输出函数参数的原型,如果要看参数的原型,可以用 M + shift + p
,显示参数的定义以及其原型。(对于无类型的编程语言,比如某些动态语言,就。。。看下面)
M + shift + P
查看函数的参数的原型(有时候可能没有效果,参考下面的ctl + q
)
- 其实根本不必按键,当光标位于括号中间的时候,你把光标放在那里不动(等一会),它自动就会显示出原型
-
M + shift + p
,光标放在函数名或者小括号里都是可以的
查看函数原型
C + q 显示函数调用文档; C + shift + I 显示函数的定义
如果函数的原型都不记得了,不必跳转,直接按 ctl + q
就会有一个弹出框显示函数原型(实际上显示的函数的文档)。
如果要看函数的定义 ctl + shift + I
,不过 ctl + shift + I
通常都是需要看函数是如何实现的时候才使用的。
- 注意前提: 选中函数名或者光标在函数名上
查看错误
如果代码有错误,那么文件名下面就会有红色波浪线。
快速找到最近的(下一个)的错误,
F2
(建议类的貌似也会提示,比如你 import了,却没有使用的包)
如果需要查看该错误的详细相信 ctl + F1
(注意不是F1
)。
- 有时候不管用,但这个不用单独设置,移动一下鼠标就看到;
- 不用键盘的话,最好改成
ctl + shift + f1
我已经修改成了
C + shift + F1
,请按一次,再按一次(show detail)
然后 M + enter
,就可以看到给出的修改建议,然后选中一种方案。
- 注意这里不同于自动补全的
ctl + shift + enter
持续高亮显示
默认的,光标移动到一个变量上,这个变量就会高亮显示。
如果想要持续高亮显示,
ctl + shift + F7
,再按一次取消。
- 取消时光标也必须在变量上
导航
代码导航,简单理解就是 查看定义或者原型
代码导航,这里不仅是前面的 ctl + shift + i
或者 ctl + q
,这里更多的强调是跳转。
跳转源码
主要就是
F4
,把光标放在类型上,然后就自动跳转到定义的地方去了。
而 C + q
或者 C + shift + i
是在代码出弹出一个框显示源码,是被精简过的。
但是 F4
更多的是调用者出发的,去寻找其原始定义的位置,会跳转过去。
遇到接口方法,想找实现? 或者反过来,我想看这个方法都被谁调用了?
F4
绝对不是一个好的选择(它只能查看具体的定义)。
此时可以选择 ctl + M + G
进行跳转,它一般用于抽象类或者接口,一般有两个作用:
- 跳转接口声明上(从调用的地方,直接看接口的声明)
- 跳转到或者popup展示调用的地方或者实现的地方 (从声明的地方查看)
比如我有一个接口:
java
interface Pigeon {
void consume(String foodType);
}
要看其调用的地方或者实现的地方,这个时候就可以 ctl + M + g
或者 ctl + 鼠标左键
或者M + .
。
用过 cs-code 的,这里建议使用
M + .
这样的来回跳更加实用一些,这个命令可以查看被调用的所有的地方,有多个,它会让你去做选择:
查看文件的组成
主要查看当前文件有哪些类定义,哪些方法等等。
ctl + F12
查看下一次出现的位置
简单说,就是搜索
最好的办法: m + j
选中(不需要你去输入搜索词),然后 ctl + s
。
(其实 emacs 更加智能,只要你的光标在这个单词上,然后 ctl + s
,它默认你就是搜索当前这个词)
-
ctl + s
向下跳转 (当然你也可以用enter
或者F3
) --- 不过熟悉 emacs 一般都会用ctl + s
跳转 -
ctl + r
向上跳转 (反向查找);当然也可以用shift + f3
如果当前仍在搜索状态,那么即使关闭顶部的搜索框,依旧可以用按键进行跳转。
关闭的搜索状态的话,可以使用 ctl + g
或者 esc
(替换的话,依旧和 emacs 一致, M + %
)
最后编辑的地方
最后编辑的地方跳转: ctl + shift + delete键
(即光标最后选中或者停留的地方)
注意: 这货可以跨文件,不单单是说在该文件里最后编辑的地方,它会搜索整个工程。
跳转行
因为原装 eamcs 的 M + g, g
可能有冲突 (总是不能显示当前行,而显示一个 @
符号),所以我改成了:
M + g, Ctl + g
父类跳转
有熊孩子闯祸了,快速找到其爸爸?
ctl + U
可以帮助你在整个继承体系(OO体系)中寻找干系人
按方法跳转
这里严格来说是按照方法或者类、接口块来跳转。
比较聪明的做法是,
- 先折叠,然后跳转:
clt + x, -
, - 然后
M + 方向下键
,或者M + 方向上键
(这是会在方法名前面跳转)
其实现,其实是是块跳转。
注意: 折叠的时候,一般连类也会被折叠。所以跳转的时候,所以方法或者类会被展开。
推荐我的方式:
- 1.折叠
ctl + x, -
,查看文件结构 (如果不行,再进行下面的) - 2.查看文件结构(outline)
ctl + F12
——— 最推荐,一目了然
其他
包括各个插件,应用应用软件,比如 pyenv, 比如 maven等等的使用,太多了,不介绍了。
导出配置
导出配置 file -> export setting
。
- 导出的时候,选择
key maps
相关的即可。(是一个 zip 文件)
调试
主要固定在 F5, F6, 尤其 F7, F8, F9,但是每种语言不同,不通用
补充: 调试部分还是不要记快捷键了,真的不通用。用鼠标点击即可。
这里 IDEAJ:
-
C + F9
构建项目,ctl + shift + F9
重新构建项目 -
M + shift + F10
运行项目 -
M + shift + F9
debug调试
其他的,比如 F8
Step Over,F7
Step Into,shift + F8
Step Out 等。
Bonus
如果您看完整篇后,能记忆全部快捷键,那么IT这个领域对您来说,太过狭小;或者您的才华,耗费在这里有些可惜。
真的。因为这是我工作两年多后,才能得心应手的。
差不多完毕了,您看到 "矩形操作"
了么?
如果您对上述的某些术语没有概念,那么很难做到得心应手。依旧:高手请随意。
CH-YK 2019.04.03 从 wiki-handbook 抽取一篇贡献社区