окно сообщения elisp: могу ли я включить в текст новые строки, и если да, то как? - PullRequest
1 голос
/ 30 марта 2012

Используя message-box fn, я могу отобразить модальное диалоговое окно.

Я знаю, что это раздражает и не всегда хороший пользовательский опыт. Использование Flymake message-box для предупреждения, когда проверка flymake не удалась, кажется хорошим примером этого. Но отложите проблему взаимодействия с пользователем для целей этого вопроса. Предположим, что я достаточно разумный, чтобы ответственно использовать окно сообщений.

Как мне отформатировать текст, отображаемый в окне сообщения? Простейший случай, как я могу сказать окну сообщения отображать несколько строк текста. Если у меня длинное сообщение, оно приводит к очень широкому окну сообщения. (Еще одна проблема пользовательского интерфейса, показанная в использовании Flymake).

Смотрите здесь для примера. этот код:

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

Результаты в этом пользовательском интерфейсе:

enter image description here

Я бы хотел новую строку вместо <NL>. Я пытался использовать \n и \r и \r\n, ни один из них не работал. Я также пытался \x000D и \x000A.

Даже лучше, чем простые разрывы строк, я бы хотел иметь возможность форматировать текст. Курсив, полужирный или что-то еще. Есть варианты? Об этом ничего не сказано в документе.

Я заглянул в источник, чтобы попытаться выяснить это, но не смог найти message2, которое вызывается через message-box, и я не уверен, что все равно что-нибудь узнаю, просто посмотрев на источник.

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Используйте \n.Это делает трюк:

(message-box (concat "You need to get an \"api key\".\n"
                     "Then, set it in your .emacs with the appropriate statement."))
0 голосов
/ 01 апреля 2012

взломать обходной путь на Windows для ошибки # 11138.

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