Вычислить выражение emacs lisp в командной строке

Я новичок в emacs. Я работаю с emacs-24.1 на redhat linux и пытаюсь оценить выражение elisp. Я хочу, чтобы emacs выполнял оценку выражения elisp без запуска самого emacs. Я пробую разные вещи

emacs --eval '(+ 2 3)'

Я не знаю, оценивает ли emacs выражение, но результат не отображается на консоли, и появляется окно emacs. Затем я попробовал это

emacsclient --eval '(+ 2 3)'

Клиент Emacs ожидает сервер. Он не может найти сервер и, следовательно, выдает ошибку (не удается найти сокет, запускать сервер и т. Д.). Итак, я запустил сервер (имя сервера - СЕРВЕР) и снова запустил emacsclient.

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

На этот раз emacs вычислил выражение и распечатал результат на консоли. Это потому, что emacs использует существующий сервер для оценки выражения. Теперь у меня проблема, когда сервер не работает.

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

На этот раз я не получаю никаких сообщений об ошибках на консоли. Emacs запускает новое окно из-за -a (в моем .emacs есть команда (server-start), а для имени сервера задано ANOTHER_SERVER). Но затем emacs пытается отредактировать файл (+ 2 3). Он отображается в строке режима. Я смущен. emacsclient --help показал мне это

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

и руководство по 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.

Я не знаю, что делать дальше. Как я уже сказал, моя цель - оценить выражение elisp без запуска emacs. Является ли это возможным?


person Surya    schedule 13.07.2012    source источник
comment
См. Также stackoverflow.com/questions/10210742/ (и связанные с ним ссылки!)   -  person phils    schedule 14.07.2012


Ответы (2)


После небольшого тестирования похоже, что вы можете использовать --batch, чтобы emacs выгружал любые сообщения в stderr. Затем вы можете вызвать message, чтобы распечатать что-либо в stderr, где вы сможете их увидеть. Ваш пример станет emacs --batch --eval '(message (number-to-string (+ 2 3)))', и результат будет напечатан в stderr.

Если вы пытаетесь перенаправить вывод в файл, вам нужно перенаправить stderr вместо stdout, используя 2> вместо просто >.

person Randy Morris    schedule 13.07.2012
comment
Может быть способ получше, я сам новичок в emacs. - person Randy Morris; 13.07.2012
comment
Почему это не работает? emacs --batch --eval (сообщение (значение-символа 'пользовательский-инициализирующий-файл)) - person Surya; 13.07.2012
comment
Очень приблизительное предположение, но я собираюсь предположить, что среда немного отличается, когда emacs запускается в пакетном режиме, поэтому пользовательский файл инициализации может не инициализироваться, как обычно. Вы уверены, что на самом деле вам не нужно что-то вроде M-x ielm в emacs, а не делать это в командной строке? Вы получите хороший elisp REPL, с которым вы можете поиграть. - person Randy Morris; 13.07.2012
comment
Однако, что интересно (OSX / Emacs 24.1), вы, по-видимому, можете принудительно загрузить файл инициализации даже в пакетном режиме, т. Е. Это работает: emacs -u keith --batch --eval (print (symbol-value 'user-init-file )) Параметр -u user будет искать и загружать файл инициализации указанного пользователя (.emacs). - person Keith Flower; 13.07.2012

Пытаться

emacs --batch --eval '(print (+ 2 3))'
person Keith Flower    schedule 13.07.2012
comment
Спасибо! Проголосовали "за". Эта команда включает новую строку, предшествующую выходному значению. Чтобы избежать новой строки: emacs --batch --eval '(message "%s" (+ 2 3))' 2>&1 - person Michael Bosworth; 27.07.2014