记录学习

2008年7月17日星期四

Writeing GNU Emacs Note Day 2

函数参数化

前面我们定义了一个函数用来返回到前一个窗口
现在让我们来做一个改进,希望这个函数能接收一个参数,返回到前面第N个窗口
(defun other-window-previous()
"select the privious window"
(interactive)
(other-window -1)
)

interactive这个函数表示other-window-previous可以用M-x XXX或者快捷键来调用

====>

(defun other-window-previous(n)
"select the Nth privious window"
(interactive "p")
(other-window (- n))
)

这里,函数other-window-previous接收前缀参数n(C-u N来传递的)
并且interactive也接收一个字符串类型的参数 "p",表示这个other-window-previous函数是一个
有参数的函数,如果没有传递给它参数,那么默认就是1
所以如果我们
C-u 4 C-x C-p那么就是返回前4个窗口
C-x C-p就是前一个窗口

很简单吧?呵呵

interactive的参数相关,请参阅 C-h f RET interactive

二 可选参数
我们进一步加以改进,使其参数能够可选输入或不输入

(
defun other-window-previous(&optional n)
"select the Nth privious window"
(interactive "p")
(if n
( ;if n not-nil
other-window (- n)
)
( ;if n is nil
other-window -1
)
)
)

或者以下部分可以简化为
(if n
( ;if n not-nil
other-window (- n)
)
( ;if n is nil
other-window -1
)
)
================》
(other-window (if n (- n) -1))
================》
(other-window (- (if n n 1)))

(if n n 1) ====> (or n 1)
推荐后面一种写法,只比较一次

最终写法如下:
(defun other-window-previous(&optional n)
"select the Nth privious window"
(interactive "p")
(other-window (- (or n 1))))

但在Emacs里的写法大都会如下
(defun other-window-previous(&optional n)
"select the Nth privious window"
(interactive "P")
(other-window (- (prefix-numeric-value n))))

这里interactive的参数是"P",表示传递给other-window-previous的参数按照Raw保持数据类型
而prefix-numeric-value表示能够将传递进来的Raw正确地"解析"或"还原"成数字类型的参数
就像是给interactive传递了一个"p"参数一样

我们写后面一种写法,是为了更加符合Emacs Lisp的写法,并且重用了已有的preifx-numric-value
的函数,便于重用

今天也到此为止啦,累,睡觉啦

没有评论:

博客归档