Tech:PyCharmPro-Emacs配置

从旧的项目导出配置,然后配置到新环境,微调。主要讲 emacs 用户的快捷键配置

简述本文

习惯 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),CControl

基本编辑

拷贝粘贴

基本和 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 语言倾向于在本行代码的后面添加注释,类似如下:

1
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 + 上下键

例如下面两个块:

1
2
3
4
5
6
7
8
public static void main(String args[]) {
(new MoveDemo()).start();
}

<here>public void run() {
started = true;
System.out.println("Hello from a thread!");
<here>}

要整块移动,请放在块的首行或者尾行。(移动块其实是基于移动行的)

收缩&展开

这个需要自己配置,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 + / 进行提示,然后你选择,如果这个时候这直接回车,那么结果就会变成:

1
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 + jM + shift +jM + shift + ctl + j (人为判断)

也可以用 emacs 的 M + s或者 m + %进行查找替换(不够专业,慢)。

专业的做法是: shift + F6

  • 默认把所有匹配的地方全部选中,然后直接键入新名字然后回车即可。
  • 如果涉及到 getter,那么它修改完毕之后会询问你是否要修改它(默认是否,需要用鼠标点击是)

BTW: 我个人用的更多的是 M + j 逐个选中其出现的地方,确定是需要被替换的内容,才替换

patch-modify

抽取变量

抽取变量,属性?

一般是一些匿名的变量或者调用,突然要给它命名或者接受一个函数的返回值,那么此时,不需要把光标移动前面,然后给定义类型,定义变量名。这么做太慢了。

直接 ctl + m + v

例如:

1
getAllUsersInfo('tokenXXXXX') // 懒得写返回值?用快捷键吧

然后我要拿到这个返回值,怎么办?移动光标,然后命名类型,然后再定义变量?

直接 ctl + M + v,这是它自动定义类型,然后提示你输入变量的名字(当然它一般默认返回值的名字是 process或者另外的名字,通常都需要根据实际情况重新命名)

BTW: 写完之后,先按下 Enter或者 Tab,然后直接跳转下一行(shift+enter)。不需要再把光标跳转行尾,太傻了。

抽取常量

实际上,抽取变量,特别是常量,最常见的是 ctl + M + c,c 就是 constant 的意思。

例如 "test.txt",如果要把 txt 抽取成常量,那么直接选中 txt ,然后 ctl + M + c 即可。

(IDE会询问你,抽取的变量放在什么地方,在弹出框中选择即可; 如果只有一个地方可以放,它默认放在全局)

把函数实现中的某个变量抽取出去,当成一个变量,比如我的函数内部有一个语句:

1
System.out.println('你好');

现在我想把这个 “你好”,当做这个函数的参数(param),调用的时候传入,而不是我这里写死。

现在把它抽取出成一个函数变量, ctl + M + p ,然后给这个变量命名即可,此时调用的地方是自动处理好的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader("input." + TXT));
ArrayList<String> lines = new ArrayList<String>();
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
reader.close();
printSotedArray(lines, "你好"); //-------------here
}

private static void printSotedArray(ArrayList<String> lines, String extraInfo /*here*/) {
String[] array = lines.toArray(new String[lines.size()]);
Arrays.sort(array);
for (String s : array) {
System.out.println(s);
}
System.out.println(extraInfo); //here: extraInfo 就是我给它命令的变量
}

用用就知道了。

总结一下,抽取变量就两种:

  • 抽取常量 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 + / 提示无效的时候

函数的参数是啥(想看参数原型),忘记了,比如已经写了如下语句:

1
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)

detail-help

然后 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展示调用的地方或者实现的地方 (从声明的地方查看)

比如我有一个接口:

1
2
3
interface Pigeon {
void consume(String foodType);
}

要看其调用的地方或者实现的地方,这个时候就可以 ctl + M + g 或者 ctl + 鼠标左键或者M + .

用过 cs-code 的,这里建议使用 M + .

这样的来回跳更加实用一些,这个命令可以查看被调用的所有的地方,有多个,它会让你去做选择:

show-all

查看文件的组成

主要查看当前文件有哪些类定义,哪些方法等等。

  • ctl + F12

outline

查看下一次出现的位置

简单说,就是搜索

最好的办法: 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体系)中寻找干系人

按方法跳转

这里严格来说是按照方法或者类、接口块来跳转。

比较聪明的做法是,

  1. 先折叠,然后跳转: clt + x, -
  2. 然后 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 抽取一篇贡献社区


文章目录
  1. 1. 简述本文
  2. 2. 导入配置
    1. 2.1. 导出
    2. 2.2. 导入
  3. 3. key-map配置
    1. 3.1. 配置大纲
    2. 3.2. 基本编辑
      1. 3.2.1. 拷贝粘贴
      2. 3.2.2. 选中
      3. 3.2.3. 注释
      4. 3.2.4. 复制上一行
      5. 3.2.5. 增加一个空行
      6. 3.2.6. 删除空行
      7. 3.2.7. 上下交换
      8. 3.2.8. 收缩&展开
      9. 3.2.9. 打开 shell
    3. 3.3. 补全
      1. 3.3.1. 基本补全
      2. 3.3.2. 语法补全
      3. 3.3.3. 智能导入包
      4. 3.3.4. 智能键入
      5. 3.3.5. 替换补全
      6. 3.3.6. 代码包裹
    4. 3.4. 代码重构
      1. 3.4.1. 重命名
      2. 3.4.2. 抽取变量
      3. 3.4.3. 抽取常量
      4. 3.4.4. 抽取方法
    5. 3.5. 协助工具
      1. 3.5.1. 格式化
      2. 3.5.2. 查看参数信息
      3. 3.5.3. 查看函数原型
      4. 3.5.4. 查看错误
      5. 3.5.5. 持续高亮显示
    6. 3.6. 导航
      1. 3.6.1. 跳转源码
      2. 3.6.2. 查看文件的组成
      3. 3.6.3. 查看下一次出现的位置
      4. 3.6.4. 最后编辑的地方
      5. 3.6.5. 跳转行
      6. 3.6.6. 父类跳转
      7. 3.6.7. 按方法跳转
    7. 3.7. 其他
      1. 3.7.1. 导出配置
      2. 3.7.2. 调试
  4. 4. Bonus
|