Posso usar uma imagem no meu isqueiro da modelo?

12

Minha modelo está desordenada. Posso exibir imagens em vez de nomes de modo?

Eu poderia usar Emoji unicode (como 🐍 para Python ou 🐓 para Coq), mas algumas máquinas nas quais eu uso minha configuração do Emacs não têm as fontes corretas pré-instaladas (idealmente, eu também gostaria de reutilizar essa técnica em um modo que estou escrevendo, por isso não posso esperar que os usuários tenham a configuração de fonte correta).

Tentei adicionar uma :imagepropriedade display ao model isqueiro de um modo menor de brinquedo, mas nada apareceu na modeline:

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

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

Clemente
fonte
Existe uma maneira de trazer as fontes para a sua configuração?
PythonNut
2
Sim, é totalmente possível fazer isso. Veja o modo nyan. Será que a imagem é muito grande para ser exibida corretamente?
wasamasa
@wasamasa, ótimo ponto! Você sabe como o modo nyan faz isso?
Clément
Como substituir a cadeia de modo principal na linha de modo por esse ícone?
stardiviner

Respostas:

11

A linha de modo é renderizada a partir de uma lista de segmentos, cada um dos quais vem com suas próprias regras especiais. Consulte Dados da linha de modo para obter detalhes. A seção de símbolos contém uma dica crucial para fazer seu código funcionar:

A menos que SYMBOL seja marcado como “arriscado” (ou seja, possui uma propriedade 'nula' 'variável de risco-local-variável'), todas as propriedades de texto especificadas no valor de SYMBOL serão ignoradas. Isso inclui as propriedades de texto das strings no valor do SYMBOL, bem como todas as formas ': eval' e ': propertize' nele. (A razão para isso é a segurança: variáveis ​​não arriscadas podem ser definidas automaticamente a partir de variáveis ​​de arquivo sem avisar o usuário.)

Eu suspeito que o modo nyan está fazendo isso de maneira menos do que ideal , então aqui está o meu exemplo 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)

A razão pela qual eu uso uma lista de um espaço e uma imagem é porque é conveniente iniciar um isqueiro com um espaço para separá-lo dos anteriores.

wasamasa
fonte
Na verdade, você tentou isso emacs -Q? Funciona muito bem com a linha de modo inteligente ativada, mas não posso fazê-lo funcionar quando começo de um Emacs simples.
Clément
Huh, você está certo. Vou verificar o que mais está faltando.
wasamasa
OK, eu descobri. Aparentemente, o pacote usa apenas cadeias de caracteres dentro de uma cadeia de formatação, enquanto o negócio real percorre os segmentos de linha de modo individualmente e só reconhece cadeias que são protegidas do início ao fim, então eu fui para uma lista de duas cadeias para ter um separador.
wasamasa
Brillian, muito obrigado! A lista leva o formatador de linha de modo a não aplicar o nível superior :propertizedo padrão mode-line-format.
Clément
@wasamasa Uau, isso é legal. Agora, quando você passa o mouse sobre a imagem, há um menu genérico; como alguém colocaria entradas nele? Apenas uma string simples como uma mensagem de foco do mouse também seria boa.
precisa
4

Boa pergunta.

Você pode tentar usar algo como o isqueiro:, (concat " " (propertize " " 'display (create-image img-file)))onde img-fileestá o nome do seu arquivo de imagem. (O primeiro caractere de espaço é apenas para separar esse isqueiro do anterior.)

Bem, eu apenas tentei usar esse código, mas não funcionou para mim. Você pode tentar brincar um pouco mais com isso. Não sei se é possível.

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

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

O isqueiro apenas aparece como um caractere de espaço comum - a displaypropriedade não parece ser respeitada.

Se você não obtiver uma boa resposta para essa pergunta, considere arquivar uma solicitação de aprimoramento do Emacs usando M-x report-emacs-bug.

Uma coisa que você certamente pode fazer é usar um ou dois caracteres Unicode na string de linha de modo. E você pode usar caracteres que são, de fato, gráficos.

Desenhou
fonte