2009-06-16 6 views
18

Ma configuration Windows ressemble à ceci:Comment forcer Emacs à ne pas afficher le tampon dans une fenêtre spécifique?

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

Et j'utiliser la fenêtre en bas à droite pour les écrans spéciaux (comme l'aide, l'achèvement, etc.), mais emacs insiste sur l'utilisation de cette fenêtre quand je l'appelle commandes (find-file-other-window, etc. .) qui utilisent display-buffer et redimensionnent également cette fenêtre. C'est embêtant ... Existe-t-il un moyen de forcer Emacs à ne PAS utiliser cette fenêtre? Je pensais conseiller display-buffer, mais c'est une fonction dans c. Des pensées à ce sujet?

EDIT:

Basé en grande partie sur la réponse de Trey, c'est ce qui fonctionne pour moi jusqu'à présent:

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

Répondre

18

Eh bien, quelqu'un a déjà demandé au same question for completion. Et j'ai écrit un answer qui semblait fonctionner plutôt bien.

Il semble que vous pourriez utiliser la même solution, sauf qu'au lieu d'ajouter à special-display-buffer-names, vous pouvez utiliser la variable special-display-regexps. Donc, quelque chose le long des lignes de:

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

Évidemment, vous devrez modifier l'expression régulière pour correspondre pas les *Help* et d'autres tampons que vous voulez réellement dans la fenêtre en bas à droite.

En ce qui concerne conseiller display-buffer, cela fonctionnerait. Vous pouvez conseiller les fonctions écrites en c, le conseil fonctionne dans presque tous les cas, sauf lorsque les fonctions sont appelées depuis c, ou si elles conseillent des macros (ce qui ne fonctionne pas car les macros sont généralement déjà étendues partout où elles ' re utilisé).

+0

J'ai vu l'autre question et en effet utilisé votre solution; mais ma question n'est pas la même. Je ne demande pas de forcer emacs à utiliser une fenêtre mais sur emacs de ne PAS utiliser une fenêtre spécifique. – polyglot

+0

Juste, je ne pense pas qu'Emacs a la capacité d'exclure Windows, donc vous devrez utiliser une version modifiée pour exclure la fenêtre en bas à droite de la liste des fenêtres. Je remarque que j'ai oublié de faire ça dans mon pressé couper/coller, lemme mise à jour ça. –

+0

Lorsque vous faites (windows de la voiture), il retourne effectivement les fenêtres en cours. Mais (voiture (cdr windows)) fonctionnera parfaitement. Aussi (- (frame-height) 2) parfois trouver le mini-buffer à la place (puisqu'il s'étend parfois jusqu'à 2 lignes), donc j'utilise 4 au lieu de 2. – polyglot

3

Peut-être quelque chose comme cela pourrait fonctionner:

(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

Je pensais conseiller affichage tampon, mais il est une fonction c.

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

Vous pouvez également conseiller les fonctions C de toute façon.

+0

Mon emacs dit "display-buffer est une fonction intégrée interactive dans le" code source C "." Différences de version, peut-être? – polyglot

2

Il sera peut-être judicieux de créer cette fenêtre en bas à droite de set-window-dedicated-p. Alors cette fenêtre sera ignorée dans les opérations comme find-file-other-window comme vous voulez.

Questions connexes