在emacs窗口中增加/减小字体大小(不仅仅是缓冲区)

8
使用C-x C-+C-x C--(text-scale-adjust)很方便地在一个缓冲区中增加/减小字体大小。当几个人共同在同一台监视器前工作时,这很有用,可以避免头部碰撞。
是否有一种方法可以在一个框架中(或同时在所有框架中)增加(稍后减少)字体大小?我想知道是否有比以下方法更快的方法:1-在每个新缓冲区中重新输入C-x C-+,2-调用M-x x-select-font并使用鼠标选择,以及3-在scratch缓冲区中运行elisp代码。
更新:
如果您不仅想满足上述1-3,还想满足:
4- Keep the size (and position) of the frame still.

那么请看这个问题。

6个回答

6

基于 @Jordon Biondo 的回答,这是另一种解决更改框架大小的副作用的替代方案,它使用带有参数 KEEP-SIZE 等于 tset-frame-font

;; Resize the whole frame, and not only a window
;; Adapted from https://dev59.com/pIHba4cB1Zd3GeqPRXNt#24714383
(defun acg/zoom-frame (&optional amt frame)
  "Increaze FRAME font size by amount AMT. Defaults to selected
frame if FRAME is nil, and to 1 if AMT is nil."
  (interactive "p")
  (let* ((frame (or frame (selected-frame)))
         (font (face-attribute 'default :font frame))
         (size (font-get font :size))
         (amt (or amt 1))
         (new-size (+ size amt)))
    (set-frame-font (font-spec :size new-size) t `(,frame))
    (message "Frame's font new size: %d" new-size)))

(defun acg/zoom-frame-out (&optional amt frame)
  "Call `acg/zoom-frame' with negative argument."
  (interactive "p")
  (acg/zoom-frame (- (or amt 1)) frame))

(global-set-key (kbd "C-x C-=") 'acg/zoom-frame)
(global-set-key (kbd "C-x C--") 'acg/zoom-frame-out)
(global-set-key (kbd "<C-down-mouse-4>") 'acg/zoom-frame)
(global-set-key (kbd "<C-down-mouse-5>") 'acg/zoom-frame-out)

1
不错!正好赶上(疫情期间)要求人们不要因为你正在展示东西而把头贴在你的肩膀上。调整大小有点突兀,但只需要做一次,直到每个人都确认他们可以清楚地从自己所在的位置看到即可。 - Calaf
2
对我来说非常好用! - Dave Abrahams
1
它完美地工作了!(尽管为什么缩放要用 C-x C-= 而不是 C-x C-+?)这个答案应该成为另一个得到大量投票的 如何在Emacs中设置字体大小? 帖子中的第一个答案! - kotchwane
1
可以了!顺便问一下,down-mouse-4/5 按钮是什么? - Ev Dolzhenko
1
@EvDolzhenko,如果我没记错的话,这些是鼠标滚轮事件。 - Arthur Colombini Gusmão

3
请参阅Emacs维基页面frame zooming,了解有关此操作的几种方法,包括来自库zoom-frm.eldoremi-frm.elframe-cmds.el的命令。
特别地,单个命令zoom-in/out允许您缩放框架或缓冲区。 (前者:缩放框架,是您所请求的内容。)

1
这三个都无法通过Melpa获取。是不是应该硬着头皮手动安装它们的依赖(每个都有好几个)? - Calaf
@Calaf:如果想要使用这些库,是的,这些库是免费提供的。手动将它们放入一个在load-path中的目录并进行require并不难。但如果不想这样做,那么也可以不使用这些库。 - Drew
有趣...这真的是一个无辜的问题。我不熟悉将某些东西放入melpa的过程,而其中一个是...嗯...我仍然手动维护自己的收藏夹,部分原因是有时防火墙使这成为唯一的选择。但我也一直在想,现在已经是2019年了,我应该现代化设置并完全使用melpa。很高兴知道你特别支持这种方法,认为它不是古怪的,或者还没有变得古怪。 - Calaf
1
@Calaf:抱歉如果我听起来很严厉。对于额外的麻烦感到抱歉。 - Drew

3

这并不是最正确的做法,我曾经使用这些函数来进行逐帧调整大小:

在这种情况下,通过更改默认表情的:height属性来完成。

(defun zoom-frame (&optional n frame amt)
  "Increase the default size of text by AMT inside FRAME N times.
  N can be given as a prefix arg.
  AMT will default to 10.
  FRAME will default the selected frame."
  (interactive "p")
  (let ((frame (or frame (selected-frame)))
        (height (+ (face-attribute 'default :height frame) (* n (or amt 10)))))
    (set-face-attribute 'default frame :height height)
    (when (called-interactively-p)
      (message "Set frame's default text height to %d." height))))

(defun zoom-frame-out (&optional n frame amt)
  "Call `zoom-frame' with -N."
  (interactive "p")
  (zoom-frame (- n) frame amt))


(global-set-key (kbd "C-c z i") 'zoom-frame)

(global-set-key (kbd "C-c z o") 'zoom-frame-out)

这会缩放整个框架,而不仅仅是文本,因此它会在您的桌面上缩小或扩大,可能会超出可见范围,并要求您的操作系统重新绘制。

另一个可能的解决方案是设置一个框架本地变量来确定所需的高度,并使用钩子每次选择缓冲区时重新显示该缓冲区中的文本以适应框架的所需大小。除非一个缓冲区在两个框架中显示,否则这将运行得相当不错。


0

您可以使用命令行更改所有框架的字体大小

$ emacsclient -e "(set-face-attribute 'default nil :height 180)"

height 的值更改为您的需要。 然后将该命令绑定到窗口管理器提供的别名或快捷方式。

0

一个简单的解决方案

我注意到尽管我通常使用C-x +来缩放,但我也可以使用C-+来达到同样的效果。这启发了我一个好的想法:

  • 我可以按住一个按钮(C),然后重复按下另一个按钮(+)来缩放。

这意味着我可以保持C-x +的行为只影响当前缓冲区的缩放,同时有另一个键C-+来影响整个框架的缩放。在我看来,这是很好的行为 - 您的要求可能会有所不同。代码也很简单:

(defvar face-attribute-height 125
  "Default font face height when Emacs starts.")

(defun face-attribute-height-increase ()
  (interactive)
  (setq face-attribute-height (+ face-attribute-height 5))
  (set-face-attribute 'default nil :height face-attribute-height)
  )
(defun face-attribute-height-decrease ()
  (interactive)
  (setq face-attribute-height (- face-attribute-height 5))
  (set-face-attribute 'default nil :height face-attribute-height)
  )

(define-key global-map (kbd "C-+") 'face-attribute-height-increase)
(define-key global-map (kbd "C--") 'face-attribute-height-decrease)

我不是一个“专家”elisp编码者,它可能可以写得更好。欢迎反馈!


-1

不,文本缩放并不是缩放。全局文本缩放只是应用于所有缓冲区的缓冲区缩放。帧和缓冲区缩放是两个不同的概念。有关差异的信息,请参见您提供的第二个链接。 - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接