学习GNU Emacs
1 GNU Emacs介绍
Emacs编辑器是最受欢迎、传播范围最广、也是最强大和最灵活的UNIX文本编辑器。与其他文本编辑器的重要区别在于它是一个完备的工作环境,使用Emacs可以完成各种日常工作。对很多Emacs用户来说,Emacs已经超越了编辑器的范畴,使用Emacs是一种文化,一种生活。 GNU Emacs是GNU开发的Emacs变体,也是最广泛使用的Emacs编辑器。本文将以GNU Emacs为例讲解GNU Emacs编辑器的使用和技巧。首先介绍一下常用的快捷键,接着介绍GNU Emacs扩展,最后是.emacs文件的配置。
2 快捷键
GNU Emacs的快捷键都是绑定于CTRL键和ALT键上。每个快捷键对应一个指令名称,也就是一个对应的函数名称,这允许你根据不同的喜好将快捷键绑定到不同的指令名称。另外,在Emacs中有很多的指令没有绑定快捷键,我们可以通过M-x 指令名称来执行指令。例如,全文替换我们可以使用M-x replace-strings。这样,很多没有绑定快捷键的功能都可以用到了。
2.1 基本操作
表1是基本操作指令列表。
表1 基本操作指令
快捷键 | 指令名称 | 用途 | 快捷键 | 指令名称 | 用途 |
---|
C-SP | set-mark-command | 设置标记 | C-q | quoted-insert | 插入引用 |
C-a | beginning-of-line | 移动到行首 | C-r | isearch-backward | 向前查找 |
C-b | backward-char | 向前移动一个字符 | C-s | isearch-forward | 向后查找 |
C-t | transpose-chars | 掉换前后二个字符位置 | C-d | delete-char | 删除一个字符 |
C-e | end-of-line | 移动到行尾 | C-v | scroll-up | 向下滚动一屏 |
C-f | forward-char | 向后移动一个字符 | C-w | kill-region | 删除选定区域 |
C-x < | scroll-left | 向左移动一屏 | C-x > | scroll-right | 向右移动一屏 |
TAB | forward-button | 缩进 | C-y | yank | 粘贴 |
C-z | suspend-frame | 暂停emacs | C-n | next-line | 移动到下一行 |
C-k | kill-line | 删除一行 | ESC | ESC-prefix | 取消前缀 |
C-o | open-line | 增加一行 | DEL | delete-backward-char | 向前删除一个字符 |
C-p | previous-line | 向上移动一行 | C-z | suspend-emacs | 暂停Emacs |
C-_ | undo | 取消 | C-l | recenter | 使光标所在行变为屏幕中央 |
2.2 帮助
表2是帮助指令列表。
表2 帮助指令
|
快捷键 | 指令名称 | 用途 | 快捷键 | 指令名称 | 用途 |
---|
C-h w | where-is | 查看命令菜单位置或者绑定热键 | C-h k | describe-key | 查看热键详细功能描述 |
C-h t | help-with-tutorial | 查看Emacs教程 | C-h c | describe-key-briefly | 查看热键简单功能描述 |
C-h n | view-emacs-news | 浏览Emacs新闻 | C-h b | describe-bindings | 查看绑定热键 |
C-h m | describe-mode | 查看编辑模式 | C-h C-c | | 查看许可证信息 |
C-h ? | help-for-help | 查看帮助列表 | | | |
2.3 缓冲区操作
表3是缓冲区操作指令列表。
表3 缓冲区操作指令
快捷键 | 指令名称 | 用途 | 快捷键 | 指令名称 | 用途 |
---|
C-x C-d | list-directory | 列出当前目录 | C-x = | what-cursor-position | 显示当前光标所在位置 |
C-x C-f | find-file | 查找文件 | C-x TAB | indent-rigidly | 强制缩进 |
C-x C-o | delete-blank-lines | 删除空白行 | C-x b | list-buffers | 打开另外一个缓冲区 |
C-x C-p | mark-page | 全选 | C-x C-r | find-file-read-only | 以只读方式打开文件 |
C-x C-s | save-buffer | 保存当前缓冲区 | C-x i | insert-file | 插入文件 |
C-x C-t | transpose-lines | 掉换前后行位置 | C-x h | mark-whole-buffer | 标记当前全部缓冲区 |
C-x C-v | find-alternate-file | 打开另外一个文件,关闭缓冲区 | C-x l | count-lines-page | 计算当前缓冲区行数 |
C-x C-w | write-file | 保存缓冲区内容到文件 | C-x k | kill-buffer | 关闭缓冲区 |
C-x m | mail | 写Email | C-x 4 m | mail-other-window | 打开新窗口写Email |
C-x s | save-some-buffers | 保存多个文件 | C-x u | advertised-undo | 取消上一步操作 |
2.4 宏操作
表4是宏操作指令列表。
表4 宏操作指令
快捷键 | 指令名称 | 用途 | 快捷键 | 指令名称 | 用途 |
---|
C-x ( | start-kbd-macro | 开始录制宏 | C-x ) | end-kbd-macro | 结束宏录制 |
C-x e | call-last-kbd-macro | 执行上一次绑定的宏命令 | | | |
2.5 窗口操作
表5是窗口操作指令列表。
表5 窗口操作指令
快捷键 | 指令名称 | 用途 | 快捷键 | 指令名称 | 用途 |
---|
C-x 0 | delete-window | 关闭当前窗口 | C-x 1 | delete-other-windows | 保留当前窗口,关闭其他窗口 |
C-x 2 | split-window-vertically | 水平分割窗口 | C-x 3 | split-window-horizontally | 垂直分割窗口 |
2.6 C语言编程模式
表6是C语言编程模式的指令列表。
表6 C语言编程模式指令
快捷键 | 指令名称 | 用途 | 快捷键 | 指令名称 | 用途 |
---|
M-a | backward-sentence | 移动到语句开头 | M-e | forward-sentence | 移动到语句结尾 |
C-M-a | beginning-of-defun | 移动到函数开头 | C-M-e | end-of-defun | 移动到函数结尾 |
2.7 SGML语言编程模式
表7是SGML语言编程模式指令列表。
表7 SGML语言编程模式指令
快捷键 | 指令名称 | 用途 | 快捷键 | 指令名称 | 用途 |
---|
C-c C-t | sgml-tag | 插入标记 | C-c C-a | sgml-attributes | 插入属性 |
C-c C-b | sgml-skip-tag-backward | 移动到前一个标记 | C-c C-f | sgml-skip-tag-forward | 移动到后一个标记 |
C-c DEL | sgml-delete-tag | 删除一个标记 | | | |
2.8 版本控制命令
表8是版本控制指令列表。
表8 版本控制指令
快捷键 | 指令名称 | 用途 | 快捷键 | 指令名称 | 用途 |
---|
C-x v d | vc-directory | 列出目录下修改过的文件 | C-x v = | vc-diff | 显示改动 |
C-x v l | vc-print-log | 显示改动历史记录 | C-x v i | vc-register | 加入文件到版本控制中 |
C-x v h | vc-insert-headers | 插入版本控制信息 | C-x v r | vc-retrieve-snapshot | 取某一版本文件 |
C-x v v | vc-next-action | 进入提交改动状态 | | | |
3 GNU Emacs扩展
3.1 Emacs Lisp语言介绍
3.2 有用的GNU Emacs扩展
3.3 写一个GNU Emacs扩展
这里我们自己动手写一个GNU Emacs扩展,实现复制一行的功能。下面是实现这个扩展的代码。
(defun copy-line (&optional arg)
"Save current line into Kill-Ring without mark the line"
(interactive "P")
(let ((beg (line-beginning-position))
(end (line-end-position arg)))
(copy-region-as-kill beg end))
)
将上面这段代码拷贝到.emacs中,就可以开始使用这个功能了。4 .emacs文件
4.1 样例
;;显示时间
(display-time)
;;显示行号
(column-number-mode t)
(show-paren-mode t)
;;设置TAB宽度为4
(setq default-tab-width 4)
;;以下设置缩进
(setq c-indent-level 4)
(setq c-continued-statement-offset 4)
(setq c-brace-offset -4)
(setq c-argdecl-indent 4)
(setq c-label-offset -4)
(setq c-basic-offset 4)
(global-set-key "\C-m" 'reindent-then-newline-and-indent)
(setq indent-tabs-mode nil)
(setq standard-indent 4)
;;开启语法高亮。
(global-font-lock-mode 1)
;;设置默认工作目录
(setq default-directory "/home/test/source/")
;; 去掉滚动条
(set-scroll-bar-mode nil)
;;关闭开启画面
(setq inhibit-startup-message t)
(setq indent-tabs-mode t)
;;不产生备份文件
(setq make-backup-files nil)
;;设置自定义变量
(custom-set-variables
'(column-number-mode t)
'(current-language-environment "UTF-8")
'(display-time-mode t)
'(ecb-options-version "2.32")
'(mouse-1-click-in-non-selected-windows t)
'(mouse-drag-copy-region t)
'(mouse-yank-at-point t)
'(save-place t nil (saveplace))
'(show-paren-mode t)
'(transient-mark-mode t))
(custom-set-faces
;;选择小工具栏图标
(tool-bar-mode -1)
5 总结
6 参考资料