Friday, August 25, 2006

Emacs Lisp 学习(二) -- 基本函数

引用自《GNU Emacs Lisp 编程入门》(中译版,2001年5月,P21。以下简称《Elisp》):
“除了一些基本函数是用 C 语言编写的之外,其他所有函数都是用别的函数来定义的。”
“当你在 Emacs Lisp 中编写代码时,你无法分清在 C 语言中编写的函数和在 Emacs Lisp 中编写的函数。它们之间的区别是不相关的。之所以提到它们的区别是因为知道这一点很有趣。实际上,除非你深入研究,否则你将不知道已经编写好的函数是用 Emacs Lisp 编写的还是用 C 语言编写的。”

以下的基本上也引用《Elisp》,因为它总结的太好了,不想破坏它。但个别地方会加以更改:

  • eval-last-sexp

  • 对光标所处的位点前的最后一个符号表达式求值。如果这个函数被激活时没有带参量,返回值输出在回显区中。如果这个函数被激活时带有参量,其输出打印在当前缓冲区中。这个命令一般被绑定到 C-x C-e.


  • defun

  • 定义函数。这个特殊表最多可以有五个部分:函数名,传送给函数的参量的模板、文档、一个可选的交互函数声明以及函数体。
     (defun function-name (arguments ...)
    "optional-documentation ..."
    (interactive argument-passing-info)
    body ...)
  • interactive

  • 设定函数可被交互使用。这个特殊表可以用一个字符串,分成一个部分或者几个部分,依次传送信息到这个函数的参数。这些部分也可以告诉 Lisp 解释器提示这些信息。字符串的每一个部分用换行符 "\n" 分开。(这里字符串即上面所显示的“argument-passing-info”)
    其中常用到的控制字符是:
    b 一个已经存在的缓冲区的名字。
    f 一个已经存在的文件的名字。
    p 数字前缀参量。(注意,这个字符是小写 "p"。)
    r 位点和标记,作为两个数字参量,小的在前面。这是唯一定义两个连续参量而不是一个参量的控制符。


  • let

  • 声明在 let 表达式主体中使用的变量列表并给它们赋初始值,初始值要么是 nil,要么是一个指定的值;然后对 let 表达式主体的其他表达式求值并返回最后一个表达式的值。在 let 表达式主体中,Lisp 解释器看不到被绑定在 let 表达式之外的同名变量的值。
    例如,
    (let ((foo (buffer-name))
    (bar (buffer-size)))
    (message "This buffer is %s and has %d characters."
    foo bar))
  • save-excursion

  • 在对这个特殊表主体求值前,记录位点和标记的值以及当前缓冲区。求值之后恢复原来位点和标记的值以及缓冲区。
    例如,
    (message "We are %d characters into this buffer.
    (- (point)
    (save-excursion
    (goto-char (point-min)) (point))))
  • if

  • 对函数的第一个参量求值;如果这个值是“真”,则对第二个参量求值;否则,如果有第三个参量的话就对第三个参量求值。
    if 特殊表被称作一个条件表达式。在 Emace Lisp 中还有其他条件表达式,但是 if 条件表达式可能是其中最经常使用的。
    例如,
    (if (string= (int-to-string 19)
    (substring (emacs-version) 10 12))
    (message "This is version 19 Emacs")
    (message "This is not version 19 Emacs"))
  • equal、eq

  • 测试两个对象是否相同。如果两个对象有相似的结构和内容,equal 则返回“真”。如果两个参量确实是完全相同的对象,则另一个函数 eq 返回“真”。


  • < 、> 、<= 、>=

  • < 函数测试其第一个参量是否小于第二个参量。与之对应的 > 函数则测试其第一个参量是否大于第二个参量。同样地,<= 函数测试其第一个函数是否小于或者等于第二个参量,>= 函数则测试第一个参量是否大于或者等于第二个参量。所有这些函数使用的参量都是数字。


  • message

  • 这个函数往回显区中打印一条消息。打印的消息只可以有一行。这个函数的第一个参量是一个字符串,这个字符串中能够包含“%s”、“%d”或者“%c”,以打印字符串后面的参量的值。用来替代“%s”的参量必须是一个字符串或者一个符号;用来替代“%d”的参量必须是一个数字。而用来替代“%c”的参量必须是一个数字,它将打印出具有相应数值的 ASCII 字符。


  • setq 、set

  • setq 函数将其第一个参量的值设置为第二个参量的值。第一个参量由这个 setq 函数自动地加上引号。这个函数对后续的成对参量执行同样的赋值操作。另外一个 set 函数只能接受两个参量,并在将其第一个参量返回的值设置为其第二个参量返回的值之前对它们求值。


  • buffer-name

  • 这个函数不需要参量,它将缓冲区的名字以一个字符串的形式返回。


  • buffer-file-name

  • 这个函数不需要参量,它返回缓冲区正在访问的文件的名字。


  • current-buffer

  • 返回 Emacs 中当前缓冲区的名字,这个当前缓冲区可能并不是屏幕上看到的缓冲区。


  • other-buffer

  • 返回最近选择过的缓冲区(既不是作为参量传送给 other-buffer 函数的缓冲区,也不是当前缓冲区。


  • switch-to-buffer

  • 这个函数为 Emacs 选择一个活动的缓冲区,并将它显示在当前的窗口,以使用户能够看到它。这个函数经常被绑定到 C-x b 键序列。


  • set-buffer

  • 将 Emacs 的注意力切换到另一个运行程序的缓冲区。不要改变当前窗口正在显示的内容。


  • buffer-size

  • 返回当前缓冲区中的字符数。


  • point

  • 返回当前光标位置对应的值,这个值是从缓冲区的开始处直到光标所在位置所占的总的字符数。


  • point-min

  • 返回当前缓冲区中位点的最小可能值。如果变窄没有开启,这个值就是1。


  • point-max

  • 返回当前缓冲区中位点的最大可能值。如果变窄没有开启,这个值就是缓冲区末尾对应的值。

No comments: