【问题标题】:How do I print a string in Emacs lisp with ielm?如何使用 ielm 在 Emacs lisp 中打印字符串?
【发布时间】:2013-08-25 22:31:25
【问题描述】:

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

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

我看不出有什么方法可以做到这一点。显而易见的功能是printprinc,但这些给了我可打印的表示:

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

我玩过pppp-escape-newlines,但它们仍然逃脱了其他字符:

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

这可能吗?对于检查大字符串,message 不会削减它。

【问题讨论】:

    标签: emacs elisp read-eval-print-loop


    【解决方案1】:

    直接插入缓冲区怎么样?

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

    这让你:

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

    编辑:使用format 可以打印字符串以外的内容。

    【讨论】:

    • 聪明的hack,我喜欢! :)
    【解决方案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 不提供此功能,所以我怀疑 Sean 的答案是您的最佳选择。

    ELISP> (setq pp-escape-newlines nil)
    nil
    ELISP> "foo\nbar"
    "foo
    bar"
    

    【讨论】:

      【解决方案3】:

      如果您想将字符串显示为会话的一部分,@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!!"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多