Scripts de shell de Emacs: ¿cómo poner opciones iniciales en el script?

Inspirado por Stack Overflow pregunta Idomatic por lotes de texto en Emacs? Probé un script de shell de Emacs con el siguiente título:

#!/usr/bin/emacs --script 

Puse un código Emacs Lisp en él y lo guardé como archivo de texto rcat.

Como la opción –script no impide la carga del archivo de inicio del sitio, tuve muchas

 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)... 

mensajes en el shell Bash (stdout). Puedo evitar eso llamando

 rcat --no-site-file 

o

 rcat -Q 

pero no cambiando el título en el guión:

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

¿Hay alguna manera de pasar opciones adicionales a Emacs dentro de dicho archivo de script en lugar de hacerlo más adelante en la línea de comando?

Siempre puede cambiar #!/usr/bin/emacs a algo como #!/home/thorsten/bin/emacs-no-site-file , y configurarlo como:

 #!/bin/sh exec /usr/bin/emacs --no-site-file "$@" 

Si esto no funciona para usted, o si desea que su secuencia de comandos sea portátil, consulte la respuesta de Gilles a continuación para un enfoque más robusto (y ligeramente funky :).

Muchas variantes de Unix solo permiten un argumento único para el progtwig en la línea shebang. Triste pero cierto. Si usa #!/usr/bin/env emacs para no depender de la ubicación del ejecutable de emacs , no puede pasar un argumento.

El encadenamiento de scripts es una posibilidad en algunos sistemas, pero eso tampoco es compatible en todas partes.

Puede ir por la ruta consagrada de escribir un script políglota: un script que es a la vez un script de shell y un script de Emacs Lisp (como Perl’s if $running_under_some_shell , por ejemplo). Seguro que se ve hambriento, pero funciona.

Los comentarios de Elisp comienzan con ; , que en el caparazón separa dos comandos. Entonces podemos usar a ; seguido de una instrucción de shell para cambiar a Emacs, con el código Lisp real comenzando en la siguiente línea. Sin embargo, a la mayoría de los proyectiles no les gusta un comando vacío, por lo que debemos encontrar algo que el caparazón y Emacs consideren no operativo, para ponerlo antes ; . El comando shell no-op es:; puedes escribirlo ":" en lo que respecta al caparazón, y Emacs lo analiza como una constante en el nivel superior que también es no operativa.

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

Si ejecuta emacs en modo script, le recomiendo que restablezca la variable “argv” a cero al final de su script, de lo contrario, emacs intentará interpretar “argv” después de que el script haya finalizado.

Supongamos que tiene un archivo llamado “test-emacs-script.el” con el siguiente contenido:

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

Intente ejecutar este script como “./test-emacs-script.el -a”. Si ejecuta este script sin restablecer “argv” (última línea en el script), el resultado será:

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

Restablecer “argv” elimina el mensaje de error “opción desconocida”

Intereting Posts