2010-01-31 3 views
21

Ich möchte ein paar Unix-Skripte in Emacs Lisp schreiben. Es scheint jedoch keine saubere Methode zum Schreiben in STDOUT zu geben, sodass ich die Ergebnisse in eine Datei umleiten oder die Ausgabe an einen anderen Befehl weiterleiten kann. Die print Funktion legt doppelte Anführungszeichen um die Ausgabe-Strings, so dass ich "Hallo Welt!" statt Hallo Welt!."Hallo Welt" in Emacs schreiben?

Hier ist das Emacs-Skript.

 
#!/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") 

Und hier ist, wie ich es nennen möchte.

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

Antwort

22

Scheint, wie Sie princ statt print wollen. Also, im Grunde:

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

jedoch ein Nachteil ist, dass princ nicht automatisch die Ausgabe mit \n beenden.

+0

Huch, vergaß ich princ. Ich habe es vor ein paar Monaten in dieser Frage benutzt. http://stackoverflow.com/questions/1532311/cgi-programming-in-elisp –

6

Wie David Antaramian sagt, möchten Sie wahrscheinlich princ.

Außerdem unterstützt message eine Formatsteuerungszeichenfolge (ähnlich printf in C), die von format angepasst wird. Also, man kann schließlich so etwas wie

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

Als ein paar Funktionen und Demonstration tun:

(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"))