Написание "Hello World" в Emacs? - PullRequest
21 голосов
/ 31 января 2010

Я хотел бы написать несколько сценариев Unix на Emacs Lisp. Тем не менее, похоже, что нет чистого способа записи в STDOUT, поэтому я могу перенаправить результаты в файл или направить вывод в другую команду. Функция print помещает двойные кавычки вокруг строк вывода, поэтому я получаю «Hello world!» вместо Hello world! .

Вот скрипт 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")

А вот как бы я хотел это назвать.

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

Ответы [ 2 ]

23 голосов
/ 31 января 2010

Похоже, вы хотите princ вместо print. Итак, в основном:

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

Однако одно предостережение заключается в том, что princ не автоматически завершает вывод с \n.

6 голосов
/ 31 января 2010

Как говорит Давид Антарамян, вы, вероятно, хотите princ.

Кроме того, message поддерживает строку управления форматом (похожую на printf в C), которая адаптирована из format. Таким образом, вы можете в конечном итоге сделать что-то вроде

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

Как пара функций плюс демонстрация:

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