您的位置:首页 > 其它

GNU emacs Lisp小结2

2013-05-15 18:51 148 查看
chapter 2 求值实践
每当在Emacs Lisp中发出一个编辑命令时,比如一个移动光标或滚动屏幕的命令,就是在对一个表达式求值,这个
表达式的第一个元素就是一个函数。这就是Emacs的工作方式。
键入普通文本是对Emacs Lisp的self-insert-command函数求值。

2.1 缓冲区名
(buffer-name) ;缓冲区的名字
(buffer-file-name) ;文件完整的路径名

2.2 获取缓冲区
(current-buffer) ;得到这个缓冲区本身
(other-buffer) ;最近使用过的缓冲区

2.3 切换缓冲区
(switch-to-buffer (other-buffer)) ;切换到最近使用的缓冲区,C-x b
switch-to-buffer切换Emacs关注的缓冲区和当前显示的缓冲区切换到另一个
set-buffer只切换Emacs关注的缓冲区,窗口显示内容不变。

2.4 缓冲区大小和位点的定位
(buffer-size) ;当前缓冲区的大小,字符统计
(point) ;光标当前位点的字符统计
(point-min) ;当前缓冲区中位点的最小可能值
(point-max) ;当前缓冲区中位点的最大可能值

chapter3 如何编写函数定义
当你在Emacs Lisp中编写代码时,你无法分清在C语言中编写的函数和在Emacs Lisp中编写的函数。

3.1 defun特殊表
因为defun不以通常的方式对它的参量求值,因此它被称为特殊表。
一个函数定义在defun之后最多有下列5个部分:
>符号名,这是函数定义将要依附的符号。
>将要传送给函数的参量列表。如果没有任何参量传送给函数,那它就是一个空列表()。
>描述这个函数的文档。(技术上说,这部分是可选的,建议使用)
>一个使函数称为交互函数的表达式,这是可选的。因此,可以通过键入M-x和函数名来使用它,或者键入一个适当
的键或者键序列来使用它。
>指导计算机如何运行的代码,这是函数定义的主体。
(defun function-name (arguments...)
"optional-documentation..."
(interactive argument-passing-info) ;optional
body...)
ex:
(defun multiply-by-seven (number)
"Multiply NUMBER by server."
(* 7 number))

3.2 安装函数定义
(multiply-by-seven 3)
执行C-x C-e defun之后即安装了函数定义
C-h f (describe-funciton) ;显示函数说明

改变函数定义即重新定义函数并求值

3.3 使函数称为交互函数
(defun multiply-by-seven (number)
"Multiply NUMBER by server."
(interactive "p") ;告诉emacs要传送一个前缀参量给这个函数,并将它作为函数的参量
(message "The result is %d" (* 7 number)))
(multiply-by-seven 3)
or user C-u 3 M-x multiply-by-seven
如果需要绑定键序列,需要其他步骤

3.4 interactive函数的不同选项
Emacs有多于20个为interactive预先定义好的字符。
“r" 使Emacs将位点所在区域的开始值和结束值作为函数的两个参量。
“B” 告诉Emacs用缓冲区的名字作为函数的参量。
ex:
(defun name-of-function (buffer start end)
"documentation..."
(interactive "BAppend to buffer: \nr")
body-of-function)

3.5 永久的安装代码
.emacs or 使用load函数

3.6 let函数
let表达式是Lisp中的一个特殊表,用户在绝大多数函数定义中都需要使用它。
let用于将一个符号附着到或者绑定到一个值上,对于这样绑定的变量,Lisp解释器就不会将其与函数之外的同名
变量混淆了。
有let表达式创建的局部变量只是在let表达式中保留它们的值。
let表达式一次可以创建多个变量。
(let varlist body...)
ex:
(let ((zebra 'stripes)
(tiger 'fierce))
(message "One kind of animal has %s and another is %s." zebra tiger))

(let ((birch 3)
pine
fir
(oak 'some))
(message "Here are %d variables with %s, %s, and %s value." birch pine fir oak))

3.7 if特殊表
(if true-or-false-test
action-to-carry-out-if-test-is-true)
ex:
(defun type-of-animal (characteristic)
"Print message in echo area depending on CHARACTERISTIC.
if the CHARACTISTIC is the symbol 'fierce',
then warn of a tiger."
(if (equal characteristic 'fierce)
(message "It's a tiger!")))

3.8 if-then-else 表达式
(if true-or-false-test
action-to-carry-out-if-the-test-returns-true
action-to-carry-out-if-the-test-returns-false)

3.9 Lisp中的真与假
nil表示一个空列表,或者“假”,可以将nil写成()或者nil。在Lisp中,除了nil和()之外都是真。

3.10 sava-excursion 函数
point当前位点
mark标记
两者之间的区域是region
save-excursion特殊表将位点和标记的当前位置保存起来,并当特殊表主题代码有Lisp解释器执行完毕之后恢复原
来的位点和标记的位置。
为保存整洁,即使其中的代码出错时,save-excursion仍然恢复位点和标记的值。
save-excursion函数也跟踪当前的缓冲区,并恢复它。

(save-excursion
first-expression-in-body
second-expression-in-body
...
last-expression-in-body)

3.11 回顾
现在接触到函数:
>eval-last-sexp ;C-x C-e
>defun
>interactive
>let
>if
>equal,eq
><,>,<=,>=
>message
>setq,set
>buffer-name
>buffer-file-name
>current-buffer
>other-buffer
>switch-to-buffer
>set-buffer
>buffer-size
>point
>point-min
>point-max
>+
>concat

本文出自 “奋斗” 博客,请务必保留此出处http://zmhot88.blog.51cto.com/1338337/1201154
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: