Kann ich ein Bild in meinem Modeline-Feuerzeug verwenden?

12

Mein Model ist voll. Kann ich dafür sorgen, dass Bilder anstelle von Modusnamen angezeigt werden?

Ich könnte Unicode-Emoji verwenden (z. B. 🐍 für Python oder 🐓 für Coq), aber auf einigen Computern, auf denen ich meine Emacs-Konfiguration verwende, sind nicht die richtigen Schriftarten vorinstalliert (im Idealfall würde ich diese Technik auch gerne in a wiederverwenden) Ich kann nicht erwarten, dass die Benutzer die richtige Schriftkonfiguration haben.

Ich habe versucht :image, dem Modeline-Feuerzeug eines Spielzeug-Minor-Modus eine Anzeigeeigenschaft hinzuzufügen, aber in der Modeline wurde nichts angezeigt:

(define-minor-mode my/test-mode
  "Test mode."
  :lighter (propertize " 🐓" 'display '(image :type imagemagick
                                             :file "/home/clement/.emacs.d/rooster.png")))

TWEmoji-Hahn (https://raw.githubusercontent.com/twitter/twemoji/gh-pages/72x72/1f413.png)

Clément
quelle
Gibt es eine Möglichkeit, die Schriftarten in Ihre Konfiguration zu bringen?
PythonNut
2
Ja, das ist absolut möglich. Siehe Nyan-Modus. Könnte es sein, dass das Bild zu groß ist, um richtig angezeigt zu werden?
Wasamasa
@wasamasa, Toller Punkt! Weißt du wie Nyan-Mode das macht?
Clément
Wie ersetze ich die Hauptmodus-Zeichenfolge in der Moduszeile durch dieses Symbol?
Stardiviner

Antworten:

11

Die Moduszeile wird aus einer Liste von Segmenten gerendert, die jeweils ihre eigenen Sonderregeln haben. Siehe Modus Line - Daten für die Details. Der Symbolabschnitt enthält einen wichtigen Hinweis, damit Ihr Code funktioniert:

Sofern SYMBOL nicht als "riskant" gekennzeichnet ist (dh eine Nicht-Nicht-Eigenschaft "riskant-lokal-variabel" aufweist), werden alle Texteigenschaften, die im SYMBOL-Wert angegeben sind, ignoriert. Dies umfasst die Texteigenschaften von Zeichenfolgen im SYMBOL-Wert sowie alle darin enthaltenen Formulare ': eval' und ': propertyize'. (Der Grund dafür ist die Sicherheit: Nicht riskante Variablen können automatisch aus Dateivariablen gesetzt werden, ohne den Benutzer dazu aufzufordern.)

Ich vermute, dass der Nyan-Modus dies auf eine weniger als ideale Weise tut. Hier ist mein minimales Beispiel:

(defvar my-nyan-mode-lighter
  (list " " (propertize ":3" 'display
                        `(image :type imagemagick
                                :file ,(expand-file-name "~/nyan.png")))))
(put 'my-nyan-mode-lighter 'risky-local-variable t)

(define-minor-mode my-nyan-mode
  "Nyan mode"
  :lighter my-nyan-mode-lighter)

(my-nyan-mode)

Der Grund, warum ich eine Liste von Leerzeichen und Bildern verwende, ist, dass es üblich ist, ein Feuerzeug mit einem Leerzeichen zu beginnen, um es von den vorhergehenden zu trennen.

Wasamasa
quelle
Hast du das wirklich probiert emacs -Q? Es funktioniert hervorragend, wenn Smart-Mode-Line aktiviert ist, aber ich kann es nicht zum Laufen bringen, wenn ich von einem nackten Emacs aus starte.
Clément
Huh, du hast recht. Ich werde nachsehen, was noch fehlt.
Wasamasa
OK, ich habe es herausgefunden. Anscheinend werden in diesem Paket nur Zeichenfolgen innerhalb einer Formatzeichenfolge verwendet, während der Real Deal die Modussegmente einzeln durchläuft und nur Zeichenfolgen erkennt, die von Anfang bis Ende mit Eigenschaften versehen sind. Daher habe ich eine Liste mit zwei Zeichenfolgen erstellt, um ein Trennzeichen zu erhalten.
Wasamasa
Brillian, vielen Dank! In der Liste wird der Moduszeilenformatierer dazu verleitet, die oberste Ebene :propertizeder Standardeinstellung nicht anzuwenden mode-line-format.
Clément
@wasamasa Wow, das ist schön. Wenn Sie nun mit der Maus über das Bild fahren, wird ein allgemeines Menü angezeigt. Wie würde man Einträge darin setzen? Auch eine einfache Zeichenfolge als Mouse-Hover-Nachricht wäre in Ordnung.
yPhil
4

Gute Frage.

Sie könnten versuchen, so etwas als Feuerzeug zu verwenden:, (concat " " (propertize " " 'display (create-image img-file)))wo img-fileist der Name Ihrer Bilddatei. (Das erste Leerzeichen dient nur dazu, das Feuerzeug vom vorherigen zu trennen.)

Nun, ich habe gerade versucht, diesen Code zu verwenden, aber es hat bei mir nicht funktioniert. Sie könnten versuchen, ein bisschen mehr damit zu spielen. Keine Ahnung, ob es möglich ist.

(defvar my-lighter-string
        (concat " " (propertize " " 'display (create-image "/path/to/an/image/file.png"))))

(define-minor-mode foo "..." nil my-lighter-string)

Das Feuerzeug zeigt sich nur als gewöhnliches Raumzeichen - die displayEigenschaft scheint nicht respektiert zu werden.

Wenn Sie keine gute Antwort auf diese Frage erhalten, sollten Sie eine Emacs-Erweiterungsanforderung über einreichen M-x report-emacs-bug.

Eine Sache, die Sie auf jeden Fall tun können, ist, ein oder zwei Unicode-Zeichen in der Mode-Line-Zeichenfolge zu verwenden. Und Sie können Zeichen verwenden, die eigentlich Grafiken sind.

Drew
quelle