diff options
author | Kurt B. Kaiser <kbk@shore.net> | 2005-01-19 00:22:59 (GMT) |
---|---|---|
committer | Kurt B. Kaiser <kbk@shore.net> | 2005-01-19 00:22:59 (GMT) |
commit | 6af44986029c84c4c5df62a64c60a6ed978a3693 (patch) | |
tree | 2c47318c67e6868b475147069c390e41e918f5e6 | |
parent | 75eabd294441266a77b837b83f34e975d7192d2e (diff) | |
download | cpython-6af44986029c84c4c5df62a64c60a6ed978a3693.zip cpython-6af44986029c84c4c5df62a64c60a6ed978a3693.tar.gz cpython-6af44986029c84c4c5df62a64c60a6ed978a3693.tar.bz2 |
1. Polish tabbing code.
2. Restore use of set_indentation_params(), was dead code since
Autoindent.py was merged into EditorWindow.py.
3. Make usetabs, indentwidth, tabwidth, context_use_ps1 instance vars
and set in EditorWindow.__init__()
4. In PyShell.__init__() set usetabs, indentwidth and context_use_ps1
explicitly (config() is eliminated).
5. Add Tabnanny check when Module is Run/F5, not just when Checked.
6. Discourage using an indent width other than 8 when using tabs to
indent Python code.
M EditorWindow.py
M NEWS.txt
M PyShell.py
M ScriptBinding.py
-rw-r--r-- | Lib/idlelib/EditorWindow.py | 117 | ||||
-rw-r--r-- | Lib/idlelib/NEWS.txt | 8 | ||||
-rw-r--r-- | Lib/idlelib/PyShell.py | 6 | ||||
-rw-r--r-- | Lib/idlelib/ScriptBinding.py | 2 |
4 files changed, 71 insertions, 62 deletions
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py index 5e0a571..0f14662 100644 --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -165,6 +165,38 @@ class EditorWindow(object): text.pack(side=TOP, fill=BOTH, expand=1) text.focus_set() + # usetabs true -> literal tab characters are used by indent and + # dedent cmds, possibly mixed with spaces if + # indentwidth is not a multiple of tabwidth, + # which will cause Tabnanny to nag! + # false -> tab characters are converted to spaces by indent + # and dedent cmds, and ditto TAB keystrokes + self.usetabs = False + + # indentwidth is the number of characters per logical indent level. + # Recommended Python default indent is four spaces. + self.indentwidth = 4 + + # tabwidth is the display width of a literal tab character. + # CAUTION: telling Tk to use anything other than its default + # tab setting causes it to use an entirely different tabbing algorithm, + # treating tab stops as fixed distances from the left margin. + # Nobody expects this, so for now tabwidth should never be changed. + self.tabwidth = 8 # for IDLE use, must remain 8 until Tk is fixed. + # indentwidth should be 8 when usetabs is True. + + # If context_use_ps1 is true, parsing searches back for a ps1 line; + # else searches for a popular (if, def, ...) Python stmt. + self.context_use_ps1 = False + + # When searching backwards for a reliable place to begin parsing, + # first start num_context_lines[0] lines back, then + # num_context_lines[1] lines back if that didn't work, and so on. + # The last value should be huge (larger than the # of lines in a + # conceivable file). + # Making the initial values larger slows things down more often. + self.num_context_lines = 50, 500, 5000000 + self.per = per = self.Percolator(text) if self.ispythonsource(filename): self.color = color = self.ColorDelegator() @@ -196,6 +228,8 @@ class EditorWindow(object): io.set_filename(filename) self.saved_change_hook() + self.set_indentation_params(self.ispythonsource(filename)) + self.load_extensions() menu = self.menudict.get('windows') @@ -214,10 +248,6 @@ class EditorWindow(object): self.askinteger = tkSimpleDialog.askinteger self.showerror = tkMessageBox.showerror - if self.extensions.has_key('AutoIndent'): - self.extensions['AutoIndent'].set_indentation_params( - self.ispythonsource(filename)) - def new_callback(self, event): dirname, basename = self.io.defaultfilename() self.flist.new(dirname) @@ -881,62 +911,19 @@ class EditorWindow(object): "n" * newtabwidth) text.configure(tabs=pixels) -### begin autoindent code ### - - # usetabs true -> literal tab characters are used by indent and - # dedent cmds, possibly mixed with spaces if - # indentwidth is not a multiple of tabwidth - # false -> tab characters are converted to spaces by indent - # and dedent cmds, and ditto TAB keystrokes - # indentwidth is the number of characters per logical indent level. - # tabwidth is the display width of a literal tab character. - # CAUTION: telling Tk to use anything other than its default - # tab setting causes it to use an entirely different tabbing algorithm, - # treating tab stops as fixed distances from the left margin. - # Nobody expects this, so for now tabwidth should never be changed. - usetabs = 0 - indentwidth = 4 - tabwidth = 8 # for IDLE use, must remain 8 until Tk is fixed - - # If context_use_ps1 is true, parsing searches back for a ps1 line; - # else searches for a popular (if, def, ...) Python stmt. - context_use_ps1 = 0 - - # When searching backwards for a reliable place to begin parsing, - # first start num_context_lines[0] lines back, then - # num_context_lines[1] lines back if that didn't work, and so on. - # The last value should be huge (larger than the # of lines in a - # conceivable file). - # Making the initial values larger slows things down more often. - num_context_lines = 50, 500, 5000000 - - def config(self, **options): - for key, value in options.items(): - if key == 'usetabs': - self.usetabs = value - elif key == 'indentwidth': - self.indentwidth = value - elif key == 'tabwidth': - self.tabwidth = value - elif key == 'context_use_ps1': - self.context_use_ps1 = value - else: - raise KeyError, "bad option name: %r" % (key,) - # If ispythonsource and guess are true, guess a good value for # indentwidth based on file content (if possible), and if # indentwidth != tabwidth set usetabs false. # In any case, adjust the Text widget's view of what a tab # character means. - def set_indentation_params(self, ispythonsource, guess=1): + def set_indentation_params(self, ispythonsource, guess=True): if guess and ispythonsource: i = self.guess_indent() if 2 <= i <= 8: self.indentwidth = i if self.indentwidth != self.tabwidth: - self.usetabs = 0 - + self.usetabs = False self.set_tabwidth(self.tabwidth) def smart_backspace_event(self, event): @@ -988,8 +975,9 @@ class EditorWindow(object): # if intraline selection: # delete it # elif multiline selection: - # do indent-region & return - # indent one level + # do indent-region + # else: + # indent one level text = self.text first, last = self.get_selection_indices() text.undo_block_start() @@ -1005,6 +993,7 @@ class EditorWindow(object): # only whitespace to the left self.reindent_to(effective + self.indentwidth) else: + # tab to the next 'stop' within or to right of line's text: if self.usetabs: pad = '\t' else: @@ -1178,28 +1167,34 @@ class EditorWindow(object): def toggle_tabs_event(self, event): if self.askyesno( "Toggle tabs", - "Turn tabs " + ("on", "off")[self.usetabs] + "?", + "Turn tabs " + ("on", "off")[self.usetabs] + + "?\nIndent width " + + ("will be", "remains at")[self.usetabs] + " 8.", parent=self.text): self.usetabs = not self.usetabs + # Try to prevent mixed tabs/spaces. + # User must reset indent width manually after using tabs + # if he insists on getting into trouble. + self.indentwidth = 8 return "break" - # XXX this isn't bound to anything -- see class tabwidth comments - def change_tabwidth_event(self, event): - new = self._asktabwidth() - if new != self.tabwidth: - self.tabwidth = new - self.set_indentation_params(0, guess=0) - return "break" + # XXX this isn't bound to anything -- see tabwidth comments +## def change_tabwidth_event(self, event): +## new = self._asktabwidth() +## if new != self.tabwidth: +## self.tabwidth = new +## self.set_indentation_params(0, guess=0) +## return "break" def change_indentwidth_event(self, event): new = self.askinteger( "Indent width", - "New indent width (2-16)", + "New indent width (2-16)\n(Always use 8 when using tabs)", parent=self.text, initialvalue=self.indentwidth, minvalue=2, maxvalue=16) - if new and new != self.indentwidth: + if new and new != self.indentwidth and not self.usetabs: self.indentwidth = new return "break" diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 5eca893..1f64ee9 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,14 @@ What's New in IDLE 1.2a0? *Release date: XX-XXX-2005* +- Discourage using an indent width other than 8 when using tabs to indent + Python code. + +- Restore use of EditorWindow.set_indentation_params(), was dead code since + Autoindent was merged into EditorWindow. + +- Add Tabnanny check before Run/F5, not just when Checking module. + - If an extension can't be loaded, print warning and skip it instead of erroring out. diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py index 2e55755..fecbf1a 100644 --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -795,7 +795,11 @@ class PyShell(OutputWindow): import __builtin__ __builtin__.quit = __builtin__.exit = "To exit, type Ctrl-D." # - self.config(usetabs=1, indentwidth=8, context_use_ps1=1) +## self.config(usetabs=1, indentwidth=8, context_use_ps1=1) + self.usetabs = True + # indentwidth must be 8 when using tabs. See note in EditorWindow: + self.indentwidth = 8 + self.context_use_ps1 = True # text = self.text text.configure(wrap="char") diff --git a/Lib/idlelib/ScriptBinding.py b/Lib/idlelib/ScriptBinding.py index 8ad02a4..0017d19 100644 --- a/Lib/idlelib/ScriptBinding.py +++ b/Lib/idlelib/ScriptBinding.py @@ -138,6 +138,8 @@ class ScriptBinding: filename = self.getfilename() if not filename: return + if not self.tabnanny(filename): + return code = self.checksyntax(filename) if not code: return |