Clloz's Blog

Back

Emacs常用快捷键 Blur image

命令和快捷键系列#

  1. 终端和chorme常用快捷键以及快捷键工具keycue()
  2. emacs常用快捷键
  3. 常用Git命令
  4. Mac的环境变量和nvm的使用
  5. Homebrew更换清华镜像以及常用命令

前言#

回到mac上又开始用Emacs了,可能是先入为主,相较于Vim我还是比较喜欢用Emacs,虽然在大部分系统中都是默认装Vim而没有Emacs并且Emacs用起来似乎更麻烦,不过我还是更喜欢Emacs的风格。如果要把Emacs作为一个日常工作中的主力工具,确实是非常折腾,特别是我对Lisp不太了解,有时候为了解决一个小问题,可能要花半天,有可能还解决不了。

Emacs算是一个比较小众的编辑器,虽然很多人对这种极客感觉的编辑器有点憧憬,但是实际的使用过程中,你想让它达到IDE的效果,是需要费相当大的功夫的,并且由于各种插件,软件以及系统的版本并不是由同一批人维护的,很可能你更新了其中一个部分,另一部分就报错了。而且Emacs的社区并不算活跃,特别是中文,你很难在网上找到有用的文档,并且同样的问题可能每个人的原因并不相同,解决方法也不同。在不了解elisp的情况下,你想要很好的驯服Emacs是相当难的,不过Emacs的现在的魅力也可能源于此把。其实Emacs的配置说起来也简单,就一份.emacs.d就可以,如果你真的只是当一个编辑器来使用可以像Vim一样,只进行简单的配置就可以,或者你可以直接用别人的配置,但是虽然你用别人的插件或者配置,但是你的Emacs配置维护者其实只有你,要像真的学好Emacs是需要花费相当大的精力的,如果不是学习Lisp我觉得并不适合把Emacs作为主力开发工具。

Emacs主要快捷键#

mode line中第一个字符表示字符集,c代表chinese-gbk,后面那个\符号表示换行类型,\是指DOSCRLF换行,另外还有UnixLF换行和MacCR换行。然后一个字符,表示打开的文件是否可写(先称为文件便于理解,实际上是buffer),%表示只读,-* 表示可写。再一个字符表示文件是否已写,%- 表示还没动,* 表示已经更改。这两个字符组合起来有四个状态。

基本操作#

命令功能
C-x C-f打开/新建文件
C-x C-s保存当前缓冲区
C-x C-w当前缓冲区另存为
C-x C-v关闭当前Buffer并打开新文件
C-x i光标处插入文件
C-x b切换Buffer
C-x C-b显示Buffer列表
C-x k关闭当前Buffer
C-x C-c关闭Emacs
C-c C-z终止shell中的进程

光标移动#

按键命令功能
C-q tab / M-i输入制表符
C-fforward-char向前一个字符
C-bbackward-char向后一个字符
C-pprevious-line上移一行
C-nnext-line下移一行
M-fforward-word向前一个单词
M-bbackward-word向后一个单词
C-abeginning-of-line移到行首
C-eend-of-line移到行尾
M-eforward-sentence移到句首
M-abackward-sentence移到句尾
M-}forward-paragraph下移一段
M-{backward-paragraph上移一段
C-vscroll-up下移一屏
M-vscroll-down上移一屏
C-x ]forward-page下移一页
C-x [backward-page上移一页
M-<beginning-of-buffer移到文档头
M->end-of-buffer移到文档尾
M-g g numgoto-line移到第n行
(none)goto-char移到第n个字符
C-lrecenter将当前位置放到页面中间(Emacs最喜欢的地方)
M-numdigit-argument重复下个命令n次
C-u numuniversal-argument重复下个命令n次,n默认为4

在mac上多个emacs的快捷键是全局绑定的,在任何地方都可以使用。

文本操作#

按键命令功能
C-x C-ffind-file打开文件
C-x C-vfind-alternate-file打开另一个文件
C-x C-ssave-buffer保存文件
C-x C-wwrite-file另存文件
C-q (n)quoted-insert插入字符,n表示字符的八进制ASCII码
C-x 8ucs-insert插入Unicode字符
C-ddelete-char删除光标处字符
Backspacedelete-backward-char删除光标前字符
M-dkill-word删除光标起单词
M-Backspacebackward-kill-word删除光标前单词
C-kkill-line删除光标起当前行
M-kkill-sentence删除光标起句子
C-x Backspacebackward-kill-sentence删除光标前句子
(none)kill-paragraph删除光标起段落
(none)backward-kill-paragraph删除光标前段落
C-/undo撤销
C-_undo撤销
C-x uundo撤销
C-gkeyboard-quit撤销命令
C-h thelp-with-tutorial调出Emacs Tutorial
C-h rinfo-emacs-manual调出Emacs Manual
C-h k (command)describe-key查看对应command帮助
C-oopen-line插入空行
C-x C-odelete-blank-line删除空行
C-x zrepeat重复前个命令
C-@set-mark-command设定标记
C-x C-xexchange-point-and-mark交换标记和光标位置
C-wkill-region删除区域中内容
C-x C-uupcase-region将区域中字母改为大写
C-x C-lupcase-region将区域中字母改为小写
C-x hmark-whole-buffer全选
C-x C-pmark-page选取一页
M-hmark-paragraph选取一段
M-@mark-word选取一个单词
C-@ C-@加入点到标记环
C-u C-@在标记环中跳跃
C-x C-@pop-global-mark在全局标记环中跳跃
(none)transient-mark-mode非持久化标记模式
M-delete-horizontal-space删除光标处的所有空格和Tab字符
M-SPCjust-one-space删除光标处的所有空格和Tab字符,但留下一个
C-x C-odelete-blank-lines删除光标周围的空白行,保留当前行
M-^delete-indentation将两行合为一行,删除之间的空白和缩进
C-S-Backspacekill-whole-line删除整行
C-wkill-region删除区域
M-wkill-ring-save复制到kill 环,而不删除
M-z charzap-to-char删至字符char为止
C-yyank召回
M-yyank-pop召回前一个
C-M-wappend-next-kill下一个删掉内容和上次删除合并
C-h vdescribe-variable显示变量内容
(none)append-to-buffer将区域中内容加入到一个buffer中
(none)prepend-to-buffer将区域中内容加入到一个buffer光标前
(none)copy-to-buffer区域中内容加入到一个buffer中,删除该buffer原有内容
(none)insert-buffer在该位置插入指定的buffer中所有内容
(none)append-to-file将区域中内容复制到一个文件中
(none)cua-mode启用/停用CUA绑定
kill-read-only-ok是否在只读文件启用kill 命令
kill-ringkill环
kill-ring-maxkill环容量

除了DelC-d其他的删除命令都会按顺序保存起来,用C-y或者M-y来取出,如果想更好的使用undo功能,可以了解undo tree,在Emacs中一切皆可undo,包括undo本身也可以被undo

查找替换操作#

按键命令功能
C-sisearch-forward向前进行增量查找
C-risearch-backward向后进行增量查找
M-c(查找状态)切换大写敏感
C-jnewline-and-indent(查找状态)输入换行符
M-Tabisearch-complete(查找状态)自动匹配
C-h C-h(查找状态)进入查找帮助
C-w(查找状态)将光标处单词复制到查找区域
C-y(查找状态)将光标处直到行尾内容复制到查找区域
M-y(查找状态)把kill 环中最后一项复制到查找区域
C-M-w(查找状态)删除查找区域最后一个字符
C-M-y(查找状态)将光标处字符复制到查找区域最后
C-f(查找状态)将光标处字符复制到查找区域最后
C-s RETsearch-forward向前进行简单查找
C-r RETsearch-backward向后进行简单查找
M-s wisearch-forward-word向前进行词组查找
M-s w RETword-search-forward向前进行词组查找(非增量方式)
M-s w C-r RETword-search-backward向后进行词组查找(非增量方式)
C-M-sisearch-forward-regexp向前进行正则查找
C-M-risearch-backward-regexp向后进行正则查找
replace-string全文替换
replace-regexp全文正则替换
M-%query-replace查找替换
recursive-edit进入递归编辑
abort-recursive-edit退出递归编辑
top-level退出递归编辑

M-%的回答#

输入响应
SPC 或者 y替换当前匹配并前进到下一个匹配处
DEL 或者 n忽略此次匹配并前进到下一个匹配处
.替换当前匹配并退出
,替换当前匹配并停在此处,再按y后前进
!替换所有剩余匹配
^回到前一个匹配处
RET 或者 q直接退出
e修改新字符串
C-r进入递归编辑状态
C-w删除当前匹配并进入递归编辑状态
C-M-c退出递归编辑状态,返回查找替换
C-]退出递归编辑状态,同时退出查找替换
C-h显示帮助

窗口操作#

按键命令功能
C-x 2split-window-vertically垂直拆分窗口
C-x 3split-window-horizontally水平拆分窗口
C-x oother-window选择下一个窗口
C-M-vscroll-other-window滚动下一个窗口
C-x 4 bswitch-to-buffer-other-window在另一个窗口打开缓冲
C-x 4 C-odisplay-buffer在另一个窗口打开缓冲,但不选中
C-x 4 ffind-file-other-window在另一个窗口打开文件
C-x 4 ddired-other-window在另一个窗口打开文件夹
C-x 4 mmail-other-window在另一个窗口写邮件
C-x 4 rfind-file-read-only-other-window在另一个窗口以只读方式打开文件
C-x 0delete-window关闭当前窗口
C-x 1delete-other-windows关闭其它窗口
C-x 4 0kill-buffer-and-window关闭当前窗口和缓冲
C-x ^enlarge-window增高当前窗口
C-x {shrink-window-horizontally将当前窗口变窄
C-x }enlarge-window-horizontally将当前窗口变宽
C-x -shrink-window-if-larger-than-buffer如果窗口比缓冲大就缩小
C-x +balance-windows所有窗口一样高
windmove-right切换到右边的窗口(类似:up, down, left)

buffer操作#

按键命令功能
C-x bswitch-to-buffer打开或新建一个缓冲
C-x 4 bswitch-to-buffer-other-window在另一个window中打开或新建一个缓冲
C-x 5 bswitch-to-buffer-other-frame在另一个frame中打开或新建一个缓冲
C-x LEFTnext-buffer移动到下一个缓冲
C-x RIGHTprevious-buffer移动到前一个缓冲
C-x C-blist-buffers显示所有缓冲
C-u C-x C-b显示映射到文件的缓冲
C-x kkill-buffer关闭缓冲
kill-some-buffers关闭多个缓冲
clean-buffer-list关闭三天未使用的缓冲
C-x C-qtoggle-read-only切换缓冲只读属性
C-u M-g M-g num跳至前一缓冲num行
rename-buffer重命名缓冲
rename-uniquely重命名缓冲,在其名后加数字
view-buffer只读方式打开缓冲
buffer-menu打开Buffer Menu
make-indirect-buffer建立间接缓冲
clone-indirect-buffer建立当前缓冲的间接缓冲

输入M-x buffer-menu进入buffer menubuffer进行管理,操作方式如下:

按键功能备注
SPC, n移动到下一项
p移动到上一项
d, k标记删除缓冲,并移动到下一项按x后生效
C-d标记删除缓冲,并移动到上一项按x后生效
s标记保存缓冲按x后生效
x执行标记删除或保存的缓冲
u取消当前缓冲的标记,并移动到下一项
Backspace取消当前缓冲的标记,并移动到上一项
~设置缓冲为未修改
%切换缓冲的只读属性
1将选中缓冲满窗口显示
2将选中缓冲显示在一半窗口中
t缓冲用tags table 方式显示
f, RET显示选择缓冲
o缓冲在新窗口显示,并选中该窗口
C-o缓冲在新窗口显示,但不选中该窗口
b将选中缓冲移动到最后一行
m标记缓冲在新窗口显示按v后生效
v显示标记的缓冲
g刷新buffer menu
T切换显示文件关联缓冲
q退出Buffer Menu

需要注意的是大部分功能是立即生效的,但像d,s,m这些只会起标记作用,在确认之后才会执行,而且按了这三个键后对应会在缓冲名前显示”D”, “S”, ”>” 三个符号用作提示。

注释的使用#

Emacs 25 引入了一个新的命令 comment-line 就是注释当前行,默认快捷键是 C-x C-;,在之前版本的 Emacs 中只有一个 comment-dwim (M-;)用来在当前行后面加上注释。我通常使用 emacs 是在终端中使用,终端里面似乎类似 C-; C-: C-'这类的命令都无效,具体原因没查到,所以只能修改命令了,用 (global-set-key (kbd "C-;") 'comment-line) 来设置快捷键,可以对同一个命令设置多个快捷键,我对 comment-line 设置了两个快捷键,分别是 C-;C-c C-c,这样前面一个在 GUI 中使用,后面一个在 shell 中使用。

一点看法#

其实我开始使用Emacs是纯属好奇,觉得这样一个工具很极客,估计大部分人也是这样的,刚开始用一些大神的配置,但其实每个人对开发工具的需求不同,别人的配置很多东西是你用不到的,使用Emacs应该尽量精简到日常要用的东西,装上太多用不到的东西难以维护,经常一个错误需要查半天,而且真的想要用好EmacsLisp是个绕不过去要学的东西,只有真的理解了Emacs才能用好它,否则还是仅仅当个玩具来看把。

参考文章#

Emacs学习教程

Emacs常用快捷键
https://clloz.com/blog/emacs-keybinding
Author Clloz
Published at April 13, 2019
Comment seems to stuck. Try to refresh?✨