理解Emacs lisp里的(interactive)

以前对(interactive)理解不深,只知道给函数加这个表示它可以被交互调用,但今天为了实现在Emacs里操作Hexo,借鉴了一下Magit的代码,发现原来里面的道道真不少,简单写写。

1
2
3
4
5
6
7
8
(defun get-dir (dir)
"This function can be called non-interactively and interactively."
(interactive (list (if current-prefix-arg
(file-name-as-directory
(read-directory-name "A directory: "
default-directory))
default-directory)))
(print dir))

上面的定义的函数有三种调用方式:

  • 在Lisp程序里调用,比如(get-dir "/tmp")
  • 交互式调用,比如M-x get-dir
  • 带参数交互式调用,比如C-u M-x get-dir

这种方式灵活性更大,而且还可以用下面的方法判断多个前缀。

1
2
3
4
(if (> (prefix-numeric-value current-prefix-arg) 4)
;多于两个前缀
;不多于两个
)

感叹 学东西切忌眼高手低,以为会了,一写就不行了,好在我还是实现出了想要的功能,改天发出来。