注册 | 登录
收藏 | 帮助
热门文章
编辑推荐
相关文章  
用MailSpy拦截局域网内危险的病毒
信息安全的隐患-GoogleHacking原
破译E-mail账号的技巧
破解Email账号三种方法
WiMAX的安全机制解析
教你强力破解E-mail密码的三种方
Linux/Unix环境下的make和makefi
DNS (domain Name System) 系统的
带SMTP认证功能的qmail配置
qmail+vpopmail+sqwebmail的安装
您现在的位置: 顶尖设计 >> IT学院 >> 服务器 >> Linux服务器 >> 文章正文
Emacs 快速入门
作者:佚名  来源:不详  点击:  更新:2006-12-20
简介:
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] 




  • 上一篇文章:
  • 下一篇文章:
  • 分享此文:该页面添加到 Mister Wong 添加到雅虎Yahoo!收藏 Add to:Del.icio.us Post to Furl Digg this 添加到Google书签 reddit spurl blogmarks 365Key 评论  收藏  分享  打印
     我来说两句
    姓名:       验证码:   
    主页: 
    评分: 1分 2分 3分 4分 5分
    本频道近期热评文章:
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备07504942号 
    网络110
    报警服务