101 lines
3.2 KiB
EmacsLisp
101 lines
3.2 KiB
EmacsLisp
|
;;; bw.el --- Show stuff in a bottom window
|
||
|
|
||
|
;; Copyright (C) 2012 Tom Willemsen
|
||
|
|
||
|
;; Author: Tom Willemsen <slash@drd>
|
||
|
;; Keywords: convenience
|
||
|
;; Version: 0
|
||
|
|
||
|
;; 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 3 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, see <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
;;; Commentary:
|
||
|
|
||
|
;; Show stuff in a bottom window.
|
||
|
|
||
|
;;; Code:
|
||
|
|
||
|
(defvar bw-last-shown-buffer nil
|
||
|
"The last buffer shown by bw.")
|
||
|
|
||
|
(defadvice quit-window (around delete-window-perhaps activate)
|
||
|
"Delete the bottom window if necessary."
|
||
|
(let* ((win (window-normalize-window (ad-get-arg 2)))
|
||
|
(delp (and (window-parameter win 'bw-bottom)
|
||
|
(string-match-p "^\\*.*\\*$"
|
||
|
(buffer-name (window-buffer win))))))
|
||
|
ad-do-it
|
||
|
(when delp
|
||
|
(delete-window win))))
|
||
|
|
||
|
(defun bw-create-window ()
|
||
|
"Create the bottom window."
|
||
|
(let ((win (split-window (frame-root-window) -20 'below)))
|
||
|
(set-window-parameter win 'bw-bottom t)
|
||
|
;; Don't allow splitting of the bottom window.
|
||
|
(set-window-parameter win 'split-window (lambda (window size side) nil))
|
||
|
;; Don't allow deleting other windows in the bottom window.
|
||
|
(set-window-parameter win 'delete-other-windows (lambda (window) nil))
|
||
|
win))
|
||
|
|
||
|
(defun bw-get-window ()
|
||
|
"Try to get the bottom window."
|
||
|
(let (win)
|
||
|
(mapc
|
||
|
(lambda (w)
|
||
|
(when (window-parameter w 'bw-bottom)
|
||
|
(setq win w)))
|
||
|
(window-list))
|
||
|
win))
|
||
|
|
||
|
(defun bw-display-in-bottom-window (buffer alist)
|
||
|
"Show BUFFER in the bottom window, discard ALIST."
|
||
|
(let ((win (or (bw-get-window) (bw-create-window))))
|
||
|
(set-window-buffer win buffer)
|
||
|
(setq bw-last-shown-buffer buffer)
|
||
|
(local-set-key (kbd "C-c C-q") 'delete-window)
|
||
|
win))
|
||
|
|
||
|
(add-to-list 'display-buffer-alist
|
||
|
'("^\\*.*\\*$" . ((bw-display-in-bottom-window . nil))))
|
||
|
(add-to-list 'window-persistent-parameters (cons 'bw-bottom t))
|
||
|
|
||
|
(defun bw-find-appropriate-buffer ()
|
||
|
"Find an appropriate buffer for bw."
|
||
|
(let ((buffers (buffer-list))
|
||
|
tmp-buffer buffer)
|
||
|
(while (and (not buffer) buffers)
|
||
|
(setq tmp-buffer (car buffers))
|
||
|
(when (string-match-p "^\\*.*\\*$" (buffer-name tmp-buffer))
|
||
|
(setq buffer tmp-buffer))
|
||
|
(setq buffers (cdr buffers)))
|
||
|
(unless buffer
|
||
|
(setq buffer "*scratch*"))
|
||
|
buffer))
|
||
|
|
||
|
(defun bw-toggle-bottom-window ()
|
||
|
"Either show or delete the bottom window."
|
||
|
(interactive)
|
||
|
(let ((win (bw-get-window)))
|
||
|
(if win
|
||
|
(delete-window win)
|
||
|
(setq win (bw-create-window))
|
||
|
(bw-display-in-bottom-window
|
||
|
(or bw-last-shown-buffer (bw-find-appropriate-buffer)) nil)
|
||
|
(select-window win))))
|
||
|
|
||
|
(global-set-key (kbd "<f11>") 'bw-toggle-bottom-window)
|
||
|
|
||
|
(provide 'bw)
|
||
|
;;; bw.el ends here
|