【问题标题】:How can I prevent Emacs resizing my windows?如何防止 Emacs 调整我的窗口大小?
【发布时间】:2011-06-10 15:39:28
【问题描述】:

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

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

之前:

_______
|     |
|     |
_______
|_____|

之后:

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

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

我怎样才能做到这一点?

谢谢!再见!

阿尔弗雷多

【问题讨论】:

  • 注意:铁杆 Emacs 用户会使用 M-x artist 进行绘制。 :P
  • 哇...艺术家模式...我不知道 Emacs 内置了这么漂亮的小玩具...谢谢 Trey!

标签: emacs resize window


【解决方案1】:

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

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

【讨论】:

  • 感谢大家,这与我正在寻找的东西最接近。由于与 ECB(Emacs 代码浏览器)冲突,我无法使用获胜者模式,但窗口配置注册可以完成这项肮脏的工作:)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      winner-mode 是救命稻草,但要让pop-to-buffer 不首先调整窗口大小,请这样做

      (setq even-window-heights nil)
      

      【讨论】:

        【解决方案5】:

        要禁用窗口缩小,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) 出于某种被遗忘的原因,但它可能不是普遍需要的。

        注意这使用了在 Emacs 24.4 中添加的新通知 API。如果您需要使用旧的 Emacs 版本,旧的通知 API 可以用不同的语法做同样的事情。

        【讨论】:

          【解决方案6】:

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

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

          或通过 GUI 使用:

          选项 > 自定义 Emacs > 特定选项 > 'frame-inhibit-implied-resize' > Value Menu = 'Always' & Apply and Save

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


          来自 [1]:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-06
            • 1970-01-01
            • 2014-03-24
            • 1970-01-01
            • 1970-01-01
            • 2018-08-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多