Forza un singolo carattere per tutti i glifi unicode


8

Sto usando GNU Emacs 24.4.1 in una GUI su OS X. Voglio forzare la visualizzazione di ogni personaggio usando solo un singolo font piuttosto che consentire a Emacs di scegliere un presunto più appropriato. Comprendo che nessun carattere includerà ogni glifo, ma uso un sottoinsieme limitato di unicode che molti buoni caratteri coprono in modo soddisfacente.

Ho visto molte discussioni sull'utilizzo del pacchetto unicode-fonts per impostare i caratteri per intervalli di caratteri, ma non voglio avere mille righe extra nella mia configurazione per impostare ogni blocco separatamente.

Come posso semplicemente impedire ad Emacs di mappare automaticamente glifi diversi su caratteri diversi?

Grazie.


1
Hai provato (set-fontset-font t nil MY-FONT)dov'è MY-FONTil nome del tuo carattere?

@lunaryorn Grazie per il suggerimento. L'ho provato proprio ora e ho ancora caratteri diversi per personaggi diversi. Ho provato a impostare il mio carattere su Pragmata Pro e alla fine ho ottenuto glifi Unicode di Menlo (come verificato da describe-char).
karl,

Risposte:


6

Giocare con le definizioni dei set di caratteri di Emacs dovrebbe essere la risposta.

Dopo aver letto

  • Documenti di font :

    Il set di caratteri di avvio utilizzerà il carattere specificato, o una variante con un registro e una codifica diversi, per tutti i caratteri supportati da quel carattere e il fallback su "fontset-default" per altri caratteri.

    Se alcuni caratteri appaiono sullo schermo come caselle vuote o codici esadecimali, ciò significa che il set di caratteri in uso per loro non ha caratteri per quei caratteri.

  • set-fontset-font descrizione:

    TARGET può essere un contro; (FROM. TO), dove FROM e TO sono personaggi. In tal caso, utilizzare FONT-SPEC per tutti i caratteri nell'intervallo DA e A (inclusi).

    TARGET può essere un simbolo del nome dello script. In tal caso, utilizzare FONT-SPEC per tutti i caratteri che appartengono allo script.

    TARGET può essere un set di caratteri. In tal caso, utilizzare FONT-SPEC per tutti i caratteri nel set di caratteri.

    TARGET può essere nullo. In tal caso, utilizzare FONT-SPEC per tutti i caratteri per i quali non è stato specificato FONT-SPEC.

  • documenti sul controllo dei set di caratteri :

    Esistono due comandi che possono essere utilizzati per ottenere informazioni sui set di caratteri. Il comando Mx list-charset-chars richiede un nome di set di caratteri e visualizza tutti i caratteri in quel set di caratteri. Il comando Mx descrivono-set di caratteri richiede un nome di set di caratteri e visualizza informazioni su quel set di caratteri, inclusa la sua rappresentazione interna in Emacs.

    Per scoprire a quale set di caratteri appartiene un carattere nel buffer, inserire un punto prima di esso e digitare Cu Cx =

Nel nostro file init dovremmo essere in grado di impostare un carattere per l'intera gamma di caratteri:

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

Ma per impostare un carattere per un intervallo di caratteri e forzarlo come carattere di fallback per caratteri non supportati da esso, dobbiamo anche aggiungere nil come target:

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

Ora, come possiamo vedere sotto il punto (cursore) con C-u C-x =o 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: display: nessun carattere disponibile .

Dovrebbe essere possibile impostarlo nel nostro file .Xresources :

Con la risorsa X 'Emacs.Font', puoi specificare un nome di set di caratteri proprio come un nome di carattere effettivo.

Non so quale sia una sintassi corretta per quello però.

Prima di quel cambiamento sono stato in grado di vedere molti glifi Unicode non supportati dal mio font preferito. Dopo quella modifica, vedo solo un carattere nei miei Emacs e vuoti box-segnaposto per glifi non supportati da esso.

Funziona nel mio sistema e dovrebbe essere sufficiente per ora prima che qualcun altro ti dia una risposta dettagliata, tecnica e corretta .


La tua spiegazione ha un buon senso, ma l'attuale configurazione del suggerimento non sembra funzionare. Non riesco a provare ad usare l'approccio Xresources perché sto usando la build Cocoa di Emacs su OS X, ma l'impostazione dei caratteri del set di caratteri come suggerito sembra non avere alcun effetto. Se list-fontsetsdopo aver inserito il codice nel mio file init, vedo quattro elencati e solo uno è correlato al carattere impostato.
karl,

1
Dovrei chiarire: questo misteriosamente sembra risolvere il problema per un pezzo di glifi, ma non tutti. Probabilmente ottengo il 75% dei caratteri nel tipo di carattere che desidero, ma ancora un fallback per alcuni selezionati.
karl,

Sì, è valido solo per l' intervallo unicode . Se vuoi più codifiche coperte, dovresti anche cambiare i set di caratteri per loro. Aggiornerò la mia risposta, ma questo è probabilmente un po 'di pirateria informatica. Dobbiamo aspettare una risposta dagli Anziani di Emacs. :)
kmicu,

Apprezzo molto l'aiuto finora e sono vicino a contrassegnare la tua risposta come accettata, salvo un ultimo problema. Il personaggio principale per cui continuo a notare che non funziona, anche dopo l'utile modifica, è la "N maiuscola colpita" utilizzata per indicare l'insieme dei numeri naturali. Se lo esaminerò con describe-charesso sembra essere unicode con un punto di codice nell'intervallo che hai usato, ma viene comunque visualizzato con un carattere diverso.
karl,

1
Quell'ultimo aggiornamento mi ha dato tutto quello che volevo --- contrassegnato come risolto. Grazie per l'aiuto.
karl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.