受堆栈溢出问题的启发 Idomatic batch processing of text in Emacs?我尝试了一个 Emacs shell 脚本,标题如下:
#!/usr/bin/emacs --script
我在其中放入了一些 Emacs Lisp 代码,并将其保存为文本文件 rcat。
由于 --script 选项不会阻止加载站点启动文件,因此我有很多
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,而不是稍后在命令行上执行?
最佳答案
许多 unix 变体只允许在 shebang 行中对程序使用单个参数。悲伤,但真实。如果您使用 #!/usr/bin/env emacs
以免依赖emacs
的位置可执行文件,您根本无法传递参数。
Chaining scripts在某些系统上是可能的,但并非所有地方都支持。
您可以采用历史悠久的编写多语言脚本的方法:该脚本既是 shell 脚本又是 Emacs Lisp 脚本(例如 Perl 的 if $running_under_some_shell
)。它确实看起来很hackish,但它确实有效。
Elisp 评论以 ;
开头, 在 shell 中将两个命令分开。所以我们可以使用 ;
后跟一个切换到 Emacs 的 shell 指令,实际的 Lisp 代码从下一行开始。大多数 shell 不喜欢空命令,所以我们需要找到一些 shell 和 Emacs 都视为无操作的东西,放在 ;
之前。 . shell 无操作命令是 :
;你可以写":"
就 shell 而言,Emacs 将其解析为顶级常量,这也是空操作。
#! /bin/sh
":"; exec emacs --no-site-file --script "$0" -- "$@" # -*-emacs-lisp-*-
(print (+ 2 2))
关于shell - Emacs shell 脚本 - 如何将初始选项放入脚本中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6238331/