【问题标题】:How to force Emacs not to display buffer in a specific window?如何强制 Emacs 不在特定窗口中显示缓冲区?
【发布时间】:2009-06-16 15:05:43
【问题描述】:

我的 Windows 配置如下所示:

          +----------+-----------+
      |          |           |
      |          |           |
      |          |           |
      |          |           |
      |          |           |
      |          +-----------+
      |          |           |
      +----------+-----------+

我使用右下方的窗口进行特殊显示(如帮助、完成等),但当我调用使用 display-buffer 的命令(find-file-other-window 等)并调整其大小时,emacs 坚持使用该窗口窗口也是如此。这很烦人......有没有办法让emacs不使用那个窗口?我正在考虑建议display-buffer,但它是c 中的一个函数。对此有什么想法吗?

编辑:

主要基于 Trey 的回答,到目前为止,这对我有用:

(setq special-display-function 'my-display-buffer)
(setq special-display-regexps '(".*"))

(defun display-special-buffer (buf)
  "put the special buffers in the right spot (bottom rigt)"
    (let ((target-window (window-at (- (frame-width) 4) (- (frame-height) 4)))
          (pop-up-windows t))
      (set-window-buffer target-window buf)
      target-window))

(defun my-display-buffer (buf)
  "put all buffers in a window other than the one in the bottom right"
  (message (buffer-name  buf))
  (if (member (buffer-name buf) special-display-buffer-names)
      (display-special-buffer buf)
      (progn
        (let ((pop-up-windows t)
              (windows (delete (window-at (- (frame-width) 4) (- (frame-height) 4))
                         (delete (minibuffer-window) (window-list)))))
          (message (buffer-name (window-buffer (car windows))))
          (set-window-buffer (car (cdr windows)) buf)
          (car (cdr windows))))))

【问题讨论】:

    标签: emacs lisp elisp advising-functions


    【解决方案1】:

    嗯,有人已经问过same question for completion。我写了一个answer,看起来效果很好。

    看起来您可以使用相同的解决方案,除了添加到special-display-buffer-names 之外,您可以使用变量special-display-regexps。所以大致如下:

    (add-to-list 'special-display-regexps '(".*" my-display-buffers))
    
    (defun my-display-buffers (buf)
      "put all buffers in a window other than the one in the bottom right"
      (let ((windows (delete (window-at (- (frame-width) 2) (- (frame-height) 4))
                             (delete (minibuffer-window) (window-list))))
        (if (<= 2 (length windows))
            (progn 
              (select-window (cadr windows))
              (split-window-vertically)))
        (let ((pop-up-windows t))
          (set-window-buffer (car windows) buf)
          (car windows)))))
    

    显然,您必须修改正则表达式,使其与右下方窗口中实际需要的 *Help* 和其他缓冲区不匹配。

    关于建议display-buffer,这会奏效。您可以建议用 c 编写的函数,建议几乎适用于您想要的所有情况,除非函数是从 c 调用 或建议宏(这不起作用 b/c 宏通常是已经在所有使用它们的地方扩展)。

    【讨论】:

    • 我看到了另一个问题,确实使用了你的解决方案;但我的问题不一样。我不是要求强制 emacs 使用窗口,而是要求 emacs 不使用特定窗口。
    • 对,我不认为 Emacs 有排除窗口的能力,所以你必须使用修改版本从窗口列表中排除右下角的窗口。我注意到我在剪切/粘贴时忘记这样做了,让我更新一下。
    • 当你这样做时(车窗),它实际上返回当前的窗口。但是 (car (cdr windows)) 将完美运行。另外 (- (frame-height) 2) 有时会找到迷你缓冲区(因为它有时会扩展到 2 行),所以我使用 4 而不是 2。
    • 我在这里问了同样的问题link这是解决方案。谢谢!
    • if: `let' 绑定只能有一种值形式:if, (
    【解决方案2】:

    也许这样的事情可以工作:

    (defun display-buffer-avoiding-lr-corner (buffer &optional not-this-window)
      (save-selected-window
        (when (buffer-file-name buffer)
          (select-window (window-at (- (frame-width) 1)
                                    (- (frame-height) 2))))
        (let ((display-buffer-function nil))
          (display-buffer buffer not-this-window))))
    
    (setq display-buffer-function 'display-buffer-avoiding-lr-corner)
    

    【讨论】:

      【解决方案3】:

      我正在考虑建议显示缓冲区,但它是 c 中的一个函数。

      "display-buffer is an interactive Lisp function in `window.el'."
      

      此外,您也可以建议 C 函数。

      【讨论】:

      • 我的 emacs 说“显示缓冲区是‘C 源代码’中的交互式内置函数。”也许是版本差异?
      【解决方案4】:

      也许让set-window-dedicated-p 专用于右下方的窗口对您来说是有意义的。然后在find-file-other-window之类的操作中会根据需要忽略此窗口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多