自己学习Emacs已3年由余, 对Emacs也算有点经验. 随着对Emacs的了解的不断深入, 越来越觉得Emacs是一款非常值得学习的软件. 所以我经常向自己的朋友推荐Emacs. 自己也认识一些Emacs初学者. 从他们经常问的一些问题中感觉, 好多初学者都没有好好的学过Emacs, 也有可能是Emacs的资料不是很多, 好资料更少, 他们没有找到好的学习方法吧. 所以, 我想就我所了解的, 写一些初学者应该知道的东西, 或者说, 初学者掌握了这些知识和方法后, 学习Emacs起来更加容易吧. 另外, 初学者如果有兴趣的话, 可以看看本人另外一篇拙作《致Emacs初学者》, 希望能对你们有所帮助.
知道Emacs的基本概念
- buffer
缓冲区. Emacs并不直接对文件进行操作, 它是把文件加载进buffer, 用户直接操作buffer, 只有当用户确定把buffer中所做的修改写人文件时, Emacs才把buffer中的内容写入文件. buffer实际上就是一个内存缓冲区, 这和一般编辑器中都一样, 应该很好理解. - window
窗口. 由于Emacs很早就诞生了, 它的窗口概念和现在基于窗口的操作系统中的窗口概念不是一样的. Emacs中的窗口是用来显示buffer的一个区域. 它并不像操作系统中的窗口拥有自己的标题栏,系统菜单栏. - frame
Emacs中的frame就是操作系统中的窗口.
buffer是文件的内存表示, windows则是显示buffer的区域, 一个frame中可以有多个window, Emacs则可以有多个frame.
- Emacs Lisp
Emacs最基础的部分是用c写的,其他部分都是用Emacs Lisp语言写的,Emacs Lisp语言是基于lisp语言的. lisp是LISt Processor的缩写, 即链表处理语言, 所以lisp语言的操作都是基于链表的, 它的语法也是链表结构, 链表第一个元素表示函数名, 其他元素是参数, 比如通常语言中的a+b, 在lisp就是(+ a b) - mode
mode有major mode和minor mode之分, 每个缓冲区对应一个major mode, 也只有一个major mode, 但是可以有多个minor mode. Emacs对每一种文件都有一个mode. - 命令
你对Emacs所有的操作都是对Emacs的命令的调用。比如,你在text-mode里,当你按下任何字母键进行编辑的时候,实际上是调用的emacs的命令self-insert-command. - 快捷键
Emacs中Control键用C表示,Alt键用M表示, 即: C-c表示Control C, M-x表示Alt x.
除掉以Alt键开头的,比如Alt a,Emacs中的快捷键基本上都有一个前缀,Emacs中最多的快捷键前缀就是C-x,C-c,前缀表示,你不必要一起按下前缀和后缀,可以先按下前缀,Emacs会等待你按下剩余的快捷键,这样Emacs中的快捷键按起来非常的方便。 - keymap
键盘映射. Emacs的快捷键是通过keymap来控制的. 有全局和局部的keymap. 每个mode都会有一个自己的局部的keymap, 局部的keymap会覆盖全局的keymap, 另外如果对应的major mode有开启的minor mode, 而且这个minor mode有keymap的话, 这个minor mode的keymap会覆盖major mode的keymap.
学会看文档
Emacs的文档非常丰富, 有Elisp自己的自文档, 还有更详细的info. Elisp中的变量, 函数都有文档. 对于大多数情况都够用了.
- 查看变量的值和文档
C-h v (describe-variable) - 查看函数的文档
C-h f (describe-function) - 查看face的文档
M-x describe-face - 查看某个mode的文档
C-h m (describe-mode)
刚开始学习某个mode的时候, 可以用C-h m看看当前buffer对应的主mode和副mode的文档, 这个文档一般都会包括mode中的命令和快捷键列表. - 查看某个快捷键对应的命令
C-h k (describe-key) - 查看某个命令对应的快捷键
C-h w (where-is) - 查看当前buffer所有的快捷键列表
C-h b (describe-bindings) - 查看当前buffer中以某个快捷键序列开头的快捷键列表
<待查看的快捷键序列> C-h,比如你想查看当前buffer中所有以C-c开头的快捷键列表,按C-c C-h就可以了。 - 查看函数的代码
find-function - 查看变量的代码
find-variable - 查看face的代码
find-face-definition - M-x apropos
查看包含某个关键词的函数,变量,face
会些简单的配置
- 执行Elisp代码
- 在某条语句后面按C-x C-e (eval-last-sexp)可以执行那条语句
- M-x eval-buffer 可以执行当前buffer内的Elisp代码
- 选中一个region后, M-x eval-region可以执行这个region内的代码
- 安装插件
Emacs的插件一般都是一个以el为后缀名的文件, 把这个文件下载下来后放到一个目录, 比如~/emacs/lisps, 然后执行下面这两条语句:
12 | (add-to-list 'load-path "~/emacs/lisps")(require 'pluginname) |
- 快捷键定制
全局绑定global-set-key, 绑定某个mode的快捷键用define-key. global-set-key的定义为:
(global-set-key key command) |
比如想把C-j绑定到”到达指定行上”(goto-line), 这样就可以了:
(global-set-key (kbd "C-j") 'goto-line) |
kbd是Emacs的宏, 把快捷键转换为Emacs的内部按键表示. 然后执行上面那条语句, 就会使你的配置生效. 然后你可以用C-h k检查一下你的定制是否成功了.
如果对于比较复杂的快捷键, 比如Control x F3, 改怎么写呢? 按C-h k(describe-key), 然后再按下Control x F3, Emacs会出现一个”C-x “, 这个就是你要写到kbd宏里面的内容.
如果你想对某个特定模式比如c++-mode进行快捷键定制, 用define-key即可, 对于上面的例子这样写:
(define-key c++-mode-map (kbd "C-j") 'goto-line) |
define-key第一个参数map一般为mode后面直接加”-map”
- 简单的颜色定制
12345 | (set-background-color "black") ;; 使用黑色背景(set-foreground-color "white") ;; 使用白色前景 (set-face-foreground 'region "red") ;; 区域前景颜色设为红色(set-face-background 'region "blue") ;; 区域背景色设为蓝色 |