Sync up with egg-980627.
[elisp/egg.git] / menudiag.el
index 639401a..b758b45 100644 (file)
 (defvar menudiag-mode-map
   (let ((map (make-keymap))
        (ch 0))
-    (while (< ch 127)
+    (while (< ch 27)
+      (define-key map (char-to-string ch) 'undefined)
+      (setq ch (1+ ch)))
+    (setq ch 28)
+    (while (< ch 255)
       (define-key map (char-to-string ch) 'undefined)
       (setq ch (1+ ch)))
     (setq ch ?0)
-    (while (< ch ?9)
+    (while (<= ch ?9)
       (define-key map (char-to-string ch) 'menudiag-goto-item)
       (setq ch (1+ ch)))
     (setq ch ?a)
-    (while (< ch ?z)
+    (while (<= ch ?z)
       (define-key map (char-to-string ch) 'menudiag-goto-item)
       (setq ch (1+ ch)))
     (setq ch ?A)
-    (while (< ch ?Z)
+    (while (<= ch ?Z)
       (define-key map (char-to-string ch) 'menudiag-goto-item)
       (setq ch (1+ ch)))
     (define-key map "\C-a" 'menudiag-beginning-of-line)
     (define-key map "\C-e" 'menudiag-end-of-line)
+    (define-key map "\M-<" 'menudiag-beginning-of-items)
+    (define-key map "\M->" 'menudiag-end-of-items)
     (define-key map "\C-f" 'menudiag-forward-item)
     (define-key map "\C-b" 'menudiag-backward-item)
     (define-key map "\C-n" 'menudiag-next-line)
 (defun menudiag-make-selection-list (item-list line-width)
   (let ((l nil)
        (line nil)
-       (width 0))
+       (width 0)
+       (i 0))
     (while item-list
       (let* ((item (car item-list))
             (item-width (menudiag-item-width item)))
-       (if (and line (>= (+ width item-width) line-width))
+       (if (and line (or (>= (+ width item-width) line-width)
+                          (>= i 36)))
            (setq l (cons (reverse line) l)
                  line nil
-                 width 0))
+                 width 0
+                 i 0))
        (setq line (cons item line)
              width (+ width (menudiag-item-width item))
+             i (1+ i)
              item-list (cdr item-list))))
     (if line
        (reverse (cons (reverse line) l))
     (mapconcat
      (function (lambda (item)
                 (setq i (1+ i))
-                (format "  %x.%s" i (menudiag-item-string item))))
+                (format "  %c.%s" (menudiag-item-num-to-char i) 
+                           (menudiag-item-string item))))
      item-list "")))
 
+
+;; ITEM No --> Character
+(defun menudiag-item-num-to-char (num)
+  (let ((char))
+    (cond ((<= num 9)
+           (setq char (+ ?0 num)))
+          (t
+           (setq char (+ ?a (- num 10))))
+          )
+    char))
+
+;; Character --> ITEM No
+(defun menudiag-char-to-item-num (char)
+  (let ((num))
+    (cond ((and (<= ?0 ch) (<= ch ?9))
+           (setq num (- ch ?0)))
+          ((and (<= ?a ch) (<= ch ?z))
+           (setq num (+ 10 (- ch ?a))))
+          ((and (<= ?A ch) (<= ch ?Z))
+           (setq num (+ 10 (- ch ?A))))
+          (t (setq num 1000)))
+    num))
+
+
 (defun menudiag-goto-item ()
   (interactive)
   (let ((ch last-command-char)
        (n 0))
-    (cond ((and (<= ?0 ch) (<= ch ?9))
-          (setq n (- ch ?0)))
-         ((and (<= ?a ch) (<= ch ?z))
-          (setq n (+ 10 (- ch ?a))))
-         ((and (<= ?A ch) (<= ch ?Z))
-          (setq n (+ 10 (- ch ?A)))))
+    (setq n (menudiag-char-to-item-num ch))
     (if (>= n (length line))
        (error "No such item")
       (menudiag-goto-item-internal n))))
       (setq i (1+ i)))
     (goto-char p)))
 
+(defun menudiag-beginning-of-items ()
+  (interactive)
+  (menudiag-goto-line 0)
+  (menudiag-beginning-of-line))
+
+(defun menudiag-end-of-items ()
+  (interactive)
+  (menudiag-goto-line (1- (length selection-list)))
+  (menudiag-end-of-line))
+
 (defun menudiag-beginning-of-line ()
   (interactive)
   (menudiag-goto-item-internal 0))
   (interactive)
   (menudiag-goto-item-internal (1- (length line))))
 
+;; Should retain compatibility.  Must.
+;;
+;;(defun menudiag-forward-item ()
+;;  (interactive)
+;;  (if (< pos-in-line (1- (length line)))
+;;      (menudiag-goto-item-internal (1+ pos-in-line))
+;;    (if (>= linepos (1- (length selection-list)))
+;;     (signal 'end-of-buffer "")
+;;      (menudiag-goto-line (1+ linepos))
+;;      (menudiag-beginning-of-line))))
+;;
+;;(defun menudiag-backward-item ()
+;;  (interactive)
+;;  (if (< 0 pos-in-line)
+;;      (menudiag-goto-item-internal (1- pos-in-line))
+;;    (if (< linepos 1)
+;;     (signal 'beginning-of-buffer "")
+;;      (menudiag-goto-line (1- linepos))
+;;      (menudiag-end-of-line))))
+;;
+;;(defun menudiag-goto-line (n)
+;;  (if (or (>= n (length selection-list)) (< n 0))
+;;      (ding)
+;;    (setq line (nth n selection-list)
+;;       linepos n)
+;;    (delete-region (point-min) (point-max))
+;;    (insert (menudiag-make-menu-formatted-string line))))
+;;
+
 (defun menudiag-forward-item ()
   (interactive)
   (if (< pos-in-line (1- (length line)))
       (menudiag-goto-item-internal (1+ pos-in-line))
     (if (>= linepos (1- (length selection-list)))
-       (signal 'end-of-buffer "")
-      (menudiag-goto-line (1+ linepos))
-      (menudiag-beginning-of-line))))
+       (menudiag-goto-line 0)
+      (menudiag-goto-line (1+ linepos)))
+    (menudiag-beginning-of-line)))
 
 (defun menudiag-backward-item ()
   (interactive)
   (if (< 0 pos-in-line)
       (menudiag-goto-item-internal (1- pos-in-line))
     (if (< linepos 1)
-       (signal 'beginning-of-buffer "")
-      (menudiag-goto-line (1- linepos))
-      (menudiag-end-of-line))))
+        (menudiag-goto-line (1- (length selection-list)))
+      (menudiag-goto-line (1- linepos)))
+    (menudiag-end-of-line)))
 
 (defun menudiag-goto-line (n)
-  (if (or (>= n (length selection-list)) (< n 0))
-      (ding)
-    (setq line (nth n selection-list)
-         linepos n)
-    (delete-region (point-min) (point-max))
-    (insert (menudiag-make-menu-formatted-string line))))
+  (cond
+   ((>= n (length selection-list))
+    (setq n 0))
+   ((< n 0)
+    (setq n (1- (length selection-list)))))
+  (setq line (nth n selection-list)
+        linepos n)
+  (delete-region (point-min) (point-max))
+  (insert (menudiag-make-menu-formatted-string line)))
 
 (defun menudiag-next-line ()
   (interactive)