Forçar uma fonte única para todos os glifos unicode

8

Estou usando o GNU Emacs 24.4.1 em uma GUI no OS X. Quero forçar a exibição de todos os caracteres usando apenas uma fonte, em vez de permitir que o Emacs escolha um supostamente mais apropriado. Entendo que nenhuma fonte incluirá todos os glifos, mas uso um subconjunto limitado de unicode, que muitas boas fontes cobrem satisfatoriamente.

Vi muita conversa sobre o uso do pacote unicode-fonts para definir fontes para intervalos de caracteres, mas não quero ter mil linhas extras na minha configuração para definir cada bloco separadamente.

Como posso simplesmente impedir que o Emacs mapeie automaticamente glifos diferentes para fontes diferentes?

Obrigado.

karl
fonte
1
Você tentou (set-fontset-font t nil MY-FONT)onde MY-FONTestá o nome da sua fonte?
Lunardorn 23/12/14
@ lunaryorn Obrigado pela sugestão. Eu tentei isso agora e ainda recebo fontes diferentes para caracteres diferentes. Tentei definir minha fonte como Pragmata Pro e acabei obtendo glifos unicode Menlo (como verificado por describe-char).
perfil

Respostas:

6

Brincar com as definições de conjunto de fontes do Emacs deve ser a resposta.

Depois de ler

  • Documentos de conjuntos de fontes :

    O conjunto de fontes de inicialização usará a fonte que você especificar, ou uma variante com um registro e codificação diferentes, para todos os caracteres suportados por essa fonte e o fallback em 'fontset-default' para outros caracteres.

    Se alguns caracteres aparecerem na tela como caixas vazias ou códigos hexadecimais, isso significa que o conjunto de fontes em uso para eles não possui fonte para esses caracteres.

  • set-fontset-font descrição:

    TARGET pode ser um contras; (FROM. TO), onde FROM e TO são caracteres. Nesse caso, use FONT-SPEC para todos os caracteres no intervalo FROM e TO (inclusive).

    TARGET pode ser um símbolo de nome de script. Nesse caso, use FONT-SPEC para todos os caracteres que pertencem ao script.

    TARGET pode ser um conjunto de caracteres. Nesse caso, use FONT-SPEC para todos os caracteres no conjunto de caracteres.

    O TARGET pode ser nulo. Nesse caso, use FONT-SPEC para quaisquer caracteres para os quais nenhum FONT-SPEC esteja especificado.

  • documentos sobre como verificar charsets :

    Existem dois comandos que podem ser usados ​​para obter informações sobre conjuntos de caracteres. O comando Mx list-charset-chars solicita um nome de charset e exibe todos os caracteres nesse conjunto de caracteres. O comando Mx descrever-conjunto de caracteres solicita um nome de conjunto de caracteres e exibe informações sobre esse conjunto de caracteres, incluindo sua representação interna no Emacs.

    Para descobrir a qual conjunto de caracteres um caractere do buffer pertence, coloque um ponto antes dele e digite Cu Cx =

Em nosso arquivo init, devemos ser capazes de definir uma fonte para toda a gama de caracteres:

 (let ((my-font "DejaVu Sans Mono-14"))
  (set-fontset-font "fontset-startup" '(#x000000 . #x3FFFFF) my-font)
  (set-fontset-font "fontset-default" '(#x000000 . #x3FFFFF) my-font)
  (set-fontset-font "fontset-standard" '(#x000000 . #x3FFFFF) my-font))

Mas, para definir uma fonte para um intervalo de caracteres e forçá-la como fonte substituta para caracteres não suportados por ela , também devemos adicionar nil como destino:

(let ((my-font "DejaVu Sans Mono-14")
      (font-sets '("fontset-default"
                   "fontset-standard"
                   "fontset-startup")))
  (mapcar
   (lambda (font-set)
     ;; all the characters in that range (which is the full possible range)
     (set-fontset-font font-set '(#x000000 . #x3FFFFF) my-font)

     ;; for all characters without font specification
     ;; in another words it is a setting for lack of fallback font
     ;; if e.g. ℕ called DOUBLE-STRUCK CAPITAL N is not covered by our font
     ;; it will be displayed as placeholder-box,
     ;; because fallback for our font is now... our font :)
     (set-fontset-font font-set nil my-font))
   font-sets))

Agora, como podemos ver no ponto (cursor) com C-u C-x =ou M-x describe-char:

             position: 1430 of 1954 (73%), column: 16
            character: ℕ (displayed as ℕ) (codepoint 8469, #o20425, #x2115)
    preferred charset: unicode (Unicode (ISO10646))
code point in charset: 0x2115
               script: symbol
               syntax: w    which means: word
             category: .:Base, L:Left-to-right (strong)
             to input: type "C-x 8 RET HEX-CODEPOINT" or "C-x 8 RET NAME"
          buffer code: #xE2 #x84 #x95
            file code: #xE2 #x84 #x95 (encoded by coding system utf-8-unix)
              display: no font available

Character code properties: customize what to show
  name: DOUBLE-STRUCK CAPITAL N
  old-name: DOUBLE-STRUCK N
  general-category: Lu (Letter, Uppercase)
  decomposition: (font 78) (font 'N')

Parte importante: exibição: nenhuma fonte disponível .

Deve ser possível definir isso em nosso arquivo .Xresources :

Com o recurso X 'Emacs.Font', você pode especificar um nome de conjunto de fontes como um nome de fonte real.

Eu não sei o que é uma sintaxe adequada para isso.

Antes dessa mudança, eu era capaz de ver muitos glifos unicode não suportados pela minha fonte de escolha. Após essa alteração - só posso ver uma fonte no meu Emacs e espaços reservados vazios para glifos não suportados por ela.

Funciona no meu sistema e deve ser suficiente por enquanto antes que alguém lhe dê uma resposta detalhada, técnica e correta .

kmicu
fonte
Sua explicação faz sentido, mas a configuração real da sugestão parece não funcionar. Não posso tentar usar a abordagem Xresources porque estou usando a compilação Cocoa do Emacs no OS X, mas definir as fontes do conjunto de fontes conforme sugerido parece não ter efeito. Se list-fontsetsdepois de colocar seu código no meu arquivo init, vejo quatro listados e apenas um está relacionado à fonte que eu defini.
karl
1
Devo esclarecer: isso misteriosamente parece resolver o problema de uma porção de glifos, mas não de todos eles. Eu obtenho provavelmente 75% dos caracteres na fonte que eu quero, mas ainda assim um substituto para alguns selecionados.
karl
Sim, isso é válido apenas para ' intervalo unicode . Se você quiser mais codificações cobertas, também deverá alterar os conjuntos de fontes para elas. Vou atualizar minha resposta, mas isso provavelmente é um hackery. Precisamos esperar por uma resposta dos Anciãos de Emacs. :)
kmicu
Eu realmente aprecio a ajuda até agora e estou perto de marcar sua resposta como aceita, exceto um problema final. O personagem principal que continuo percebendo que isso não funciona, mesmo após a modificação útil, é o "capital de golpe duplo N" usado para denotar o conjunto de números naturais. Se eu examiná- describe-charlo, parece ser unicode com um ponto de código no intervalo que você usou, mas ainda é exibido com uma fonte diferente.
karl
1
Essa última atualização me deu tudo o que eu queria - marcado como resolvido. Obrigado pela ajuda.
karl