¿Puedo usar una imagen en mi modeline encendedor?

12

Mi línea de modelo está abarrotada. ¿Puedo hacer que muestre imágenes en lugar de nombres de modo?

Podría usar Emoji unicode (como 🐍 para Python o 🐓 para Coq), pero algunas máquinas en las que uso mi configuración de Emacs no tienen las fuentes correctas preinstaladas (idealmente, también me gustaría reutilizar esta técnica en un modo que estoy escribiendo, por lo que no puedo esperar que los usuarios tengan la configuración de fuente correcta).

Intenté agregar una :imagepropiedad de visualización al encendedor modeline de un modo menor de juguete, pero no apareció nada en el modeline:

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

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

Clemente
fuente
¿Hay alguna manera de incorporar las fuentes a su configuración?
PythonNut
2
Sí, es totalmente posible hacer eso. Ver modo nyan. ¿Podría ser que la imagen es demasiado grande para mostrarse correctamente?
wasamasa
@wasamasa, ¡gran punto! ¿Sabes cómo funciona el modo nyan?
Clément
¿Cómo reemplazar la cadena de modo mayor en la línea de modo con este icono?
stardiviner

Respuestas:

11

La línea de modo se representa a partir de una lista de segmentos, cada uno de los cuales viene con sus propias reglas especiales. Ver Datos de línea de modo para los detalles. La sección de símbolos contiene una pista crucial para que su código funcione:

A menos que SYMBOL se marque como “riesgoso” (es decir, tiene una propiedad 'variable nula' de riesgo-local '), se ignoran todas las propiedades de texto especificadas en el valor de SYMBOL. Esto incluye las propiedades de texto de las cadenas en el valor de SYMBOL, así como todos los formularios ': eval' y ': propiedad'. (La razón de esto es la seguridad: las variables no riesgosas se pueden configurar automáticamente a partir de las variables de archivo sin preguntar al usuario).

Sospecho que nyan-mode lo está haciendo de una manera menos que ideal , así que aquí está mi ejemplo mínimo:

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

La razón por la que uso una lista de un espacio y una imagen es porque es convencional comenzar un encendedor con un espacio para separarlo de los anteriores.

wasamasa
fuente
En realidad, ¿intentaste esto emacs -Q? Funciona muy bien con la línea de modo inteligente habilitada, pero no puedo hacer que funcione cuando comienzo desde un Emacs desnudo.
Clément
Huh, tienes razon. Comprobaré qué más falta.
wasamasa
OK, lo he descubierto. Aparentemente, ese paquete solo usa cadenas dentro de una cadena de formato, mientras que el trato real recorre los segmentos de línea de modo individualmente y solo reconoce cadenas que son propiedad de principio a fin, por lo que busqué una lista de dos cadenas para tener un separador.
wasamasa
Brillian, muchas gracias! La lista engaña al formateador de línea de modo para que no aplique el nivel superior :propertizedel predeterminado mode-line-format.
Clément
@wasamasa Wow, eso es bueno. Ahora cuando pasa el mouse sobre la imagen, hay un menú genérico; ¿Cómo podría uno poner entradas en él? Solo una cadena simple como mensaje de desplazamiento del mouse también estaría bien.
yPhil
4

Buena pregunta.

Puede intentar usar algo como esto como el encendedor:, (concat " " (propertize " " 'display (create-image img-file)))donde img-fileestá el nombre de su archivo de imagen. (El primer carácter espacial es solo para separar este encendedor del anterior).

Bueno, acabo de intentarlo, usando este código, pero no funcionó para mí. Puede intentar jugar un poco más con él. No sé si es posible.

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

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

El encendedor solo se muestra como un personaje espacial ordinario: la displaypropiedad no parece ser respetada.

Si no obtiene una buena respuesta a esta pregunta, considere presentar una solicitud de mejora de Emacs, utilizando M-x report-emacs-bug.

Una cosa que ciertamente puede hacer es usar uno o dos caracteres Unicode en la cadena de línea de modo. Y puede usar caracteres que son, en efecto, gráficos.

Dibujó
fuente