代码之家  ›  专栏  ›  技术社区  ›  polyglot

如何强制Emacs在特定窗口中不显示缓冲区?

  •  18
  • polyglot  · 技术社区  · 17 年前

    我的windows配置如下所示:

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

    find-file-other-window 等)使用 display-buffer ,并调整该窗口的大小。真烦人。。。有没有办法强制emacs不要使用该windows?我在考虑提供建议 显示缓冲区 ,但它是c中的一个函数。有什么想法吗?

    编辑:

    根据特雷的回答,到目前为止,这对我来说是有效的:

    (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))))))
    
    4 回复  |  直到 12 年前
        1
  •  18
  •   Community Mohan Dere    9 年前

    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)))))
    

    显然,您必须修改regexp以使其与 *Help*

    关于建议 display-buffer 从c或建议宏(b/c不起作用,宏通常已在使用的任何地方展开)。

        2
  •  3
  •   huaiyuan    17 年前

    也许这样的方法可以奏效:

    (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
  •  2
  •   jrockway    17 年前

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

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

    另外,您也可以建议使用C函数。

        4
  •  2
  •   V_V    14 年前

    也许你可以把这个右下角的窗口用 set-window-dedicated-p . 然后,此窗口将在以下操作中被忽略: find-file-other-window 随你的便。