Learn elisp in 15 minutes

感谢作者和译者

15分钟学会Emacs Lisp

15分钟学会Emacs Lisp总结

进入lisp交互模式

在emacs使用快捷键M-x输入lisp-interaction-mode

输出当前运算结果

  • C-j在当前buffer中插入当前运算结果
  • C-x C-e在minibuffer中显示当前运算结果

关键字

setq给一个变量赋值。

1
(setq my-name "gulei")

insert会在光标处插入字符串。

1
2
3
4
5
6
;;一个参数
(insert "Hello!")
;;多个参数
(insert "Hello!" " World!")
;;含变量
(insert "Hello, I am " my-name)

defun定义一个函数。调用无参数(hello),调用有参数(hello "you")

1
2
3
4
5
6
7
;;无参数
(setq my-name "gulei")
(defun hello()
(insert "Hello, I am " my-name))
;;有参数
(defun hello(my-name)
(insert "Hello, I am " my-name))

progn可以把s式结合起来

1
2
3
(progn
(switch-to-buffer-other-window "*test*")
(hello "you"))

let可以将一个值和一个局部变量绑定

1
2
3
4
5
(let ((local-name "you"))
(switch-to-buffer-other-window "*test*")
(erase-buffer)
(hello local-name)
(other-window 1))

format格式化字符串

1
2
3
4
5
6
7
;;例如
(format "Hello %s!\n" "visitor")
;; 现在我们用格式化的方法再重写一下我们的函数:
(defun hello (name)
(insert (format "Hello %s!\n" name)))

(hello "you")

一起使用这些关键字

1
2
3
4
5
6
7
8
9
(defun greeting (from-name)
(let ((your-name (read-from-minibuffer "Enter your name: ")))
(switch-to-buffer-other-window "*test*")
(erase-buffer)
(insert (format "Hello %s!\n\nI am %s." your-name from-name))
(other-window 1)))

;; 测试一下:
(greeting "Bastien")

列表

使用列表

1
(setq list-of-names '("Sarah" "Chloe" "Mathilde"))

car来取得第一个名字

1
(car list-of-names)

cdr取得剩下的名字

1
(cdr list-of-names)

push把名字添加到列表的开头:

1
(push "Stephanie" list-of-names)

list-of-names列表中的每一个元素都使用hello函数

1
2
3
4
5
6
7
8
9
10
;;例子
(mapcar 'hello list-of-names)
;; 将 `greeting' 改进,使的我们能够对`list-of-names'中的所有名字执行:
(defun greeting ()
(switch-to-buffer-other-window "*test*")
(erase-buffer)
(mapcar 'hello list-of-names)
(other-window 1))

(greeting)