【问题标题】:How do I close an automatically opened window in Emacs?如何关闭 Emacs 中自动打开的窗口?
【发布时间】:2009-07-31 13:04:23
【问题描述】:

这可能是一个非常幼稚的 Emacs 问题 - 我是新手。

当我评估一个 lisp 表达式时,如果出现错误,调试器会自动出现在另一个窗口中。如果我打开了 *scratch* 和 *info*(前者用于尝试 lisp,后者用于阅读它),那么调试器会在 *info* 所在的窗口中打开。此刻,我必须切换到该窗口,然后将其更改回 *info*,然后返回 *scratch*。 (如果我对缓冲区列表执行 C-x C-b 也会发生同样的事情。)我猜必须有一种方法可以在没有这么长的命令序列的情况下关闭该窗口。谁能赐教?

【问题讨论】:

  • 也许可以在 SuperUser 那里问这个问题?
  • 我确实考虑过...这是一个棘手的决定。可以交叉发帖吗? (我想我应该在 meta 上问这个问题:P)
  • 由于大多数关于 Emacs 的问题通常都涉及到编写一些 elisp,因此它们似乎在这里得到了最好的回答。 :)

标签: emacs


【解决方案1】:

至少在我的 emacs (22.3) 上,当调试器弹出时,它的窗口成为活动窗口。在那里,按 q 只是退出调试器,如果这是你想要的。到那时,它也脱离了递归编辑。

【讨论】:

  • 是的,这行得通!虽然它并没有解决持久缓冲区列表的情况,但也许这是另一个问题......
  • "q" 是许多弹出窗口的相当常见的退出机制。适用于 calc、calendar、debuggers、dired 和许多其他非内置的,如 browse-kill-ring。它也适用于持久缓冲区列表,但您必须先切换到缓冲区列表。如果你有一个特定的工作窗口配置,你可以用 C-x r w 存储它,然后随时用 C-x r j 跳回到它。
  • 我在玩 24.5,可以确认 'q' 解决方案。但是,如果 'q' 在任何情况下都失败了,C-x 0 也会关闭焦点窗口。
【解决方案2】:

据我了解,您希望在不将光标从当前窗口移动的情况下关闭另一个窗口中的缓冲区。

我没有任何现有的功能可以做到这一点,所以我推出了自己的功能。

(defun other-window-kill-buffer ()
  "Kill the buffer in the other window"
  (interactive)
  ;; Window selection is used because point goes to a different window
  ;; if more than 2 windows are present
  (let ((win-curr (selected-window))
        (win-other (next-window)))
    (select-window win-other)
    (kill-this-buffer)
    (select-window win-curr)))

您可以将它绑定到“C-x K”之类的东西或其他一些难以按的键上,这样您就不会误按它。

(global-set-key (kbd "C-x K") 'other-window-kill-buffer)

我经常使用这个! (对于帮助缓冲区、编译缓冲区、Grep 缓冲区以及我现在想关闭的普通旧缓冲区,而不移动该点)

【讨论】:

    【解决方案3】:

    我通常使用delete-other-windows 命令。 C-x 1

    太规律了,我重新绑定到 F4。

    官方文档:https://www.gnu.org/software/emacs/manual/html_node/emacs/Change-Window.html#Change-Window

    HTH

    【讨论】:

      【解决方案4】:

      使用winner mode,可以使用快捷键C-C向左箭头返回到之前的窗口配置。当然,这实际上并没有杀死新缓冲区,但它确实隐藏了它。

      【讨论】:

        【解决方案5】:

        我认为您正在寻找 C-x 4 C-o,它在“其他”窗口中显示缓冲区而不切换到它。

        如上所述,对于回溯缓冲区,您可能希望使用 q 退出它,以退出递归编辑。

        【讨论】:

          【解决方案6】:

          尝试使用popwin-mode。自动关闭窗口真是太好了。

          我想描述一下机制是如何工作的|

          您打开undo-tree-visualize 而不是找到正确的分支,之后当您通过switch-window 更改具有光标的活动窗口时,undo-tree 相关缓冲区将自动关闭其他窗口。

          【讨论】:

            【解决方案7】:

            一种可能的解决方案是使用窗口管理包。存储您的“首选”窗口排列,并在调试器/缓冲区窗口弹出并完成后,恢复到您的首选排列。

            有很多包可供选择,请参阅:wiki 上的switching window configurations

            此外,您可能想要找出触发额外(不需要的)窗口弹出的常用操作,并使用它在窗口弹出之前触发保存您的窗口配置。

            如果你想自己滚动(这很容易),你可以保存窗口配置,然后像这样恢复它:

            (setq the-window-configuration-i-want (current-window-configuration))
            (global-set-key (kbd "<f7>") 
                   (lambda () (interactive) 
                        (set-window-configuration the-window-configuration-i-want)))
            

            诀窍在于找出将the-window-configuration-i-want 的设置放在哪里。

            【讨论】:

              【解决方案8】:

              感谢@spk 提供了一个不错的功能。我只是将它修改为也关闭窗口并将其绑定到邪恶窗口中已经很好的窗口控制功能集(通过“C-w”):

              (use-package evil
                :bind (:map evil-window-map ("O" . delete-most-recent-window))
                :preface
                (defun delete-most-recent-window ()
                  "Kill the buffer in the most recent window."
                  (interactive)
                  ;; Window selection is used because point goes to a different window
                  ;; if more than 2 windows are present
                  (let ((win-curr (selected-window))
                        (win-other (next-window)))
                    (select-window win-other)
                    (kill-this-buffer)   
                    (delete-window)   ; <-- Added this
                    (select-window win-curr))))
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-11-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多