Existe uma maneira de controlar em qual janela o Emacs abre novos buffers?

8

Estou usando a sr-speedbar com o emacs, e geralmente tenho o quadro dividido em duas ou três janelas diferentes e, sempre que clico em um arquivo na sr-speedbar, ele sempre abre o novo buffer na janela mais baixa. Estou tentando manter a janela inferior direita como um termo relativamente pequeno, e o emacs continua insistindo em abrir novos buffers na janela de curto prazo, em vez de na área muito maior que gostaria de usar para editar buffers.

Existe alguma maneira de configurar a lógica de criação de buffer para preferir janelas mais altas em janelas inferiores?

Eu já tentei pegar minha janela mais baixa e marcá-la como protegida, e isso fez com que o emacs a dividisse em duas porções excessivamente pequenas. Então tentei ativar o tamanho do tamanho da janela e, em vez de fazer o emacs abrir o buffer acima dessa janela, ele simplesmente me deu um erro dizendo que a janela era muito pequena para ser dividida. Bom, eu acho que parou de bater na minha janela mais baixa, mas burro que me impede de abrir novos buffers em vez disso.

Idealmente, gostaria de forçar o emacs a selecionar a janela superior direita para exibir os buffers recém-criados, e não tentar dividir a janela inferior direita.

    
por robru 13.04.2013 / 23:18

2 respostas

7

Suponho que você esteja usando o Emacs 24; Eu não testei esta resposta em nenhuma versão anterior e não sei quando o conceito de janelas dedicadas foi adicionado ao Emacs. Eu vi menções de seu uso que datam de 2011, então eu assumo que o Emacs 23 (pelo menos) também tem a capacidade.

Você pode impedir que o Emacs abra um novo buffer em uma determinada janela por dedicatória a janela para o seu buffer .

No caso mais simples, você pode fazer isso selecionando a janela que deseja dedicar, garantindo que ela exiba o buffer ao qual você deseja dedicar e, em seguida, fazendo M-: (set-window-dedicated-p (selected-window) t) . Isso impedirá que o Emacs considere a janela modificada ao decidir em qual janela mostrar um buffer. Para remover a dedicação, avalie a mesma expressão, substituindo o segundo argumento por nil .

Você pode impedir que o Emacs tente dividir uma janela que exibe um determinado buffer definindo a variável local do buffer como fixada pelo tamanho da janela para um valor diferente de zero.

No caso mais simples, você pode fazer isso selecionando a janela e fazendo M-: (setq window-size-fixed t) . Para corrigir apenas a altura ou a largura das janelas que exibem o buffer, avalie a mesma expressão, passando 'height ou 'width como o segundo argumento; para remover a restrição, substitua o segundo argumento por nil .

No caso geral, achei seu problema interessante o suficiente para hackear uma solução , que você pode colocar no caminho de carregamento, (require) e usar:

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

;; Copyright (C) 2013 Aaron Miller
;; <[email protected]>

;; 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
    
por 14.08.2013 / 23:48
2

Na opção de lançamentos recentes do Emacs display-buffer-alist foi adicionado. Ele fornece controle refinado sobre a exibição do buffer, janelas usadas, etc. No entanto, porque permite fazer muitas coisas, também é bastante complexo e difícil de descrever. Consulte a documentação: C-h v display-buffer-alist .

    
por 01.09.2013 / 23:14

Tags