- (setq col-width (+ single-key-width 1 single-trans-width 1)
- cols (/ window-width col-width)
- rows (/ (length single-list) cols))
- (if (> (% (length single-list) cols) 0)
- (setq rows (1+ rows)))
- (insert "key")
- (indent-to (1+ single-key-width))
- (insert "char")
- (indent-to (1+ col-width))
- (insert "[type a key sequence to insert the corresponding character]\n")
- (setq pos (point))
- (insert-char ?\n (+ rows 2))
- (goto-char pos)
- (setq col (- col-width) row 0)
- (while single-list
- (setq elt (car single-list) single-list (cdr single-list))
- (when (= (% row rows) 0)
- (goto-char pos)
- (setq col (+ col col-width))
- (move-to-column col t)
- (insert-char ?- single-key-width)
- (insert ? )
- (insert-char ?- single-trans-width)
- (forward-line 1))
- (move-to-column col t)
- (insert (car elt))
- (indent-to (+ col single-key-width 1))
- (insert (cdr elt))
- (forward-line 1)
- (setq row (1+ row)))
- (goto-char (point-max)))
+ ;; Figure out how many columns can fit.
+ (let* ((len (length single-list))
+ ;; The longest key is at the end, by virtue of the above `sort'.
+ (max-key-width (max 3 (length (caar (last single-list)))))
+ ;; Starting point: worst case.
+ (col-width (+ max-key-width 1 single-trans-width 1))
+ (cols (/ window-width col-width))
+ rows)
+ ;; Now, let's see if we can pack in a few more columns since
+ ;; the first columns can often be made narrower thanks to the
+ ;; length-sorting.
+ (while (let ((newrows (/ (+ len cols) (1+ cols))) ;Round up.
+ (width 0))
+ (dotimes (col (1+ cols))
+ (let ((last-col-elt (or (nth (1- (* (1+ col) newrows))
+ single-list)
+ (car (last single-list)))))
+ (incf width (+ (max 3 (length (car last-col-elt)))
+ 1 single-trans-width 1))))
+ (< width window-width))
+ (incf cols))
+ (setq rows (/ (+ len cols -1) cols)) ;Round up.
+ (let ((key-width (max 3 (length (car (nth (1- rows) single-list))))))
+ (insert "key")
+ (quail-indent-to (1+ key-width))
+ (insert "char")
+ (quail-indent-to (+ 1 key-width 1 single-trans-width 1)))
+ (insert "[type a key sequence to insert the corresponding character]\n")
+ (let ((pos (point))
+ (col 0))
+ (insert-char ?\n (+ rows 2))
+ (while single-list
+ (goto-char pos)
+ (let* ((key-width (max 3 (length
+ (car (or (nth (1- rows) single-list)
+ (car (last single-list)))))))
+ (col-width (+ key-width 1 single-trans-width 1)))
+ ;; Insert the header-line.
+ (move-to-column col)
+ (quail-indent-to col)
+ (insert-char ?- key-width)
+ (insert ?\s)
+ (insert-char ?- single-trans-width)
+ (forward-line 1)
+ ;; Insert the key-tran pairs.
+ (dotimes (row rows)
+ (let ((elt (pop single-list)))
+ (when elt
+ (move-to-column col)
+ (quail-indent-to col)
+ (insert (propertize (car elt)
+ 'face 'font-lock-comment-face))
+ (quail-indent-to (+ col key-width 1))
+ (insert (cdr elt))
+ (forward-line 1))))
+ (setq col (+ col col-width)))))
+ (goto-char (point-max))))