Regolazione rapida delle modifiche del testo ai DPI


9

Il mio laptop ha uno schermo 4K quindi un DPI molto elevato, molto più alto dei miei monitor esterni. Quindi, quando passo dall'uso di monitor esterni allo schermo del laptop integrato, desidero ridimensionare rapidamente il testo e, se possibile, tutti i widget della GUI di Emacs per adattarli al nuovo DPI. Sono a conoscenza di set-frame-font ma non ho trovato una funzione corrispondente che regola anche il ridimensionamento. E la modifica della scala del testo funziona solo su un buffer localmente.

Risposte:


7
  1. È possibile impostare il valore di default-frame-alist, incluso il suo fontparametro, in modo condizionale, a seconda del monitor / display corrente. (È possibile utilizzare la funzione display-monitor-attributes-listper fornire informazioni sul monitor / display.) Ciò consente di utilizzare caratteri di dimensioni predefinite diverse per monitor diversi o altri contesti diversi.

  2. È inoltre possibile modificare la dimensione del carattere in modo dinamico, per tutte le finestre e buffer indicati in ogni fotogramma, utilizzando il comando zoom-in, zoom-outo zoom-in/out, dalla libreria zoom-frm.el.

    Questi stessi comandi possono ingrandire un buffer (in tutte le finestre, su qualunque frame) o un frame (tutte le sue finestre, qualunque sia il loro buffer). Vedi la pagina Wiki di Emacs Imposta caratteri .


4

Sto usando qualcosa di simile a @gavenkoa (per pura coincidenza anche con un aiutante di nome my-dpi!) Per fare in modo che i nuovi fotogrammi ottengano le dimensioni giuste, ma zoom-frmmi rivolgo da quando uso comunque quel pacchetto. Funziona anche su configurazioni a più teste, usando frame-monitor-attributesinvece di display-monitor-attributes-list:

(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-zoom-frm-wanted-dpi 70
  "The DPI I want to achieve when using `my-zoom-frm-by-dpi'.")

(defun my-zoom-frm-by-dpi (&optional frame)
  "Zoom FRAME so the DPI is closer to `my-zoom-frm-wanted-dpi'."
  (interactive)
  (let ((frame (or frame (selected-frame))))
    (when (frame-parameter frame 'zoomed)
      (zoom-frm-unzoom frame))
    (let ((frame-zoom-font-difference (1- (round (/ (my-dpi frame)
                                                    my-zoom-frm-wanted-dpi)))))
      (when (called-interactively-p 'interactive)
        (message "Zooming by %S" frame-zoom-font-difference))
      (zoom-frm-in frame))))

;; Apply the scaling I want to each newly created frame:
(add-hook 'after-make-frame-functions #'my-zoom-frm-by-dpi)

Se c'è un modo per attivarlo automaticamente quando il frame viene visualizzato per la prima volta su un display diverso e DPI è cambiato?
krokodil,

(add-hook 'after-make-frame-functions #'my-zoom-frm-by-dpi)lo farà funzionare creando il frame. Non so se c'è un gancio per spostare una cornice esistente su schermi, se è questo che intendevi.
unhammer il

2
Trovato questo: github.com/mnp/dispwatch
krokodil

2
Ho scoperto che su Windows, la funzione my-dpi è un po 'più accurata se si utilizza l'attributo' area di lavoro 'anziché l'attributo' geometria '. Questo perché l'attributo 'mm-size' è la dimensione dell'area non oscurata dalle barre delle applicazioni e così via.
Glamour il

Dopo la modifica, displaynon viene utilizzato nel my-dpigiusto?
KevinOrr,

2

Ho reso la mia configurazione portatile su diversi laptop / desktop con:

(defun my-dpi ()
  (let* ((attrs (car (display-monitor-attributes-list)))
         (size (assoc 'mm-size attrs))
         (sizex (cadr size))
         (res (cdr (assoc 'geometry attrs)))
         (resx (- (caddr res) (car res)))
         dpi)
    (catch 'exit
      ;; in terminal
      (unless sizex
        (throw 'exit 10))
      ;; on big screen
      (when (> sizex 1000)
        (throw 'exit 10))
      ;; DPI
      (* (/ (float resx) sizex) 25.4))))

(defun my-preferred-font-size ()
  (let ( (dpi (my-dpi)) )
  (cond
    ((< dpi 110) 10)
    ((< dpi 130) 11)
    ((< dpi 160) 12)
    (t 12))))

(defvar my-preferred-font-size (my-preferred-font-size))

(defvar my-regular-font
  (cond
   ((eq window-system 'x) (format "DejaVu Sans Mono-%d:weight=normal" my-preferred-font-size))
   ((eq window-system 'w32) (format "Courier New-%d:antialias=none" my-preferred-font-size))))
(defvar my-symbol-font
  (cond
   ((eq window-system 'x) (format "DejaVu Sans Mono-%d:weight=normal" my-preferred-font-size))
   ((eq window-system 'w32) (format "DejaVu Sans Mono-%d:antialias=none" my-preferred-font-size))))

(cond
 ((eq window-system 'x)
  (if (and (fboundp 'find-font) (find-font (font-spec :name my-regular-font)))
      (set-frame-font my-regular-font)
    (set-frame-font "7x14")))
 ((eq window-system 'w32)
  (set-frame-font my-regular-font)
  (set-fontset-font nil 'cyrillic my-regular-font)
  (set-fontset-font nil 'greek my-regular-font)
  (set-fontset-font nil 'phonetic my-regular-font)
  (set-fontset-font nil 'symbol my-symbol-font)))

Anche se non ho provato a farlo funzionare in configurazione multihead. Non so se sia mai possibile.


1
Questo in realtà funziona meglio per me quando aggiusto il fattore di ridimensionamento in my-dpi da 25,4 a 17,2 (dal momento che emacs utilizza xrandr per le dimensioni del monitor, non xdpyinfo)
Greg B
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.