Emacs

Emacs和Vim的主要不同在于, Vim是符合UNIX哲学的工具(只做一件事, 并把这件事做好),
Emacs是不符合UNIX哲学的工具(可以做任何事, 因为它本质上是一个Elisp的解释器).

  • Vim的快捷键很多, 但Vim的模式和快捷键是固化的,
    这使得这些按键在支持Vim键位的软件里通用, 而且Vim的快捷键确实很好用,
    连Emacs用户也喜欢用evil-mode(用来在Emacs里使用Vim键位的插件).
  • Emacs的快捷键本质上是命令的绑定, Emacs的命令非常多, 这导致Emacs的快捷键比Vim还要多得多.
    Emacs的键位因此变得非常难以记忆, 加上在不同的模式里快捷键可能会大变样,
    导致掌握Emacs的快捷键极为困难, 很多时候还不如直接输入命令.

使用Vim能感受到显著地编辑效率提升, Emacs则不然, 但Emacs具有比Vim强得多的hack功能(elisp),
用户编写自己的功能比Vim要容易许多.

CONTROL 缩写为 C, 在键盘上是Ctrl或Command键
META 缩写为 M, 在键盘上是Alt键
SHIFT 缩写为 S, 在键盘上是Shift键
RETRETURN 在键盘上是Enter键
DEL 在键盘上是BackSpace键
SPC 在键盘上是Space键
ESC 在键盘上是Esc键

q 关闭欢迎画面, 进入scratch(草稿, 一个空白缓冲区)

C-x C-c 退出Emacs
C-g 取消命令(用于取消当前已经输入的命令, 相当于Vim的 <Esc>)
C-u {number} {action} 次数重复命令, 可用于各种键. 若直接输入字符, 则输入该字符number次.
C-z 暂离Emacs(回到终端, 用fg命令回来)
ESC ESC ESC 离开命令(可以关闭缓冲, 窗格, 与 C-g 有一些区别)

使用被禁用命令时(避免新手按错), 会弹出确认, 按n键拒绝执行命令.

C-v 向下翻屏 相当于 PageDown
M-v 向上翻屏 相当于 PageUp

C-l 将光标行置于屏幕中央
C-l C-l 将光标行置于屏幕顶部
C-l C-l C-l 将光标行置于屏幕底部

CONTROL 组合键常用于语言无关单位(字符, 行)
META 组合键常用于语言有关单位(单词, 句子, 段落)

C-p 向上移动光标 previous
C-n 向下移动光标 next
C-b 向左移动光标 backward
C-f 向右移动光标 forward

M-f 向后跳跃一个单词
M-b 向前跳跃一个单词

C-a 移动光标至行首 ahead
C-e 移动光标至行尾 end

M-a 移动光标至句首
M-e 移动光标至句尾

M-< (< 左尖括号, 需要同时按住Shift) 移动光标至文件首
M-> (> 右尖括号, 需要同时按住Shift) 移动光标至文件尾

C-d 删除光标后的一个字符, 相当于Delete键
C-h 删除光标前的一个字符, 相当于Backspace键

M-<DEL> 删除光标前一个单词
M-d 删除光标后一个单词

C-k 杀死(剪切)至行尾 kill
M-k 杀死(剪切)至句尾 kill

C-<SPC> {移动光标选择文本} C-w 选择并杀死文本

C-y 粘贴(先前杀死的)文本 yanking
M-y 将刚刚用 C-y 粘贴的文本切换成更早的文本(重复按 M-y 可找回更早的文本) yanking

C-/C-_C-x u 撤销

C-x 1 关闭当前窗格以外的窗格, 也适用于各种命令打开的列表(它们就是以窗格形式显示的).
C-x 2 将屏幕分为上下两个窗格
C-x 3 将屏幕分为左右两个窗格
C-x 4 C-f <输入文件名> 打开一个新窗格并打开新文件
C-M-v 向下滚动另一个窗格
C-M-S-v 向上滚动另一个窗格
C-x o 将光标移动到其他的窗格(以遍历的形式) other

多窗口主要用于图形界面, 文本终端只能显示一个窗口.

M-x make-frame <Return> 打开一个新的窗口
M-x delete-frame <Return> 关闭当前窗口

C-x C-f <输入文件名> 打开一个文件(和Vim一样, 以缓冲区形式打开, 所以也可以打开不存在的文件) find/file
C-x C-s 保存文件 save
M-x customize-variable <Return> make-backup-files <Return> 关闭文件备份特性(在保存时创建以~结尾的备份文件)
C-x C-b 列出缓冲区(已打开文件列表)
C-x b <缓冲区名称(大部分情况下与文件名相同)> <Return> 回到某个缓冲区
C-x s 保存多个缓冲区(该命令会逐个询问已被修改但尚未保存的缓冲区是否要保存)

缓冲区通常是文件, 但也存在Emacs内部定义的虚拟缓冲区(名称两侧有 * 符号),
可以用 C-x b 打开, 以下是虚拟缓冲区:

  • Buffer List 缓冲区列表
  • Messages Emacs底部出现的消息

间接缓冲区在分屏显示同一篇org-mode文档时很有用, 因为在间接缓冲区里, org-mode的折叠是独立的.

M-x clone-indirect-buffer 创建间接缓冲区

由于Emacs命令数量太多, 键盘绑定不下, 所以很多命令需要靠扩展命令完成.

C-x 字符扩展命令(输入 C-x 后跟一个字符或组合键, 跟Vim的Leader键是一个作用, 只是Emacs的命令更多)
M-x 运行命令(输入 M-x 之后输入一个命令名再按 <Return>),
以命令名形式扩展的命令都是不常用的命令(类似于Vim的ex命令),
本质上是函数(命令名就是函数名), 字符扩展命令不过是对函数名的键盘绑定.

M-x replace-string 字符串替换(不需要输入完整的命令名, 输入 repl s<TAB> 就可以完成命令补全),
接下来Emacs会询问用户具体的参数(类似于Powershell).
M-x recover file 恢复自动保存文件(Emacs会创建自动保存文件, 类似于Vim的swp文件)

主模式 major mode
辅模式 minor mode

不同辅模式下相同的命令会有一些细节变化, 辅模式可以同时开启多个.
启动模式的命令也可以用来关闭模式.

M-x fundamental-mode Fundamental模式(Emacs的主模式)
M-x text-mode 自然文本辅模式(和主模式的区别在于M-f和M-b把单引号也视作单词的一部分)

M-x auto-fill-mode 自动折行辅模式
(超出边界的内容会被换行, 这个边界不是窗口的边界, 而是Emacs定义的每行最大字符数, 可以用 C-x f 设置)
M-q 手动折行当前段落(参照 C-x f 设置的边界)

C-s 向前搜索
C-r 向后搜索

C-h ? 查看所有帮助

C-h v <变量名> 查看变量文档
C-h f <函数名> 查看函数(命令)的文档
C-h k <组合键> 查看快捷键的文档

C-h c <组合键> 查看快捷键的简短说明
C-h a <关键词> 相关命令搜索, 查找所有包含次关键词的命令

SPC 先导键(和 Vim 的 <Leader> 等价), 默认为空格键

按下 SPC 后, 会出现进一步按键的菜单, 每个按键后都跟随着说明文本, 用户不会一头雾水.

Spacemacs 的按键基本上采用英语作为助记符.

虽然 Spacemacs 使用 Vim 的按键进行文本编辑,
但列表窗口仍然需要使用 Emacs 的按键进行上下移动( C-n 向下, C-p 向上),
因为列表窗口还可以输入字符进行模式匹配(搜索).

遇到新的文件格式时, Spacemacs 会自动提示下载相关的 layer.

SPC ? 查看按键绑定

https://github.com/syl20bnr/spacemacs/issues/4453
由于这个问题的存在, Spacemacs要么处于可以使用的状态, 要么是一坨纯粹的狗屎.

Spacemacs的稳定版本自2018年以来再也没有升级过主版本号, 一直停留在 200 版本.
官方仓库的主要分支现在已经切换到版本号升至300的develop分支, 似乎是想直接用开发版替代稳定版.
虽然 develop 在基本功能的使用上没有问题, 但有关新特性的文档处于语焉不详的状态.

SPC w 窗口菜单

SPC w . 管理窗口状态(Window transient-state),
处于该状态时, 可以使用单个按键调整窗口的大小, 位置等(下方会出现相关按键的提示信息).
实际上用鼠标就可以改变窗口大小.

SPC w / 左右分屏
SPC w - 上下分屏
也可以用 Vim 的 C-w vC-w s 分屏

C-w o 使当前窗口成为唯一窗口
C-w c 关闭当前窗口

SPC 1 切换光标到窗口 1(窗口的序号显示在窗口左下角)
SPC 2 切换光标到窗口 2
也可以用 Vim 的 C-w h/j/k/l 移动光标, 不需要在乎序号

C-w H/J/K/L 移动窗口

SPC w d 关闭当前窗口(关闭窗口并不会关闭缓冲区)

SPC b 缓冲区菜单

SPC b n 下一个缓冲区
SPC b p 上一个缓冲区

SPC b b 打开缓冲区列表
SPC b d 关闭当前缓冲区

SPC f f 通过交互式的资源管理器打开文件
SPC f r 最近打开的文件列表
SPC f s 保存文件(用 Vim 的 :w 替代就够了)

SPC f t 开关 NeoTree

Spacemacs 使用 layer 作为配置单元, 多个 layer 可以堆叠在一起(即同时开启多个功能).

SPC f e d 打开 ~/.spacemacs 文件

Doom Emacs相比Spacemacs更轻量, 也更接近原始Emacs.

  • 官方引入了一些自以为是的怪癖, 例如将Evil的 s 键设置为其他功能, 并推荐用 cl 替代原本的 s.
  • 社区小于Spacemacs, 因此虽然更轻量和更接近于原始Emacs, 但对于不熟悉Emacs的人来说也更难配置.
  • Org Mode的行为与Spacemacs不符, 在中文文本的换行, S-RET 键的绑定上都有奇怪的问题.