Điều chỉnh nhanh văn bản theo thay đổi DPI


9

Máy tính xách tay của tôi có màn hình 4K do đó DPI rất cao, cao hơn nhiều so với màn hình ngoài của tôi. Vì vậy, khi tôi chuyển từ sử dụng màn hình ngoài sang màn hình máy tính xách tay tích hợp, tôi muốn nhanh chóng chia tỷ lệ văn bản và, nếu có thể, tất cả các tiện ích GUI trong Emacs để phù hợp với DPI mới. Tôi biết về set-frame-font nhưng tôi chưa tìm thấy một chức năng tương ứng có thể điều chỉnh tỷ lệ co giãn. Và điều chỉnh tỷ lệ văn bản chỉ hoạt động trên một bộ đệm cục bộ.

Câu trả lời:


7
  1. Bạn có thể đặt giá trị của default-frame-alist, bao gồm cả fonttham số của nó , tùy theo điều kiện, tùy thuộc vào màn hình / màn hình hiện tại. (Bạn có thể sử dụng chức năng display-monitor-attributes-listđể cung cấp cho bạn thông tin màn hình / hiển thị.) Điều này cho phép bạn sử dụng các kích thước phông chữ mặc định khác nhau cho các màn hình khác nhau hoặc các bối cảnh khác nhau.

  2. Bạn cũng có thể thay đổi kích thước font chữ động, cho tất cả các cửa sổ và bộ đệm hiện trong bất kỳ khung hình, sử dụng lệnh zoom-in, zoom-outhoặc zoom-in/outtừ thư viện zoom-frm.el.

    Các lệnh tương tự này có thể phóng to bộ đệm (trong tất cả các cửa sổ, trên bất kỳ khung nào) hoặc khung (tất cả các cửa sổ của nó, bất kể bộ đệm của chúng). Xem trang Wiki Emacs Đặt Phông chữ .


4

Tôi đang sử dụng một cái gì đó tương tự như @gavenkoa (bởi sự trùng hợp hoàn toàn với một người trợ giúp có tên my-dpi!) Để làm cho các khung hình mới có kích thước phù hợp, nhưng vẫn tiếp tục zoom-frmkể từ khi tôi sử dụng gói đó. Nó cũng hoạt động trên các thiết lập nhiều đầu, bằng cách sử dụng frame-monitor-attributesthay vì 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)

Nếu có cách nào để tự động kích hoạt điều này khi khung hình được hiển thị lần đầu tiên ở màn hình khác nhau và DPI đã thay đổi?
krokodil

(add-hook 'after-make-frame-functions #'my-zoom-frm-by-dpi)sẽ làm cho nó chạy trên việc tạo khung. Tôi không biết nếu có một cái móc để di chuyển một khung hình hiện có trên màn hình, nếu đó là ý bạn.
unhammer

2
Tìm thấy cái này: github.com/mnp/dispwatch
krokodil

2
Tôi thấy rằng trên Windows, hàm my-dpi chính xác hơn một chút nếu bạn sử dụng thuộc tính 'workarea' thay vì thuộc tính 'hình học'. Điều này là do thuộc tính 'mm-size' là kích thước của khu vực không bị che khuất bởi các thanh tác vụ, v.v.
quyến rũ

Sau khi chỉnh sửa, displaykhông được sử dụng my-dpiđúng không?
KevinOrr

2

Tôi đã cấu hình di động trên các máy tính xách tay / máy tính để bàn khác nhau bằng:

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

Mặc dù tôi đã không cố gắng làm cho nó hoạt động trong thiết lập nhiều đầu. Không biết nếu nó có thể.


Điều này thực sự hoạt động tốt hơn đối với tôi khi sửa hệ số tỷ lệ trong my-dpi từ 25.4 đến 17.2 (vì emacs sử dụng xrandr cho kích thước màn hình, không phải xdpyinfo)
Greg B
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.