Jak w solidny sposób skonfigurować cofanie czcionek?

16

TL; DR: Jaki jest prosty sposób rzetelnego powiedzenia: użyć Consolas jako domyślnej czcionki, FreeMono dla znaków nieobsługiwanych przez Consolas i Symbola dla znaków nieobsługiwanych przez oba?

Ponieważ moja główna czcionka programistyczna nie obejmuje wszystkich potrzebnych mi symboli matematycznych, początkowo skonfigurowałem zastępowanie czcionek, jak pokazano poniżej:

(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)

Niestety zmieniło to również czcionkę niektórych znaków obsługiwanych przez moją główną czcionkę, więc zmieniłem ją na

(set-fontset-font t 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)

Jeśli moje rozumowanie jest prawidłowe, powinno to zapewnić, że znaki, których konsole nie są w stanie obsłużyć, są obsługiwane przez FreeMono, chyba że FreeMono ich nie ma, w takim przypadku powinny być wyświetlane przy użyciu Symbola. To też rozumiem, że trobi to samo co "fontset-default"powyżej.

Niestety wciąż były przypadki, w których nie wybrano właściwej czcionki; Znalazłem to zmieniające się na

(set-fontset-font t 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font t 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font "fontset-startup" 'unicode (font-spec :name "Symbola") nil 'append)

działało lepiej, ale nie zawsze: zmiana rozmiaru czcionki za pomocą

(set-face-attribute 'default nil :height some-size)

spowodowało, że awarie zostały zignorowane z powodu tworzenia nowych zestawów czcionek.

Moje obecne rozwiązanie to zrobić

(set-fontset-font fontset 'unicode (font-spec :name "Consolas") nil)
(set-fontset-font fontset 'unicode (font-spec :name "FreeMono") nil 'append)
(set-fontset-font fontset 'unicode (font-spec :name "Symbola") nil 'append)

na każdym zestawie czcionek ( fontset-list), po każdej zmianie rozmiaru czcionki.

Jaki jest właściwy sposób ustawienia zastępowania czcionek?

Uwaga : do celów testowych oto kilka znaków matematycznych: ℕ𝓟⧺×≠≥≤±¬∨∧∃∀λ⟿⟹⊥⊤⊢
Odnośniki : Podręcznik Emacsa na temat zestawów czcionek i modyfikacji zestawów czcionek

Łaskawy
źródło
2
Mam myśl, która tak naprawdę nie rozwiązuje twojego problemu, ale - jeśli potrzebujesz symboli matematycznych itp. Do twierdzeń i dokumentów naukowych, dlaczego nie używasz do tego TeX i AucTeX? Sprawiłoby to, że kłopoty z czcionkami X (lub Mac lub Windows, w zależności od tego, co uruchomisz) nie byłyby konieczne i zapewniłyby wysokiej jakości dokumenty i fragmenty (np. W trybie org).
po namyśle: czcionka UTF-8 z pełnym zestawem znaków powinna całkowicie usunąć twój problem (np. GNU Unifont), a gdy trzeba wybrać między wymyślną czcionką a wymaganymi glifami, wybrałbym to drugie.
2
@kuli Jesteś zbyt pesymistyczny. Zobacz github.com/cpitclaudel/monospacifier
Ista
Nie pamiętam, gdzie to przeczytałem, ale wierzę, że Eli Zaretskii odpowiedział gdzieś na podobne pytanie. Myślisz fontsetw niewłaściwy sposób. Emacs nie sprawdza właściwie każdego wyświetlanego znaku, czy czcionka wie, jak go wyświetlić, czy nie. To byłoby zbyt intensywne obliczeniowo. Zatem nie ma mechanizmu „rezerwowego” jako takiego. Powinieneś ustawić domyślną czcionkę, a następnie ręcznie zmodyfikować domyślny zestaw czcionek w określonych zakresach, aby wyświetlał się przy użyciu różnych czcionek. Ta procedura jest ręczna, a może pakiet unicodemoże pomóc.
GenaU
@GenaU Mogę się nieporozumieć, ale Emacs sprawdza; tylko nie każda czcionka, tylko te, które pojawiają się w zestawie czcionek.
Clément

Odpowiedzi:

0

Dla tych, którzy nie są w stanie przeczytać dokumentacji Emacsa.

Wybór czcionki

Zanim Emacs będzie mógł narysować znak na wyświetlaczu graficznym, musi wybrać „czcionkę” dla tego znaku. Zwykle Emacs automatycznie wybiera czcionkę na podstawie twarzy przypisanych do tego znaku - w szczególności atrybuty twarzy: „rodzina”, „: waga”, „: pochylenie” i „: szerokość”. Wybór czcionki zależy również od wyświetlanego znaku; niektóre czcionki mogą wyświetlać tylko ograniczony zestaw znaków. Jeśli żadna dostępna czcionka nie pasuje dokładnie do wymagań, Emacs szuka „najbliższej pasującej czcionki”. Zmienne w tej sekcji kontrolują sposób, w jaki Emacs dokonuje tego wyboru.

face-font-family-alternatives

Specjalnie przetestowany przy użyciu znaków w pytaniu, sprawdzając znaki przy pomocy
describe-character. Każda postać używa jednej z bezpłatnych czcionek: Consolas, FreeMono, Symbola. Ustawienie czcionki ramki na Consola przez set-frame-font.

Jak dotąd 14 głosów pozytywnych, odpowiedź odrzucona, a nauka UE wciąż nie jest w stanie rozwiązać tej tajemnicy.

Alexandr Karbivnichiy
źródło
Dzięki! Czy rozważałeś opublikowanie tego jako odpowiedzi na mój komentarz powyżej, a nie jako osobnej odpowiedzi?
Clément
1
(Powinienem wyjaśnić, że też testowałem na Emacs 26, a twoja odpowiedź nie wydaje się działać: (setq face-font-family-alternatives '(("Consolas" "FreeMono" "Symbola")))wtedy użyłem M-x set-frame-font RET Consolas RET; postacie używają mieszanki Consolas i Segoe UI Symbol)
Clément
Testowałem na Manjaro Arch Linux następującą sekwencję: ℕ𝓟⧺ × ≠ ≥≤ ± ¬∨∧∃∀λ⟿⟹⊥⊤⊢; Nie testowałem, co się stanie, jeśli jakaś czcionka nie zostanie zainstalowana. To może być możliwe. Ponieważ nazwy czcionek są wprowadzane ręcznie, a nie z listy istniejących.
Alexandr Karbivnichiy
Testowałem ze wszystkimi czcionkami na liście zainstalowanymi w emacs -Q.
Clément
@ Clément emacs -Q opcja wiele implikuje: --no-x-resources. Być może leży w tym problem. Dla mnie Consolas zaczyna się od tego znaku: „×”. I pierwsze dwa „ℕ𝓟” FreeMono i Symbola.
Alexandr Karbivnichiy
-1

M-x customize-variable face-font-family-alternatives

Istnieje lista, która wygląda mniej więcej tak:

(("Monospace" "courier" "fixed")
 ("Monospace Serif" "Courier 10 Pitch" "Consolas" "Courier Std" "FreeMono" "courier" "fixed")
 ("courier" "CMU Typewriter Text" "fixed")
 ("Sans Serif" "helv" "helvetica" "arial" "fixed")
 ("helv" "helvetica" "arial" "fixed"))

Dodaj swoją sekwencję do customizeinterfejsu bufora:

("Consolas" "FreeMono" "Symbola")

Jeśli dana rodzina jest określona, ​​ale nie istnieje, ta zmienna określa alternatywne rodziny czcionek do wypróbowania. Każdy element powinien mieć ten formularz:

 (FAMILY ALTERNATE-FAMILIES...)

Jeśli RODZINA jest określona, ​​ale niedostępna, Emacs będzie wypróbowywał inne rodziny podane w RODZINACH ALTERNATYWNYCH, jeden po drugim, aż znajdzie rodzinę, która istnieje.

Jak korzystać face-font-family-alternatives:

W twoim buforze: M-x set-frame-font

Wybierz czcionkę z listy. Wybrana czcionka określi, z jakiej sekwencji wyszukiwania czcionek face-font-family-alternativesma korzystać. W tym przykładzie Consolas .

Aby sprawdzić, jakiej rodziny czcionek użyto do wyświetlenia znaku: M-x describe-char

Alexandr Karbivnichiy
źródło
Dzięki! Ale nie sądzę, że to odpowiada na pytanie. AFAICT, sugerowana konfiguracja użyje FreeMono, jeśli czcionka Consolas nie jest dostępna, ale nie powróci do FreeMono dla znaków nieobsługiwanych przez Consolas.
Clément