Сценарии оболочки 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 вместо того, чтобы делать это позже в командной строке?
Ответы
Ответ 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"