##// END OF EJS Templates
Fix autogen_shortcuts.py for prompt_toolkit 2.0
Gabriel Potter -
Show More
@@ -1,85 +1,90 b''
1 1 from os.path import abspath, dirname, join
2 2
3 from IPython.terminal.interactiveshell import KeyBindingManager
4
3 from IPython.terminal.shortcuts import create_ipython_shortcuts
5 4
6 5 def name(c):
7 6 s = c.__class__.__name__
8 7 if s == '_Invert':
9 8 return '(Not: %s)' % name(c.filter)
10 9 if s in log_filters.keys():
11 10 return '(%s: %s)' % (log_filters[s], ', '.join(name(x) for x in c.filters))
12 11 return log_filters[s] if s in log_filters.keys() else s
13 12
14 13
15 14 def sentencize(s):
16 15 """Extract first sentence
17 16 """
18 17 s = s.replace('\n', ' ').strip().split('.')
19 18 s = s[0] if len(s) else s
20 19 try:
21 20 return " ".join(s.split())
22 21 except AttributeError:
23 22 return s
24 23
25 24
26 25 def most_common(lst, n=3):
27 26 """Most common elements occurring more then `n` times
28 27 """
29 28 from collections import Counter
30 29
31 30 c = Counter(lst)
32 31 return [k for (k, v) in c.items() if k and v > n]
33 32
34 33
35 34 def multi_filter_str(flt):
36 35 """Yield readable conditional filter
37 36 """
38 37 assert hasattr(flt, 'filters'), 'Conditional filter required'
39 38 yield name(flt)
40 39
41 40
42 41 log_filters = {'_AndList': 'And', '_OrList': 'Or'}
43 42 log_invert = {'_Invert'}
44 43
45 kbm = KeyBindingManager.for_prompt()
46 ipy_bindings = kbm.registry.key_bindings
44 class _DummyTerminal(object):
45 """Used as a buffer to get prompt_toolkit bindings
46 """
47 handle_return = None
48 input_splitter = None
49 display_completions = None
50
51 ipy_bindings = create_ipython_shortcuts(_DummyTerminal()).bindings
47 52
48 53 dummy_docs = [] # ignore bindings without proper documentation
49 54
50 55 common_docs = most_common([kb.handler.__doc__ for kb in ipy_bindings])
51 56 if common_docs:
52 57 dummy_docs.extend(common_docs)
53 58
54 59 dummy_docs = list(set(dummy_docs))
55 60
56 61 single_filter = {}
57 62 multi_filter = {}
58 63 for kb in ipy_bindings:
59 64 doc = kb.handler.__doc__
60 65 if not doc or doc in dummy_docs:
61 66 continue
62 67
63 68 shortcut = ' '.join([k if isinstance(k, str) else k.name for k in kb.keys])
64 69 shortcut += shortcut.endswith('\\') and '\\' or ''
65 70 if hasattr(kb.filter, 'filters'):
66 71 flt = ' '.join(multi_filter_str(kb.filter))
67 72 multi_filter[(shortcut, flt)] = sentencize(doc)
68 73 else:
69 74 single_filter[(shortcut, name(kb.filter))] = sentencize(doc)
70 75
71 76
72 77 if __name__ == '__main__':
73 78
74 79 sort_key = lambda k:(str(k[0][1]),str(k[0][0]))
75 80
76 81 here = abspath(dirname(__file__))
77 82 dest = join(here, 'source', 'config', 'shortcuts')
78 83
79 84 with open(join(dest, 'single_filtered.csv'), 'w') as csv:
80 85 for k, v in sorted(single_filter.items(), key=sort_key):
81 86 csv.write(':kbd:`{}`\t{}\t{}\n'.format(k[0], k[1], v))
82 87
83 88 with open(join(dest, 'multi_filtered.csv'), 'w') as csv:
84 89 for k, v in sorted(multi_filter.items(), key=sort_key):
85 90 csv.write(':kbd:`{}`\t{}\t{}\n'.format(k[0], k[1], v))
General Comments 0
You need to be logged in to leave comments. Login now