PyCharmPro-Emacs配置

简述本文

习惯 emacs 快捷键的用户使用 PyCharm 或可参考本文

BTW: 因为快捷键的说明就已经占了很大的篇幅,所以其他的诸如 Template, Snippet设置等,略

导入配置

从旧的 MBP 上到处配置,然后初始化新机器 PyCharm Professional 的时候导入配置,直接看图:

导出

1.先导出: "File -> Export Settings",导出一个 zip 文件:

PyCharmPro-Emacs配置

导入

2.接着导入: 不用解压 zip 文件:

PyCharmPro-Emacs配置

如果您对我设置的快捷键配置有兴趣,我单独导出了一份快捷键配置放在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 语言倾向于在本行代码的后面添加注释,类似如下:

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(); }

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

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

收缩&展开

这个需要自己配置,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,然后根据需要选择一个框即可

PyCharmPro-Emacs配置

方便吧。

代码重构

这里大部分人其实用不到的,除非你要升级自己的代码或者接受的是别人的老代码。

主要分为两个方面:

  • 重命名类的重构 (refactoring)
  • 抽取类的重构 (extract) : 抽取类属性(域)或者局部变量,抽取类内的方法

重命名

这里主要是指批量重命名,方式有很多,可以用之前的选中技巧:

  • M + jM + shift +jM + shift + ctl + j (人为判断)

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

专业的做法是: shift + F6

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

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

PyCharmPro-Emacs配置

抽取变量

抽取变量,属性?

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

直接 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 lines = new ArrayList(); String line; while ((line = reader.readLine()) != null) { lines.add(line); } reader.close(); printSotedArray(lines, "你好"); //-------------here }

private static void printSotedArray(ArrayList 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 + / 提示无效的时候

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

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)

PyCharmPro-Emacs配置

然后 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 + .

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

PyCharmPro-Emacs配置

查看文件的组成

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

  • ctl + F12

PyCharmPro-Emacs配置

查看下一次出现的位置

简单说,就是搜索

最好的办法: 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 抽取一篇贡献社区


上一篇:ThreadPoolExecutor 之执行与关闭


下一篇:Postgres-XL集群软件介绍及搭建