由于用惯了Windows,在使用Linux操作系统后遇到的第一个棘手的问题就是没有很顺手的编辑器。阴差阳错的开始用起了Emacs。
其实也没有比较编辑器的优劣,只是默认安装打开文本的编辑器是Emacs而已。但是随着使用Emacs的逐渐深入,发现越来越喜欢这个
编辑器了。
Emacs编辑器的神奇之处莫过于内嵌插件的强大,现在以一种好奇和求知欲的心态来逐渐了解一下内嵌插件的开发语言Elisp。
Emacs Lisp,一种直译式的脚本语言,为LISP的方言之一,GNU Emacs与XEmacs文字编辑器都使用这个编程语言来扩展它们的功能。
它的直译器是以C语言来实作的。
note:
Emacs Lisp Reference is the official Emacs Lisp documentation. It is built into the Emacs Info pages and is the go-to for most Elisp programmers. It is shipped with Emacs and can be accessed by the menu bar, with ‘M-x menu-bar-read-lispref’, or from the top page of InfoMode.
Emacs Lisp Intro is a book for non-programmers available from the Free Softwar eFoundation and is shipped with Emacs. Its command is ‘M-x menu-bar-read-lispinfo’.
热身运动:
Emacs的插件实现的功能虽然数不胜数,但是万变不离其宗。当实现一个功能不管是用快捷键还是用(M-x),最本质的其实是Elisp函数
的调用。so,Emacs插件其实就是用Elisp语言来写函数。知易行难,要是真正写起插件来,工作量也是让人不要不要的。
初探Elisp:
启动Emacs,在下面会发现 *scratch* 的字样,这表示你当前的缓冲区(buffer)的名字。缓冲区也叫做工作区,在Emacs中打开一个文件,
实际只是在Emacs中构造该文件的一个副本,放到缓冲区中,状态行下面的那行,叫做辅助输入区(minibuffer),该minibuffer用于显示计算
为了实验本教程中的lisp命令,我们要让Emacs工作在lisp-interaction-mode工作模式下,这个模式可以让我们在缓冲区中和Emacs进行互
动,并且直接执行Lisp命令,得到结果。进入lisp-interaction-mode的方法: 把光标移动到辅助输入区,键入M-x lisp-interaction-mode 然
后回车。
(message "hello elisp")
注意返回值和作用是不同的。比如前面 message 函数它的作用是在 Minibuffer 里显示一个字符串,但是它的返回值是 "hello world" 字符串。
一、变量、表达式、函数
(setq my-name "Tom")
给变量my-name赋值,然后C-x C-e 查看执行结果。
(insert my-name)
C-x C-e
在光标处插入my-name
defun命令用来定义一个函数,语法是(defun 函数名 (参数列表) (函数体))
(defun SayHello (name)
(insert my-name name))
C-x C-e
(SayHello "Tom" )
C-x C-e
函数的调用方式,相当于SysHello("Tom")
二、progn,let和交互式函数
执行switch-to-buffer-other-window命令,将在在一个新的窗口中打开一个buffer,并将该buffer命名叫做 test, 并且把光标移到新的buffer的窗口中。
(switch-to-buffer-other-window "*test*")
要回到原来的buffer中,可以使用鼠标点击原来的buffer或者使用组合键 C-x o (M-x other-window)
如果要执行一系列的指令,可以使用流程函数progn,把函数命令连接起来.
(progn
(switch-to-buffer-other-window"*test*")
(erase-buffer)
(SayHello "Tom" ))
let函数用来做局部变量的定义,然后写入要执行的指令这个功能和progn类似
(let ((local-name "you"))
(switch-to-buffer-other-window "*test*")
(erase-buffer)
(SayHello local-name)
(other-window 1)) ;;切换窗口
read-from-minibuffer函数提供和用户交互的功能,这个函数可以帮助Elisp程序从用户处得到输入
(read-from-minibuffer "Enter your name: ")
format函数可以用做格式化的输出 其中%s表示该s的地方将被之后提供的一个字符串替换,类似于C语言的prinf。
(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 "Tom")