2009-06-16 13 views
18

Meine Fenster Konfiguration sieht wie folgt aus:Wie erzwinge ich, dass Emacs keinen Puffer in einem bestimmten Fenster anzeigt?

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

Und ich verwende die untere rechte Fenster für spezielle Displays (wie Hilfe, Abschluss etc.), aber Emacs besteht auf das Fenster zu verwenden, wenn ich Befehle aufrufen (find-file-other-window, etc .) das display-buffer verwenden, und die Größe dieses Fensters auch ändern. Es ist nervig ... Gibt es eine Möglichkeit, dass ich emacs zwingen kann, diese Fenster NICHT zu benutzen? Ich dachte an Beratung display-buffer, aber es ist eine Funktion in c. Irgendwelche Gedanken dazu?

EDIT:

Basierend stark auf Trey Antwort, das ist was für mich so weit:

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

Antwort

18

Nun, jemand bereits die same question for completion gefragt. Und ich schrieb eine answer, die ziemlich gut zu funktionieren schien.

Es sieht so aus, als ob Sie dieselbe Lösung verwenden könnten, außer dass Sie statt special-display-buffer-names die Variable special-display-regexps verwenden können. So etwas entlang der Linien von:

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

Offensichtlich haben Sie die regexp ändern müssen, um nicht die *Help* und andere Puffer übereinstimmen, die Sie tatsächlich in der unteren rechten Fenster werden soll.

In Bezug auf die Beratung display-buffer, das würde funktionieren. Sie können in c geschriebene Funktionen vorschlagen, Ratschläge funktionieren in fast allen Fällen, außer wenn die Funktionen von aus c aufgerufen werden oder Makros beraten (was nicht funktioniert b/c die Makros sind in der Regel bereits überall erweitert) wieder verwendet).

+0

Ich sah die andere Frage und tatsächlich Ihre Lösung verwendet; aber meine Frage ist nicht die gleiche. Ich frage nicht, Emacs zu zwingen, ein Fenster zu verwenden, sondern auf Emacs, um ein bestimmtes Fenster NICHT zu verwenden. – polyglot

+0

Richtig, ich denke nicht, dass Emacs Windows ausschließen kann, also müssen Sie eine modifizierte Version verwenden, um das Fenster unten rechts aus der Fensterliste auszuschließen. Ich bemerke, dass ich vergessen habe, das in meinem Cut/Paste Eile zu tun, lemme Update das. –

+0

Wenn Sie (Autofenster) tun, gibt es tatsächlich die aktuellen Fenster zurück. Aber (Auto (CDR Windows)) wird perfekt funktionieren. Auch (- (frame-height) 2) findet manchmal stattdessen den Mini-Puffer (da er manchmal auf 2 Zeilen erweitert wird), also benutze ich 4 statt 2. – polyglot

3

Vielleicht so etwas wie dies funktionieren könnte:

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

I Display-Puffer zu beraten dachte, aber es ist eine Funktion in c.

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

Auch können Sie auf C-Funktionen sowieso beraten.

+0

Mein Emacs sagt "Anzeigepuffer ist eine interaktive eingebaute Funktion in' C-Quellcode '. " Versionsunterschiede, vielleicht? – polyglot

2

Vielleicht macht es Sinn, dass Sie dieses untere rechte Fenster von set-window-dedicated-p dediziert machen. Dann wird dieses Fenster in Operationen wie find-file-other-window wie Sie wollen ignoriert.