Emacs作为一款文本编辑器已经为大家所熟知,但是可能比较少人会想到它还能用来像python,ruby一样作为一门脚本语言来用.
注意: EmacsScript的坑超级多,强烈推荐阅读这篇文章:emacs-script-pitfalls (这里是它的中文版emacs-script中的那些坑)
–script选项
Emacs提供了一个 --script
选项可以让Emacs运行在batch模式下,并运行指定文件中的elisp代码.
在batch模式下emacs完全作为一个elisp语言解释器来运行,并在执行完所有的elisp代码后直接退出. 在elisp代码执行期间,那些输出到echo area中的内容会输出到stdout或stderr中,那些从minibuffer读取内容的函数会变成从stdin读取内容.
Emacs为了遵循shell script的shebang标准,特意将第一行内容中的的 #!
当成注释符号来处理,因此你的EmacsScript一般会是这样的:
#!/usr/bin/emacs --script
(message "Hello world")
当然,这种写法并不具有可移植性的,毕竟不是所有的emacs路径都是 /usr/bin/emacs
. 真正具有可移植性的写法应该是:
#!/bin/sh
":"; exec emacs --script "$0" "$@" # -*- mode: emacs-lisp; lexical-binding: t; -*-
(message "Hello world")
处理命令行参数
注意:对于EmacsScript来说,参数与选项是截然不同的两个东西. 而且选项不能放在参数最后,否则Emacs会提示”emacs: Option ‘-f’ requires an argument”
在EmacsLisp中,与处理命令行参数有关的常用变量有这么几个:
command-line-args-left
尚未处理的command-line argument列表.
假设有这么一个”/tmp/test1.el”的脚本:
#!/bin/sh ":"; exec e