跳到主要内容

Emacs 基本命令

Emacs 中的操作都对应一个命令,大多命令都绑定了一个或多个快捷键。

首先,看看图形界面下 Emacs 的操作过程:

  1. 图形界面操作的过程

    用户点击按钮或菜单,编辑器弹出对话框,用户点击鼠标选中焦点,用户输入信息,然后点鼠标后用键盘输入下一个信息,编辑器执行相应的操作。

  2. Emacs 操作过程:

    用户点击快捷键,用户输入信息,手不离开键盘,继续输入下一个信息,编辑器执行相应操作。

这两个过程的差异是,Emacs 交互过程是确定的,可以手不离键盘进行操作;而图形界面却需要有更复杂的交互过程。

认知心理学告诉我们,人的思维模式存在一种筛状结构,从日常状态聚焦到筛孔中形成聚焦。而程序设计这样的思考过程正是需要思维聚焦,需要从常规思考平面进入专注的筛孔,从而进入心流状态;而图形的切换交互,会产生思维抖动,提高思维聚焦的难度,更难以进入心流状态,这就是纯键盘操作的优势,也是终端文本编辑器的优势。

在 Emacs Lisp 中会了解 Emacs 命令是一个带 interactive 的 Emacs Lisp 函数,可以绑定一个快捷键,都可以用 M-x command-name 执行,下面我们来讲 M-x 是什么。

键盘约定

  • Ctrl 键:简写为大写字母 C
  • Meta 键:简写为大写字母 M
  • Shift 键:简写为大写字母 S
提示

Meta 键在现代键盘上已不常见,取而代之的是 Alt

Meta 还有一种等效输入方式,即先按 ESC 释放后再按下其他键,效果和按住 Alt 不放再按下其他键等效。

  • TAB
  • RETRETURN ENTER
  • DELBACKSPACE 在组合键时与 DEL 是一致的

设计初衷

Emacs 命令有很多,最好的记忆方式是亲手使用:当你有时间时,在不同的场景下反复使用命令。

  • C-nCMS 后带有 - 时,是常用的命令绑定,操作方式是按住 CTRL 后,再按下 n ,然后释放两个键;
  • ESC n:空格键表示释放后再按键,这里是按下 ESC,释放后,再按 n 键;
  • C-x n:常用命令设计为 C-x 后接一个字符,在键盘上 C-z 是挂起程序,所以 C-x 是最近的一个键
  • C-c n:用户命令设计为 C-c 后接一个字符,在键盘上 C-x 是被占用了,所以 C-c 是最近的一个键
另类玩法

特殊的键盘由于产生特殊的字符代码,此特性可定义一个键盘映射图实现对组合的快捷键实现二层定制。定制前提是:键盘特殊键所产生的字符代码是以一个特殊字符开头,并且至少有3个字符长时,才能在 Emacs 里对它们进行定义。利用这个特性可实现按下一个键执行一个命令(类似 Vim),类似游戏机的金手指。

Emacs 基本操作

初学者逃生命令

对于初学者,遇到光标不知所踪,或卡在 mini buffer 不知道怎么处理时,请使用下列命令回到编辑区。

操作命令名称快捷键备注
取消命令keyboard-quitC-g非常有用
撤销undoC-x uC-/C-_根据习惯使用其中一种即可

文件和缓冲区 File and Buffer

操作命令名称快捷键备注
访问文件find-fileC-x C-f或者说读取文件内容到缓冲区,并展示出来。
关闭缓冲区kill-bufferC-x k
保存缓冲区save-bufferC-x C-s当缓冲区有变化时,保存缓冲区到文件中。
批量保存save-some-buffersC-x s
另存为文件write-fileC-x C-w
保存后退出save-buffers-kill-emacsC-x C-c
恢复缓冲区revert-buffer
恢复文件recovery-file
正则关闭缓冲kill-matching-buffers
批量关闭缓冲kill-some-buffers
打开缓冲列表list-buffersC-x C-b
切换缓冲switch-to-bufferC-x b
缓冲重命名rename-buffer
唯一命名缓冲区rename-uniquely
只读模式read-only-modeC-x C-q把当前的缓冲切换成只读模式

框架 Frame (Windows 的窗口)

操作命令名称快捷键备注
最小化框架iconify-or-deiconify-frameC-z
打开新框架make-frame-commandC-x 5 2即另一个 Windows 窗口
关掉其他框架delete-other-framesC-x 5 1
关掉本框架delete-frameC-x 5 0
切换框架switch-to-buffer-other-frameC-x 5 b
新框架other-frameC-x 5 o
新框架访问文件find-file-other-frameC-x 5 f
新框架只读文件find-file-read-only-other-frameC-x 5 r

窗口 Window (Windows 窗口内的操作)

操作命令名称快捷键备注
纵向分割出窗口split-window-belowC-x 2
横向分割出窗口split-window-rightC-x 3
跳到新窗口other-windowC-x o
增加窗口高度enlarge-windowC-x ^
减小窗口高度shrink-window
增加窗口宽度enlarge-window-horizontallyC-x }
减小窗口宽度shrink-window-horizontallyC-x {
平衡窗口balance-windowsC-x +
小窗口高度shrink-window-if-larger-than-bufferC-x -如果窗口高度比缓冲行数更多, 则缩小窗口.
在另一个窗口打开文件find-file-other-windowC-x 4 C-f C-x 4 f相当于 C-x C-f, 不过使用另一个窗口或新建一个窗口.
在另一个窗口只读打开缓冲find-file-read-only-other-windowC-x 4 r在另一个窗口以只读的模式打开文件. 可以使用 C-x C-q 来取消只读.
在另一个窗口打开缓冲swith-to-buffer-other-windowC-x 4 b相当于 C-x b, 不过使用另一个窗口或新建一个窗口.

移动 Motion

这些操作在 Linux 和 macOS 终端中通用

操作命令名称快捷键备注
左移一个字符backward-charC-b
左移一个字符forward-charC-f
下移一行next-lineC-n
上移一行previous-lineC-p
前移一个词backward-wordM-b
后移一个词forward-wordM-f
前移一段M-{需要按 Shift
后移一段M-}需要按 Shift
上滚一屏scroll-upC-vPgUp
下滚一屏scroll-downM-vPgDn
滚到上一页C-x [分页符以 ^L 分隔
滚到下一页C-x ]分页符以 ^L 分隔
移到行首beginning-of-lineC-a
移到行尾end-of-lineC-e
移到句首backward-sentenceM-a
移到句尾forward-sentenceM-e
移到首字符beginning-of-bufferM-<需要按 Shift
移到尾字符end-of-bufferM->需要按 Shift
移到屏幕中间recenterC-l按三次分别是中上下
跳到指定行goto-lineM-x goto-line RET (n)
改写模式M-x overwrite-mode RETURN
操作命令名称快捷键备注
后向查找isearch-backwardC-r
前向查找isearch-forwardC-s
查找替换query-replaceM-%
正则替换query-replace-regexpC-M-%

选择 Selecting

操作命令名称快捷键备注
标记set-mark-commandC-@C-Space即鼠标点选拖动前的定位
转换光标和标记exchange-point-and-markC-x C-x
选择段mark-paragraphM-h
选择页面mark-pageC-x C-p分页符以 ^L 分隔
全选mark-whole-bufferC-x h

移除和删除 Killing and Deleting

移除进入移除环(剪贴板),删除不进入移除环。

操作命令名称快捷键备注
删除一个字符delete-charC-dDel不进入 kill-ring
向前删除一个字符delete-backward-charBackspace
移除一个词kill-wordM-d向后删除到词的边界
向前移除一个词backward-kill-wordM-DEL
移除一行kill-lineC-k按两次删除一行,第一次删除文本,第二次删除换行符
移除句kill-sentenceM-k
移除区域kill-regionC-w删除标记和当前光标
移除段kill-paragraph
反向移除段backward-kill-paragraph
复制kill-ring-saveM-wC-Ins和剪切类似,但不删除
粘帖(召回)yankC-yC-Ins可理解为粘帖,但其实是从 kill-ring 中召回
粘帖(召回前一个)yank-popM-y需上一个命令是 C-y,从 kiil-ring 轮询下一个文本召回
插入一行electric-newline-and-maybe-indentC-j根据 mode 确定是否换行
剪切到粘贴板clipboard-kill-region
复制到粘贴板clipboard-kill-ring-save
召回粘贴板clipboard-yank
交换前字符transpose-charsC-t
交换前词transpose-wordsM-t
交换前行transpose-linesC-x C-t

可以设置移除环的深度:M-x set-variable RETURN kill-ring-max RETURN new-value RETURN

重复命令

操作命令名称快捷键备注
重复 n 次命令M-n COMMANDn 为要重复的次数, COMMAND 是命令.
重复命令universal-argumentC-u (n) COMMAND带 n 同 M-n 相同,不带 n 则执行 4 次,
多次输入 C-u 是 4 的倍数次。

转化

操作命令名称快捷键备注
单词首字符转大写capitalize-wordM-c
整个单词转为大写upcase-wordM-u
整个单词转为小写downcase-wordM-l
选定区域全部改为小写downcase-regionC-x C-l
选定区域全部改为大写upcase-regionC-x C-u

书签 Bookmark

书签文件位置 ~/.emacs.bmk

操作命令名称快捷键备注
建立书签bookmark-setC-x r m
移动到书签bookmark-jumpC-x r b
书签重命名bookmark-rename
删除书签bookmark-remove
书签目录bookmark-bmenu-listC-x r l打开书签目录

SHELL

操作命令名称快捷键备注
打开ShellM-x
执行命令M-! shell-command
交互ShellM-x shell常见命令,需要先输入 C-c 转义

帮助 Help

操作命令名称快捷键备注
查看命令describe-key-brieflyC-h c
查看按键describe-keyC-h k
最近100字符view-lossageC-h l
按键绑定where-isC-h w
查看函数describe-functionC-h f
查看变量describe-variableC-h v
查看模式describe-modeC-h m
缓冲区绑定describe-bindingsC-h b
查看语法表describe-syntaxC-h s
查看指南help-with-tutorialC-h t
启动程序infoC-h i
帮助列表C-h ?
查看快捷键C-h C-h

简写模式 Abbrev Mode

操作命令名称快捷键备注
进入或退出简写模式abbrev-mode
词后输入全局简写词inverse-add-glabal-abbrevC-x a -C-x a i g
词后输入局部简写词inverse-add-mode-abbrevC-x a i l
撤销最近一个简写词unexpand-abbrev
保存简写词列表write-abbrev-file
编辑简写词列表edit-abbrevs
查看简写词列表list-abbrevs
本次警用简写词列表kill-all-abbrevs

邮件 Mail 和 新闻组 UseNet

操作命令名称快捷键备注
写邮件C-x m可以进入邮件模式

建议使用邮件客户端,比如 ThunderBird 处理邮件;建议使用客户端访问新闻组。

FTP / Telnet / W3

建议自行探索

制表符

操作命令名称快捷键备注
改变制表符设置edit-tabs-stops
空格转制表符tabify
制表符转空格untabify
段落重排fill-individual-paragraphs

矩形模式

操作命令名称快捷键备注
移除一个矩形kill-rectangleC-x r k
删除一个矩形delete-rectangleC-x r d
召回一个矩形yank-rectangleC-x r y
清空一个矩形clear-rectangleC-x r c
插入一个空白矩形open-rectangleC-x r o

图形模式

建议自行探索

大纲模式 outline mode

大纲提供了一种一览全局的视图。

传统目录
C Programming Language

目录

第一章 导言
1.1 入门
1.2 变量和算术表达式
1.3 for语句
第二章 类型、运算符和表达式
2.1 变量名
2.2 数据类型及长度
2.3 常量
大纲模式
C Programming Language

* 目录

* 第一章 导言
** 1.1 入门
** 1.2 变量和算术表达式
** 1.3 for语句

* 第二章 类型、运算符和表达式
** 2.1 变量名
** 2.2 数据类型及长度
** 2.3 常量

大纲模式中的概念:

  • 正文(Body):除标题行以外的其他行
  • 标题(Heading):以一个或多个星号加一个空格开始的行;大纲模式用变量 outline-regexp 控制。
提示
(setq outline-regexp "\\(\\.11\\)\\|\\(\\.1e2\\)\\|\\(\\.lev3\\)\\|\\(\\.level4\\)") 

标题和正文行的组合:

  • 条目(Entry): 标题和其下所有的正文行组成一个条目
  • 子树(Subtree): 标题和其下的所有子标题以及它们的正文行组成一棵子树
操作命令名称快捷键备注
移到下一个标题outline-next-visible-headingC-c C-n
移到上一个标题outline-previous-visible-headingC-c C-p
移到下一个同级标题outline-forward-same-levelC-c C-f
移到上一个同级标题outline-backward-same-levelC-c C-b
移到上一级标题outline-up-headingC-c C-u
隐藏正文行hide-bodyC-c C-t
显示正文行show-bodyC-c C-a
隐藏子节点hide-sublevelsC-c C-q可用 C-uM-(n) 实现递归
隐藏其它节点hide-otherC-c C-o
显示子树show-subtreeC-c C-s
隐藏子树hide-subtreeC-c C-d
显示孩子节点show-childrenC-c TAB
显示分支节点show-branchesC-c C-k
隐藏叶子节点hide-leavesC-c C-l
显示记录show-entryC-c C-e
隐藏记录hide-entryC-c C-c

更多可转到 Emacs org mode 查看

TEX 和 LATEX 模式

Donald Knuth 创造了 TEX;LATEX 是 Leslie Lamport 开发的 TEX 命令。

它们是带有排版标记的模式,常用来写论文排版格式。

其中的 Html-helper 模式带有非常多的命令。

版本控制 Version Control

了解即可,现代更多的是 Git 和 SVN 进行版本控制。