Subject: Re: bug#12345: 24.2.50; doc string of `text-scale-adjust'

From: Bastien <[email-masked]>
Date: Tue, 11 Sep 2012 15:37:31 +0200

"Drew Adams" <[email-masked]> writes:

> 1. Describe the parameter, INC.
>  
> 2. Describe the use of a prefix argument.
>  
> In general, describe this as a user command, from a user point of view,
> and not just as a function to be called from code.

See attached patch.

I enhanced the docstring and rewrote the command so that it does
not use a temporary keymap.  When I tried `C-x C-+' I was left with 
the `+' and `-' keys not usable anymore.

The patch also removes the redundant keybinding `C-x C-='.

And C-x C-0 does not allow adjusting further.  My feeling is that
it is not useful.

I'll apply this patch within a week if nobody is against it.

=== modified file 'lisp/face-remap.el'
--- lisp/face-remap.el	2012-07-10 11:51:54 +0000
+++ lisp/face-remap.el	2012-09-11 13:18:59 +0000
@@ -281,22 +281,26 @@
 
 ;;;###autoload (define-key ctl-x-map [(control ?+)] 'text-scale-adjust)
 ;;;###autoload (define-key ctl-x-map [(control ?-)] 'text-scale-adjust)
-;;;###autoload (define-key ctl-x-map [(control ?=)] 'text-scale-adjust)
 ;;;###autoload (define-key ctl-x-map [(control ?0)] 'text-scale-adjust)
 ;;;###autoload
-(defun text-scale-adjust (inc)
-  "Increase or decrease the height of the default face in the current buffer.
+(defun text-scale-adjust (inc &optional mod)
+  "Adjust the height of the default face by INC.
+
+INC may be passed as a numeric prefix argument.
+
+The optional argument MOD is used internally to pass the previous
+modifier to the command, when used repeatedly.
 
 The actual adjustment made depends on the final component of the
-key-binding used to invoke the command, with all modifiers removed:
+keybinding used to invoke the command.
 
-   +, =   Increase the default face height by one step
+   +      Increase the default face height by one step
    -      Decrease the default face height by one step
    0      Reset the default face height to the global default
 
-Then, continue to read input events and further adjust the face
-height as long as the input event read (with all modifiers removed)
-is one of the above.
+After the first invokation, continue to read input events and
+further adjust the face height as long as the input event read
+is `+' or `-'.
 
 Each step scales the height of the default face by the variable
 `text-scale-mode-step' (a negative number of steps decreases the
@@ -309,30 +313,15 @@
 a top-level keymap, `text-scale-increase' or
 `text-scale-decrease' may be more appropriate."
   (interactive "p")
-  (let ((first t)
-	(ev last-command-event)
-	(echo-keystrokes nil))
-    (let* ((base (event-basic-type ev))
-           (step
-            (pcase base
-              ((or ?+ ?=) inc)
-              (?- (- inc))
-              (?0 0)
-              (t inc))))
-      (text-scale-increase step)
-      ;; FIXME: do it after every "iteration of the loop".
-      (message "+,-,0 for further adjustment: ")
-      (set-temporary-overlay-map
-       (let ((map (make-sparse-keymap)))
-         (dolist (mods '(() (control)))
-           (define-key map (vector (append mods '(?-))) 'text-scale-decrease)
-           (define-key map (vector (append mods '(?+))) 'text-scale-increase)
-           ;; = is unshifted + on most keyboards.
-           (define-key map (vector (append mods '(?=))) 'text-scale-increase)
-           (define-key map (vector (append mods '(?0)))
-             (lambda () (interactive) (text-scale-increase 0))))
-         map)
-       t))))
+  (let* ((ev (or (event-basic-type (or mod last-command-event))))
+	 (step (pcase ev (?+ inc) (?- (- inc)) (?0 0) (t inc)))
+	 c)
+    (text-scale-increase step)
+    (when (and (not (zerop step))
+	       (setq c (read-event "Hit + or - for further adjustment, RET to finish")))
+      (cond ((member (event-basic-type c) '(?+ ?-))
+	     (text-scale-adjust (abs step) c))
+	    (t (message "Done"))))))
 
 
 ;; ----------------------------------------------------------------

-- 
 Bastien