1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
# The first three items of each tupel pertain to the menu bar. All
# three are None if the item is not to appeat in a menu. Otherwise,
# the first item is the menu name (in lowercase), the second item is
# the menu item label; the third item is the keyboard shortcut to be
# listed in the menu, if any. Menu items are added in the order of
# their occurrence in this table. An item of the form
# ("menu", None, None) can be used to insert a separator in the menu.
#
# The fourth item, if present is the virtual event; each of the
# remaining items is an actual key binding for the event. (Thus,
# items[3:] conveniently forms an argument list for event_add().)
win_bindings = [
(None, None, None, "<<beginning-of-line>>", "<Control-a>", "<Home>"),
(None, None, None, "<<expand-word>>", "<Meta-slash>", "<Alt-slash>"),
(None, None, None, "<<newline-and-indent>>", "<Key-Return>", "<KP_Enter>"),
(None, None, None, "<<plain-newline-and-indent>>", "<Control-j>"),
(None, None, None, "<<interrupt-execution>>", "<Control-c>"),
(None, None, None, "<<end-of-file>>", "<Control-d>"),
(None, None, None, "<<dedent-region>>", "<Control-bracketleft>"),
(None, None, None, "<<indent-region>>", "<Control-bracketright>"),
(None, None, None, "<<comment-region>>", "<Meta-Key-3>", "<Alt-Key-3>"),
(None, None, None, "<<uncomment-region>>", "<Meta-Key-4>", "<Alt-Key-4>"),
(None, None, None, "<<history-previous>>", "<Meta-p>", "<Alt-p>"),
(None, None, None, "<<history-next>>", "<Meta-n>", "<Alt-n>"),
(None, None, None, "<<toggle-auto-coloring>>", "<Control-slash>"),
(None, None, None, "<<close-all-windows>>", "<Control-q>"),
(None, None, None, "<<open-new-window>>", "<Control-n>"),
(None, None, None, "<<open-window-from-file>>", "<Control-o>"),
(None, None, None, "<<save-window>>", "<Control-s>"),
(None, None, None, "<<save-window-as-file>>", "<Control-w>"),
(None, None, None, "<<save-copy-of-window-as-file>>", "<Meta-w>"),
(None, None, None, "<<find>>", "<Control-f>"),
(None, None, None, "<<find-next>>", "<F3>"),
(None, None, None, "<<find-same>>", "<Control-F3>"),
(None, None, None, "<<goto-line>>", "<Alt-g>", "<Meta-g>"),
(None, None, None, "<<undo>>", "<Control-z>"),
(None, None, None, "<<redo>>", "<Control-y>"),
(None, None, None, "<<dump-undo-state>>", "<Control-backslash>"),
]
emacs_bindings = [
# File menu
("file", "New window", "C-x C-n",
"<<open-new-window>>", "<Control-x><Control-n>"),
("file", "Open...", "C-x C-f",
"<<open-window-from-file>>", "<Control-x><Control-f>"),
("file", None, None),
("file", "Save", "C-x C-s",
"<<save-window>>", "<Control-x><Control-s>"),
("file", "Save As...", "C-x C-w",
"<<save-window-as-file>>", "<Control-x><Control-w>"),
("file", "Save Copy As...", "C-x w",
"<<save-copy-of-window-as-file>>", "<Control-x><w>"),
("file", None, None),
("file", "Close", "C-x C-0",
"<<close-window>>", "<Control-x><Control-0>"),
("file", "Exit", "C-x C-c",
"<<close-all-windows>>", "<Control-x><Control-c>"),
# Edit menu
("edit", "Undo", "C-z", "<<undo>>", "<Control-z>"),
("edit", "Redo", "Alt-z", "<<redo>>", "<Alt-z>", "<Meta-z>"),
("edit", None, None),
("edit", "Cut", None, "<<Cut>>"),
("edit", "Copy", None, "<<Copy>>"),
("edit", "Paste", None, "<<Paste>>"),
("edit", None, None),
("edit", "Find...", "C-s",
"<<find>>", "<Control-u><Control-u><Control-s>"),
("edit", "Find next", "C-u C-s",
"<<find-next>>", "<Control-u><Control-s>"),
("edit", "Find same", "C-s", "<<find-same>>", "<Control-s>"),
("edit", "Go to line", "Alt-g", "<<goto-line>>", "<Alt-g>", "<Meta-g>"),
("edit", None, None),
("edit", "Dedent region", "Ctrl-[", "<<dedent-region>>",
"<Meta-bracketleft>", "<Alt-bracketleft>", "<Control-bracketleft>"),
("edit", "Indent region", "Ctrl-]", "<<indent-region>>",
"<Meta-bracketright>", "<Alt-bracketright>", "<Control-bracketright>"),
("edit", "Comment out region", "Alt-3",
"<<comment-region>>", "<Meta-Key-3>", "<Alt-Key-3>"),
("edit", "Uncomment region", "Alt-4",
"<<uncomment-region>>", "<Meta-Key-4>", "<Alt-Key-4>"),
# Debug menu
("debug", "Go to line from traceback", None, "<<goto-traceback-line>>"),
("debug", "Open stack viewer", None, "<<open-stack-viewer>>"),
# Help menu
("help", "Help...", None, "<<help>>"),
("help", None, None),
("help", "About IDLE...", None, "<<about-idle>>"),
# Not in any menu
(None, None, None, "<<beginning-of-line>>", "<Control-a>", "<Home>"),
(None, None, None, "<<center-insert>>", "<Control-l>"),
(None, None, None, "<<expand-word>>", "<Meta-slash>", "<Alt-slash>"),
(None, None, None, "<<newline-and-indent>>", "<Key-Return>", "<KP_Enter>"),
(None, None, None, "<<plain-newline-and-indent>>", "<Control-j>"),
(None, None, None, "<<interrupt-execution>>", "<Control-c>"),
(None, None, None, "<<end-of-file>>", "<Control-d>"),
(None, None, None, "<<history-previous>>", "<Meta-p>", "<Alt-p>"),
(None, None, None, "<<history-next>>", "<Meta-n>", "<Alt-n>"),
(None, None, None, "<<toggle-auto-coloring>>", "<Control-slash>"),
(None, None, None, "<<dump-undo-state>>", "<Control-backslash>"),
]
default_bindings = emacs_bindings
def apply_bindings(text, bindings=default_bindings):
event_add = text.event_add
for args in bindings:
args = args[3:]
if args[1:]:
apply(event_add, args)
def fill_menus(text, dict, bindings=default_bindings):
# Fill the menus for the given text widget. The dict argument is
# a dictionary containing the menus, keyed by their lowercased name.
# Menus that are absent or None are ignored.
for args in bindings:
menu, label, accelerator = args[:3]
if not menu:
continue
menu = dict.get(menu)
if not menu:
continue
if accelerator is None:
accelerator = ""
args = args[3:]
if args:
def command(text=text, event=args[0]):
text.event_generate(event)
menu.add_command(label=label, accelerator=accelerator,
command=command)
elif label or accelerator:
menu.add_command(label=label, accelerator=accelerator)
else:
menu.add_separator()
|