From c66587feff67603818ea49fe4b7bfafe77a93e89 Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Mon, 28 Nov 1994 19:44:16 +0000 Subject: [PATCH] (keyboard-escape-quit): New command. (beginning-of-buffer, end-of-buffer): With argument, calculate fraction wrt accessible portion of buffer. --- lisp/simple.el | 64 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/lisp/simple.el b/lisp/simple.el index 14e2c68aa1..157a5cb90d 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -248,37 +248,46 @@ Goes backward if ARG is negative; error if CHAR not found." (defun beginning-of-buffer (&optional arg) "Move point to the beginning of the buffer; leave mark at previous position. -With arg N, put point N/10 of the way from the true beginning. +With arg N, put point N/10 of the way from the beginning. + +If the buffer is narrowed, this command uses the beginning and size +of the accessible part of the buffer. Don't use this command in Lisp programs! \(goto-char (point-min)) is faster and avoids clobbering the mark." (interactive "P") (push-mark) - (goto-char (if arg - (if (> (buffer-size) 10000) - ;; Avoid overflow for large buffer sizes! - (* (prefix-numeric-value arg) - (/ (buffer-size) 10)) - (/ (+ 10 (* (buffer-size) (prefix-numeric-value arg))) 10)) - (point-min))) + (let ((size (- (point-max) (point-min)))) + (goto-char (if arg + (+ (point-min) + (if (> size 10000) + ;; Avoid overflow for large buffer sizes! + (* (prefix-numeric-value arg) + (/ size 10)) + (/ (+ 10 (* size (prefix-numeric-value arg))) 10))) + (point-min)))) (if arg (forward-line 1))) (defun end-of-buffer (&optional arg) "Move point to the end of the buffer; leave mark at previous position. -With arg N, put point N/10 of the way from the true end. +With arg N, put point N/10 of the way from the end. + +If the buffer is narrowed, this command uses the beginning and size +of the accessible part of the buffer. Don't use this command in Lisp programs! \(goto-char (point-max)) is faster and avoids clobbering the mark." (interactive "P") (push-mark) - (goto-char (if arg - (- (1+ (buffer-size)) - (if (> (buffer-size) 10000) - ;; Avoid overflow for large buffer sizes! - (* (prefix-numeric-value arg) - (/ (buffer-size) 10)) - (/ (* (buffer-size) (prefix-numeric-value arg)) 10))) - (point-max))) + (let ((size (- (point-max) (point-min)))) + (goto-char (if arg + (- (point-max) + (if (> size 10000) + ;; Avoid overflow for large buffer sizes! + (* (prefix-numeric-value arg) + (/ size 10)) + (/ (* size (prefix-numeric-value arg)) 10))) + (point-max)))) ;; If we went to a place in the middle of the buffer, ;; adjust it to the beginning of a line. (if arg (forward-line 1) @@ -2491,6 +2500,27 @@ At top-level, as an editor command, this simply beeps." (signal 'quit nil)) (define-key global-map "\C-g" 'keyboard-quit) + +(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." + (interactive) + (cond ((eq last-command 'mode-exited) nil) + ((> (minibuffer-depth) 0) + (abort-recursive-edit)) + (current-prefix-arg + nil) + ((and transient-mark-mode + mark-active) + (deactivate-mark)) + ((not (one-window-p t)) + (delete-other-windows)))) + +;;; This may not be safe yet. +;;;(define-key global-map "\e\e\e" 'keyboard-escape-quit) (defun set-variable (var val) "Set VARIABLE to VALUE. VALUE is a Lisp object. -- 2.20.1