返回

Emacs使用笔记

原版快捷键

光标、页面移动相关

按键 功能
C-v 下一屏
M-v 上一屏
C-l 重绘屏幕,将光标至于中央、顶端、底端
C-p 方向键上
C-n 方向键下
C-b 方向键左
C-f 方向键右
M-f 这个词的末尾
M-b 这个词的开头
C-a 行首
C-e 行尾
M-a 这一句的开头
M-e 这一句的末尾
M-< 文件开头
M-> 文件末尾
C-M-v 在另一个window里下一屏
C-M-S-v 在另一个window里上一屏
M-g M-g 行号 跳转到某一行

文本操作

按键 功能
<DEL> 删除(delete)光标前的一个字符,windows上为Backspace
C-d 删除光标后的一个字符
M-<DEL> 移除(kill)光标前的一个词
M-d 移除光标后的一个词
C-k 移除光标到行尾间的字符
M-k 移除光标到句尾间的字符
C-<SPC> 开始标记范围,从光标处开始,移动光标扩大选中范围
C-w 移除选中范围的字符,其实就是剪切
M-w 复制选中范围的字符
C-y 召回(yanking)被最近一次移除(kill)的字符
M-y 在C-y之后,紧接着使用,可以替换为召回再上一次被移除的字符,连续使用多次则替换为召回在上多次被移除的字符
C-/ 撤回,多次使用则撤回更以前的操作。如果使用C-g打断undo,则之后的C-/是重做
C-s 向下文搜索。再次按C-s则搜索下一个出现的位置。<Return>即回车将光标停在这个位置,结束搜索。C-g结束搜索并将光标还原到原来的位置
C-r 向上文搜索,其他类似
M-x replace-string 替换字符串
C-o 与回车不同的是,光标不会进入到下一行
C-x C-o 将光标前后的所有空白行变成一个空白行
C-x h 全选

文件相关

按键 功能
C-x C-f 寻找并打开一个文件,如果不存在,则新建这个文件
C-x C-s 保存文件
C-x C-r 以只读方式打开文件
C-x C-q 切换为只读模式

Buffer相关

按键 功能
C-x C-b 列出Buffer
C-x b 缓冲区名 切换到这个缓冲区
C-x s 保存多个缓冲区

Window相关

按键 功能
C-x 0 关闭当前光标所在的window
C-x 1 保留当前光标所在的window,关闭其他所有
C-x 2 将屏幕分为上下两个window
C-x 3 将屏幕分为左右两个window
C-x o 光标切换到另一个window
C-x 4 以该命令为前缀时,表示在另外一个窗口做……例如C-x 4 f表示在另一个窗口打开新文件

其他

按键 功能
C-u 数字 其他命令 给其他命令传递一个数字,大部分都是重复次数
C-g 取消没输完的命令或者正在执行的命令
C-x 字符扩展,之后输入另一个字符或组合键
M-x 命令名扩展,之后输入一个命令名
C-x C-c 退出Emacs
C-x C-= 放大字号
C-x C-- 减小字号
C-x C-0 默认字号

evil-mode快捷键

大部分都是从vim教程中整理来的,标注一些与emacs冲突的快捷键。

光标、页面移动相关

按键 功能
j 向下
k 向上
h 向左
l 向右
w 移动到下一个单词开始。W,b,B,$等可通过motion表推出来
2w 往后移动两个单词,类似的33w是33个单词,33b等可以类推
C-o 在搜索后移动到之前的位置
C-i 相当于C-o的反向操作
% 当前光标是括号的话,光标移动到与该括号匹配的括号
C-f 下一屏
C-b 上一屏
行号-G 输入行号后按G,跳转到行号,也可以用:行号
行号-<RET> 输入行号后回车,跳转到n行后

切换模式

按键 功能
<ESC> 切换到命令模式(指从其他模式退出)
i 输入模式(方框光标的字符前,竖线光标则为原地)
a 输入模式(方框光标的字符后,竖线光标则为下一个字符)
A 输入模式(光标在行尾)
v 可视模式,跟emacs原版的C-<SPC>可以说是一样
o 在光标下新建一行并换到插入模式
O 在光标上新建一行并换到插入模式

motion

motion有些类似原版emacs指令中,C-x后面加的那个东西。

motion 含义
w 从光标开始,到(本行)下一个单词的第一个字符前。标点符号会被识别为单独的单词
W 遇上一个不同的是,单词只会被空字符隔开,如果标点符号和字母连在一起会是一个单词
b 光标开始往左数,第一个单词的首字母,如果在单词中间使用会移动到该单词首字母
B 类似于W与w的区别
e 光标开始,到本单词的最后一个字符,竖线光标为字符前,方框光标则为该字符
E 类似于W与w的区别
$ 光标开始到行尾
g_ 光标开始到本行最后一个非空字符
0 光标之前到行首
^ 光标之前到本行第一个非空字符
G 光标开始到文本最后一行第一个非空字符
gg 光标前到文本第一行第一个非空字符

文本相关

按键 功能
x 删除(也可理解为剪切)光标所在的字符(光标是方框时,如果光标是竖线则删除之后的一个字符)
dw 删除光标开始,到下一个单词的第一个字符前。dW,db,dB,d$之类可以类推
d2w 删除两个单词,d33w则是删除33个,d33b可以类推
dd 删除一整行,2dd删除光标所在的和下一行,以此类推
u 撤销操作
U 撤销对改行的操作
C-r 重做操作(emacs不兼容,推荐用C-g打断后再用u撤销撤销)
p 在方框光标后粘贴文本,可以是从外部剪贴板来的,也可以是之前操作删除的(可以理解为只有剪切操作而没有删除)
y 复制v模式选中的文本
yw 复制一个词,其他类推
r 输入之后输入任意字符,把方框光标的字符替换为该字符
R 替换更多字符,有些类似其他文本编辑器按到了Insert
cw 其实就只是dw操作完后直接进入插入模式,ce,cb等类推,c2w等也类推
/name 搜索name,完成后按回车。按n搜索下一个,N搜索上一个
?name 反向搜索name,和/的操作逻辑正好相反
:s/old/new 将本行的第一个old替换为new
:s/old/new/g 将本行的所有old替换为new
:#,#s/old/new/g 将#,#这两个行号之间的所有行的old替换为new
:%s/old/new/g 将全文的old替换为new
:%s/old/new/gc 替换全文,但是会要求逐个确认
/name\c 搜索时忽略大小写(暂时)
:set ic 设置永久忽略大小写
:set noic 设置成永久不忽略大小写

文件相关

按键 功能
:w 保存文件(可以和q结合使用,见后)
:w filename 另存为filename
:’<,’>w filename 用v选中一些字符后,按:会自动出现’<,’>,输入w filename将选中的东西另存为
:r filename 将filename里的东西复制到光标后
:r !dir 将dir命令的输出复制到光标后

其他

按键 功能
:q 退出程序
:wq 保存并退出
:q! 未保存强制退出
:!command 执行外部命令,例如:!ls

evil代替不了或者最好不要代替的原版按键

M-x

由于安装了counsel,提供的命令列表不宜直接替换为:,因为这两个是不同的东西。虽然都是输入命令,但是:经常只会使用一些短小的命令,例如:dw,:wq。虽然:也能使用emacs里面的其他指令,例如package-install,但是却又没有补全。而M-x补全强大,但是根本无法使用:dw, :wq。综上不建议替代。不应当把counsel绑定到:上

C-s

由于安装了swiper,emacs的搜索快捷键被替换成了更强的插件,与/或者?相比也算是操作逻辑有不同,不应当把swiper绑定到/或者?上。

C-x

很多关于buffer,file,window的操作是emacs特有的,不应该换掉。好在原版vim也没有C-x这个快捷键。不过是否可以把切换window的操作绑定成vim的,TODO。

另外注意,不应当把undo-tree绑定到u和C-r上,具体怎么做,TODO。

<f1>~<f12>

大部分也都是绑定的插件,没有必要替换。

M-., M-?

感觉可以替换成vim按键,TODO。

自己设置的快捷键

尝试找到vim的替代,TODO。

自用插件

use-package

在init.el里自动安装其他插件的必备。通常可以用M-x package-install来手动安装use-package。

good-scroll

平滑滚动的插件。

mwim

优化了原版的C-a和C-e快捷键,具体如下。

按键 功能
C-a 跳到文字的开头或这一行的开头
C-e 跳到文字的结尾或一行的结尾

但是安装了evil后,我怀疑这个插件是否有必要,TODO。

all-the-icons

提供emacs内许多图标的显示功能,需要在下载插件后M-x all-the-icons-install-font。或是去其github下载fonts安装后才能使用。

counsel、ivy、swiper

三个著名的插件,优化了诸多功能,如搜索、切换buffer、文件操作、命令列表等等。

下面的命令可能会根据我使用的熟练程度来更新。

按键 功能
C-s 使用swiper代替原版的搜索
C-x b 替代原版的buffer列表
C-x C-f 替代原版的文件操作
M-x 替代原版的命令列表

amx

将我们在M-x中输入命令的历史记录下来,每次显示最常用的。

ace-window

按键 功能
C-x o 优化切换window的操作逻辑,可以根据编号进行切换

undo-tree

提供比原版更好的撤销、重做操作。

按键 功能
C-x u 打开undo tree

which-key

在输入快捷键时提醒我们可以接下来输入什么,以及有什么功能。

flycheck

语法检查程序,对于c/c++需要装好clang才能使用。另外在windows上并不是完美支持的,虽然github的issue里最近没有什么东西。

solarized-theme

Emacs下的Solarized主题。

ayu-theme

一个主题。我目前喜欢Ayu的light主题胜过了Solarized的light主题。

dashboard

一个欢迎界面。

yasnippet

在补全的时候提供代码片段。

highlight-symbol

高亮Buffer中所有的、与光标处符号相同的符号。按<f3>开启。

按键 功能
<f3> 开启高亮

rainbow-delimiters

彩虹括号,方便在lisp系语言中看清。

avy

一套跳转光标的操作。暂时还不太会使用。

https://github.com/abo-abo/avy

company

自动补全插件。

按键 功能
<f1> 显示候选项的文档(如果有、如果支持)

company-box

在图形界面下为company提供图标。以及可以开一个小的悬浮窗口展示候选项的文档(如果有)。但是其有一些问题,我觉得还是不开好。

lsp-mode

代码分析。如定义跳转等等功能由lsp提供。

lsp-ui

为lsp提供图形化的显示,同时

按键 功能
M-. 寻找符号定义
M-? 寻找符号引用

lsp-ivy

使lsp和ivy协作,可以通过命令 lsp-ivy-workspace-symbol 来搜索当前工作区的符号。

projectile

项目管理插件。通常我们查找一个函数的定义或者别的什么的定义的时候,这些定义并不会在同一个文件里,而是在同一个项目里,此时我们lsp需要projectile才能正确查找。

counsel-projectile

允许我们在项目中进行搜索。

magit

内置git。

neotree

打开文件夹树形结构图

按键 功能
<f8> 打开neotree

c++-mode

提供c++、c的支持。

powerline

更好的mode-line显示。

yasnippet-snippets

相当于yasnippet那个插入代码片段的插件的一个范例。

markdown-mode

与markdown相关,还在探索中。

texfrag

与latex相关,还在探索中。

goto-chg

evil部分功能的前置插件。

evil

使我们可以在emacs中使用vim的快捷键

自用设置

init.el

https://github.com/kegalas/.emacs.d/blob/main/init.el

额外快捷键

按键 功能
M-n 下十行
M-p 上十行
C-<TAB> 打4个空格,而不是像TAB在emacs中的智能缩进
C-c c 适用于打codeforces等竞赛,编译当前window里的单c++文件