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

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

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

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

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

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

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


person Mike H-R    schedule 27.10.2014    source источник


Ответы (1)


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

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

 -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-terminal. Клиент просто запустит ваш elisp и выйдет.

Думаю, я бы написал лисп-функцию, которая принимает в качестве аргумента имя файла, которую я загружаю в emacs во время запуска, а затем просто вызываю ее с именем файла через emacsclient,

e.g. FILENAME="somefile"; emacsclient -e "(now-do-my-thing $FILENAME)"

person cms    schedule 27.10.2014
comment
отличный ответ, спасибо. В конце концов, мое решение было emacsclient -e "(progn (find-file \"$FILE\") (prelude-cleanup-buffer-or-region) (save-buffer) (kill-buffer))". Обратите внимание на (kill-buffer), так как без этого мой скрипт зависал, если я пробовал его дважды, поскольку уже открытый буфер останавливает вашу команду. - person Mike H-R; 27.10.2014
comment
хм - мой пример должен был быть просто подсказкой, но find-file отлично работает с буферами, которые уже посещаются. Может быть, что-то в ваших других формах заставляло его ожидать больше информации при втором посещении? В любом случае, принцип верен, я рад, что вы это исправили. - person cms; 27.10.2014
comment
Да, я сам был сбит с толку этим, так как думал, что find-file в любом случае идемпотентный, гарантируя, что вы kill-buffer после исправления ошибки для меня (какой бы ошибка ни была). Спасибо еще раз. - person Mike H-R; 27.10.2014
comment
возможно, точка была оставлена ​​где-то, чего ваша функция очистки не ожидала. - person cms; 27.10.2014