2012-03-30 3 views
1

Mit der message-box Fn kann ich einen modalen Dialog anzeigen.elisp message-box: kann ich Zeilenumbrüche in den Text einfügen, und wenn ja, wie?

Ich weiß, das ist nervig und nicht immer eine gute Benutzererfahrung. Flymakes Verwendung der message-box, um zu warnen, wenn eine Flymake-Prüfung fehlgeschlagen ist, scheint ein gutes Beispiel dafür zu sein. Aber legen Sie das Problem der Benutzerfreundlichkeit für die Zwecke dieser Frage beiseite. Angenommen, ich bin vernünftig genug, die Message-Box verantwortungsvoll zu verwenden.

Wie kann ich den angezeigten Text formatieren? Der einfachste Fall ist, wie kann ich Nachricht anzeigen, um mehrere Textzeilen anzuzeigen. Wenn ich eine längliche Nachricht habe, ergibt sich eine sehr breite Nachrichtenbox. (Ein weiteres UI-Problem, das bei der Verwendung von Flymake aufgetreten ist).

Hier finden Sie ein Beispiel. dieser Code:

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

Ergebnisse in dieser UI:

enter image description here

ich eine neue Zeile anstelle der <NL> mag. Ich versuchte mit \n und \r und \r\n, keiner von denen arbeitete. Ich versuchte auch \x000D und \x000A.

Noch besser als einfache Zeilenumbrüche, würde ich gerne in der Lage sein, den Text zu formatieren. Kursiv, fett oder was auch immer. Gibt es Optionen? Im Dokument wird dazu nichts erwähnt.

Ich schaute in der Quelle, um zu versuchen, herauszufinden, aber konnte nicht Nachricht2 finden, die von Message-Box aufgerufen wird, und ich bin mir nicht sicher, ich würde sowieso etwas lernen, indem ich nur auf Quelle.

Antwort

3

Verwenden Sie \n. Das macht den Trick:

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

Hmm, tut es nicht für mich., Aus irgendeinem Grund. Als ich die Frage posten wollte, dachte ich: * Nun, ich zeige den Fall besser mit \ n *, aber ich tat es nicht. Dann habe ich '\ r \ n' versucht, das gleiche Ergebnis. Ich habe keine Sachen mehr, um es zu versuchen. – Cheeso

+0

@Cheeso, Emacs-Version? Hast du versucht, Emacs mit -q auszuführen? --no-site-init? –

+0

Hmmm, naja ... das ist vielleicht das Problem 'Das ist GNU Emacs 23.3.1 (i386-mingw-nt6.1.7601)'. Windows. Ich habe gerade mit -q und dem gleichen Ergebnis versucht. – Cheeso

0

hacken Workaround unter Windows für Fehler # 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.") 
Verwandte Themen