4

我想在 ielm 中打印一个字符串。我不想打印打印的表示,我想要字符串本身。我想要这个结果:

ELISP> (some-unknown-function "a\nb\n")
a
b
ELISP>

我看不出有任何方法可以做到这一点。明显的功能是printand princ,但这些给了我可打印的表示:

ELISP> (print "* first\n* second\n* third\n")
"* first\n* second\n* third\n"

我玩过ppand pp-escape-newlines,但这些仍然逃脱了其他角色:

ELISP> (setq pp-escape-newlines nil)
nil
ELISP> (pp "a\n")
"\"a
\""

这可能吗?用于检查大字符串,message不要剪断它。

4

3 回答 3

7

直接插入缓冲区怎么样?

(defun p (x) (move-end-of-line 0) (insert (format "\n%s" x)))

这让你:

ELISP> (p "a\nb\n")
a
b

nil
ELISP> 

编辑:用于format能够打印字符串以外的东西。

于 2013-06-14T23:14:27.953 回答
2
;;; Commentary:

;; Provides a nice interface to evaluating Emacs Lisp expressions.
;; Input is handled by the comint package, and output is passed
;; through the pretty-printer.

IELM 使用(pp-to-string ielm-result)(因此绑定pp-escape-newlines通常会产生影响),但是如果您想pp完全绕过,那么 IELM 不提供,所以我怀疑肖恩的答案是您的最佳选择。

ELISP> (setq pp-escape-newlines nil)
nil
ELISP> "foo\nbar"
"foo
bar"
于 2013-06-15T01:30:31.803 回答
1

如果您想将字符串显示为会话的一部分,@Sean 的答案是正确的。

但是,您说要检查大字符串。另一种方法是将字符串放在单独的窗口中。你可以with-output-to-temp-buffer用来做这个。例如:

(with-output-to-temp-buffer "*string-inspector*"
  (print "Hello, world!")
  nil)

将弹出一个新窗口(或者如果它已经存在,则其输出将被更改)。它处于帮助模式,所以它是只读的,可以用q.

如果您想在输出缓冲区中做一些更复杂的事情,您可以使用with-temp-buffer-window,如下所示:

(with-temp-buffer-window "*string-inspector*"
                         #'temp-buffer-show-function
                         nil
  (insert "hello, world!!"))
于 2013-06-15T01:39:41.343 回答