2010-01-31 14 views
21

Chciałbym napisać kilka skryptów uniksowych w Emacs Lisp. Jednak wydaje się, że nie ma czystej metody zapisu do STDOUT, więc mogę przekierować wyniki do pliku lub potokować wyjście do innego polecenia. Funkcja drukuj umieszcza podwójne cudzysłowy wokół ciągów wyjściowych, więc otrzymuję "Witaj, świecie!" zamiast Witaj, świecie!.Pisanie "Hello World" w Emacs?

Oto skrypt emacsa.

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

A oto jak chciałbym to nazwać.

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

Odpowiedz

22

Wygląda chcesz princ zamiast print. Tak więc, w zasadzie:

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

jednak jedno zastrzeżenie jest to, że princ nie automatycznie rozwiązać wyjście z \n.

+0

Yikes, zapomniałem o Princ. Używałem go kilka miesięcy temu w tym pytaniu. http://stackoverflow.com/questions/1532311/cgi-programming-in-elisp –

6

Jak mówi David Antaramian, prawdopodobnie chcesz princ.

Ponadto, message obsługuje ciąg kontrolny formatu (podobny do printf w C), który jest dostosowywany z format. Więc może w końcu chcesz zrobić coś jak

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

Jako para funkcji oraz wykazanie:

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