在命令行上评估emacs lisp表达式

Sur*_*rya 8 emacs elisp emacsclient

我是emacs的新手.我在redhat linux上使用emacs-24.1,并试图评估一个elisp表达式.我想要emacs做的是评估elisp表达式而不启动emacs本身.我正在尝试不同的事情

emacs --eval '(+ 2 3)'
Run Code Online (Sandbox Code Playgroud)

我不知道emacs是否正在评估表达式,但结果未显示在控制台上,并且emacs窗口出现.接下来我尝试了这个

emacsclient --eval '(+ 2 3)'
Run Code Online (Sandbox Code Playgroud)

Emacs客户端期待服务器.它找不到服务器,因此抛出错误(无法找到socket.启动服务器等).所以我启动了一个服务器(服务器名称是SERVER)并再次运行emacsclient

emacsclient --server-file=SERVER -e '(+ 2 3)'
Run Code Online (Sandbox Code Playgroud)

这次,emacs评估表达式并在控制台上打印结果.这是因为emacs正在使用现有服务器来评估表达式.现在,当服务器未运行时,我遇到了问题.

emacsclient --server-file=ANOTHER_SERVER -e '(+ 2 3)' -a emacs
Run Code Online (Sandbox Code Playgroud)

这一次,我在控制台上没有收到任何错误.Emacs正在启动一个新窗口,因为-a(我的.emacs中有(server-start)命令,server-name设置为ANOTHER_SERVER).但emacs正在尝试编辑该文件(+ 2 3).它显示在模式行上.我糊涂了.emacsclient --help向我展示了这个

-e, --eval              Evaluate the FILE arguments as ELisp expressions
Run Code Online (Sandbox Code Playgroud)

和emacs手册说这个.

'-e'
'--eval'
Tell Emacs to evaluate some Emacs Lisp code, instead of visiting some files.
When this option is given, the arguments to emacsclient are interpreted as a
list of expressions to evaluate, not as a list of files to visit.
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做.正如我所说,我的目标是在不启动emacs的情况下评估elisp表达式.可能吗?

Ran*_*ris 9

经过一些测试后,看起来您可以使用--batchemacs将任何消息转储到stderr.然后你可以打电话message给stderr打印东西,你可以在那里看到它们.您的示例将成为emacs --batch --eval '(message (number-to-string (+ 2 3)))'结果,并将结果打印到stderr.

如果您尝试将输出重定向到文件,则需要使用2>而不是仅仅重定向stderr而不是stdout >.


Kei*_*wer 7

尝试

emacs --batch --eval '(print (+ 2 3))'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!投票赞成。该命令在输出值之前包含一个换行符。为了避免换行符: `emacs --batch --eval '(message "%s" (+ 2 3))' 2>&1` (2认同)