2010-01-31 43 views
21

Me gustaría escribir algunos scripts de Unix en Emacs Lisp. Sin embargo, no parece haber una forma clara de escribir en STDOUT, así que puedo redireccionar los resultados a un archivo o canalizar la salida a otro comando. La función de impresión coloca comillas dobles alrededor de las cadenas de salida para obtener "¡Hola, mundo!" en lugar de ¡Hola, mundo!.Escribiendo "Hola mundo" en Emacs?

Aquí está el script de emacs.

 
#!/usr/bin/emacs --script 
;; 
;; Run me from a Unix shell: ./hello.el > x.txt 
;; 
(message "Hello world! I'm writing to STDERR.") 
(print "Hello world! I'm writing to STDOUT but I'm in quotes") 
(insert "Hello world! I'm writing to an Emacs buffer") 
(write-file "y.txt") 

Así es como me gustaría llamarlo.

 
hello.el > x.txt 
hello.el | wc 

Respuesta

22

parece que desea en lugar de princprint. Así que, básicamente:

(princ "Hello world! I'm writing to STDOUT but I'm not in quotes!")

Sin embargo, una advertencia es que princ no termina automáticamente la salida con \n.

+0

Ay, me había olvidado de Princ. Lo usé hace varios meses en esta pregunta. http://stackoverflow.com/questions/1532311/cgi-programming-in-elisp –

6

Como dice David Antaramian, es probable que desee princ.

Además, message admite una cadena de control de formato (similar a printf en C) que se ha adaptado de format. Por lo tanto, es posible que el tiempo que desee hacer algo como

(princ (format "Hello, %s!\n" "World")) 

Como un par de funciones, además de la demostración:

(defun fmt-stdout (&rest args) 
    (princ (apply 'format args))) 
(defun fmtln-stdout (&rest args) 
    (princ (apply 'format 
       (if (and args (stringp (car args))) 
        (cons (concat (car args) "\n") (cdr args)) 
        args)))) 

(defun test-fmt() 
    (message "Hello, %s!" "message to stderr") 
    (fmt-stdout "Hello, %s!\n" "fmt-stdout, explict newline") 
    (fmtln-stdout "Hello, %s!" "fmtln-stdout, implicit newline")) 
Cuestiones relacionadas