(defcommand repack-group-numbers (&optional preserved) () "Ensure that used group numbers do not have gaps; ignore PRESERVED group numbers." (let ((groups (remove-if (lambda (x) (member (group-number x) preserved)) (sort1 (screen-groups (current-screen)) #'< :key #'group-number)))) (labels ((repack (&optional items (idx 1)) (cond ((null items) nil) ((= idx (group-number (car items))) (repack (cdr items) (1+ idx))) ((member idx (mapcar #'group-number groups)) (repack items (1+ idx))) (t (progn (setf (group-number (car items)) idx) (repack (cdr items) (1+ idx))))))) (repack groups))))