diff options
author | Wojciech Siewierski <wojciech.siewierski@onet.pl> | 2018-03-04 13:43:33 +0100 |
---|---|---|
committer | Wojciech Siewierski <wojciech.siewierski@onet.pl> | 2018-03-04 13:47:39 +0100 |
commit | 7dd423ca506ae0ae46be015d6e1564d2b24ae36a (patch) | |
tree | ccf41d8da075d9e25f991fe7e2979d154788c79c | |
parent | fb3c1a21231b7f4dc0a1190332c55a73dba2bab9 (diff) | |
download | ranger-7dd423ca506ae0ae46be015d6e1564d2b24ae36a.tar.gz |
Show the full keybindings in the key hints
-rw-r--r-- | ranger/gui/widgets/view_base.py | 53 |
1 files changed, 43 insertions, 10 deletions
diff --git a/ranger/gui/widgets/view_base.py b/ranger/gui/widgets/view_base.py index cb205d92..b005f1d5 100644 --- a/ranger/gui/widgets/view_base.py +++ b/ranger/gui/widgets/view_base.py @@ -112,16 +112,49 @@ class ViewBase(Widget, DisplayableContainer): # pylint: disable=too-many-instan self.color_reset() self.need_clear = True hints = [] - for key, value in self.fm.ui.keybuffer.pointer.items(): - key = key_to_string(key) - if isinstance(value, dict): - text = '...' - else: - text = value - if text.startswith('hint') or text.startswith('chain hint'): - continue - hints.append((key, text)) - hints.sort(key=lambda t: t[1]) + + def populate_hints(keymap, prefix=""): + for key, value in keymap.items(): + key = prefix + key_to_string(key) + if isinstance(value, dict): + populate_hints(value, key) + else: + text = value + if text.startswith('hint') or text.startswith('chain hint'): + continue + hints.append((key, text)) + populate_hints(self.fm.ui.keybuffer.pointer) + + def sort_hints(hints): + """Sort the hints by the action string but first group them by the + first key. + + """ + from itertools import groupby + + # groupby needs the list to be sorted + hints.sort(key=lambda t: t[0]) + + def group_hints(hints): + def first_key(hint): + return hint[0][0] + + def action_string(hint): + return hint[1] + + return (list(sorted(group, key=action_string)) + for _, group + in groupby( + hints, + key=first_key)) + hints = sorted( + group_hints(hints), + key=lambda g: g[0][1]) # sort by the first action in group + + def flatten(nested_list): + return [item for inner_list in nested_list for item in inner_list] + return flatten(hints) + hints = sort_hints(hints) hei = min(self.hei - 1, len(hints)) ystart = self.hei - hei |