Pytanie Pisanie "Hello World" w Emacs?


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. The wydrukować Funkcja umieszcza podwójne cudzysłowy wokół ciągów wyjściowych, więc otrzymuję "Witaj świecie!" zamiast Witaj świecie!.

Oto skrypt emacs.

#! / usr / bin / emacs --script
;;
;; Uruchom mnie z powłoki Uniksa: ./hello.el> x.txt
;;
(wiadomość "Witaj, świecie! piszę do STDERR.")
(drukuj "Witaj, świecie! piszę do STDOUT, ale jestem w cudzysłowie")
(wstaw "Witaj, świecie! piszę do bufora Emacs")
(napisz plik "y.txt")

A oto jak chciałbym to nazwać.

hello.el> x.txt
hello.el | toaleta

21
2018-01-31 04:10


pochodzenie




Odpowiedzi:


Wydaje się, że chcesz princ zamiast print. Więc, w zasadzie:

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

Jednak jedno zastrzeżenie jest takie princ nie kończy automatycznie wyjścia za pomocą \n.


22
2018-01-31 04:33



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


Jak mówi David Antaramian, prawdopodobnie chcesz princ.

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

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

Jako kilka funkcji plus demonstracja:

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

6
2018-01-31 05:24