DPIの変更に合わせてテキストをすばやく調整する


9

私のラップトップは4K画面を備えているため、外部モニターよりもはるかに高いDPIを持っています。したがって、外部モニターの使用から組み込みのラップトップ画面に切り替えるときに、テキストと、可能であれば、EmacsのすべてのGUIウィジェットを新しいDPIに合わせてすばやくスケーリングしたいと考えています。私はset-frame-fontを知っていますが、スケーリングを調整する対応する関数も見つかりませんでした。そして、text-scale-adjustはローカルのバッファでのみ機能します。

回答:


7
  1. 現在のモニター/ディスプレイに応じて、パラメーターdefault-frame-alistを含むの値をfont条件付きで設定できます。(関数display-monitor-attributes-listを使用して、モニター/ディスプレイ情報を提供できます。)これにより、異なるモニターまたは他の異なるコンテキストに対して異なるデフォルトのフォントサイズを使用できます。

  2. また、コマンドを使用して、任意のフレームに示されているすべてのウィンドウとバッファのために、動的にフォントサイズを変更することができzoom-inzoom-outまたはzoom-in/outライブラリから、zoom-frm.el

    これらの同じコマンドは、バッファ(すべてのウィンドウで、どのフレームでも)またはフレーム(すべてのウィンドウで、そのバッファで)をズームできます。Emacs WikiページSet Fontsを参照してください。


4

私は@gavenkoaに似たものを使用して(純粋に偶然にもmy-dpi!という名前のヘルパーzoom-frmを使用して)、新しいフレームを適切なサイズにしますが、とにかくそのパッケージを使用しているので呼び出します。frame-monitor-attributes代わりにを使用することで、マルチヘッドセットアップでも機能し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)

フレームが別のディスプレイに最初に表示され、DPIが変更されたときにこれを自動的にトリガーする方法がある場合
クロコジル

(add-hook 'after-make-frame-functions #'my-zoom-frm-by-dpi)フレームの作成時に実行されます。既存のフレームをディスプレイ間で移動するためのフックがあるかどうかはわかりません。
unhammer

2
これを見つけた: github.com/mnp/dispwatch
krokodil

2
Windowsでは、「geometry」属性の代わりに「workarea」属性を使用した場合、my-dpi関数の方が少し正確であることがわかりました。これは、「mm-size」属性がタスクバーなどによって隠されていない領域のサイズであるためです。
華やかな

編集後、display使ってみませんmy-dpiか?
KevinOrr

2

私は異なるラップトップ/デスクトップ間で私の設定を移植可能にしました:

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

私はそれをマルチヘッド設定で動作させることを試みていませんが。それが可能かどうかわからない。


これは、my-dpiのスケーリングファクターを25.4から17.2に修正するときに実際にうまく機能します(emacsはxdpyinfoではなくxrandrをモニターディメンションに使用しているため)
Greg B
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.