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

时间:2011-01-17 19:10:41

标签: emacs resize window

我的Lisp工作环境将框架拆分为两个窗口,前者用于主编码,后者用于我的粘贴评估。

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

在:

_______
|     |
|     |
_______
|_____|

在:

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

如何阻止Emacs调整窗口大小?我希望Emacs让我的窗口尺寸保持不变。

我该如何实现?

谢谢!再见!

阿尔弗雷

6 个答案:

答案 0 :(得分:8)

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

您可以随时使用M-x跳转到寄存器(或C-x r j)恢复配置。

答案 1 :(得分:5)

不幸的是,主要命令pop-to-buffer几乎被emacs中的每个程序用来切换到不同窗口中的缓冲区,它具有你所描述的副作用。

到目前为止,除了所有其他解决方案之外,还有winner mode可以随时撤消/重做窗口配置中的任何更改。

答案 2 :(得分:4)

如果您调用的某些代码更改了窗口配置,则可以 用(save-window-excursion BODY ...)

包装你的代码

如果是更改配置的调试器 - 点击“q”,将重新保留旧配置。

如果您希望调试器不更改大小,请尝试添加调试器模式挂钩以恢复窗口大小。

答案 3 :(得分:2)

winner-mode是救星,但要让pop-to-buffer不首先调整窗口大小,请执行

(setq even-window-heights nil)

答案 4 :(得分: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))))

我有一段旧的代码,基本上就是上面的内容,并且由于某些被遗忘的原因我ignore-errors缠绕(apply orig args),但它可能并非普遍需要。

N.B。这使用了在Emacs 24.4中添加的新建议API。如果您需要使用旧的Emacs版本,旧的建议API可以使用不同的语法执行相同的操作。

答案 5 :(得分:0)

通过配置文件(〜/ .emacs等)将'frame-inhibit-implied-resize'变量设置为'true'[1]:

  

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

或通过GUI使用:

选项>自定义Emacs>特定选项>'禁止框架暗示调整大小'>值菜单='始终'并应用并保存

对于后一种方法,“自定义选项:禁止显示隐式调整大小”缓冲区中的“状态”应指示“已保存并设置”,而不是“标准”。


来自[{1]:

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