annotate Lib/idlelib/CodeContext.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents ef4cca2d6171
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
1 """CodeContext - Extension to display the block context above the edit window
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
2
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
3 Once code has scrolled off the top of a window, it can be difficult to
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
4 determine which block you are in. This extension implements a pane at the top
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
5 of each IDLE edit window which provides block structure hints. These hints are
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
6 the lines which contain the block opening keywords, e.g. 'if', for the
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
7 enclosing block. The number of hint lines is determined by the numlines
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
8 variable in the CodeContext section of config-extensions.def. Lines which do
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
9 not open blocks are not shown in the context hints pane.
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
10
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
11 """
47130
ef4cca2d6171 Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents: 44277
diff changeset
12 import tkinter
ef4cca2d6171 Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents: 44277
diff changeset
13 from tkinter.constants import TOP, LEFT, X, W, SUNKEN
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
14 import re
44277
9a09d442bce2 maxint->maxsize. Wouldn't import.
Kurt B. Kaiser <kbk@shore.net>
parents: 42714
diff changeset
15 from sys import maxsize as INFINITY
42714
2ec16b6b4d04 Switch to absolute imports to support direct execution of modules. Many
Kurt B. Kaiser <kbk@shore.net>
parents: 42324
diff changeset
16 from idlelib.configHandler import idleConf
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
17
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 35691
diff changeset
18 BLOCKOPENERS = set(["class", "def", "elif", "else", "except", "finally", "for",
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
diff changeset
19 "if", "try", "while", "with"])
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
20 UPDATEINTERVAL = 100 # millisec
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
21 FONTUPDATEINTERVAL = 1000 # millisec
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
22
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
23 getspacesfirstword =\
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
24 lambda s, c=re.compile(r"^(\s*)(\w*)"): c.match(s).groups()
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
25
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
26 class CodeContext:
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
27 menudefs = [('options', [('!Code Conte_xt', '<<toggle-code-context>>')])]
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
28 context_depth = idleConf.GetOption("extensions", "CodeContext",
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
29 "numlines", type="int", default=3)
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
30 bgcolor = idleConf.GetOption("extensions", "CodeContext",
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
31 "bgcolor", type="str", default="LightGray")
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
32 fgcolor = idleConf.GetOption("extensions", "CodeContext",
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
33 "fgcolor", type="str", default="Black")
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
34 def __init__(self, editwin):
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
35 self.editwin = editwin
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
36 self.text = editwin.text
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
37 self.textfont = self.text["font"]
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
38 self.label = None
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
39 # self.info is a list of (line number, indent level, line text, block
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
40 # keyword) tuples providing the block structure associated with
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
41 # self.topvisible (the linenumber of the line displayed at the top of
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
42 # the edit window). self.info[0] is initialized as a 'dummy' line which
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
43 # starts the toplevel 'block' of the module.
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
44 self.info = [(0, -1, "", False)]
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
45 self.topvisible = 1
32272
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
46 visible = idleConf.GetOption("extensions", "CodeContext",
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
47 "visible", type="bool", default=False)
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
48 if visible:
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
49 self.toggle_code_context_event()
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
50 self.editwin.setvar('<<toggle-code-context>>', True)
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
51 # Start two update cycles, one for context lines, one for font changes.
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
52 self.text.after(UPDATEINTERVAL, self.timer_event)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
53 self.text.after(FONTUPDATEINTERVAL, self.font_timer_event)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
54
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
55 def toggle_code_context_event(self, event=None):
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
56 if not self.label:
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
57 # Calculate the border width and horizontal padding required to
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
58 # align the context with the text in the main Text widget.
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
59 #
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
60 # All values are passed through int(str(<value>)), since some
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
61 # values may be pixel objects, which can't simply be added to ints.
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
62 widgets = self.editwin.text, self.editwin.text_frame
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
63 # Calculate the required vertical padding
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
64 padx = 0
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
65 for widget in widgets:
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
66 padx += int(str( widget.pack_info()['padx'] ))
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
67 padx += int(str( widget.cget('padx') ))
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
68 # Calculate the required border width
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
69 border = 0
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
70 for widget in widgets:
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
71 border += int(str( widget.cget('border') ))
47130
ef4cca2d6171 Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents: 44277
diff changeset
72 self.label = tkinter.Label(self.editwin.top,
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
73 text="\n" * (self.context_depth - 1),
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
74 anchor=W, justify=LEFT,
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
75 font=self.textfont,
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
76 bg=self.bgcolor, fg=self.fgcolor,
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
77 width=1, #don't request more than we get
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
78 padx=padx, border=border,
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
79 relief=SUNKEN)
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
80 # Pack the label widget before and above the text_frame widget,
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
81 # thus ensuring that it will appear directly above text_frame
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
82 self.label.pack(side=TOP, fill=X, expand=False,
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
83 before=self.editwin.text_frame)
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
84 else:
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
85 self.label.destroy()
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
86 self.label = None
32272
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
87 idleConf.SetOption("extensions", "CodeContext", "visible",
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
88 str(self.label is not None))
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
89 idleConf.SaveUserCfgFiles()
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
90
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
91 def get_line_info(self, linenum):
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
92 """Get the line indent value, text, and any block start keyword
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
93
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
94 If the line does not start a block, the keyword value is False.
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
95 The indentation of empty lines (or comment lines) is INFINITY.
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
96
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
97 """
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
98 text = self.text.get("%d.0" % linenum, "%d.end" % linenum)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
99 spaces, firstword = getspacesfirstword(text)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
100 opener = firstword in BLOCKOPENERS and firstword
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
101 if len(text) == len(spaces) or text[len(spaces)] == '#':
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
102 indent = INFINITY
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
103 else:
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
104 indent = len(spaces)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
105 return indent, text, opener
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
106
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
107 def get_context(self, new_topvisible, stopline=1, stopindent=0):
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
108 """Get context lines, starting at new_topvisible and working backwards.
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
109
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
110 Stop when stopline or stopindent is reached. Return a tuple of context
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
111 data and the indent level at the top of the region inspected.
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
112
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
113 """
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
114 assert stopline > 0
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
115 lines = []
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
116 # The indentation level we are currently in:
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
117 lastindent = INFINITY
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
118 # For a line to be interesting, it must begin with a block opening
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
119 # keyword, and have less indentation than lastindent.
41642
a6eb6acfe04a Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40893
diff changeset
120 for linenum in range(new_topvisible, stopline-1, -1):
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
121 indent, text, opener = self.get_line_info(linenum)
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
122 if indent < lastindent:
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
123 lastindent = indent
31949
3838cdee1a20 Fix a bug I introduced which causes all block openers at an indent level
Kurt B. Kaiser <kbk@shore.net>
parents: 31947
diff changeset
124 if opener in ("else", "elif"):
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
125 # We also show the if statement
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
126 lastindent += 1
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
127 if opener and linenum < new_topvisible and indent >= stopindent:
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
128 lines.append((linenum, indent, text, opener))
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
129 if lastindent <= stopindent:
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
130 break
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
131 lines.reverse()
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
132 return lines, lastindent
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
133
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
134 def update_code_context(self):
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
135 """Update context information and lines visible in the context pane.
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
136
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
137 """
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
138 new_topvisible = int(self.text.index("@0,0").split('.')[0])
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
139 if self.topvisible == new_topvisible: # haven't scrolled
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
140 return
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
141 if self.topvisible < new_topvisible: # scroll down
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
142 lines, lastindent = self.get_context(new_topvisible,
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
143 self.topvisible)
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
144 # retain only context info applicable to the region
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
145 # between topvisible and new_topvisible:
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
146 while self.info[-1][1] >= lastindent:
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
147 del self.info[-1]
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
148 elif self.topvisible > new_topvisible: # scroll up
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
149 stopindent = self.info[-1][1] + 1
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
150 # retain only context info associated
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
151 # with lines above new_topvisible:
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
152 while self.info[-1][0] >= new_topvisible:
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
153 stopindent = self.info[-1][1]
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
154 del self.info[-1]
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
155 lines, lastindent = self.get_context(new_topvisible,
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
156 self.info[-1][0]+1,
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
157 stopindent)
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
158 self.info.extend(lines)
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
159 self.topvisible = new_topvisible
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
160 # empty lines in context pane:
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
161 context_strings = [""] * max(0, self.context_depth - len(self.info))
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
162 # followed by the context hint lines:
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
163 context_strings += [x[2] for x in self.info[-self.context_depth:]]
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
164 self.label["text"] = '\n'.join(context_strings)
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
165
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
166 def timer_event(self):
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
167 if self.label:
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
168 self.update_code_context()
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
169 self.text.after(UPDATEINTERVAL, self.timer_event)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
170
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
171 def font_timer_event(self):
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
172 newtextfont = self.text["font"]
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
173 if self.label and newtextfont != self.textfont:
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
174 self.textfont = newtextfont
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
175 self.label["font"] = self.textfont
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
176 self.text.after(FONTUPDATEINTERVAL, self.font_timer_event)