(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)
(define-key map "\C-l" 'menudiag-redraw)
(define-key map "\C-m" 'menudiag-select-this-item)
(define-key map [return] 'menudiag-select-this-item)
- (define-key map [left] 'menudiag-forward-item)
- (define-key map [right] 'menudiag-backward-item)
+ (define-key map [left] 'menudiag-backward-item)
+ (define-key map [right] 'menudiag-forward-item)
(define-key map [up] 'menudiag-previous-line)
(define-key map [down] 'menudiag-next-line)
(define-key map [menudiag-continuation] 'menudiag-follow-continuation)
(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)