使用elisp脚本编程
使用elisp脚本编程
Table of Contents
1 引言
目前,编程脚本语言python等非常流行,当然python有很强的优势,emacs作为一种编辑器也为python提供了很好的编辑环境。但是对于一些基本的逻辑处理,字符串处理,输入输出处理等,作为Emacs的脚本语言Elisp已经非常强大了,而且简约的函数数编程非常令人喜欢,学习也非常容易,利用emacs内置的一些帮助方式,在目前的需求下,几乎再也不需要额外的elisp学习资料。所以我坚持使用elisp来做一些处理,但是希望写好的程序也能给不会emacs的人使用,所以想写下这篇博客,希望有同样想法的emacser友喜欢,也希望emacs在国内能够更加地流行。
2 目的
在引言中也已经提到了,写这篇文章的主要目的是想编写单独的elisp脚本,具有“标准输入输出”功能,能够完成其他编程脚本具有的绝大部分功能,正常运行于所有装配有emacs编辑器的平台之上,也能让自己编写的elisp让非Emacser正常使用。 下面列举一些使用elisp编程能够到达的效果。
3 elisp 能够编程的理由以及优势
- 写出单独的脚本文件,可以使用【emacs -nw -q -l "所在文件位置"】运行,也可以不使用-nw参数,以图形化启动。能够在emacs支持的所有平台上运行,跨平台能力强。
- emacs 零基础者也可以顺利运行程序,只需要打一个启动脚本的命令,或者elisp编写者可以直接给写一个bat脚本或者bash脚本。让运行elisp方式更加地简单。
- emacser可以在程序运行完的同时继续在显示结果的emacs上操作。因为elisp是借用emacs的elisp解释器运行的。所以,当elisp运行完毕后,界面仍然是emacs的界面,emacser可以继续使用这个emacs.
- 在上面一点的基础上,可以借用elisp内置于emacs的优势,使得显示效果更加地绚丽。你可以让emacs创建多个windows,甚至多个frame,然后在不同的windows上显示结果,emacs24后对emacs的内置功能也增加了不少,可以有更多地库函数供elisp使用,当然你也可以不用-q参数启动emacs,那样就可以使用emacs无穷地扩展性,作为emacser爱好者的你能想象的,这个是使用其他脚本语言很难达到的效果。
- 书写简单,功能强大。elisp语言非常简单,库函数丰富,而且最主要的是配套设施完善,具有edebug这个源码级的调试工具,也具有emacs内置的非常多的帮助方式。也因为emacs是开源的,所以在你面前,一切都可以是赤裸裸的。
….
….
4 自我文档化
当然学习elisp是非常方便的。emacs内置有两边elisp的书籍。启动emacs后按 快捷键Ctrl h i就可以进入到emacs的 *info*。
这两本emacs的书籍如下,需要的可以自己前往看,当然也可以在emacs官网下载pdf版本,或者直接购买纸质版本。
4.1 Elisp
The Emacs Lisp Reference Manual
4.2 Emacs Lisp Intro
(A simple introduction to Emacs Lisp programming)
4.3 emacs的elisp帮助系统
如果你对一个函数或者变量不熟悉,你可以使用Ctrl h f或者Ctrl h v来查看它的使用方式。当然也可以使用快捷键Alt x ,输入find-function或者find-variable来直接观看其源代码。或者使用edebug直接来调试。
5 几个简单的示例
下面2个简单的示例都是在windows上使用[emacs -nw -q -l "test.el" ] 命令启动的。test.el为elisp脚本所在位置。可以用一张图为描述下,图貌似比较丑,使用emacs-graphviz生成的。
图1
其中的autoinsert部分没有用过的朋友可以参考emacswiki的介绍。autoinsert主要是插入一些公共模板,提高编程效率。在这里 可以把
;;;auto-insert 开始 (setq inhibit-startup-message t); (insert "************************************************************\n") (insert "如需翻阅:请按CTRL+V向下翻阅,ALT+V向上翻阅\n"); (insert "************************************************************\n") ;;;auto-insert 结束
等一些公共部分用autoinsert自动插入。
下面两个例子都相对简单:
- 示例1主要示范交互功能,在终端下显示
- 示例2示范多个buffer功能,在图形化下显示。
希望有兴趣的朋友可以借用emacs编写更有吸引力的示例。
5.1 示例1
src:
;;;auto-insert 开始 (setq inhibit-startup-message t); (insert "************************************************************\n") (insert "如需翻阅:请按CTRL+V向下翻阅,ALT+V向上翻阅\n"); (insert "************************************************************\n") ;;;auto-insert 结束 ;一些基本的环境获取-------------------------------------------------- ;判断是否是windows操作系统 (if (eq system-type 'windows-nt) (insert "当前操作系统是windows\n") (insert "非windows操作系统\n") ) ;;;;设置和输出用户名 (setq user-full-name "csophys") (insert (concat "你的用户名为" user-full-name "\n")) ;输出系统home变量值 (insert (concat "你的系统home变量为" (getenv "home") "\n")) ;显示emacs主版本号 (insert (concat "你的emacs的主版本号为:" (number-to-string emacs-major-version)) "\n") ;;;;一些基本的环境获取----------------------------------------------- (insert "这是一个简单的字符串处理函数,输入一个带扩展名的文件名,去除它的扩展名\n") (insert (concat "去除扩展名后为:" (file-name-sans-extension (read-string "请输入一个含扩展名的文件名:"))"\n" )) (insert (concat "去除扩展名后为:" (file-name-sans-extension (read-string "请再次输入一个含扩展名的文件名:"))"\n" ))
运行过程中的截图如下:
图2
图3
图4
5.2 示例2
src:
;;;auto-insert 开始 (setq inhibit-startup-message t); (insert "************************************************************\n") (insert "如需翻阅:请按CTRL+V向下翻阅,ALT+V向上翻阅\n"); (insert "************************************************************\n") ;;;auto-insert 结束 (create-file-buffer "result.txt") (switch-to-buffer "result.txt") (insert "正在进行一些计算,请安心等待结果....\n" ) (insert "假设在进行一些耗时的运算......\n") (insert "假设在进行一些耗时的运算......\n") (insert "假设在进行一些耗时的运算......\n") (insert "假设在进行一些耗时的运算......\n") (split-window-below) (other-window 1) (snake)
运行过程中的截图如下:
图5