;;; Code:
-(require 'fuel-base)
(require 'fuel-eval)
+(require 'fuel-popup)
(require 'fuel-font-lock)
+(require 'fuel-base)
\f
;;; Customization:
\f
;;; Debug buffer:
-(defvar fuel-debug--buffer nil)
+(fuel-popup--define fuel-debug--buffer
+ "*fuel debug*" 'fuel-debug-mode)
(make-variable-buffer-local
(defvar fuel-debug--last-ret nil))
(make-variable-buffer-local
(defvar fuel-debug--file nil))
-(defun fuel-debug--buffer ()
- (or (and (buffer-live-p fuel-debug--buffer) fuel-debug--buffer)
- (with-current-buffer
- (setq fuel-debug--buffer (get-buffer-create "*fuel dbg*"))
- (fuel-debug-mode)
- (current-buffer))))
-
(defun fuel-debug--display-retort (ret &optional success-msg no-pop file)
(let ((err (fuel-eval--retort-error ret))
(inhibit-read-only t))
(setq fuel-debug--file file)
(goto-char (point-max))
(font-lock-fontify-buffer)
- (when (and err (not no-pop)) (pop-to-buffer fuel-debug--buffer))
+ (when (and err (not no-pop)) (fuel-popup--display))
(not err))))
(defun fuel-debug--display-output (ret)
(require 'fuel-autodoc)
(require 'fuel-completion)
(require 'fuel-font-lock)
+(require 'fuel-popup)
(require 'fuel-base)
\f
\f
;;; Fuel help buffer and internals:
-(defun fuel-help--help-buffer ()
- (with-current-buffer (get-buffer-create "*fuel help*")
- (fuel-help-mode)
- (current-buffer)))
+(fuel-popup--define fuel-help--buffer
+ "*fuel help*" 'fuel-help-mode)
+
(defvar fuel-help--prompt-history nil)
(fuel-help--insert-contents def out))))
(defun fuel-help--insert-contents (def str &optional nopush)
- (let ((hb (fuel-help--help-buffer))
+ (let ((hb (fuel-help--buffer))
(inhibit-read-only t)
(font-lock-verbose nil))
(set-buffer hb)
(kill-region (point-min) (point))
(fuel-help--history-push (cons def (buffer-string)))))
(set-buffer-modified-p nil)
- (pop-to-buffer hb)
+ (fuel-popup--display)
(goto-char (point-min))
(message "%s" def)))
(let ((map (make-sparse-keymap)))
(suppress-keymap map)
(define-key map "\C-m" 'fuel-help)
- (define-key map "q" 'bury-buffer)
(define-key map "b" 'fuel-help-previous)
(define-key map "f" 'fuel-help-next)
(define-key map "l" 'fuel-help-previous)
(fuel-autodoc-mode)
(run-mode-hooks 'fuel-help-mode-hook)
+
(setq buffer-read-only t))
\f
--- /dev/null
+;;; fuel-popup.el -- popup windows
+
+;; Copyright (C) 2008 Jose Antonio Ortega Ruiz
+;; See http://factorcode.org/license.txt for BSD license.
+
+;; Author: Jose Antonio Ortega Ruiz <jao@gnu.org>
+;; Keywords: languages, fuel, factor
+;; Start date: Sun Dec 21, 2008 14:37
+
+;;; Comentary:
+
+;; A minor mode to pop up windows and restore configurations
+;; afterwards.
+
+;;; Code:
+
+(make-variable-buffer-local
+ (defvar fuel-popup--created-window nil))
+
+(make-variable-buffer-local
+ (defvar fuel-popup--selected-window nil))
+
+(defun fuel-popup--display ()
+ (let ((selected-window (selected-window))
+ (buffer (current-buffer)))
+ (unless (eq selected-window (get-buffer-window buffer))
+ (let ((windows))
+ (walk-windows (lambda (w) (push w windows)) nil t)
+ (prog1 (pop-to-buffer buffer)
+ (set (make-local-variable 'fuel-popup--created-window)
+ (unless (memq (selected-window) windows) (selected-window)))
+ (set (make-local-variable 'fuel-popup--selected-window)
+ selected-window))))))
+
+(defun fuel-popup--quit ()
+ (interactive)
+ (let ((selected fuel-popup--selected-window)
+ (created fuel-popup--created-window))
+ (bury-buffer)
+ (when (eq created (selected-window)) (delete-window created))
+ (when (window-live-p selected) (select-window selected))))
+
+(define-minor-mode fuel-popup-mode
+ "Mode for displaying read only stuff"
+ nil nil
+ '(("q" . fuel-popup--quit)))
+
+(defmacro fuel-popup--define (fun name mode)
+ `(defun ,fun ()
+ (or (get-buffer ,name)
+ (with-current-buffer (get-buffer-create ,name)
+ (funcall ,mode)
+ (fuel-popup-mode)
+ (current-buffer)))))
+
+(put 'fuel-popup--define 'lisp-indent-function 1)
+\f
+(provide 'fuel-popup)
+;;; fuel-popup.el ends here
\f
;;; The xref buffer:
-(defvar fuel-xref--buffer-name "*fuel xref*")
-
-(defun fuel-xref--get-buffer ()
- (let ((buffer (get-buffer fuel-xref--buffer-name)))
- (or (and (buffer-live-p buffer) buffer)
- (prog1
- (set-buffer (get-buffer-create fuel-xref--buffer-name))
- (fuel-xref-mode)))))
+(fuel-popup--define fuel-xref--buffer
+ "*fuel xref*" 'fuel-xref-mode)
(defvar fuel-xref--help-string "(Press RET or click to follow crossrefs)")
(defun fuel-xref--fill-buffer (title refs)
(let ((inhibit-read-only t))
- (with-current-buffer (fuel-xref--get-buffer)
+ (with-current-buffer (fuel-xref--buffer)
(erase-buffer)
(insert title "\n\n")
(dolist (ref refs)
(newline)))
(when refs
(insert "\n\n" fuel-xref--help-string "\n"))
- (goto-char (point-min)))))
+ (goto-char (point-min))
+ (current-buffer))))
(defun fuel-xref--show-callers (word)
(let* ((cmd `(:fuel* (((:quote ,word) fuel-callers-xref))))
(title (format (if res "Callers of '%s':"
"No callers found for '%s'")
word)))
- (fuel-xref--fill-buffer title res)
- (pop-to-buffer (fuel-xref--get-buffer))))
+ (set-buffer (fuel-xref--fill-buffer title res))
+ (fuel-popup--display)))
(defun fuel-xref--show-callees (word)
(let* ((cmd `(:fuel* (((:quote ,word) fuel-callees-xref))))
(title (format (if res "Words called by '%s':"
"No callees found for '%s'")
word)))
- (fuel-xref--fill-buffer title res)
- (pop-to-buffer (fuel-xref--get-buffer))))
+ (set-buffer (fuel-xref--fill-buffer title res))
+ (fuel-popup--display)))
\f
;;; Xref mode: