Подтвердить что ты не робот

Написание "Hello World" в Emacs?

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

Здесь emacs script.

#!/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
4b9b3361

Ответ 1

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

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

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

Ответ 2

Как говорит Дэвид Антарамян, вы, вероятно, хотите 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"))