Esiste un modo per controllare in quale finestra Emacs apre nuovi buffer?


12

Sto usando sr-speedbar con emacs e spesso ho il frame diviso in 2-3 finestre diverse e ogni volta che faccio clic su un file in sr-speedbar, apre sempre il nuovo buffer nella finestra più bassa. Sto cercando di mantenere la finestra in basso a destra come un termine ansi relativamente piccolo, ed emacs continua a insistere sull'apertura di nuovi buffer nella finestra a breve termine piuttosto che nell'area molto più grande che mi piacerebbe utilizzare per la modifica dei buffer.

C'è un modo in cui posso configurare la logica di creazione del buffer per preferire finestre più alte rispetto a quelle più basse?

Ho già provato a prendere la mia finestra più bassa e contrassegnarla come protetta, e questo ha fatto dividere Emacs in due porzioni irragionevolmente piccole. Quindi ho provato ad abilitare fixed-size-fixed e invece di far emacs aprire il buffer sopra quella finestra, mi ha fatto solo un errore che la finestra era troppo piccola per essere divisa. Bene immagino che abbia smesso di ostruire la mia finestra più bassa, ma stupido invece mi impedisce di aprire nuovi buffer.

Idealmente, vorrei essere in grado di forzare emacs a selezionare la finestra in alto a destra per visualizzare i buffer appena creati, non tentare di dividere la finestra in basso a destra.


Bella domanda, spero che qualcuno troverà una risposta.
cpoile

@cpoile l'ho fatto! Vedi la mia risposta
Aaron Miller,

Risposte:


8

Presumo che tu stia usando Emacs 24; Non ho testato questa risposta in nessuna versione precedente e non so quando il concetto di finestre dedicate è stato aggiunto a Emacs. Ho visto menzioni del suo utilizzo che risalgono al 2011, quindi presumo che Emacs 23 (almeno) abbia anche la capacità.

Puoi impedire ad Emacs di aprire un nuovo buffer in una determinata finestra dedicando la finestra al suo buffer .

Nel caso più semplice, puoi farlo selezionando la finestra che vuoi dedicare, assicurandoti che visualizzi attualmente il buffer a cui desideri dedicarlo, e poi facendo M-: (set-window-dedicated-p (selected-window) t). Ciò impedirà ad Emacs di considerare la finestra così modificata quando si decide in quale finestra mostrare un buffer. Per rimuovere la dedica, valuta la stessa espressione, sostituendo il secondo argomento con nil.

È possibile impedire ad Emacs di tentare di dividere una finestra che visualizza un determinato buffer impostando la variabile buffer-locale della finestra-dimensione-fissa su un valore diverso da zero.

Nel caso più semplice, puoi farlo selezionando la finestra e facendo M-: (setq window-size-fixed t). Per correggere solo l'altezza o la larghezza delle finestre che visualizzano il buffer, valutare la stessa espressione, passando 'heighto 'widthcome secondo argomento; per rimuovere la restrizione, sostituire il secondo argomento con nil.

Nel caso generale, ho trovato il tuo problema abbastanza interessante da hackerare una soluzione , che puoi inserire nel percorso di caricamento (require)e utilizzare:

;;; dedicate-windows-manually.el --- Manually (un)dedicate windows

;; Copyright (C) 2013 Aaron Miller
;; <me@aaron-miller.me>

;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 2 of
;; the License, or (at your option) any later version.

;; This program is distributed in the hope that it will be
;; useful, but WITHOUT ANY WARRANTY; without even the implied
;; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
;; PURPOSE.  See the GNU General Public License for more details.

;; You should have received a copy of the GNU General Public
;; License along with this program; if not, write to the Free
;; Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
;; MA 02111-1307 USA

;;; Commentary:

;; Introduction
;; ============

;; The functions here defined allow you to manually dedicate and
;; undedicate windows, that is, prevent `set-window-buffer' from
;; considering them when selecting a window in which to display a
;; given buffer.

;; Windows dedicated in this fashion will also be protected from
;; splitting by setting `window-size-fixed'.

;; Installation
;; ============

;; Place this file in your load path; then, place the following
;; command somewhere in your initialization file:

;; (require 'dedicate-windows-manually)

;; Now you can use M-x dedicate-window to dedicate the selected window
;; to its currently displayed buffer, M-x undedicate-window to release
;; a dedication so applied, and M-x dedicate-window-toggle to switch
;; between the states.

;; These functions will operate only on manually dedicated or
;; undedicated windows; that is, M-x dedicate-window will not dedicate
;; a window which is already dedicated (i.e. "(window-dedicated-p
;; window) -> t", and M-x undedicate-window will not undedicate a
;; window which was not dedicated by way of M-x dedicate-window.

;; If you find yourself frequently doing M-x dedicate-window-toggle,
;; you might wish to place something like this in your init file:

;; (global-set-key (kbd "C-x 4 C-d") 'dedicate-window-toggle)

;; Bugs:
;; * Changing the lighter string while you have windows dedicated is
;;   probably not a good idea.
;; * I should certainly find a better way to change the mode line.

;;; Code:

(defcustom dedicated-window-lighter-string " [D]"
  "A string, propertized with `dedicated-window-lighter-face', prepended
to the mode line of manually dedicated windows.")

(defvar dedicated-windows-by-hand nil
  "A list of windows known to have been manually dedicated. Windows not
in this list will not be undedicated by `undedicate-window'.")

(defun dedicate-window-was-by-hand-p (window)
  (let ((result nil))
    (loop for w in dedicated-windows-by-hand
          collect (if (eq w window) (setq result t)))
    result))

(defun dedicate-window (&optional window flag)
  "Dedicate a window to its buffer, and prevent it from being split.

Optional argument WINDOW, if non-nil, should specify a window. Otherwise,
or when called interactively, the currently selected window is used.

Optional argument FLAG, if non-nil, will be passed verbatim to
`set-window-dedicated-p'."
  (interactive nil)
  (if (eq nil window) (setq window (selected-window)))
  (if (eq nil flag) (setq flag t))
  (if (window-dedicated-p window)
      (message "Window is already dedicated.")
    (progn
      (add-to-list 'dedicated-windows-by-hand window)
      (setq mode-line-format
            (append `(,dedicated-window-lighter-string) mode-line-format))
      (setq window-size-fixed t)
      (set-window-dedicated-p window flag))))

(defun undedicate-window (&optional window)
  "Un-dedicate a window from its buffer.

Optional argument WINDOW, if non-nil, should specify a window listed in
`dedicated-windows-by-hand'. Otherwise, or when called interactively,
the currently selected window is used.

If WINDOW is not in `dedicated-windows-by-hand', a complaint will be
issued and nothing will be done."
  (interactive nil)
  (if (eq nil window) (setq window (selected-window)))
  (if (not (window-dedicated-p window))
      (message "Window is not dedicated.")
    (if (not (dedicate-window-was-by-hand-p window))
        (message "Window is not dedicated by hand.")
      (progn
        (setq dedicated-windows-by-hand
              (remove window dedicated-windows-by-hand))
        (setq mode-line-format
              (remove dedicated-window-lighter-string mode-line-format))
        (setq window-size-fixed nil)
        (set-window-dedicated-p window nil)))))

(defun dedicate-window-toggle (&optional window)
  "Toggle a window's manual buffer dedication state.

Optional argument WINDOW, if non-nil, should specify a window. Otherwise,
or when called interactively, the value of `selected-window' is used."
  (interactive nil)
  (if (eq nil window) (setq window (selected-window)))
  (if (window-dedicated-p window)
      (undedicate-window window)
    (dedicate-window window)))

(provide 'dedicate-windows-manually)

;;; dedicate-windows-manually.el ends here

4

Nelle recenti versioni di Emacs è display-buffer-aliststata aggiunta l' opzione . Fornisce un controllo accurato della visualizzazione del buffer, delle finestre utilizzate, ecc. Tuttavia, poiché consente di fare così tante cose, è anche abbastanza complesso e difficile da descrivere. Consultare la documentazione: C-h v display-buffer-alist.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.