使用elisp脚本编程

 

使用elisp脚本编程

1 引言

目前,编程脚本语言python等非常流行,当然python有很强的优势,emacs作为一种编辑器也为python提供了很好的编辑环境。但是对于一些基本的逻辑处理,字符串处理,输入输出处理等,作为Emacs的脚本语言Elisp已经非常强大了,而且简约的函数数编程非常令人喜欢,学习也非常容易,利用emacs内置的一些帮助方式,在目前的需求下,几乎再也不需要额外的elisp学习资料。所以我坚持使用elisp来做一些处理,但是希望写好的程序也能给不会emacs的人使用,所以想写下这篇博客,希望有同样想法的emacser友喜欢,也希望emacs在国内能够更加地流行。

2 目的

在引言中也已经提到了,写这篇文章的主要目的是想编写单独的elisp脚本,具有“标准输入输出”功能,能够完成其他编程脚本具有的绝大部分功能,正常运行于所有装配有emacs编辑器的平台之上,也能让自己编写的elisp让非Emacser正常使用。 下面列举一些使用elisp编程能够到达的效果。

3 elisp 能够编程的理由以及优势

  1. 写出单独的脚本文件,可以使用【emacs -nw -q -l "所在文件位置"】运行,也可以不使用-nw参数,以图形化启动。能够在emacs支持的所有平台上运行,跨平台能力强。
  2. emacs 零基础者也可以顺利运行程序,只需要打一个启动脚本的命令,或者elisp编写者可以直接给写一个bat脚本或者bash脚本。让运行elisp方式更加地简单。
  3. emacser可以在程序运行完的同时继续在显示结果的emacs上操作。因为elisp是借用emacs的elisp解释器运行的。所以,当elisp运行完毕后,界面仍然是emacs的界面,emacser可以继续使用这个emacs.
  4. 在上面一点的基础上,可以借用elisp内置于emacs的优势,使得显示效果更加地绚丽。你可以让emacs创建多个windows,甚至多个frame,然后在不同的windows上显示结果,emacs24后对emacs的内置功能也增加了不少,可以有更多地库函数供elisp使用,当然你也可以不用-q参数启动emacs,那样就可以使用emacs无穷地扩展性,作为emacser爱好者的你能想象的,这个是使用其他脚本语言很难达到的效果。
  5. 书写简单,功能强大。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

Date: 2012-07-12 15:59:56 中国 (標準時)

Author:

Org version 7.8.11 with Emacs version 24

Validate XHTML 1.0
posted @ 2012-07-12 16:13  csophys  阅读(7003)  评论(5编辑  收藏  举报