Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Evaluate emacs lisp expression on command line

I'm a newbie to emacs. I'm working with emacs-24.1 on redhat linux, and trying to evaluate an elisp expression. What I want emacs to do is to evaluate the elisp expression without launching emacs itself. I'm trying different things

emacs --eval '(+ 2 3)'

I do not know if emacs is evaluating the expression, but the result is not shown on console and emacs window comes up. Next I tried this

emacsclient --eval '(+ 2 3)'

Emacs client is expecting a server. It could not find the server and hence throwing an error (can't find socket. start server etc). So I launched a server (server-name is SERVER) and ran emacsclient again

emacsclient --server-file=SERVER -e '(+ 2 3)'

This time, emacs evaluated the expression and printed the result on console. That is because emacs is using the existing server to evaluate the expression. Now I get a problem when the server is not running.

emacsclient --server-file=ANOTHER_SERVER -e '(+ 2 3)' -a emacs

This time, I'm not getting any error on console. Emacs is launching a new window, because of -a (my .emacs has (server-start) command in it and server-name set to ANOTHER_SERVER). But emacs then is trying to edit the file (+ 2 3). It is shown on the mode line. I'm confused. emacsclient --help showed me this

-e, --eval              Evaluate the FILE arguments as ELisp expressions

and emacs manual says this.

'-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.

I do not know how to proceed on this. As I said, my goal is to evaluate an elisp expression without launching emacs. Is it possible?

like image 334
Surya Avatar asked Jul 13 '12 16:07

Surya


People also ask

How do you evaluate a Lisp expression?

The most general command for evaluating Lisp expressions from a buffer is eval-region . M-x eval-region parses the text of the region as one or more Lisp expressions, evaluating them one by one. M-x eval-current-buffer is similar but evaluates the entire buffer.

How do you eval in Emacs?

The command C-x C-e ( eval-last-sexp ) evaluates the Emacs Lisp expression preceding point in the buffer, and displays the value in the echo area.

How do I run a Lisp command in Emacs?

In a fresh Emacs window, type ESC-x lisp-interaction-mode . That will turn your buffer into a LISP terminal; pressing Ctrl+j will feed the s-expression that your cursor (called "point" in Emacs manuals' jargon) stands right behind to LISP, and will print the result.


2 Answers

After a bit of testing it looks like you can use --batch to have emacs dump any messages to stderr. Then you can call message to print things to stderr where you'll be able to see them. Your example would become emacs --batch --eval '(message (number-to-string (+ 2 3)))' and the result would be printed to stderr.

If you're trying to redirect the output to a file you'll need to redirect stderr instead of stdout by using 2> instead of just >.

like image 196
Randy Morris Avatar answered Sep 16 '22 19:09

Randy Morris


Try

emacs --batch --eval '(print (+ 2 3))'
like image 45
Keith Flower Avatar answered Sep 17 '22 19:09

Keith Flower