如何控制在Emacs中用于新内容的窗口?

时间:2014-08-23 21:39:00

标签: emacs

通常我会在一个框架内仔细排列多个窗口。

然而,某些命令,例如M-x man RET将抓住其中一个可见窗口以显示其自己的内容。有时这很烦人,因为被带走的窗口是我需要保持可见的窗口。

e.g。我在屏幕上有3个窗口,一个有用的源代码窗口和两个无用的窗口。我想在查看man页面时保持源代码窗口可见。但是Emacs经常会删除新打开的手册页的代码窗口。

我能想到的一种方法是显示每个窗口的(按时间顺序)打开顺序,这样我就可以将注意力集中在第n个窗口,并确信Emacs会抓住(第n + 1)个窗口内容。

有没有办法显示这样的订单,例如在每个窗口的模式行?

还是有另一种方法可以更好地控制显示新窗口吗?

2 个答案:

答案 0 :(得分:2)

有点晚了,但正如评论中所讨论的那样,使用专用窗口是一种控制新内容显示位置的好方法(提交+1的@lawlist以及提及切换的@phils!)。

我很确定你现在能够实现一个自己切换专注的命令,但是由于我有这个方便的代码,我还是会分享它:

(defun toggle-window-dedicated ()
  "Control whether or not Emacs is allowed to display another
buffer in current window."
  (interactive)
  (message
   (if (let (window (get-buffer-window (current-buffer)))
         ; set-window-dedicated-p returns FLAG that was passed as
         ; second argument, thus can be used as COND for if:
         (set-window-dedicated-p window (not (window-dedicated-p window))))
       "%s: Can't touch this!"
     "%s is up for grabs.")
   (current-buffer)))

(global-set-key (kbd "C-c d") 'toggle-window-dedicated)

现在,在多窗口设置中,您只需在每个窗口中按 C-c d 即可保护"。

答案 1 :(得分:2)

我将display-buffer-alist的这个示例用法放入混合中,因为它已在评论中提到,并且确实是控制缓冲区显示方式和位置的一般机制(尽管如此德鲁表示,这远不是微不足道的。)

从变量本身的帮助开始:
C-h v display-buffer-alist RET

从那里你将获得display-buffer的帮助,毫无疑问会对所涉及的复杂性有所了解。)

在任何情况下,以下是使用自定义函数来决定如何显示名为*Buffer List*的缓冲区的示例。

您可以很容易地看到,如果您可以编写一个可以找出如何在您希望的位置显示缓冲区的函数,那么您可以使用display-buffer-alist来实现它。

(defun my-display-buffer-pop-up-same-width-window (buffer alist)
  "A `display-buffer' ACTION forcing a vertical window split.
    See `split-window-sensibly' and `display-buffer-pop-up-window'."
  (let ((split-width-threshold nil)
        (split-height-threshold 0))
    (display-buffer-pop-up-window buffer alist)))

(add-to-list 'display-buffer-alist
             '("\\*Buffer List\\*" my-display-buffer-pop-up-same-width-window))

关于ACTION功能的关键引用是:

  

每个这样的FUNCTION都应该接受两个参数:缓冲区   显示和一个列表。基于这些论点,它应该   显示缓冲区并返回窗口。