Подтвердить что ты не робот

Сценарии оболочки Emacs - как установить исходные параметры в script?

Вдохновленный Stack вопрос с переполнением Idomatic пакетная обработка текста в Emacs? Я опробовал оболочку Emacs script со следующим заголовком:

#!/usr/bin/emacs --script 

Я ввел в него некоторый код Emacs Lisp и сохранил его как файл rcat.

Поскольку параметр - script не мешает загрузке файла начала сайта, у меня было много

Loading /etc/emacs/site-start.d/20apel.el (source)...
Loading /etc/emacs23/site-start.d/35elib-startup.el (source)...
Loading /etc/emacs23/site-start.d/50auctex.el (source)...

в оболочке Bash (stdout). Я могу предотвратить это, позвонив

rcat --no-site-file

или

rcat -Q

но не путем изменения заголовка в script:

 #!/usr/bin/emacs --script --no-site-file

Есть ли способ передать дополнительные параметры Emacs внутри такого файла script вместо того, чтобы делать это позже в командной строке?

4b9b3361

Ответ 1

Вы всегда можете изменить #!/usr/bin/emacs на что-то вроде #!/home/thorsten/bin/emacs-no-site-file и установить это как:

#!/bin/sh
exec /usr/bin/emacs --no-site-file "[email protected]"

Если это не сработает для вас или если вы хотите, чтобы ваш script был переносимым, см. ниже ответ Gilles ниже для более надежного (и слегка фанки:).

Ответ 2

Многие версии unix допускают только один аргумент программы в строке shebang. Печально, но верно. Если вы используете #!/usr/bin/env emacs, чтобы не зависеть от местоположения исполняемого файла emacs, вы не можете передать аргумент вообще.

Цепочки-скрипты - это возможность для некоторых систем, но это тоже не поддерживается везде.

Вы можете пройти проверенный временем маршрут написания polyglot script: a script, который является как оболочкой script, так и Emacs Lisp script (например, Perl if $running_under_some_shell, например). Он уверен, выглядит хаки, но он работает.

Комментарии Elisp начинаются с ;, который в оболочке разделяет две команды. Таким образом, мы можем использовать ;, а затем команду оболочки для переключения на Emacs с фактическим кодом Lisp, начинающимся с следующей строки. Однако большинство оболочек не любят пустую команду, поэтому нам нужно найти то, что обе оболочки и Emacs рассматривают как no-op, чтобы поставить перед ;. Команда no-op оболочки :; вы можете записать его ":" в отношении оболочки, а Emacs анализирует это как константу на верхнем уровне, которая также является не-оператором.

#! /bin/sh
":"; exec emacs --no-site-file --script "$0" -- "[email protected]" # -*-emacs-lisp-*-
(print (+ 2 2))

Ответ 3

Если вы запустите emacs в режиме script, я бы рекомендовал переменной reset "argv" в nil в конце вашего script, иначе emacs попытается интерпретировать "argv" после завершения script.

Предположим, что у вас есть файл с именем "test-emacs- script.el" со ​​следующим содержимым:

#!/usr/bin/emacs --script
(print argv)
(setq argv nil)

Попробуйте запустить этот script как "./test-emacs-script.el -a". Если вы запустите этот script без настроек "argv" (последняя строка в script), то вывод будет:

("-a")
Unknown option `-a'

Сброс "argv" устраняет сообщение об ошибке "unknown option"