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