LINUX.ORG.RU

Emacs и размер шрифта

 , , emacs-lucid,


1

4

Всем здравствуйте.

Периодически ноутбук «кочует» между разными внешними мониторами с разным DPI (от 91 до 162).

Для всех прочих программ достаточно выполнить

xrandr --dpi ...

и изменить значение X-ресурса Xft.dpi.

Исключение составляет Emacs (неважно, с Lucid или GTK+-интерфейсом – оба ведут себя одинаково). Для того, чтобы шрифт в Emacs был сопоставим по размеру с тем же самым шрифтом в терминале (xterm, rxvt, konsole – неважно), приходится увеличивать размер с 12pt до 27pt:

(set-default-font
	"Courier New:size=27:antialias=false")

Из этого можно заключить, что либо размер Xft-шрифта Emacs воспринимает в пикселях, а не в пунктах, либо где-то внутри «зашито» разрешение в 72 DPI.

Проблема наблюдается в версиях 24, 25 и 26 (по меньшей мере).

Как лечить?

★★★★★

Подпишусь на тред. Такая же проблема, хз как решить.

Difrex ★★★★
()

Должен смотреть на Xft.dpi. Попробуй указывать шрифт без размера для начала, то есть просто «Courier New» без size. Тогда слушается Xft.dpi?

Zubok ★★★★★
()

Я написал функцию, которую вызывает хук window-size-change-functions и вычисляет DPI и меняет размер шрифта:

(defun my-dpi (&optional frame)
  "Get the DPI of FRAME (or current if nil)."
  (cl-flet ((pyth (lambda (w h)
                    (sqrt (+ (* w w)
                             (* h h)))))
            (mm2in (lambda (mm)
                     (/ mm 25.4))))
    (let* ((atts (frame-monitor-attributes frame))
           (pix-w (cl-fourth (assoc 'geometry atts)))
           (pix-h (cl-fifth (assoc 'geometry atts)))
           (pix-d (pyth pix-w pix-h))
           (mm-w (cl-second (assoc 'mm-size atts)))
           (mm-h (cl-third (assoc 'mm-size atts)))
           (mm-d (pyth mm-w mm-h)))
      (/ pix-d (mm2in mm-d)))))

(defvar my-dpi-last 0)
(defun my-zoom-frm-by-dpi (&optional frame)
  "Zoom FRAME so the DPI is closer to `my-zoom-frm-wanted-dpi'."
  (interactive)
  (when (frame-size-changed-p frame)
    (let ((dpi (truncate (my-dpi nil))))
      (when (not (eq my-dpi-last dpi))
        (message (format "DPI: %d" dpi))
        (setq my-dpi-last dpi)
        (if (< dpi 110)
            (set-face-attribute 'default nil :height 120)
          (set-face-attribute 'default nil :height 170))))))
(add-hook 'window-size-change-functions #'my-zoom-frm-by-dpi)

SL_RU ★★★★
()

Странно, но у меня такой проблемы не было. Два компьютера, на одном монитор HD, на другом 4K. Шрифт ставится так:

(set-face-attribute 'default nil :font "Iosevkaslab-10.5")
Puzan ★★★★★
()

А чего в терминале Имакс не используешь?

serg002 ★★★
()

в Xresource пропиши.
Emacs.font: Hack mono-13

Тогда он будет брать настройки из Xft.dpi

FortyTwo
()
Последнее исправление: FortyTwo (всего исправлений: 1)

Я сейчас протестировал – и результаты таковы.

При указании шрифта в «расширенном» формате, ожидаемом Xft, разрешение монитора игнорируется:

;; ~/.emacs
(set-default-font "Courier New:size=12:antialias=false")
! Emacs.ad
emacs.Font: Courier New:size=12:antialias=false

Если указать шрифт в «коротком» виде, то всё хорошо:

;; ~/.emacs
(set-default-font "Courier New 12")
;; или
(set-default-font "Courier New-12")
! Emacs.ad
emacs.Font: Courier New 12
! или
emacs.Font: Courier New-12

Использование set-default-font не распространяется на новые окна (New Frame/New Frame on Display…), поэтому лучше вместо (или в дополнение к нему) использовать set-face-attribute. Такой вариант работает всегда:

;; ~/.emacs
(set-face-attribute
      'default nil
      :font "Courier New 12")
;; или
(set-face-attribute
      'default nil
      :font "Courier New-12")
;; или
(set-face-attribute
      'default nil
      :family "Courier New"
      :height 120
      :weight 'normal)

Bass ★★★★★
() автор топика
Ответ на: комментарий от Bass

Ещё хочу добавить, что указание шрифта в «расширенном» формате посредством set-face-attribute имеет ту же проблему, что и описанная изначально:

;; ~/.emacs
(set-face-attribute
      'default nil
      :font "xft:family=Courier New:size=12:antialias=false:matrix=-1 0 0 1:dpi=999")

В таком случае Emacs проигнорирует и matrix (ранее я думал, что это работает только для серверных core-шрифтов – но нет, Xft умеет то же самое), и dpi, и по-своему интерпретирует size (как pizelsize). Такое ощущение, что в «потрохах» зашит кривой парсер Xft-описания, искажающий это самое описание прежде, чем оно попадёт на вход к Xft.

Bass ★★★★★
() автор топика
Ответ на: комментарий от aquadon

Поищи в моих темах решение.

Спасибо.

Да, в общем-то, обходной путь уже найден – просто не использовать size.

Bass ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.