В общем, причина этого понятна, используемые шрифты не содержат всех нужных начертаний и требуется подстановка из других шрифтов.
Я использую DejaVu Sans Mono. К нему руками в реестре подлинковал дополнительные шрифты, это известная техника, использует ветку реестра
Code: Select all
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink
Стал гуглить, нашел какие-то упоминания, что виндовый консольный API в принципе не может отображать символы, не лезущие в UCS-2. Но это упоминания все какие-то неофициальные и официальных формулировок от MS я так и не нашел.
Еще я пробовал использовать ConEmu, там, что интересно, все UCS-4 символы отобразились, но не отображается очень много других символов. Линковку шрифтов оно вообще игнорирует, а та подстановка символов из других шрифтов, что все-таки происходит, оказывается (очень) плохого качества -- размеры глифов не корректируются, рендерятся они отвратно и т .д. Т.е. ConEmu в нынешнем виде для этого совсем плох.
Использование внешних редакторов, которые все умеют, пока вынесем за скобки (оно меня в данный момент не удовлетворяет по другим причинам).
Итак, теперь вопросы, на которые, возможно, у кого-нибудь есть ответы:
1. Действительно ли консольный API винды на сегодня в принципе неспособен рисовать UCS-4 символы?
2. Если да, то каковы перспективы замены механизма рендеринга текста только для редактора Фара (а не для всего Фара)? Это совсем нереально?
3. Если нереально, то каковы перспективы замены механизма рендеринга текста для всего Фара (т.е., частичной эмуляции консоли)? ConEmu очень большой, жирный и мне оттуда вообще ничего не нужно, кроме его потенциальной способности отрендерить любой текст в случае, если обычная консоль на это не способна, но как раз с этим у него проблемы.
4. Если все предыдущее не вариант, то правильно ли то, что единственной остающейся возможностью остается доработка ConEmu?
5. Если ответ на предыдущий вопрос положителен, то в какую сторону дорабатывать ConEmu? Я его довольно пристально повертел в руках и примерно понимаю, что там в этой части происходит, но только примерно. Из того, что я видел, наиболее удобный API для работы с проблемами типа моей -- это использование DirectWrite, там оба высокоуровневых API для рендеринга текста делают font fallback автоматически, без геморроя, и с высоким качеством (примеры -- редакторы на scintilla c включенным DirectWrite, например scite, или, например, Vim последних версий). Но нащет ConEmu у меня сложилось ощущение, что он весь насквозь пророс GDI и использовать DirectWrite там реалистично только без D2D рендеринга, и только используя GDI interoperatbility. Хотя мою проблему это таки решит.
В общем, правилен ли мой вывод, что единственный реалистичный вариант решить мою проблему это допилить ConEmu, воткнув туда DirectWrite в режиме GDI interoperatbility, или нет? Еще вариант -- допилить ConEmu, используя Uniscribe APIs, но по результатом беглого исследования мне этот вариант показался даже более геморройным, чем использование DirectWrite.
Или, может, я вообще ломлюсь в открытые двери и существуют какие-то простые варианты, мимо которых я прошел (внешние редакторы, как я уже упомянул, не предлагать)?