Emacs学习笔记
                           =============

Author:
Date: 2012-12-09 22:19:21 中国标准时间


Table of Contents
=================
1 基本概念
2 基本操作
   2.1 各种组合键形式
   2.2 定位=移动+搜索
   2.3 编辑
       2.3.1 一般编辑命令
       2.3.2 文本块编辑
       2.3.3 查询、替换操作
       2.3.4 递归编辑
       2.3.5 单词简写模式
   2.4 缓冲区、窗口与窗格操作
       2.4.1 缓冲区
       2.4.2 窗口
       2.4.3 书签
       2.4.4 窗格操作
   2.5 文件操作
   2.6 启动参数
3 高级编辑
   3.1 缩进
   3.2 矩形编辑
   3.3 绘制简单的图像
4 专题说明
   4.1 Emacs工作环境
       4.1.1 执行UNIX命令
       4.1.2 文件和目录操作
       4.1.3 打印文件
       4.1.4 用Emacs查询UNIX在线文档
       4.1.5 时间管理工具
   4.2 GUI
   4.3 获取帮助
       4.3.1 EMACS的自动补足功能
       4.3.2 帮助键(通常是C-h)
   4.4 auto-fill mode自动换行模式
   4.5 设置Emacs
       4.5.1 定制按键
       4.5.2 变量说明
       4.5.3 加载LISP包
   4.6 拼写检查
   4.7 Emacs中的宏
   4.8 Emacs下的版本控制
   4.9 Html-helper-mode
   4.10 cc-mode
   4.11 complier-mode
   4.12 大纲模式(M-x outline-mode)
5 NOTE


1 基本概念
-----------

2 基本操作
-----------

2.1 各种组合键形式
===================
  1. 最常用的命令都被绑定为"C-n"的形式
  2. 次常用的命令被绑定为"M-n"(也就是"ESC n")的形式
  3. 其他常用命令被绑定为"C-x something"的形式例如文件操作类命令
  4. 某些特殊命令被绑定为"C-c something"的形式这类命令通常都与某些特殊的编辑模式有关

2.2 定位=移动+搜索
===================
  1. C-f             向右移动一个字符
  2. C-b             向左移动一个字符
  3. C-p             上一行
  4. C-n             下一行如果是在缓冲区的最后一行则等于给缓冲区增加一个新行
  5. M-f             向右移动一个单词
  6. M-b             向左移动一个单词
  7. C-a             把光标移到一行的开始
  8. C-e             把光标移到一行的结束
  9. M-a             把光标左移一个句子
  10. M-e             把光标右移一个句子
  11. M-{             把光标上移一个段落
  12. M-}             把光标下移一个段落
  13. C-x ]           把光标移动到下一页须有分页符(也可以由page-delimiter变量定义)
  14. C-x [           把光标移动到上一下须有分页符(也可以由page-delimiter变量定义)
  15. C-v             翻到下一屏幕
  16. M-v             翻到上一屏幕
  17. M->             翻到缓冲区末尾
  18. M-<             翻到缓冲区头
  19. M-x goto-line   移动到第n行从文件头开始计数
  20. M-x goto-char   移动到文件第n个字符从文件头开始计数

2.3 编辑
=========

2.3.1 一般编辑命令
~~~~~~~~~~~~~~~~~~~
   1. M-n command      /     C-u n command(默认为4次)重复执行一个命令多次
   2. C-x u            撤销操作
   3. C-d              删除光标所在位置处的字符
   4. M-d              删除一个单词
   5. C-k              删除一行
   6. ESC - C-k        删除从行首到光标位置之间的东西
   7. M-k              删除一个句子
   8. C-x DEL          删除光标前面的句子
   9. C-y              从killing-ring里将文本复制出来
   10. M-y             在killing-ring里面向前遍历一般与C-y一起用
   11. C-t             transpose-chars 交换两个字符的位置
   12. M-t             transpose-words 交换两个单词的位置
   13. C-x C-t         transpose-lines 交换两个文本行的位置
   14.                 transpose-sentences 交换两个句子的位置
   15.                 transpose-paragraphs 交换两个段落的位置
   16. M-c             将光标到单词结尾的字母改成Caption格式
   17. M-l             将光标到单词结尾的字母改成lower格式
   18. M-u             将光标到单词结尾的字母改成Upper格式
   19. M-- M-c             将光标到单词开头的字母改成Caption格式
   20. M-- M-l             将光标到单词开头的字母改成lower格式
   21. M-- M-u             将光标到单词开头的字母改成Upper格式
   22. 重载文件             M-x revert-buffer
   23. 命令的重复执行
       * 按C-x ESC ESC则会把最后一次输入的复杂命令调出来也可以用M-p和M-n遍历前面/后面的命令
       * C-x ESC ESC 这种快捷操作方式对在辅助输入区内有补充性输入内容的一切命令都有效这也就是所谓的复杂命令

2.3.2 文本块编辑
~~~~~~~~~~~~~~~~~
   1. 定义文本块
      * 自由定义文本块
        把光标移到文本块的一段按C-@或C-SPACE组合键设置一个文本标记然后移动光标文本标记和光标当前位置的文本就构成了一个文本块
      * 定义一段为文本块           M-h
      * 定义整个缓冲区为文本块      C-x h
      * 定义当前页面为文本块        C-x C-p
   2. 检查文本块标记是否设置正确
      由于GNU Emacs的文本标记是不可以见的可以按下C-x C-x命令名是exchange-point-and-mark组合键它的作用是互换插入点和文本标记的位置如果光标移到了应该有文本标记的位置就说明文本块已经正确地标记出来了。
      使用C-x u撤销回来的文本仍然带有文本块标记
   3. 删除文本块                   C-w
   4. 复制文本块                   M-w

2.3.3 查询、替换操作
~~~~~~~~~~~~~~~~~~~~~
   默认情况下Emacs的查找操作是不区分大小写的。但是若输入的单词里有一个以上的大写字母Emacs就会区分大小写
   1. 递增查找
      * 先敲入C-s组合键再输入想查找的文本。如果找到想找到的东西按下回车键退出这次查找光标将停留在文件的当前位置。如果想继续查找再次按下C-s
      * 向前查找则使用C-r组合键再次按下C-r组合键则继续查找
      * C-s C-w可以把从光标位置到下一个标点符号或空格符之间的文本都复制到查找字符串中去
      * C-s C-y可以把光标位置到行尾之间的文本都复制到查找字符串里
      * C-s M-y可以把删除环里的文本复制到查找字符串里去还可以用M-p组合键来查看删除环上一个条目
   2. 简单查找
      * 先按下C-s RETURN然后输入查找的字符串按下回车Emacs就开始查找了。再次按下C-s会继续查找下一个
      * 同理C-r RETURN向前查找
   3. 单词查找
      * 单词查找是一种非递增性的查找它不会受换行符、空格和 *标点符号* 的影响但要求查找字符串必须与文件里的单词完整地匹配
      * 按下C-s RETURN C-w,输入查找字符串再按下回车
      * 同理C-r RETURN C-w向前查找
      * 就三种基本的查找操作而言单词查找是唯一能够在将要查找的短语跨越两个文本行的情况系啊找到该短语的查找操作
   4. 正则表达式查找
      * ESC C-s RETURN / M-x re-search-forward   向后查找正则表达式
      * ESC C-r RETURN / M-x re-search-backward  向前查找正则表达式
      * ESC C-s / M-x re-search-forward   向后递增查找正则表达式
      * ESC C-r / M-x re-search-backward  向前递增查找正则表达式
      * M-x replace-regexp                无条件对一个正则表达式做全局性替换
   5. 基本替换操作
      * M-x replace-string RETURN再输入查找字符串RETURN再输入替换字符串RETURN。
      * Emacs从光标处开始把文件后面所有的字符串进行替换
   6. 询问-替换操作
      * M-% 或者Search菜单选择Query Replace操作。输入查找字符串后RETURN输入替换字符串后RETURN
      * 在查询状态中按C-r进入递归编辑状态。C-w删除此处内容并进入递归编辑状态。ESC C-c退出递归编辑状态继续完成询问-替换操作。C-]退出递归编辑状态和询问-替换操作
      * 在查询状态中按,替换并显示替换情况再按空格或y才移动到下一个位置。按!对后面的文件内容全部进行替换

2.3.4 递归编辑
~~~~~~~~~~~~~~~
   1. 有时在进行询问-替换操作的时候会看到还有其他一些地方需要修改。Emacs允许一次询问-替换操作的过程中再开始一次递归编辑
   2. 要想在询问-查询操作的过程中开始一次递归编辑需要按下C-r。进入递归编辑状态的时候状态条上将会多出一对方括号[]
   3. 按下ESC C-c命令让Emacs退出递归编辑并重新开始继续执行询问-替换操作
   4. 如果想在退出递归编辑的同时也取消查询操作按下C-]
   5. 可以随时而不仅仅在询问-替换操作的时候开始一次递归编辑。M-x recursive-edit会进入递归编辑状态而ESC C-c会退出递归编辑状态返回此前的工作中

2.3.5 单词简写模式
~~~~~~~~~~~~~~~~~~~
   1. 单词简写模式(word abbreviation mode)可为特殊的单词和短语定义一些简写形式。Emacs会密切关注内容一旦输入了一个简写单词并按下空格或标点符号就会立刻自动展开为对应的短语
   2. 要撤销最近简写词定义M-x unexpand-abbrev RETURN
   3. Emacs会根据简写词被定义时的编辑模式对它们进行分类。全局性简写词可以用在任何一种编辑模式里而局部性简写词则只能用在定义时所在的编辑模式里。即简写词的作用范围是 *编辑模式* 而非文件或编辑缓冲区
   4. 为一次编辑工作定义临时的简写词汇
      * M-x abbrev-mode 进入简写词模式Abbrev字样出现在状态行上
      * 输入简写词后按下C-x a i g(add-inverse-global定义全局性的简写词) / C-x a i l(add-inverse-local定义局部性简写词)
      * 输入该简写词的扩展短语后回车
   5. 为多次编辑工作定义永久性的简写词汇
      * M-x write-abbrev-file保存简写词记录文件
      * M-x read-abbrev-file 读取简写词记录文件
      * M-x edit-abbrevs 对简写词表进行编辑
      * M-x list-abbrevs 查看简写词表
   6. 禁用简写词汇
      * M-x kill-all-abbrevs       在本次编辑中临时禁用简写词汇
      * 删除简写词汇表文件           永久禁用简写词汇

2.4 缓冲区、窗口与窗格操作
===========================

2.4.1 缓冲区
~~~~~~~~~~~~~
   1. 进去指定名字的缓冲区 / 新建一个新缓冲区           C-x b
   2. 删除缓冲区                                     C-x k / M-x kill-buffer
   3. 删除多个缓冲区                                  M-x kill-some-buffers
   4. 重命名缓冲区                                    M-x rename-buffer
   5. 把当前缓冲区设置为在只读/可写之间切换              C-x C-q
      状态栏左边会出现两个百分号(%%),他们表示这个编辑缓冲区是只读的
   6. 编辑缓冲区相关的操作
      * 列示编辑缓冲区                                C-x C-b
      * 下一行                                       C-n / 空格
      * 上一行                                       C-p
      * 为编辑缓冲区加删除标记                         k /d
      * 去除操作标记                                  u
      * 去除上一行的操作标记                           DEL
      * 为编辑缓冲区加存盘标记                         s
      * 执行为缓冲区加的标记                           x
      * 为缓冲区状态修改为未修改状态                    ~
      * 缓冲区权限在只读 / 读写间切换                   %
      * 把缓冲区满屏显示                               1
      * 把缓冲区显示在第二个窗口中                      2
      * 把缓冲区内容显示在当前窗口中                    f
      * 把缓冲区内容显示在另一窗口中                    o
      * 给编辑缓冲区加上待显示标志                      m    按v后才执行
      * 退出编辑缓冲区清单                             q

2.4.2 窗口
~~~~~~~~~~~
   1. 水平分割窗口                                    C-x 2
      如果想用水平窗口同时对两个文件进行编辑可以在启动Emacs时同时给出这两个文件的名字
   2. 垂直分割窗口                                    C-x 3
      * 将文本向左移动好看右边的文本                 C-x <
      * 将文本向右移动好看左边的文本                 C-x >
   3. 在窗口之间移动                                   C-x o
      Emacs在窗口间顺时针移动
   4. 删除窗口                                        C-x 0
   5. 只保留唯一窗口                                   C-x 1
   6. 删除特定缓冲区的全部窗口                          M-x delete-windows-on RETURN 缓冲区名字 RETURN
   7. 调整窗口的大小尺寸
      * 加高当前工作的窗口按下C-x ^ Emacs将会加高当前窗口它下方的窗口将被相应地压低
      * 加宽当前窗口按下C-x } Emacs将加宽这个窗口它右方的窗口将相应地变窄
      * 压低窗口按下M-x shrink-window
      * 缩窄窗口使用C-x {可以压缩一列使用C-x - / shrink-window-if-larger-than-buffer 让窗口收缩到编辑缓冲区那么小
      * 使窗口尺寸编程通钢的大小C-x +
   8. 对其他窗口进行操作
      * 卷动下一窗口的内容                             ESC C-v
      * 有几个“其他窗口命令”其实是一些中间插有“4”的普通命令
      * 在另一个窗口打开文件                            C-x 4 f
      * 在另一个窗口里选择编辑缓冲区                     C-x 4 b
   9. 比较两个窗口中的文件
      * 可以用M-x compare-windows命令来比较两个窗口中的文件
      * compare-windows只会找出它们之间的第一个不同
      * compare-windows比较的两个窗口为顺时针方向的两个窗口

2.4.3 书签
~~~~~~~~~~~
   书签操作所有的函数名都是以bookmark开头或以C-x r开头
   1. 设置书签                         C-x r m
      书签名中可以有空格                
   2. 移动到书签指示的位置               C-x r b
   3. 对书签进行重命名                  M-x bookmark-rename
   4. 删除书签                         M-x bookmark-delete
      用删除书签指示文件的方法是删不掉书签的
   5. 对书签清单进行编辑操作             C-x r l
      * 给书签加上待删除标记             d
      * 对书签重命名                    r
      * 保存清单里的全部书签             s
      * 显示光标位置上的书签             f
      * 给书签加上待显示标记             m
      * 显示加油待显示标记的书签         v
      * 切换显示/不显示书签关联文件的路径 t
      * 显示书签关联文件的存放位置       w
      * 删除加油删除标记的书签           x
      * 去掉上一行书签上的待操作标记      DEL
      * 退出书签清单                    q
   6. 把书签文件内容插入到光标位置上      M-x bookmark-insert
   7. 保存书签文件                      M-x bookmark-write
   8. 加载书签文件                      M-x bookmark-load

2.4.4 窗格操作
~~~~~~~~~~~~~~~
   窗格操作大多以C-x 5开头
   1. 在另一个窗格里查找文件             C-x 5 f
   2. 新窗格                           C-x 5 2
   3. 在新窗格中打开编辑缓冲区           C-x 5 b
   4. 窗格间切换                       C-x 5 o
   5. 删除一个窗格                      C-x 5 0
   6. 以只读方式打开一个窗格             C-x 5 r
   7. 将窗格缩小为一个图标               C-z

2.5 文件操作
=============
  1. C-x C-f         打开一个文件
     若打开的是FTP上的文件可以采用ange-ftp模式如果同时满足下面3个条件Emacs就会启动ange-ftp模式
     * 文件名以一个斜线/开头
     * /后紧跟username@systemname
     * 系统名后面是一个冒号:,然后是子目录名或文件名例如/sas@10.8.6.10:/tmp
     * *注意开头的/和系统名与文件路径名之间的:*
  2. C-x C-v         打开一个文件来代替现有的文件
  3. C-x i           把一个文件插入另一个文件中
  4. C-x C-s         当前缓冲区文件存盘
  5. C-x s           多个缓冲区文件存盘
  6. C-x C-w         另存为
  7. 从自动保存文件恢复文本         M-x recover-file

2.6 启动参数
=============

3 高级编辑
-----------

3.1 缩进
=========
  1. TAB与SPACE互转
     选中要转换的文本块后,
     * M-x untabify               :把制表符转换为空格
     * M-x tabify                 :把空格转换为制表符
  2. 缩进前导字符串
     * 所谓缩进前导字符串指由Emacs自动放到每行输入文本开头的一个字符串。
     * 设置前导字符的方法是:
       1. 在行首输入前导字符串
       2. 输入C-x . / M-x set-fill-prefix 设置前导字符
       3. 若要停止前导字符则设置一个新的前导字符该前导字符应为空
  3. 文本缩进模式
     * 进入文件缩进模式M-x indented-text-mode
     * 如果自动换行模式没有启用那么文本缩进模式是无法工作的
     * 开启文本缩进模式后到达文本行末时Emacs会自动对下一行进行缩进使它与前一行匹配。
  4. 对现有的文本块进行缩进
     * 进入文本缩进模式M-x indented-text-mode
     * 移动到准备缩进的文本块的末尾设置文本块标记
     * 移动到准备缩进的文本块的开头设置好缩进距离用空格或制表位来设置首行
     * 按下ESC C-\ / M-x indent-region 。Emacs将按第一行的格式对整个文本块进行缩进
     * 按下M-q组合键对文本块进行段落重排
  5. 把文本分拆成两行并呈台阶装排序               :ESC C-o / M-x split-line
  6. 文本居中
     * 进入text-mode
     * 文本居中
       输入要居中的文本按M-s
     * 段落居中
       光标放于要居中的段落中按M-S / M-x center-paragraph
     * 文本块居中
       把要居中的文本块定义好按M-x center-region

3.2 矩形编辑
=============
  * 定义矩形区域与定义文本块的方法是一样的他们之间的区别体现在设定文本区域之后发出的编辑命令这些命令将告诉Emacs打算对文本块进行操作还是打算对矩阵进行操作
  * 定义矩阵右下角时需要将光标移动到矩阵右下角再右移动一个字符。因为文本块上的字符时文本块的一部分但光标位置上的字符却不是文本块的一部分。
  * 矩阵没有相应的删除环,只能把最近一次删除的矩形恢复回来.
  * 删除矩阵到矩形删除缓冲区             :C-x r k / M-x kill-rectangle
  * 粘贴矩阵                           :C-x r y / M-x yank-rectangle
  * 插入矩阵                           :C-x r o / M-x open-rectangle
  * 清空矩阵                           :C-x r c / M-x clear-rectangle
  * 删除矩阵                           :C-x r d / M-x delete-rectangle

3.3 绘制简单的图像
===================
  1. 图像模式
     * 进入图像模式的命令是M-x edit-picture
     * 退出图像模式的命令是C-c C-c
  2. 在图像模式里划线
     1) 设定方向
        * C-c ^        :上
        * C-c '        :右上
        * C-c >        :右
        * C-c \        :右下
        * C-c .        :下
        * C-c /        :左下
        * C-c <        :左
        * C-c `        :左上
     2) 设定好绘画方向后重复按下任何键都会沿该方向画一条字符线。
     3) 插入新行用C-o
     4) 图像模式下的字符删除命令为C-c C-d,它会删除字符并将该行的其余文本左移.而其他删除只是替换为空格
     5) 刚进入图像模式默认的方向是:右
     6) 为防止插入模式下所输的字符会弄乱其他部分,图像模式将会明确地变为改写模式
     7) 在图像模式里按回车会移动到下一行的开始,但不会插入一个空白行,因为Emacs假定不想改变各行之间的相对关系
  3. 图像模式中移动鼠标
     * 沿着默认绘制方向前进           :C-c C-f
     * 沿着默认绘制方向后退           :C-c C-b
  4. 在图像模式里使用矩形编辑命令
     * 在图像模式里,可以同时把多个矩形区域分别保存在不同的寄存器中.
     * 清除一个矩形区域并保存到某寄存器中          :C-c C-w 寄存器名
     * 删除一个矩形区域并保存到某寄存器中          :C-u C-c C-w 寄存器名
     * 插入保存起来的矩形区域                     :C-c C-x 寄存器名
     * 清除矩形区域                             :C-c C-k (只能保存一个矩形区域的内容)
     * 恢复C-c C-k清除的区域                    :C-c C-y

4 专题说明
-----------

4.1 Emacs工作环境
==================

4.1.1 执行UNIX命令
~~~~~~~~~~~~~~~~~~~
   1. 执行一条UNIX命令              
      * 运行ESC !后输入命令会新建一个缓冲区用于存放执行命令的结果
      * C-u ESC ! 命令会把输出结果放到当前编辑缓冲区内
      *
   2. 将文本块作为UNIX命令的输入
      * 定义要作为输入的文本块C-@
      * 运行M-x shell-command-on-region / ESC |
      * 输入要执行的shell命令
   3. 进入shell模式
      * 通过M-x shell进入shell模式
      * 对一些shell下的特殊按键需要在按键前加C-c例如C-c C-c / C-c C-z
      * 通过M-p / M-n遍历输过的命令
      * 若上一个命令输出过长想删除上一个命令的输出可以按C-c C-o / comint-kill-output
      * Emacs会根据cd、popd和pushd等命令来改变默认目录的表示方法即查找文件的默认目录永远和当前目录一样
      * shell是怎样知道启动哪个shell的呢
        它首先查看的是变量explicit-shell-file-name接着查看ESHELL的环境变量最后查看SHELL的环境变量
      * shell的初始化
        Emacs启动一个交互shell是它会在shell正常的启动文件之后再额外运行一个名叫~/.emacs_shell名称 的初始化文件。其中的"shell名称"是打算在Emacs中使用的shell的名字
      * 若要输入密码一类不能显示出来的字符时用M-x send-invisible
      * 移动到前一个命令          C-c C-p
      * 移动到后一条命令          C-c C-n

4.1.2 文件和目录操作
~~~~~~~~~~~~~~~~~~~~~
   1. 进入Dired模式directory editing mode 目录编辑模式
      * 使用C-x C-f命令时指定一个目录名 / C-x d 再输入目录名,产生的结果类似于ls
      * C-x C-d给出一个简单的目录文件清单类似ls -F后面有一个标志表示文件类型
      * C-u C-x C-d给出一个详细的目录文件清单类似ls -l
   2. Dired模式的普通操作
      * 切换按文件名排序/时间排序               s
      * 移动到文件清单下一个文件                SPACE / C-n / n
      * 移动到文件清单上一个文件                DEL / C-p / p
      * 快速查看文件                          v
        在查看状态文件内容只能看不能改按下C-c 或 q将返回目录的文件清单窗口可以用s键开始一次递增查找按=键Emacs会告诉光标在哪一行
      * 编辑某个文件                          f / e
      * 为文件加删除标识                       d
      * 为所有自动保存文件加上待删除标记         # 自动保存文件的文件名其首尾各有一个#字符
      * 为所有自动保存文件去掉待删除标记         C-u # 自动保存文件的文件名其首尾各有一个#字符
      * 为所有备份文件加上待删除标记            ~ 备份文件的文件名以~字符结尾
      * 为所有备份文件去除待删除标记            C-u ~
      * 为所有可执行文件加上 *待操作* 标记      *
      * 为所有可执行文件去除 *待操作* 标记      C-u *
      * 为所有目录加上 *待操作* 标记           /
      * 为所有目录去除 *待操作* 标记           C-u /
      * 去掉文件的待删除标记                   u
      * 去掉上一个文件的待删除标记              DEL
      * 执行标记操作                          x
      * 立刻删除某个文件                       D 大写字母表示立即操作
      * 拷贝文件                              C 可以在C之前加上数字表示拷贝多少个文件
      * 文件重命名 / 移动文件                  R 与UNIX的mv命令一样
      * 文件压缩 / 解压缩                      Z 调用compress
      * 对文件进行比较                         =  调用diff
      * 文件与备份文件做比较                    M-=
      * 在文件上执行UNIX命令                    ! (若要传入的参数不止一个文件名则可以在命令行中用*来代替该文件名称)
      * 刷新Dired视图                          g
      * 新建目录                               + / M-x dired-create-directory
      * 对文件内容进行查询-替换
        先把想包括在查询-替换的文件都选上然后按下Q键M-x dired-do-query-replace接下来先后输入查找字符串和替换字符串。
        如果在这次查询-替换操作的过程中另外开始了一次递归编辑这次查询-替换操作就将到此为止只能重新回到Dired编辑缓冲区里才能再次继续这个查询-替换操作
      * 改变文件的组权限                        G / M-x dired-do-chgrp
      * 在画面上删除光标所在哪一行不删除文件   k
      * 在另一个窗口打开文件                     o光标移动到新窗口 / C-o光标不移动到新窗口
      * 打印文件                               P
      * 移动到上一个目录                        >
      * 移动到上一个目录                        <
   3. Dired模式的文件组操作
       * 给文件加上待操作标记                   m 对一组文件加了待操作标记后Emacs会认为此后的操作都是以这些加操作标记的文件为对象的
       * 去掉星号带操作标记                     M-DEL / M-x dired-unmark-all-files / Mark标记菜单->Unmark All
       * 用正则表达式给一组文件加操作标志         %m 正则表达式
       * 用正则表达式给一组文件加删除标志         %d 正则表达式
       *

4.1.3 打印文件
~~~~~~~~~~~~~~~
   1. 打印编辑缓冲区
      M-x print-buffer类似pr|lpr
   2. 打印文本块
      M-x print-region类似pr|lpr
   3. 打印编辑缓冲区但不带页码
      M-x lpr-buffer 类似lpr
   4. 打印文本块但不带页码
      M-x lpr-region 类似于lpr
   5. 在Dired里把默认的打印命令放到辅助输入区里在按回车键执行它之前还可对它进行修改
      M-x dired-do-print
   6. 打印具有文本属性的编辑缓冲区
      M-x ps-print-buffer-with-faces

4.1.4 用Emacs查询UNIX在线文档
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   1. M-x man
   2. M-x manual-entry RETURN UNIX命令 ERTURN
      manual-entry的好处是可以随心所欲地前后翻阅使用手册页

4.1.5 时间管理工具
~~~~~~~~~~~~~~~~~~~
   1. 显示时间                    M-x display-time
   2. 显示日历                    M-x calendar
      * 默认情况下星期从星期日开始的。要修改开始星期几修改calendar-week-start值M-x set-variable calendar-week-start RETURN 1 RETURN
      * 移动到后一天               C-f
      * 移动到前一天               C-b
      * 移动到下一星期的同一天      C-n
      * 移动到前一星期的同一天      C-p
      * 以月份为单位前后移动        ESC } / ESC {
      * 以年为单位前后移动          C-x ] / C-x [
      * 前卷三个月                 C-v
      * 后卷三个月                 M-v
      * 移动到星期的开始 / 结尾     C-a / C-e
      * 移动到月份的开始 / 结尾     M-a / M-e
      * 移动到年的开始   / 结尾     ESC < / ESC >
      * 直接到达某个特定的日期       g d
      * 把指定月份放在日历画面的中间  o
      * 前卷一个月                  C-x <
      * 后卷一个月                  C-x >
      * 查看节假日                  a / M-x list-calendar-holidays /M-x holidays
      * 查看指定日期是不是节假日      h
      * 搞亮显示节假日               x
   3. 日记功能日常安排不是一般的日记calendar的一部分
      * 日记文件名字必须是.diary,并且放在自己的主目录中把自己打算记住的日期插入到这个文件里
      * 若不想Emacs在日历上把某条目显露出来在某个日记条目前加上&字符
      * 插入一条一次性的日记条目                    i d
      * 插入以周为循环的日记条目                    i w
      * 插入以月为循环的日记条目                    i m
      * 插入以年为循环的日记条目                    i y / i a
      * 插入以n天循环的日记条目                     i c
      * 插入以日期block为循环的日记条目             i b
      * 突出显示日记条目                           m
      * 显示指定日期的日记条目                      d
      * 显示.diary文件的内容                       s
      * 计算某个日期段的天数                        M-=
      * 显示3个月期间的月相情况                      M calendar-phases-of-moon
      * 根据给定的经度和维度显示指定日期的日出和日落时间S calendar-sunrise-sunset
      * 设置时间块block                             C-@ / C-SPACE

4.2 GUI
========
  1. 打开文本GUI
     按下F10或者"ESC `"

4.3 获取帮助
=============

4.3.1 EMACS的自动补足功能
~~~~~~~~~~~~~~~~~~~~~~~~~~
   1. Emacs的自动补足项包括
      * 命令
      * 文件名
      * 编辑缓冲区名
      * Emacs变量名
   2. Emacs的补足键包括
      * TAB    :尽可能补足
      * SPACE  :补足这个名称直到下一个标点符号
      * ?      :以此前输入的字符为依据,可用选择列在*Completions*里

4.3.2 帮助键(通常是C-h)
~~~~~~~~~~~~~~~~~~~~~~~~
   1. C-h c                         :这个按键组合将允许哪个命令
   2. C-h l                         :最近输入的1000个字符是什么
   3. C-h v                         :这个变量的含义是什么,有哪些可取值
   4. C-h t                         :Tutorial教程
   5. C-h k                         :Describe Key按键解释
   6. C-h f                         :Describe Function函数解释
   7. M-x describe-face             :查看face的文档
   8. C-h m                         :查看当前mode的文档
   9. C-h w                         :查看某个命令对应的快捷方式
   10. C-h b                        :查看当前buffer所有的快捷键列表
   11. C-h s                        :这个缓冲区里使用哪个语法表
   12. <待查看的快捷键序列>C-h        :查看当前buffer中以某个快捷序列开头的快捷键列表
   13. M-x find-function            :查看函数代码
   14. M-x find-variable            :查看变量的代码
   15. M-x find-face-definition     :查看face的代码
   16. C-h a / M-x command-apropos  :查看关键字所涉及的命令
   17. M-x apropos                  :查看关键字所涉及的函数和变量
   18. M-x super-apropos            :查看关键字所涉及的文档
   19. C-h i / M-x info             :启动文档查看器info程序,进入info模式
   20. C-h C-f                      :info下的C-h f
   21. C-h C-k                      :info下的C-h k

4.4 auto-fill mode自动换行模式
===============================
  这种副模式把什么地方断行的工作交给Emacs去决定。Emacs会在句子接近行尾的时候等待你输入一个空格然后它会把下一个单词转到下一行。

4.5 设置Emacs
==============

4.5.1 定制按键
~~~~~~~~~~~~~~~
   1. 通过向键位映射图添加定义项的方法能创造出自己的按键绑定。有三个函数可完成这个操作
      * (define-key 键位映射图 "键序列" 'Emacs命令)
        对于按多次键的组合键命令中供C-x使用的键位映射图是Ctl-x-mapESC使用的键位映射图是esc-map
      * (global-set-key "键序列" ‘Emacs命令)
      * (local-set-key "键序列" 'Emacs命令)
   2. 键序列中
      * C-x用\C-x代替
      * ESC用\e代替

4.5.2 变量说明
~~~~~~~~~~~~~~~
     * kill-ring-max
       设置删除环的尺寸            
     * auti-save-interval
       设置Emacs对文件自动保存的频率
     * case-fold-search
       查找操作是否区分字母大小写  
     * case-replace
       是否改变被替换字符串的大小写
     * window-min-height / window-min-width
       窗口大小的上下限          
     * shell-file-name
       替换用于执行命令的shell    
     * sentence-end
       设置句子的定义              
     * auto-mode-alist
       设定文件后缀与主编辑模式的关联管理
     * default-major-mode
       设置默认的主编辑模式        
     * c-macro-preprocessor
       设置C预处理器命令          
     * completion-auto-help
       设置自动补全时,是否打开*Completions*窗口
     * completion-ignored-extensions
       它是一个由文件后缀构成的列表,Emacs在补足文件名时将不把以它们为后缀的文件名列出来

4.5.3 加载LISP包
~~~~~~~~~~~~~~~~~
   1. autoload函数
      * autoload函数告诉Emacs在遇到没有见过的命令时应该到什么地方去查它。这就在函数和实现函数的程序包之间建立起一个关联关系这样当这个函数在第一次被调用时Emacs就会自动加载相应程序包来载入该函数的代码。
      * autoload函数的格式为(autoload '函数名 "源文件名称")
   2.

4.6 拼写检查
=============
  1. M-x ispell-buffer              检查整个缓冲区
  2. ESC $ / M-x ispell-word        检查单词
  3. ESC TAB / ispell-complete-word 会把单词的各种补足形式列出来
  4. M-x ispell-kill-ispell         杀死ispell进程

4.7 Emacs中的宏
================
  1. 定义宏          C-x (
     * 在录制宏的过程中如果在某个地方按下了C-u C-x q就表示插入一个递归编辑在递归编辑期间录入的任何东西都不会录制到宏中去可以输入任何东西但结束时必须用ESC C-c推出递归编辑状态。
     * 在录制宏的过程中可以在想让宏暂停执行的地方按下C-x q。当宏执行到这里时Emacs会给出询问
       y 表示继续执行这个宏执行完毕进入下一次循环
       n 表示停止执行这个宏但进入下一次循环
       C-r 开始一次递归编辑
       C-l 把光标所在的文本行放到画面中央
       C-g 取消整个宏的执行
  2. 结束宏的录制            C-x )
  3. 取消宏录制              C-g
  4. 执行宏                 C-x e
     任何时候只能有一个活动的宏如果又定义了另外一个宏那么新定义的宏就成了活动的宏而以前的宏被覆盖.
  5. 向现有的宏里增加编辑命令  :C-u C-x (
     虽然不能对宏进行编辑但是可以用C-u C-x (组合键在宏的尾部加ixie编辑命令。这个命令先执行完已经录制好了的宏然后等待添加更多的击键动作按C-x )结束宏的录制。
  6. 命名并保存宏           M-x name-last-kbd-macro
  7. 执行被命名的宏         M-x 宏名字
  8. 插入表示宏的代码到文件中
     * 用C-x C-f打开保存宏代码的文件
     * M-x insert-kbd-macro RETURN 宏名字 RETURN
     * 保存该文件
     * 可以把宏保存到.emacs中这样宏就会自动加载进来了
  9. 加载宏文件            M-x load-file

4.8 Emacs下的版本控制
======================
  1. VC命令汇总
     * C-x v v  / M-x vc-next-action               前进到下一个合乎逻辑的版本控制状态
     * C-x v d  / M-x vc-directory                 列出某个子目录下所有的已注册版本
     * C-x v =  / M-x vc-diff                      生成一份版本差异报告
       * 可以加前缀C-u那么会提示输入一个文件名和两个修订号比较该文件的两个修订号之间的而区别
       * 如果输入文件名时输入的是目录名称则VC把该目录力全部已注册文件的指定版本之间的差异全部报告出来
       * VC输出的差异报告可以通过patch转换为一个补丁包
     * C-x v u  / M-x vc-revert-buffer             丢弃修改
     * C-x v ~  / M-x vc-version-other-window      在另一窗口打开指定修订版
     * C-x v l  / M-x vc-print-log                 显失某文件的修订日志
     * C-x v i  / M-x vc-register                  把文件注册到版本控制系统
     * C-x v h  / M-x vc-insert-headers            给文件加上供版本控制系统使用的标题块
     * C-x v r  / M-x vc-retrieve-snapshot         签出一个已命名的项目快照
     * C-x v s  / M-x vc-create-snapshot           创建一个项目快照并命名
     * C-x v c  / M-x vc-cancel-version            丢弃一个已保存起来的修订版
     * C-x v a  / M-x vc-update-change-log         刷新一个GNU格式的changeLog文件
     * M-x vc-rename-file                          重命名版本受控文件
     * M-x vc-clear-context                        强制让VC清空当前文件的版本控制状态的缓存信息
  2. VC的变量设置
     * vc-default-back-end           :VC缺省使用的版本控制系统
     * vc-display-status             :是否显示版本信息
     * vc-header-alist               :设置版本header的格式
     * vc-keep-workfiles             :设置签入时是否保留工作版本的文件
     * vc-mistrust-permissions       :是否根据文件的权限来判断版本控制状态
     * vc-suppress-confirm           :设置丢弃操作时是否进行确认
     * vc-initial-comment            :初始注释
     * diff-switches                 :在生成修改报告的时候,把这个变量传递到UNIX的diff命令
     * vc-consult-headers            :是否从版本控制字符串出获取文件的状态和版本信息,而不再看主控文件

4.9 Html-helper-mode
=====================
  1. 把标签加到文本块的两端而不是光标位置上             C-u HTML标签的键盘命令
  2. 自动补全                                         ESC TAB
  3. 特殊字符的输入                                    C-c 特殊字符
  4. HTML段落分隔符                                   M-RETURN
  5. 逻辑样式strong                                   C-c C-s s
  6. 超链接                                           C-c C-a l

4.10 cc-mode
=============
  1. 移动命令
     * 移动到当前语句的开头                 M-a
     * 移动到当前语句的结尾                 M-e
     * 段落重排                            M-q
     * 移动到当前函数的开头                 ESC C-a
     * 移动到当前函数的结尾                 ESC C-e
     * 选中整个函数为文本块                 ESC C-h / M-x c-mark-function
     * 对整个函数进行缩进                   C-c C-q
     * 移动到当前预处理器条件的开始位置       C-c C-u
     * 移动到上一个预处理器条件              C-c C-p
     * 移动到下一个预处理器条件              C-c C-n
  2. 基本缩进命令
     * 对文本块进行缩进                     ESC C-\ / M-x indent-region
     * 光标移到当前行的第一个非空白字符上     M-m     / M-x back-to-identation
     * 把当前行合并到上一行去                ESC ^   / M-x delete-indentation
     * 选择一个缩进样式                     M-x c-set-style
  3. 注释命令                              M-;
  4. 自动开始新行
     * 可以使用C-c C-a / M-x c-toggle-auto-state来启用 / 禁用它
     * 启用了自动开始新行功能后只要输入;{}或者特定情况下的,:Emacs就会自动加上一个换行符并对新行进行缩进
     * 启用了之后状态行从C改为C/a
  5. 饥饿的删除键
     * 可以使用C-c C-d / M-x c-toggle-hungry-state启动 / 禁用它
     * 饥饿的删除键将使DEL键具备删除光标左边全部空格的能力
     * 启用后状态行从C改为C/h
  6. 同时启用 / 禁用 自动开始新行与饥饿的删除键  C-c C-t / M-x c-toggle-auto-hungry-state
  7. 查看C预处理器处理之后的代码              
     * 先定义一个文本块
     * C-c C-e / M-x c-macro-expand
     * 文本块会送到实际的C语言预处理器中处理结果放到一个名为*Macroexpansion*窗口中
  8. etags
     * 设定TAGS文件地址                    M-x visit-tags-table RETURN
     * 查找TAG                            M-. (当前窗口跳转) / C-x 4 . 另一窗口跳转
     * 查找其他同名的函数                   M-, / M-x tags-loop-continue
     * 正则表达似乎查找TAG                  M-x tags-search
     * 对TAGS中所有文件进行询问-替换         M-x tags-query-replace
     * 显示所有符合正则表达式的TAG列表        M-x tags-apropos
     * 显示所有TAG                         M-x list-tags

4.11 complier-mode
===================
  1. 执行编译
     * M-x compile
     * 首先会输入一个编译命令一旦输入这个编译命令在本次Emacs回话过程中都有效
     * 输入编译命令之后Emacs会自动把未存盘的编辑缓冲区保存起来
     * 在编译执行阶段状态行上显示Compiling:run
     * 编译结束则显示exit字样
     * 编译结果显示在*compilation*编辑缓冲区内
  2. 移动到下一条出错信息并访问与之对应的源代码 C-x · 这里时C-x 反引号
  3. 移动到下一条 / 上一条出错信息            M-n / M-p
  4. 访问当前出错信息的源代码                 C-c C-c
  5. 下卷屏幕显示                           SPACE
  6. 上卷屏幕显示                            DEL

4.12 大纲模式(M-x outline-mode)
================================
  1. 移动
     * 移动到下一个标题或子标题                  :C-c C-n
     * 移动到上一个标题或子标题                  :C-c C-p
     * 移动到同级的下一个标题                    :C-c C-f
     * 移动到同级的上一个标题                    :C-c C-b
     * 移动到上一层标题                         :C-c C-u
  2. 文本的隐藏和显示
     * 隐藏正文                                :C-c C-t / M-x hide-body
     * 查看所有文本                             :C-c C-a / M-x show-all
     * 隐藏某标题下的所有子标题和文本             :C-c C-d / M-x hide-subtree
     * 显示某标题下的所有子标题和文本             :C-c C-s / M-x show-subtree
     * 把紧跟在某标题下的文本隐藏起来             :M-x hide-entry
     * 把紧跟在某标题下的文本显示出来             :M-x show-entry
  3. 大纲的编辑
     * 如果想把隐藏着的文本移动到另外一个编辑缓冲区内,这两个编辑缓冲区就必须都在大纲模式下
       如果试图把大纲里的隐藏文本移动到另外一个不在大纲模式下的编辑缓冲区里,就会看到来自大纲的文本有所改变
     * 在隐藏文本的情况下,千万不要在省略号上输入,因为输入的内容将会插入到隐藏文本里
  4. 大纲的副模式(M-x outline-minor-mode)
     * 在大纲副模式下,必须给大纲命令都加上C-c C-o前缀,以便跟主模式里的C-c命令发生冲突.

5 NOTE
-------
 1. 文本标记是与编辑缓冲区而不是窗口关联的每个编辑缓冲区职能有一个文本标记
 2. 每个窗口都能记住自己的光标位置
 3. 只有在特殊键所产生的字符代码是以一个特殊字符开头并且至少有3个字符长时才能在Emacs里对它们进行定制