emacs --daemon с --batch и входным файлом

Я хотел бы создать сценарий, который просто очищает пробелы и вкладки для нескольких файлов в папке для меня. Я создал Bash-файл, среди прочего:

emacsclient -t -e '(progn (prelude-cleanup-buffer-or-region) (save-buffer-kill-terminal))' $FILE

Теперь это, похоже, не работает, так как интерпретирует ВСЕ аргументы файла как функции для запуска (поэтому $FILE выполняется как функция). (PS prelude-cleanup-buffer-or-region находится здесь)

Теперь то, чего я действительно хочу, --batch описанный здесь (поскольку я на самом деле не хочу ничего отображать на экране), но это не одна из опций emacsclient. Причина, по которой я хочу использовать emacsclient, а не просто использовать emacs --batch в том, что у меня много файлов запуска, поэтому я хочу, чтобы все это оставалось загруженным, иначе мой сценарий займет слишком много времени.

У кого-нибудь есть советы, как это сделать?

Заранее спасибо.

1 ответ

Решение

emacsclient -e означает оценивать формы lisp, не редактировать файлы

со страницы руководства

 -e, --eval
              do  not  visit files but instead evaluate the arguments as Emacs
              Lisp expressions.

Я думаю, вы могли бы добавить (find-file "file") к вашему списку форм для выполнения

Я только что попробовал этот фрагмент -

/opt/local/bin/emacsclient  -e '(progn (find-file "./tmpfoo") 
    (end-of-buffer) (insert "ffff") (save-buffer))' 

и он редактирует файл молча, как вы ожидаете.

Вы можете использовать оболочку и скрипт для расширения имени файла аргумента в список форм.

также не запускайте с ключом -t, -e не ожидает постоянного окна редактора, и вам не нужен kill-терминал. Клиент просто запустит ваш elisp и выйдет.

Я думаю, что я, вероятно, напишу функцию lisp, которая принимает аргумент имени файла, который я загрузил в emacs во время запуска, а затем просто вызову это с именем файла через emacsclient,

например FILENAME="somefile"; emacsclient -e "(now-do-my-thing $FILENAME)"

Другие вопросы по тегам