Puis-je utiliser une image dans mon briquet modeline?


12

Ma modeline est encombrée. Puis-je lui faire afficher des images au lieu des noms de mode?

Je pourrais utiliser Emoji unicode (comme 🐍 pour Python ou 🐓 pour Coq), mais certaines machines sur lesquelles j'utilise ma configuration Emacs n'ont pas les bonnes polices préinstallées (idéalement, j'aimerais également réutiliser cette technique dans un mode que j'écris, donc je ne peux pas m'attendre à ce que les utilisateurs aient la bonne configuration de police).

J'ai essayé d'ajouter une :imagepropriété d'affichage à l'allume-modeline d'un jouet en mode mineur, mais rien n'apparaissait dans la modeline:

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

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


Existe-t-il un moyen d'intégrer les polices dans votre configuration?
PythonNut du

2
Oui, il est tout à fait possible de le faire. Voir nyan-mode. Se pourrait-il que l'image soit trop grande pour être affichée correctement?
wasamasa

@wasamasa, bon point! Savez-vous comment fonctionne le mode nyan?
Clément

Comment remplacer la chaîne en mode majeur dans la ligne de mode avec cette icône?
stardiviner

Réponses:


11

La ligne de mode est rendue à partir d'une liste de segments, chacun ayant ses propres règles spéciales. Voir Données de ligne de mode pour les détails. La section des symboles contient une astuce cruciale pour faire fonctionner votre code:

À moins que SYMBOL ne soit marqué comme «risqué» (c'est-à-dire qu'il ait une propriété «nulle» «variable locale à risque»), toutes les propriétés de texte spécifiées dans la valeur de SYMBOL sont ignorées. Cela inclut les propriétés de texte des chaînes dans la valeur de SYMBOL, ainsi que tous les formulaires ': eval' et ': propertize' qu'il contient. (La raison en est la sécurité: les variables non risquées peuvent être définies automatiquement à partir des variables de fichier sans inviter l'utilisateur.)

Je soupçonne que le mode nyan le fait de manière moins qu'idéale , alors voici mon exemple minimal:

(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 raison pour laquelle j'utilise une liste d'un espace et d'une image est qu'il est conventionnel de démarrer un briquet avec un espace pour le séparer des précédents.


En fait, avez-vous essayé cela emacs -Q? Cela fonctionne très bien avec la ligne de mode intelligent activée, mais je ne peux pas le faire fonctionner quand je pars d'un Emacs nu.
Clément

Tu as raison. Je vais vérifier ce qui manque d'autre.
wasamasa

OK, je l'ai compris. Apparemment, ce package utilise uniquement des chaînes à l'intérieur d'une chaîne de format alors que la vraie affaire parcourt les segments de ligne de mode individuellement et ne reconnaît que les chaînes qui sont propertisées du début à la fin, donc j'ai opté pour une liste de deux chaînes pour avoir un séparateur.
wasamasa

Brillian, merci beaucoup! La liste incite le formateur de lignes de mode à ne pas appliquer le niveau supérieur :propertizede la valeur par défaut mode-line-format.
Clément

@wasamasa Wow, c'est bien. Maintenant, lorsque vous passez la souris sur l'image, il y a un menu générique; comment y mettrait-on des entrées? Une simple chaîne comme un message de survol de la souris conviendrait également.
yPhil

4

Bonne question.

Vous pourriez essayer d'utiliser quelque chose comme ça comme le plus léger:, (concat " " (propertize " " 'display (create-image img-file)))img-fileest le nom de votre fichier image. (Le premier caractère spatial consiste simplement à séparer ce briquet du précédent.)

Eh bien, j'ai juste essayé d'utiliser ce code, mais cela n'a pas fonctionné pour moi. Vous pourriez essayer de jouer un peu plus avec. Je ne sais pas si c'est possible.

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

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

Le briquet apparaît simplement comme un caractère d'espace ordinaire - la displaypropriété ne semble pas être respectée.

Si vous n'obtenez pas une bonne réponse à cette question, envisagez de déposer une demande d'amélioration d'Emacs à l'aide de M-x report-emacs-bug.

Une chose que vous pouvez certainement faire est d'utiliser un ou deux caractères Unicode dans la chaîne de ligne de mode. Et vous pouvez utiliser des caractères qui sont en fait des graphiques.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.