(define-key global-map "\C-g" 'keyboard-quit)
+(defvar buffer-quit-function nil
+ "Function to call to \"quit\" the current buffer, or nil if none.
+\\[keyboard-escape-quit] calls this function when its more local actions
+\(such as cancelling a prefix argument, minibuffer or region) do not apply.")
+
(defun keyboard-escape-quit ()
"Exit the current \"mode\" (in a generalized sense of the word).
This command can exit an interactive command such as `query-replace',
can clear out a prefix argument or a region,
can get out of the minibuffer or other recursive edit,
-or delete other windows."
+cancel the use of the current buffer (for special-purpose buffers),
+or go back to just one window (by deleting all but the selected window)."
(interactive)
(cond ((eq last-command 'mode-exited) nil)
((> (minibuffer-depth) 0)
((and transient-mark-mode
mark-active)
(deactivate-mark))
+ (buffer-quit-function
+ (funcall buffer-quit-function))
((not (one-window-p t))
(delete-other-windows))))
-;;; This may not be safe yet.
-;;;(define-key global-map "\e\e\e" 'keyboard-escape-quit)
+(define-key global-map "\e\e\e" 'keyboard-escape-quit)
\f
(defun set-variable (var val)
"Set VARIABLE to VALUE. VALUE is a Lisp object.
(define-key map [down-mouse-2] nil)
(define-key map "\C-m" 'choose-completion)
(define-key map [return] 'choose-completion)
+ (define-key map "\e\e\e" 'delete-completion-window)
(setq completion-list-mode-map map)))
;; Completion mode is suitable only for specially formatted data.
;; which was not included in the completion.
(defvar completion-base-size nil)
+(defun delete-completion-window ()
+ "Delete the completion list window.
+Go to the window from which completion was requested."
+ (interactive)
+ (let ((buf completion-reference-buffer))
+ (delete-window (selected-window))
+ (if (get-buffer-window buf)
+ (select-window (get-buffer-window buf)))))
+
(defun choose-completion ()
"Choose the completion that point is in or next to."
(interactive)