Emacs shell脚本 - 如何将初始选项放入脚本?

时间:2011-06-04 17:34:06

标签: shell emacs command-line elisp options

3 个答案:

答案 0 :(得分:34)

许多unix变体只允许shebang行上的程序使用单个参数。悲伤,但是真的。如果您使用#!/usr/bin/env emacs以便不依赖emacs可执行文件的位置,则根本无法传递参数。

Chaining scripts在某些系统上是可能的,但在任何地方都不支持。

您可以使用历史悠久的编写多语言脚本的途径:一个脚本既是shell脚本又是Emacs Lisp脚本(例如Perl的if $running_under_some_shell)。它确实看起来很乱,但它确实有效。

Elisp注释以;开头,它在shell中分隔两个命令。因此我们可以使用;后跟shell指令切换到Emacs,实际的Lisp代码从下一行开始。大多数shell不喜欢空命令,因此我们需要找到shell和Emacs视为无操作的东西,放在;之前。 shell no-op命令是:;就shell而言,你可以把它写成":",而Emacs将它解析为顶层的常量,这也是一个无操作。

#! /bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(print (+ 2 2))

答案 1 :(得分:11)

您可以随时将#!/usr/bin/emacs更改为#!/home/thorsten/bin/emacs-no-site-file,并将其设置为:

#!/bin/sh
exec /usr/bin/emacs --no-site-file "$@"

如果这对你不起作用,或者你希望你的脚本可以移植,那么请参阅Gilles' answer below以获得更强大(并且有点时髦:)的方法。

答案 2 :(得分:7)

如果您在脚本模式下运行emacs,我建议在脚本结束时将“argv”变量重置为nil,否则emacs将在脚本完成后尝试解释“argv”。

假设您有一个名为“test-emacs-script.el”的文件,其中包含以下内容:

#!/usr/bin/emacs --script
(print argv)
(setq argv nil)

尝试将此脚本作为“./test-emacs-script.el -a”运行。如果您运行此脚本而不重置“argv”(脚本中的最后一行),则输出将为:

("-a")
Unknown option `-a'

重置“argv”会删除“未知选项”错误消息