- (setq file (recentf-menu-element-value elt)
- rules recentf-arrange-rules
- elts menus
- menu nil)
- (while (and (not menu) rules)
- (when (recentf-match-rule-p (cdar rules) file)
- (setq menu (car elts))
- (recentf-set-menu-element-value
- menu (cons elt (recentf-menu-element-value menu))))
- (setq rules (cdr rules)
- elts (cdr elts)))
- (unless menu
- (push elt others)))
-
- (setq l nil
- min (if (natnump recentf-arrange-by-rules-min-items)
- recentf-arrange-by-rules-min-items 0))
- (dolist (menu menus)
- (when (setq elts (recentf-menu-element-value menu))
- (setq count (length elts))
- (if (< count min)
- (setq others (nconc elts others))
- (recentf-set-menu-element-item
- menu (format (recentf-menu-element-item menu) count))
- (recentf-set-menu-element-value
- menu (recentf-apply-menu-filter
- recentf-arrange-by-rule-subfilter (nreverse elts)))
- (push menu l))))
-
- (if (and (stringp recentf-arrange-by-rule-others) others)
- (nreverse
- (cons
- (recentf-make-menu-element
- (format recentf-arrange-by-rule-others (length others))
- (recentf-apply-menu-filter
- recentf-arrange-by-rule-subfilter (nreverse others)))
- l))
- (nconc
- (nreverse l)
- (recentf-apply-menu-filter
- recentf-arrange-by-rule-subfilter (nreverse others)))))
- ))
+ (setq file (recentf-menu-element-value elt)
+ menu (recentf-match-rule file))
+ (while (functionp (car menu))
+ (setq menu (funcall (car menu) (cdr menu))))
+ (if (not (stringp (car menu)))
+ (push elt others)
+ (setq menu (or (assoc (car menu) menus)
+ (car (push (list (car menu)) menus))))
+ (recentf-set-menu-element-value
+ menu (cons elt (recentf-menu-element-value menu)))))
+ ;; Finalize each sub-menu:
+ ;; - truncate it depending on the value of
+ ;; `recentf-arrange-by-rules-min-items',
+ ;; - replace %d by the number of menu items,
+ ;; - apply `recentf-arrange-by-rule-subfilter' to menu items.
+ (setq min (if (natnump recentf-arrange-by-rules-min-items)
+ recentf-arrange-by-rules-min-items 0)
+ l nil)
+ (dolist (elt menus)
+ (setq menu (recentf-menu-element-value elt)
+ count (length menu))
+ (if (< count min)
+ (setq others (nconc menu others))
+ (recentf-set-menu-element-item
+ elt (format (recentf-menu-element-item elt) count))
+ (recentf-set-menu-element-value
+ elt (recentf-apply-menu-filter
+ recentf-arrange-by-rule-subfilter (nreverse menu)))
+ (push elt l)))
+ ;; Add the menu items remaining in the `others' bin.
+ (when (setq others (nreverse others))
+ (setq l (nconc
+ l
+ ;; Put items in an sub menu.
+ (if (stringp recentf-arrange-by-rule-others)
+ (list
+ (recentf-make-menu-element
+ (format recentf-arrange-by-rule-others
+ (length others))
+ (recentf-apply-menu-filter
+ recentf-arrange-by-rule-subfilter others)))
+ ;; Append items to the main menu.
+ (recentf-apply-menu-filter
+ recentf-arrange-by-rule-subfilter others)))))))
+ l)