Erzwingen Sie eine einzelne Schriftart für alle Unicode-Glyphen


8

Ich verwende GNU Emacs 24.4.1 in einer GUI unter OS X. Ich möchte erzwingen, dass jedes Zeichen nur mit einer einzigen Schriftart angezeigt wird, anstatt Emacs zu erlauben, eine angeblich am besten geeignete auszuwählen. Ich verstehe, dass keine Schriftart alle Glyphen enthält, aber ich verwende eine begrenzte Teilmenge von Unicode, die viele gute Schriftarten zufriedenstellend abdecken.

Ich habe viel über die Verwendung des Unicode-Fonts-Pakets zum Festlegen von Schriftarten für Zeichenbereiche gesprochen, aber ich möchte nicht tausend zusätzliche Zeilen in meiner Konfiguration haben, um jeden Block separat festzulegen.

Wie kann ich Emacs einfach daran hindern, verschiedene Glyphen automatisch verschiedenen Schriftarten zuzuordnen?

Vielen Dank.


1
Haben Sie versucht, (set-fontset-font t nil MY-FONT)wo MY-FONTist der Name Ihrer Schrift?
Mondhorn

@unaryorn Danke für den Vorschlag. Ich habe das gerade versucht und bekomme immer noch verschiedene Schriftarten für verschiedene Charaktere. Ich habe versucht, meine Schriftart auf Pragmata Pro einzustellen und am Ende Menlo-Unicode-Glyphen zu erhalten (wie von überprüft describe-char).
Karl

Antworten:


6

Das Spielen mit den Schriftartendefinitionen von Emacs sollte die Antwort sein.

Nach dem Lesen

  • Fontsets-Dokumente :

    Das Start-Fontset verwendet die von Ihnen angegebene Schriftart oder eine Variante mit einer anderen Registrierung und Codierung für alle Zeichen, die von dieser Schriftart unterstützt werden, und greift bei anderen Zeichen auf "Fontset-Standard" zurück.

    Wenn einige Zeichen auf dem Bildschirm als leere Kästchen oder Hex-Codes angezeigt werden, bedeutet dies, dass die für sie verwendete Schriftart keine Schriftart für diese Zeichen hat.

  • set-fontset-font Beschreibung:

    ZIEL kann ein Nachteil sein; (FROM. TO), wobei FROM und TO Zeichen sind. Verwenden Sie in diesem Fall FONT-SPEC für alle Zeichen im Bereich FROM und TO (einschließlich).

    TARGET kann ein Skriptnamensymbol sein. Verwenden Sie in diesem Fall FONT-SPEC für alle Zeichen, die zum Skript gehören.

    TARGET kann ein Zeichensatz sein. Verwenden Sie in diesem Fall FONT-SPEC für alle Zeichen im Zeichensatz.

    ZIEL kann Null sein. Verwenden Sie in diesem Fall FONT-SPEC für alle Zeichen, für die kein FONT-SPEC angegeben ist.

  • Dokumente zum Überprüfen von Zeichensätzen :

    Es gibt zwei Befehle, mit denen Informationen zu Zeichensätzen abgerufen werden können. Der Befehl Mx list-charset-chars fordert zur Eingabe eines Zeichensatznamens auf und zeigt alle Zeichen in diesem Zeichensatz an. Der Befehl Mx beschreiben-Zeichensatz fordert zur Eingabe eines Zeichensatznamens auf und zeigt Informationen zu diesem Zeichensatz an, einschließlich seiner internen Darstellung in Emacs.

    Um herauszufinden, zu welchem ​​Zeichensatz ein Zeichen im Puffer gehört, setzen Sie einen Punkt davor und geben Sie Cu Cx = ein

In unserer Init-Datei sollten wir in der Lage sein, eine Schriftart für den gesamten Zeichenbereich festzulegen:

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

Um eine Schriftart für eine Reihe von Zeichen festzulegen und als Fallback-Schriftart für Zeichen zu erzwingen, die nicht von ihr unterstützt werden, müssen wir außerdem Folgendes nil als Ziel hinzufügen :

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

Nun, wie wir unter Punkt (Cursor) mit C-u C-x =oder sehen können 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')

Wichtiger Teil: Anzeige: Keine Schriftart verfügbar .

Es sollte möglich sein, dies in unserer .Xresources- Datei festzulegen :

Mit der X-Ressource 'Emacs.Font' können Sie einen Schriftartennamen genau wie einen tatsächlichen Schriftnamen angeben.

Ich weiß allerdings nicht, was eine richtige Syntax dafür ist.

Vor dieser Änderung konnte ich viele Unicode-Glyphen sehen, die von der Schriftart meiner Wahl nicht unterstützt wurden. Nach dieser Änderung kann ich in meinen Emacs nur eine Schriftart und leere Platzhalter für Glyphen sehen, die von dieser nicht unterstützt werden.

Es funktioniert in meinem System und sollte vorerst ausreichen, bevor Ihnen jemand anderes eine detaillierte, technische und korrekte Antwort gibt .


Ihre Erklärung ist sinnvoll, aber die eigentliche Vorschlagskonfiguration scheint nicht zu funktionieren. Ich kann nicht versuchen, den Xresources-Ansatz zu verwenden, da ich den Cocoa-Build von Emacs unter OS X verwende, aber das Festlegen der von Ihnen vorgeschlagenen Schriftarten-Schriftarten scheint keine Auswirkungen zu haben. Wenn ich list-fontsetsIhren Code in meine Init-Datei eingefügt habe, werden vier aufgelistet und nur einer bezieht sich auf die von mir festgelegte Schriftart.
Karl

1
Ich sollte klarstellen: Dies scheint auf mysteriöse Weise das Problem für ein Stück Glyphen zu beheben, aber nicht für alle. Ich bekomme wahrscheinlich 75% der Zeichen in der gewünschten Schriftart, aber immer noch ein Fallback für einige wenige.
Karl

Ja, das gilt nur für den Unicode- Bereich. Wenn Sie mehr Codierungen behandeln möchten, sollten Sie auch die Schriftarten für diese ändern. Ich werde meine Antwort aktualisieren, aber dies ist wahrscheinlich ein Hackery. Wir müssen auf eine Antwort der Ältesten von Emacs warten. :)
kmicu

Ich schätze die bisherige Hilfe sehr und bin kurz davor, Ihre Antwort als akzeptiert zu markieren. Speichern Sie ein letztes Problem. Die Hauptfigur, für die ich immer wieder bemerke, dass dies auch nach der hilfreichen Modifikation nicht funktioniert, ist das "doppelt geschlagene Großbuchstaben N", mit dem die Menge der natürlichen Zahlen bezeichnet wird. Wenn ich es damit untersuche, describe-charscheint es ein Unicode mit einem Codepunkt in dem von Ihnen verwendeten Bereich zu sein, aber es wird immer noch mit einer anderen Schriftart angezeigt.
Karl

1
Das letzte Update gab mir alles, was ich wollte - als gelöst markiert. Danke für Ihre Hilfe.
Karl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.