То, что вам нужно, это пакетный режим Emacs, который инструктирует Emacs выполнить данную программу на Лиспе (заданную с помощью -l FILE
, -f FUNCTION
или --eval FORM
) и затем выйти. Из Справочного руководства по GNU Emacs Lisp:
Параметр командной строки '-batch' заставляет Emacs работать неинтерактивно. В этом режиме Emacs не читает команды с терминала, он не изменяет режимы терминала и не ожидает вывода на стираемый экран. Идея состоит в том, что вы указываете программы на Лиспе для запуска; когда они закончат, Emacs должен выйти. Способ указать программы для запуска - с помощью '-l file', который загружает библиотеку с именем file, или '-f function', которая вызывает функцию без аргументов, или '--eval form'.
Любой вывод программы на Лиспе, который обычно отправляется в область эха, либо с использованием сообщения, либо с использованием prin1 и т.д. С t в качестве потока, вместо этого идет в стандартный дескриптор ошибок Emacs в пакетном режиме. Аналогично, ввод, который обычно поступает из минибуфера, читается из стандартного дескриптора ввода. Таким образом, Emacs ведет себя как неинтерактивная прикладная программа. (Вывод области эха, который обычно генерирует сам Emacs, такой как эхо-команды, полностью подавляется.)
И для быстрого примера:
me@host $ emacs -batch --eval '(message (format "1+2 equals %d" (+ 1 2)))'
1+2 equals 3
me@host $