受堆栈和溢出问题Idomatic batch processing of text in Emacs?的启发,我尝试了一个带有以下标题的Emacs shell脚本:
#!/usr/bin/emacs --script
我在里面放了一些Emacs和Lisp代码,并将它保存为文本文件rcat。
因为--script选项不会阻止加载site-start文件,所以我有很多
Loading /etc/emacs/site-start.d/20apel.el (source)...
Loading /etc/emacs23/site-start.d/35elib-startup.el (source)...
Loading /etc/emacs23/site-start.d/50auctex.el (source)...
Bash shell (stdout)中的消息。我可以通过调用
rcat --no-site-file
或
rcat -Q
但不是通过更改脚本中的标题:
#!/usr/bin/emacs --script --no-site-file
有没有一种方法可以在这样的脚本文件中向Emacs传递额外的选项,而不是稍后在命令行中执行?
发布于 2011-06-05 11:50:47
您可以随时将#!/usr/bin/emacs
更改为类似于#!/home/thorsten/bin/emacs-no-site-file
的内容,并将其设置为:
#!/bin/sh
exec /usr/bin/emacs --no-site-file "$@"
如果这对您不起作用,或者如果您希望您的脚本是可移植的,那么请参阅Gilles' answer below以获得更健壮(稍微有点时髦:)的方法。
发布于 2011-06-07 07:53:36
许多unix变种只允许在shebang行上对程序使用单个参数。很悲哀,但这是真的。如果为了不依赖于emacs
可执行文件的位置而使用#!/usr/bin/env 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在顶层将其解析为常量,这也是一个no-op。
#! /bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(print (+ 2 2))
发布于 2011-10-14 22:49:59
如果您在脚本模式下运行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“会消除”未知选项“的错误信息
https://stackoverflow.com/questions/6238331
复制相似问题