功能按键

M(eta) ,在 Mac 下为 Option

s(uper) ,在 Mac 环境下为左 Command

S(hift)

C(trl)

基本操作

C-x C-f 打开文件

C-x C-s 保存文件

C-x C-c 退出Emacs

M-w 复制

C-w 剪切

C-y 粘贴

M-x 执行命令

C-x C-b 切换Buffer

C-c p f 目录查找文件

C-c s 交换2个Window

M-c 光标位置开始的首字母改为大写

M-u 光标位置开始的单词改为大写

M-l 光标位置开始的单词改为小写

C-x C-u 选定区域改为大写

C-x C-l 选定区域改为小写

Emacs Lisp

C-x C-e 执行最后一个表达式

C-c C-z 打开Elisp REPL

C-c C-c 执行Elisp代码块

C-c C-b 执行整个Buffer

Common Lisp(Slime)

M-x slime 启动slime

C-- M-x slime 启动slime并选择要启动的lisp实现(有些设置可能是 M-- M-x slime

M-p 上一条被输入 REPL 执行的表达式

M-. 跳转到符号定义处

C-x 4 . 在新窗口中跳转到其定义,和上面命令不同的就是会在新 Buffer 中打开

C-x 5 . 跳转并在另一个窗口中编辑,和上面命令不同的就是会新开一个 Emacs 窗口

M-, 回到执行的光标处

C-c-: 从 MiniBuffer 读取表达式并求值

C-M-x 执行当前 toplevel 的 form

C-x C-e 对光标之前的 S 表达式求值

C-c C-r 对选中的表达式求值

C-c C-p 类似 C-x C-e,但它会把求值结果打印到一个新的 Buffer 中

C-c E 单独编辑可以被 setf 的值,会启动一个临时 Buffer 编辑,然后 C-c C-c 应用这个新值,可以避免在 REPL 下手动写 setf 设置

C-c C-u 取消函数的定义,这个很有用,可以让 core 中定义的函数失效

C-M-iTab 自动补全

C-c C-d d 显示光标所在的符号的描述信息

C-c C-d f 显示光标所在的函数的描述信息

C-c C-d a 搜索符号的文档字符串(显示全部匹配),默认包括外部变量

C-c C-d z 如果要默认包含所有内部符号

C-c C-d p 显示包内的结果,等于还可以查找有哪些包

C-c C-d h 显示光标所在处符号的 Hyperspec 文档

C-c C-d ` 查找 format 里控制符的文档

C-c C-d # 查找读取宏的文档

C-c C-m 将光标处的宏展开一次(一层)

C-c M-m 将光标处的宏完全展开

C-c C-b 中断 Lisp 进程(比如中断死循环等等)

M-x slime-restart-inferior-lisp 重启 REPL

M-x slime-sync-package-and-default-directory 同步到当前包的工作目录,比如在编辑另外个目录下的文件,现在要 REPL 切换到该目录下

C-c C-p 设置当前 REPL 所在包

M-x slime-cd 改变 REPL 目录

M-x slime-pwd 打印出当前目录

M-x slime-toggle-profile-fdefinition 触发对某个函数的分析

M-x slime-profile-package 分析某个包里的函数

M-x slime-profile-by-substring 分析所有名字含某个字符串的函数

M-x slime-unprofile-all 停止所有分析

M-x slime-profile-report 报告分析结果

M-x slime-profile-reset 重置分析报告

M-x slime-profiled-functions 显示当前正在分析的函数

C-c C-c 编译光标所在的 toplevel 形式

C-c C-k 编译文件,然后加载

C-c M-k 编译文件,只编译不加载

C-c C-l 调用 load 函数加载

M-x slime-compile-region 编译选中的表达式

C-c M-d 显示光标处函数的汇编代码

C-c C-t 对光标的函数 trace

M-x slime-untrace-all 停止 trace

C-c C-w c 显示某函数被哪些函数调用

C-c C-w w 显示该函数调用了哪些函数

C-c C-w r 显示某全局变量被引用的情况

C-c C-w b 显示某全局变量被其他函数绑定情况

C-c C-w s 显示对某全局变量的赋值

C-c C-w m 显示某个宏被其他函数调用情况

M-x slime-who-specializes 获得某个类的所有方法

C-c < 列出某个函数的所有调用者

C-c > 列出一个函数调用的所有函数

Scheme

C-c C-z 打开 Geiser REPL

C-c C-c 执行当前定义

C-c C-\ 插入 λ

M-. 查看接口定义

M-, 返回查看定义前的位置

Racket

C-c C-c 运行 Racket REPL

C-c C-z 打开 Racket REPL

C-M-y 插入 λ

C-x C-e 发送最后一个 S 表达式到 REPL

C-M-x 发送当前定义到 REPL

C-c C-d 查询 Racket 官方文档

C-c C-p 改变 S 表达式括号形状 () [] {}

C-M-. 查看模块定义

M-. 查看接口定义

M-, 返回查看定义前的位置

Clojure(Cider)

C-c C-x C-j C-j 启动 Cider nREPL

C-c C-z 切换 Buffer 和 nREPL,如果使用 C-u 前缀会将 nREPL 的命名空间切换到与当前 Buffer 匹配的命名空间

C-c C-k 运行当前整个 Buffer

C-c C-e 运行当前光标所在的前一个表达式

C-c M-p 将当前光标所在的前一个表达式输出到 nREPL 中

C-c C-c 运行当前光标所在的顶层表达式

C-c C-b 中断当前代码执行

C-c C-m 对当前光标位置的表达式执行 macroexpand-1

C-c M-m 对当前光标位置的表达式执行 macroexpand-all

C-c C-l 执行加载源代码文件

C-c C-d d 查询当前光标位置表达式的文档

C-c C-d j 在默认浏览器里查看当前光标位置表达的 JavaDoc

C-c C-d a Apropos 搜索 functions/vars

C-c M-i Inspect 当前光标位置的表达式

C-c C-u 清除符号定义

C-c M-t v 开启函数 Tracing

C-c M-t n 开启命名空间 Tracing

M-. 跳转到定义处

M-, 返回之前的跳转处

C-c C-t 测试相关指令

C-u C-M-x 打开调试器

C-M-x 撤销调试器

C-c C-= v 开启函数 Profiling

C-c C-= n 开启命名空间 Profiling

C-c C-= s 展示 Profiling 报表

C-c C-t C-p 运行当前项目所有测试用例

C-c C-t C-n 运行当前命名空间下的所有测试用例

C-c C-t C-l 运行当前所有已加载的测试用例

JavaScript

M-. 跳到函数声明

M-, 跳回光标处

C-c C-o 折叠/展开当前代码块

C-c C-f 折叠/展开所有函数块

C-c C-t 折叠/展开所有注释

C-c C-m 代码反射

C-c C-d 插入注释文档

Org-mode

C-c ' 打开 major mode 来编辑 src 里的源码

C-c C-c 执行 ... 之间的代码

C-c x 导出项目HTML