18

私のWindows構成は次のようになります。

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

そして、私は右下のウィンドウを特別な表示(ヘルプ、完了など)に使用しますが、emacsは、を使用するコマンド(find-file-other-windowなど)を呼び出しdisplay-buffer、そのウィンドウのサイズも変更するときに、そのウィンドウを使用することを主張します。迷惑です...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))))))
4

4 に答える 4

18

さて、誰かがすでに同じ質問をして完了しました。そして、私はかなりうまくいくように思われる答えを書きました。

に追加する代わりに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では機能しません。マクロは通常、使用されるすべての場所で既に展開されています) )。

于 2009-06-16T15:16:20.793 に答える
3

おそらく、このようなものが機能する可能性があります。

(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)
于 2009-06-16T16:35:21.177 に答える
2

display-bufferのアドバイスを考えていましたが、これはcの関数です。

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

また、とにかくC関数をアドバイスすることができます。

于 2009-06-16T21:58:30.700 に答える
2

たぶん、この右下のウィンドウをによって専用にするのは理にかなっていますset-window-dedicated-p。その後、このウィンドウは必要に応じて操作で無視さfind-file-other-windowれます。

于 2012-04-24T15:19:43.733 に答える