• Stefan Monnier's avatar
    Add multiple inheritance to keymaps. · 3349e122
    Stefan Monnier authored
    * src/keymap.c (Fmake_composed_keymap): New function.
    (Fset_keymap_parent): Simplify.
    (fix_submap_inheritance): Remove.
    (access_keymap_1): New function extracted from access_keymap to handle
    embedded parents and handle lists of maps.
    (access_keymap): Use it.
    (Fkeymap_prompt, map_keymap_internal, map_keymap, store_in_keymap)
    (Fcopy_keymap): Handle embedded parents.
    (Fcommand_remapping, define_as_prefix): Simplify.
    (Fkey_binding): Simplify.
    (syms_of_keymap): Move minibuffer-local-completion-map,
    minibuffer-local-filename-completion-map,
    minibuffer-local-must-match-map, and
    minibuffer-local-filename-must-match-map to Elisp.
    (syms_of_keymap): Defsubr make-composed-keymap.
    * src/keyboard.c (menu_bar_items): Use map_keymap_canonical.
    (parse_menu_item): Trivial simplification.
    * lisp/subr.el (remq): Don't allocate if it's not needed.
    (keymap--menu-item-binding, keymap--menu-item-with-binding)
    (keymap--merge-bindings): New functions.
    (keymap-canonicalize): Use them to refine the canonicalization.
    * lisp/minibuffer.el (minibuffer-local-completion-map)
    (minibuffer-local-must-match-map): Move initialization from C.
    (minibuffer-local-filename-completion-map): Move initialization from C;
    don't inherit from anything here.
    (minibuffer-local-filename-must-match-map): Make obsolete.
    (completing-read-default): Use make-composed-keymap to combine
    minibuffer-local-filename-completion-map with either
    minibuffer-local-must-match-map or
    minibuffer-local-filename-completion-map.
    3349e122
keymap.c 112 KB