vendredi 30 avril 2010

Emacs 入门 — 基础键盘命令/快捷键和注意事项

with 2 comments

阅读前请先记住以下几点:

解说按键组合命令时除 CONTROL / META / EDIT / ALT / SHIFT 等键需按住不放外, 其余按键无特别说明均需释放. C-v 表示按住 CONTROL 不放再按下 v, 然后松开; C-u 10 C-f 表示 按下 C-u 后松开, 输入 10, 再按下 C-f 后松开.
用 < > 包裹的一般指英文和标点字符按键或特殊名称, 常用按键如 CONTROL, SHIFT 直接大写处理.
指按下回车键. 为任意字符, 如 “a”, “b”, “g”, 标点, 区分大小写.
N 指任意数字.
命令中需要输入的名字或路径均不需要引号 (”", ”) 包裹住, 如 C-x C-f C:\test.txt 打开 C:\test.txt, 路径根据平台特性输入.
以下内容基于 Windows 平台, Emacs 大部分特性与平台无关, 有区别的多数在操作上, 如组合键.
基础知识:

Emacs 键盘命令 (即快捷键) 通常是以以下方式来组合:

C- 和 M-

C 即 CONTROL 键.
M 即 META / EDIT / ALT 键, 三键效果相同, 亦可以按一下 ESC 键后放开模拟 META 键, 如 C-M-v 等效于 ESC C-v. META 键组合的执行的操作一般是 CONTROL 键组合的反向操作.
通常组合键都有对应的命令名, 如 C-h ? 打开帮助列表 等效于 M-x help, M-% 替换模式 等效于 M-x query-replace.
大部分时候都可以使用 来补全命令名, 文件名等等, 如果没有唯一的补全项, 则会新打开一个窗格显示以关键字为开头的命令列表.

命令集扩展:

C-x 字符扩展, 用于和字符或组合键组合命令, 如 C-x C-f 打开文件

M-x 命令扩展, 用于执行特定命令. 如 M-x set-language-environment 设定语言环境, 输入完命令名需要按 执行.

C-x C-c 退出 Emacs

C-z 挂起 Emacs, 以便使用 shell.

Win 图形界面版效果为最小化 Emacs; 控制台下为挂起 emacs, 根据系统支持决定, 返回命令一般为 “fg” 或 “%emacs”, 不提供挂起功能的系统, 会在 Emacs 下创建子 shell, 使用 “exit” 回到 Emacs

文件和缓冲区:

C-x C-f 寻找文件.

底部 minibuffer 区会显示 Find file: , 可以自定输入完整路径, 如 D:\test.txt, 也可以输入目录路径, 如 D:\, Emacs 会列出目录, 在这个窗口里可随意浏览硬盘. 如果输入文件名后, 指定路径不存在该文件, 则在 buffer 区创建, 保存后才正式创建文件. 可以直接使用 C-x C-f 打开其他文件, Emacs 会自动创建新 buffer, 不会替换掉已打开文档, Emacs 是 “强制” 多文档同时编辑.

C-x C-s 保存当前文件.

默认会创建备份, 使用 M-x customize-variable make-backup-files 关闭备份.

C-x s 保存所有文件, 会逐个询问是否保存.

C-X C-b 列出缓冲区列表.

通常缓冲区内的名字和文件名一致, *Messages* 等缓冲区是系统缓冲区.

C-x b 跳转到已打开的指定文件.

M-x recover-file 从指定自动保存文件中恢复原有进度.

先打开原始文件再使用此命令, 自动保存文件名字一般为 “#file name#“

在开始编辑文档前, 请记住以下命令:

M-x set-default-font 设置默认字体.

字体名可以简写, 如 tahamo, 宋体, Emacs 会自动搜索, 如果输入 <->, 则会有一个超详细的字体列表. Emacs 理论上不存在乱码问题, 各类编码文档可直接打开, 如果遇到乱码, 请选择合适的字体.

M-x set-language-environment 设置语言环境.

通常会自动检测 OS 环境, 有特殊需要可更改, 直接输入 English 等即可.


状态栏和回显区:

打开文件后可看到 Emacs 底部有一个区域, 如下:

前面 “–\—” 是文件编码相关, 接着是文件名, “Top” 是光标所在文章的位置, 一般用 “NN%” 显示, 末尾是 “Bot”, 一屏显示完毕的显示 “All”, “(CSS)” 是编辑模式, 缺省是 “Fundamental”, 属于主模式, 通常根据设置会自动选择对应模式, 比如 “CSS”, 每个模式都有不同的改变, 如代码高亮, 缩进, 折叠等.

M-x 切换主模式.

除了主模式, 还有辅模式, 属于扩展功能, 可随意开启关闭, 用来起辅助作用, 比如:
M-x auto-fill-mode 自动折行, 会根据上下文对文章自动折行, 如:

The difference between “killing” and “deleting” is that “killed” text
can be reinserted (at any position), whereas “deleted” things cannot be reinserted in this way
(you can, however, undo a deletion–see below).

启用自动折行后:

The difference between “killing” and “deleting” is that “killed” text
can be reinserted (at any position), whereas “deleted” things cannot
be reinserted in this way (you can, however, undo a deletion–see below).

默认自动折行边界为70个ASCII字符, 在这里需要注意, 一个中文字会处理为双字符, 达到指定字符数后, 会根据最后一个词决定折行方式, 通过以下命令可以更改边界值:

C-u C-x f 修改边界值为 N.

M-q 对光标所在的段落或选择内容进行手动折行.

更改边界值或修改段落中间后, Emacs 不会自动折行, 需要手动折行.

Emacs 自带的主模式均可自动识别, 非自带的需要自己添加并设置, 普通编辑用 “Fundamental” 足够, 自然语言文本编辑可用 “Text”.

在文字中移动:

C-p 光标向上移动移动.
C-n 光标向下一行移动
C-b 光标向左移动.
C-f 光标向右移动.

以上四个命令是以一个字符为单位 — 无论中英文/标点/换行符等均算一个字符.

M-f 如果光标停在一个词中间, 移动到词尾; 如果位于词与词之间的空白处, 移动到下一个词的末尾.

M-b 与 M-f 相反.

词的定义通过标点, 特殊字符 (如空格) 区分, 无法识别中文的词, 直接跳到下一标点/特殊字符.

C-a 移动到行首.
C-e 移动到行尾.
M-a 移动到句首.
M-e 移动到句尾.

C-a 和 C-e 到行首或行尾时均不会再移动, 而 M-a 和 M-e 如果已在行首或行尾时, 会向上或向下移动, 直到找到新的句首或句尾.

M-< / M-SHIFT-, 移动到文件头, 注意是 , 英文逗号.

M-> / M-SHIFT-. 移动到文件尾, 注意是 . 英文句号.

C-v 向下滚动一个屏幕, 效果与 PageDown 相同.

M-v 向上滚动一个屏幕, 效果与 PageUp 相同.

C-l 重绘屏幕, 并把光标所在行置于屏幕中央. 注意是小写 L 非 I.

编辑文档:

插入文字直接敲键盘即可, 无需像 Vim 一样切换模式.

C-u N 插入 N 个 .

/ ENTER 插入换行符.

删除光标前的一个字符.

通常有三种标示: DELETE, DEL 或 BACKSPACE, 如果存在 BACKSPACE, 那 DEL 和 DELETE 都不是 .

C-d 删除光标后的一个字符.

M- 移除光标前的一个词, 若该词尾包括标点, 连同标点一起移除.

M-d 移除光标后的一个词, 若该词首包括标点, 连同标点一起移除.

C-k 移除光标到行尾的字符.

M-k 移除光标到句尾的字符.

“M-k: Kill to the end of the current sentence“, 这是官方的解释, 而实际判断标准却有点奇怪, 句子很好地匹配到句尾的 “。”, 但是对于英文则直接移除从光标所在处开始搜索行尾是否有结束标点 (”.”, “?”), 并移除到匹配为止的所有行, 如:

This’s first sentence. This’s second sentence
for the test. This’s third sentence.
This’s fourth sentence.

假设光标在开头处, 因为 “second sentence” 行尾没有结束标点, Emacs 搜索第二行, 在 “thrid sentence.” 处找到结束标点, 移除后结果为 (粗体部分被移除):

This’s fourth sentence.

即使使用 M-x set-language-environment: English 修改语言环境为英文也仍然如此.

C-@ (C-SHIFT-2) / C-SPACE 进入 Mark set 状态.

此状态将光标所在处标记为起点, 移动光标即可选择区域. C-g 可中止区域选择, 但起点仍然存在.

C-w 移除已选区域的内容.
M-w 复制已选区域的内容.

C-w 和 M-w 需配合 C-@ 使用, 只要有起点的存在, 即使不在 Mark set 状态, 也会自动复制/移除起点到光标所在处的内容.

C-y 召回被移除内容.
M-y 召回 buffer 内之前被移除的内容. 此命令接着 C-y 使用, 不能单独使用.

注: 移除 (kill) 和 删除 (delete) 是 Emacs 里很特别的一个定义, kill 会把内容复制到 Emacs 的 buffer 和电脑内存 (比如 Win 的剪贴板) 里再删除内容, 就像剪切, 而 delete 就纯粹是删除, 内容和 buffer 都不会有记录. 在 buffer 的内容可通过 C-y & M-y 复制到其他地方, 召回顺序由最近移除的开始, 比如按顺序移除了 B, C, A 三段内容, C-y 召回 A 内容, 接着使用 M-y 召回 C 内容, 再使用一次 M-y 召回 B 内容.

C-_ (C-SHIFT–) / C-x u undo, 只针对改变了文字的命令; 对输入的字符以组为单位撤销, 每组20个字符, 中文字是一个字符.

C-s 从光标所在处起向前搜索.
C-r 从光标所在处起向后搜索.
C-M-S 从光标所在处起向前查找正则表达式.
C-M-r 从光标所在处起向后查找正则表达式.

Emacs 是即时搜索, 会高亮关键字, 再次按 C-s / C-r 会跳到下一个匹配项, 当光标不在第一个匹配项时, &ltDelback> 会返回上一个匹配项直至到达第一个匹配项, 此时再按下 则会逐字符删除关键字. 使用 结束搜索, 光标停留在搜索结果上, 可用 C-g 终止搜索, 但光标返回搜索开始时的位置, 搜索时输入某些 C / M 命令会导致搜索结束.
注: 某些终端下, C-x C-s 会冻结屏幕, 使用 C-q 可以解除冻结, Emacs 手册 “Spontaneous Entry to Incremental Search” 一节有介绍.

替换模式和递归编辑:

M-% (M-SHIFT-5) 进入替换模式.

M-% (query-replace) from-string to-string &optional delimited start end, y 为替换; n 为不替换当前目标转到下一目标; q 为退出; C-r 进入递归编辑, 下方主模式显示变化, 如 (CSS) -> [(CSS)], 在递归编辑, 可以修改文档, 但替换模式没有退出, 按下 C-M-c 或 ESC ESC ESC 后回到替换模式; C-w 删除当前匹配项并进入递归编辑; ! 不询问直接替换所有匹配项; ^ 移动光标到上一匹配项; E 修改 to-string, 按下 进行替换.

多窗格编辑:

C-x 1 将屏幕恢复为 1 个窗格, 保留显示光标所以在的文档, 其他文档保留在 buffer 里.

部分命令会新建窗格, 通过激活需保留的窗格后使用 C-x 1 关闭不要的窗格.

C-x 2 将屏幕水平划分为 2 个窗格.

C-x 3 将屏幕垂直划分为 2 个窗格.

C-x o 切换到其他窗格.

在每个窗格里也可以继续划分窗格, 使用 C-x b 或者 C-x C-f 即可同一屏幕编辑多个文档.

C-x o 切换顺序由上至下和由左至右, 先算了水平窗格内的垂直窗格再向下, 无论划分顺序如何.

C-u N C-x o 按顺序切换 N 次窗格.

C-M-v 滚动当前窗格下一个窗格的屏幕.

其他命令:

C-u 为 Emacs 命令指定数字参数.

大部分命令把数字参数解释为重复次数, 如 C-u 8 C-f 会向前移动8个字符, 但部分命令是会改变命令原本的功能, 比如 C-u 2 C-v 不会执行两次向下滚动一个屏幕命令, 而是向下滚动2行.

C-g 取消已输入但未执行的命令; 终止正在执行的命令命令.

取消 ESC 需再次按两次 ESC, 因为 但按一次 ESC 效同 META, 再按 C-g 则等效于 C-M-g 默认未定义命令.

C-h t 显示当前 language-environment 对应的 tutorial, 入门指南.

C-h c 查询某个组合键的简要说明, 如 C-h c M-% 会显示 M-% runs the command query-replace.

C-h k 查询某个组合键的详细说明.

C-h a 搜索相关命令.

C-h i 阅读文档, 相当完善.

Aucun commentaire:

Enregistrer un commentaire