control (minor mode.), c-x c-q 变成check-in/check-out.
如何取得更多的资讯:
Emacs的lisp 经过多年的发展,已成为完整的self-documenting系统. 很多东西都可以线上找到你要的资讯.
前面说过,或者你已经不小心按backspace遇到了, C-h (就是backspace 的ascii码) 在emacs里面是help的意思, 它可以带出一串指令. 常用的有:
C-h F Emacs FAQ C-h t Emacs Tutorial C-h n Emacs NEWS file, 介绍最近改版的新功能 C-h i Info system. Info是gnu用来取代man page的系统, 基本上和文字模示的WWW差不多. 有许多重要的资讯 可以在这边找到. 如果你是新手, 建议你在x-win下 看. 不然, 按键 m (menuitem), SPC next page l (last node: node就是章节的意思) u (up node) d (directory, 索引). BS (Backspace, back a page). 如果全部只按SPC, 就跟man 一样. C-h k describe key, 告诉你按这个键执行那个lisp function. C-h f describe function. 告诉你function在作什么. 如果只按SPC, emacs会给你所有lisp 函数的列表, 和说明. C-h v describe variable 同function. C-h a apropos的意思(approximate). 给lisp function的部份 字串, emacs帮你找. C-h b 列出目前所有的keybinding C-h m mode help. 列出目前的mode的特殊说明. C-c C-h 列出以C-c 开头的所有key-binding. 虽然说Emacs 可以定义按键, 可是Ctrl- 开头的所有组合大概都用光了, 只有C-c算是可以自定指令. 不过有些mode也侵犯这个空间. 目前的convention是C-c <chr> 留给user, C-c C-<chr> 留给package.
有以上这些help, 你的emacs/elisp功力会随著时间成长.
Elisp 简介:
Emacs有三份手册.第一份是使用手册, 第二份是Elisp 手册, 第三份是 Elisp 简介. 第三份的程度是入门级, 值得看. Elisp手册其实也写的 很简单, 还教你lisp, 不过有点长, 适合参考.
因为我lisp没有仔细学过, 所以: 以下所言, 如有巧合, 那才是真的.
Basic data type 字串 (string) "Hello, World" 字元 (char) ?a ; 问号开头 atom & list: (1 2 3 4) 是一个list, 由 4个 atom 组成. pair: 中间是句点. (apple . 2) alist (associated list) 就是一堆 pair的集合,就像perl/tcl的associative array. 或者说是一个资料库, 一堆 (key, value) pair. '((Apple . 1) (Orange . 2) (PineApple . 3)) vector (?) emacs 19用vector 来表示按键(key strok sequence) [f1] [f2] [f1 a]
nil 就是空的list, 或者表示 false t true Forms 我们写程式最好有样版让我们填空最简单了. Form 就是样版, 不过意义不太一样. Form 就是Elisp 可以接受的句型. lisp 解译器 预设是对list的每个元素求值(evaluate), 除非是 special form, 有特殊的定义. 比如说
(defun FUNC (ARG-LIST) BODY ...)
就是一个special form, 用来定义函式, 所以FUNC 不会被 求值, 被当成symbol, ...
(quote (LIST))
这也是个special form, 叫 lisp 把 (LIST)当做symbol就好了, 不要 evaluate.
quote 很常用, 所以有个缩写: '(LIST) 等于 (quote (LIST)) 'Asymbol 可以表示一个Atom, 名称叫Asymbol
set 可以产生/定义新的变数. (set 'hello 1) ; hello = 1 ; 注意我们用 'hello, 所以lisp不会evaluate hello的值.
这家伙很常用, 也有简写. (setq hello 1) setq 就是set quote 的缩写. 这是个 special form, 不会对 第二个元素求值. Evaluation
在Emacs下, C-x C-e 可以执行(evaluate, 求值)游标左边的叙述. 结果会出现在minibuffer.
lisp-interaction-mode中 C-j 可以evaluate, 并且把结果append到 buffer.
lisp 程式由一堆list 构成.称为expression. 每个expression 都回传回一个值. 有些expression有副作用, 如删掉一个字. (这跟C 的int delete_char() 意思一样, 它传回int, 并且删掉某个char)
定义函式:
(defun NAME (ARGS-LIST) "注解" ; optional (interactive) ; optional BODY)
定义一个叫NAME的函式. BODY 是一堆expression. 注解是用来给C-h f显示的. (interactive) 表示这个函示会和user/buffer作用. (interactive "B") 表示执行此函式先问user一个buffer的名字, 然后当作参数传给它. (如, 当user透过key-binding 或者 M-x 呼叫此函式时) (interactive "BAppend to buffer: \nr") 问user buffer name时, 提示号 Append to buffer: 此function有两个引数,第一个是B, 就是buffer 第二个是r, region 用\n 隔开. (interactive "p") 用C-u 设的prefix 把它当作参数传给我. 预设值==4. C-u C-f 向右移四个字
一些lisp 函式:
(list 1 2 3 4) 产生 '(1 2 3 4) (car '(1 2 3 4) 1 (cdr '(1 2 3 4) '(2 3 4) (cons 1 '(2 3 4)) '(1 2 3 4) (cons 1 2) (1 . 2) (cons 0 (cons 1 (cons 2 nil))) 等于 '(0 1 2) {list 是用 pair 串起来的, 用C 表示: pair: {Object *first, Object *second}; *(pair[i].first) == i; pair[i].second == pair[i+1]; }
(cons '(1 2) '(3 4)) '((1 2) 3 4) (setq a 1) (1+ a) ; a+1 (+ 2 a) ; a+2 (* 1 2 3 4) (current-buffer) ; 传回目前buffer的资料物件 (switch-to-buffer (other-buffer)) (set-buffer) (buffer-size) (setq current-pos (point)) (point-min) (point-max) (message "Hello") ; 在minibuffer显示Hello (if (test) (then-part) (else-part)) (cond ((test1) BODY1) ((test2) BODY2) (t OTHER-WISE) (let ((var1 value) ; local variable var2 ; no value (var3 value) ...) BODY ...) (lambda (ARG-LIST) ...) 同 defun, 但是没有名字 (anonymous). 可以存到变数去: (setq hello (lambda () (message "Hello,World"))) (funcall hello) (goto-char (point-max)) (defvar VAR VALUE "*注解") 如果VAR 不存在才定义. 有注解可以用 C-h v 看. 注解打*号表是使用者可以直接改/ 这个变数本来就是 给使用者设定用的. 可以用 M-x edit-options 来线上设定 (emacs结束就没有了, 不过edit-options可以给你所有可修改的变数的列表,你可以 放到.emacs档内.
(directory-files "./" t "\\..*") return a list of files under directory X (load "xxxx.el") 同#include <stdio.h> (setq load-path (cons "~/emacs" load-path)) ; load的search path. (autoload ...) 不像load会直接evaluate 整个档案, 而是需要时再 load. (local-unset-key [(control c)]) (local-set-key [(control c) a] 'forward-sexp) sexp 就是一个expession, n个expression如果用括号括起来就算一个. (expression的定义随语言的不同而有不同, 在C, lisp tex, html, fortran 下皆有差异上一页 [1] [2]
|
|