172 lines
6.5 KiB
Python
172 lines
6.5 KiB
Python
# 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", "Open module...", "C-x C-m",
|
|
"<<open-module>>", "<Control-x><Control-m>"),
|
|
("file", "Class browser...", "C-x C-b",
|
|
"<<open-class-browser>>", "<Control-x><Control-b>"),
|
|
("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()
|