Emacs elisp消息框:我可以在文本中包含换行符吗?如果可以,如何添加?

Emacs elisp消息框:我可以在文本中包含换行符吗?如果可以,如何添加?,emacs,elisp,Emacs,Elisp,使用消息框fn,我可以显示一个模式对话框 我知道这很烦人,并不总是一个好的用户体验。Flymake使用消息框在Flymake检查失败时发出警告,这似乎是一个很好的例子。 但是为了这个问题的目的,把用户体验问题放在一边。假设我足够明智,能够负责任地使用MessageBox 如何格式化消息框显示的文本?最简单的情况是,如何让MessageBox显示多行文本。如果我有一条较长的消息,它会导致一个非常宽的消息框。(另一个UI问题出现在Flymake使用中) 请参见这里的示例。此代码: (message-

使用
消息框
fn,我可以显示一个模式对话框

我知道这很烦人,并不总是一个好的用户体验。Flymake使用
消息框
在Flymake检查失败时发出警告,这似乎是一个很好的例子。 但是为了这个问题的目的,把用户体验问题放在一边。假设我足够明智,能够负责任地使用MessageBox

如何格式化消息框显示的文本?最简单的情况是,如何让MessageBox显示多行文本。如果我有一条较长的消息,它会导致一个非常宽的消息框。(另一个UI问题出现在Flymake使用中)

请参见这里的示例。此代码:

(message-box (concat "You need to get an \"api key\".<NL>"
             "Then, set it in your .emacs with the appropriate statement."))
(消息框(concat)“您需要获取一个\“api密钥\”
“然后,用适当的语句在.emacs中设置它。”)
此UI中的结果:

我想用换行符代替
。我试过使用
\n
\r
\r\n
,但都不起作用。我还尝试了
\x000D
\x000A

甚至比简单的换行更好,我希望能够格式化文本。斜体、粗体或其他任何形式。有选择吗?文件中没有提到这一点


我查看了源代码,试图找出这一点,但找不到message2,它由MessageBox调用,我不确定通过查看源代码我能学到什么

使用
\n
。这就是诀窍:

(message-box (concat "You need to get an \"api key\".\n"
                     "Then, set it in your .emacs with the appropriate statement."))

针对bug#11138的Windows黑客解决方案


嗯,这对我来说不是,因为某种原因。当我发布问题时,我想,我最好用\n来展示这个案例,但是,我没有。然后我尝试了
\r\n
,同样的结果。我没有东西可以试了。@Cheeso,Emacs版本?您是否尝试过使用-q运行Emacs--没有站点初始化?嗯,嗯。。。这可能是问题所在
这是GNU Emacs 23.3.1(i386-mingw-nt6.1.7601)
。窗户。我刚刚用-q试过,结果也一样。如果是这样,我可以在Windows环境中设置一个特殊情况,并使用另一个选项在那里显示一个消息框。@因此,它在Windows上也失败了(在Linux上工作)。我会尝试
M-x报告emacs bug
。很抱歉
(defun multiline-message-box (msg)
  "display a multiline message box on Windows.

According to bug #11138, when passing a message with newlines to
`message-box' on Windows, the rendered message-box appears all on
one line.

This function can work around that problem.
"
  (flet ((ok (&optional p1 &rest args) t))

    (let ((parts (split-string msg "\n"))
          (menu-1 (make-sparse-keymap "Attention"))
          c)

      (define-key menu-1 [menu-1-ok-event]
        `(menu-item ,(purecopy "OK")
                    ok
                    :keys ""))
      (define-key menu-1 [separator-1] menu-bar-separator)

      ;; add lines in reverse order
      (setq c (length parts))
      (while (> c 0)
        (setq c (1- c))
        (define-key menu-1 (vector (intern (format "menu-1-fake-event-%d" c)))
          `(menu-item ,(purecopy (nth c parts))
                      nil
                      :keys ""
                      :enable t)))
      (x-popup-menu t menu-1))))


(multiline-message-box "Hello!\nI must be going!\nThis is line 3.")