[See end for tips.]

Click on the dotted line at the top of a menu to "tear it off": a
separate window containing the menu is created.

File menu:

	New window -- create a new editing window
	Open... -- open an existing file
	Open module... -- open an existing module (searches sys.path)
	Class browser -- show classes and methods in current file
	Path browser -- show sys.path directories, modules, classes
		and methods
	---
	Save -- save current window to the associated file (unsaved
		windows have a * before and after the window title)

	Save As... -- save current window to new file, which becomes
		the associated file
	Save Copy As... -- save current window to different file
		without changing the associated file
	---
	Close -- close current window (asks to save if unsaved)
	Exit -- close all windows and quit IDLE (asks to save if unsaved)

Edit menu:

	Undo -- Undo last change to current window (max 1000 changes)
	Redo -- Redo last undone change to current window
	---
	Cut -- Copy selection into system-wide clipboard; then delete selection
	Copy -- Copy selection into system-wide clipboard
	Paste -- Insert system-wide clipboard into window
	Select All -- Select the entire contents of the edit buffer
	---
	Find... -- Open a search dialog box with many options
	Find again -- Repeat last search
	Find selection -- Search for the string in the selection
	Find in Files... -- Open a search dialog box for searching files
	Replace... -- Open a search-and-replace dialog box
	Go to line -- Ask for a line number and show that line
	---
	Indent region -- Shift selected lines right 4 spaces
	Dedent region -- Shift selected lines left 4 spaces
	Comment out region -- Insert ## in front of selected lines
	Uncomment region -- Remove leading # or ## from selected lines
	Tabify region -- Turns *leading* stretches of spaces into tabs
	Untabify region -- Turn *all* tabs into the right number of spaces
	Expand word -- Expand the word you have typed to match another
		word in the same buffer; repeat to get a different expansion
	Format Paragraph -- Reformat the current blank-line-separated paragraph
	---
	Import module -- Import or reload the current module
	Run script -- Execute the current file in the __main__ namespace

Windows menu:

	Zoom Height -- toggles the window between normal size (24x80)
	and maximum height.
	---
	The rest of this menu lists the names of all open windows;
	select one to bring it to the foreground (deiconifying it if
	necessary).

Debug menu (in the Python Shell window only):

	Go to file/line -- look around the insert point for a filename
		and linenumber, open the file, and show the line
	Open stack viewer -- show the stack traceback of the last exception
	Debugger toggle -- Run commands in the shell under the debugger
	JIT Stack viewer toggle -- Open stack viewer on traceback

Basic editing and navigation:

	Backspace deletes to the left; DEL deletes to the right
	Arrow keys and Page Up/Down to move around
	Home/End go to begin/end of line
	Control-Home/End go to begin/end of file
	Some Emacs bindings may also work, e.g. ^B/^P/^A/^E/^D/^L

Automatic indentation:

	After a block-opening statement, the next line is indented by
	4 spaces (in the Python Shell window by one tab).  After
	certain keywords (break, return etc.) the next line is
	dedented.  In leading indentation, Backspace deletes up to 4
	spaces if they are there.  Tab inserts 1-4 spaces (in the
	Python Shell window one tab).  See also the indent/dedent
	region commands in the edit menu.

Python Shell window:

	^C interrupts executing command
	^D sends end-of-file; closes window if typed at >>> prompt

    Command history:

	Alt-p retrieves previous command matching what you have typed
	Alt-n retrieves next
	Return while on any previous command retrieves that command
	Alt-/ (Expand word) is also useful here

Syntax colors:

	The coloring is applied in a background "thread", so you may
	occasionally see uncolorized text.  To change the color
	scheme, edit the [Colors] section in config.txt (or add a
	[Colors] section to ~/.idle).

    Python syntax colors:

	Keywords	orange
	Strings		green
	Comments	red
	Definitions	blue

    Shell colors:

	Console output	brown
	stdout		blue
	stderr		dark green
	stdin		black

Other preferences:

	Most preferences can be changed by editing one of the
	configuration text files: config.txt (generic) or one of
	config-unix.txt, config-win.txt, config.mac.txt (platform
	specific).  User-specific preferences can be stored in
	$HOME/.idle, which overrides the config*.txt files.

	To change keyboard bindings, edit Bindings.py

Command line usage:

	idle.py [-c command] [-d] [-e] [-s] [-t title] [arg] ...

	-c command  run this command
	-d          enable debugger
	-e          edit mode; arguments are files to be edited
	-s          run $IDLESTARTUP or $PYTHONSTARTUP first
	-t title    set title of shell window

	If there are arguments:

	    If -e is used, arguments are files opened for editing and
	    sys.argv reflects the arguments passed to IDLE itself.

	    Otherwise, if -c is used, all arguments are placed in
	    sys.argv[1:...], with sys.argv[0] set to '-c'.

	    Otherwise, if neither -e nor -c is used, the first
	    argument is a script which is executed with the remaining
	    arguments in sys.argv[1:...]  and sys.argv[0] set to the
	    script name.  If the script name is '-', no script is
	    executed but an interactive Python session is started; the
	    arguments are still available in sys.argv.
