2014-10-27 5 views
1

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

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

Теперь это, кажется, не работает, как он интерпретирует все аргументы файлов в качестве функции для запуска (так что $ FILE выполняется как функция). (PS прелюдия-очистка-буфер или регион является from here)

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

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

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

ответ

1

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

со страницы человека

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

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

I просто попробовал этот фрагмент -

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

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

вы можете использовать shell globbing и скрипт для расширения аргумента filename в списке форм.

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

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

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

+0

отличный ответ, спасибо. Моим решением было 'emacsclient -e '(progn (find-file \" $ FILE \ ") (prelude-cleanup-buffer-or-region) (save-buffer) (kill-buffer)) в конце. Обратите внимание на '(kill-buffer)', так как без этого мой скрипт висит, если я попробовал его дважды, поскольку буфер, уже открытый, останавливает вашу команду. –

+0

hmm - мой пример должен был быть подсказкой, но find-file в порядке с буферами, которые уже посещаются. Может быть, что-то в ваших других формах заставляло его ожидать большего вклада во второй раз? Во всяком случае, принцип звучит, я рад, что вы его исправили. – cms

+0

Да, я смутился об этом сам, поскольку я думал, что файл find был идемпотентным, в любом случае, гарантируя, что вы «kill-buffer» после исправления ошибки для меня (как бы там ни было ошибка). Еще раз спасибо. –