如何防止Emacs调整我的窗口大小?

10

我的Lisp工作环境将框架分为两个窗口,前一个用于主要编码,后一个用于我的slime评估。

不幸的是,当我犯了一些错误(因为我还在学习Lisp: P),slime调试器会警告我,并且它会显示在自动调整大小的底部窗口中。 只是为了更明确:

之前:

_______
|     |
|     |
_______
|_____|

AFTER:

_______
|     | <- decreased in size!
_______
|_____| <- increased in size!

我怎样才能防止Emacs调整我的窗口大小?我希望Emacs保持我的窗口尺寸不变。

我该如何实现这个目标呢?

谢谢!再见!

Alfredo


5
注意:一个死忠的Emacs用户可能会使用"M-x artist"来进行绘画。 :P - Trey Jackson
1
哇...艺术家模式...我不知道Emacs内置了这样一个漂亮的小玩具...谢谢Trey! - A. Levy
6个回答

8

您可以使用命令M-x window-configuration-to-register(或C-x r w)来记住您的窗口配置。

之后,您可以始终使用M-x jump-to-register(或C-x r j)恢复您的配置。


感谢大家,这是最接近我寻找的东西。由于与ECB(Emacs Code Browser)冲突,我无法使用winner-mode,但window-configuration-to-register完成了脏活 :) - Alfredo Di Napoli

6

winner-mode 是一个救命稻草,但是为了让pop-to-buffer一开始就不改变窗口大小,请执行以下操作:

(setq even-window-heights nil)

5

很不幸,几乎每个emacs程序都使用的主要命令pop-to-buffer,用于在不同窗口之间切换缓冲区,会产生你所描述的副作用。

除了迄今为止的所有其他解决方案外,还有一种胜利者模式,可以在任何时候撤消/重做窗口配置中的任何更改。


4

如果你调用的某个代码改变了窗口配置,你可以使用 (save-window-excursion BODY ...) 语句将你的代码包装起来。

如果是调试器改变了配置 - 按 "q" 键,旧的配置将会被还原。

如果你不想让调试器改变窗口大小,尝试添加一个 debugger-mode-hook 来恢复你的窗口大小。


1
为了禁用窗口缩小,需要将shrink-window-if-larger-than-buffer设置为无操作。你可以重新定义它来什么也不做,但如果你建议它,你就可以随意启用和禁用它。
;; never shrink windows
(defvar allow-window-shrinking nil
  "If non-nil, effectively disable shrinking windows by making `shrink-window-if-larger-than-buffer' a no-op.")
(advice-add 'shrink-window-if-larger-than-buffer
            :before-while
            (lambda (&rest args)
              "Do nothing if `allow-window-shrinking' is nil."
              allow-window-shrinking))

你可以建议调用shrink-window-if-larger-than-buffer的其他函数启用或禁用缩小功能:
(advice-add 'some-function-that-resizes-windows
            :around
            (lambda (orig &rest args)
              "enable shrinkage"
              (let ((allow-window-shrinking t))
                (apply orig args))))

我有一段旧代码,实际上就是上面的代码,并且我曾经在(apply orig args)周围包裹了ignore-errors,出于某些被遗忘的原因,但它可能并非普遍需要。
注意:这使用了新的advice API,在Emacs 24.4中添加。如果您需要使用旧版本的Emacs,则旧的advice API可以使用不同的语法执行相同的操作。

0
将“frame-inhibit-implied-resize”变量设置为“true” [1],可以通过配置文件(~/.emacs等)实现:

(custom-set-variables '(frame-inhibit-implied-resize t))

或者通过GUI实现:

选项 > 自定义Emacs > 特定选项 > “frame-inhibit-implied-resize” > 值菜单 = “始终” & 应用并保存

在后一种方法中,“自定义选项:Frame Inhibit Implied Resize”缓冲区中的“状态”应指示为“已保存和设置”,而不是“标准”。

来自 [1]:

"如果 {Frame Inhibit Implied Resize} 为 nil,则设置特定框架的字体、菜单栏、工具栏、内部边框、缝隙或滚动条可能会调整框架大小,以保持其显示的列数或行数。 如果此选项为 t,则不进行任何调整。(..)"


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