##// END OF EJS Templates
Improve auto_match for triple quotes and escaped quotes
Lucy McPhail -
Show More
@@ -140,6 +140,18 b' def create_ipython_shortcuts(shell):'
140 _following_text_cache[pattern] = condition
140 _following_text_cache[pattern] = condition
141 return condition
141 return condition
142
142
143 @Condition
144 def not_inside_unclosed_string():
145 app = get_app()
146 s = app.current_buffer.document.text_before_cursor
147 # remove escaped quotes
148 s = s.replace('\\"', "").replace("\\'", "")
149 # remove triple-quoted string literals
150 s = re.sub(r"(?:\"\"\"[\s\S]*\"\"\"|'''[\s\S]*''')", "", s)
151 # remove single-quoted string literals
152 s = re.sub(r"""(?:"[^"]*["\n]|'[^']*['\n])""", "", s)
153 return not ('"' in s or "'" in s)
154
143 # auto match
155 # auto match
144 @kb.add("(", filter=focused_insert & auto_match & following_text(r"[,)}\]]|$"))
156 @kb.add("(", filter=focused_insert & auto_match & following_text(r"[,)}\]]|$"))
145 def _(event):
157 def _(event):
@@ -160,7 +172,7 b' def create_ipython_shortcuts(shell):'
160 '"',
172 '"',
161 filter=focused_insert
173 filter=focused_insert
162 & auto_match
174 & auto_match
163 & preceding_text(r'^([^"]+|"[^"]*")*$')
175 & not_inside_unclosed_string
164 & following_text(r"[,)}\]]|$"),
176 & following_text(r"[,)}\]]|$"),
165 )
177 )
166 def _(event):
178 def _(event):
@@ -171,13 +183,35 b' def create_ipython_shortcuts(shell):'
171 "'",
183 "'",
172 filter=focused_insert
184 filter=focused_insert
173 & auto_match
185 & auto_match
174 & preceding_text(r"^([^']+|'[^']*')*$")
186 & not_inside_unclosed_string
175 & following_text(r"[,)}\]]|$"),
187 & following_text(r"[,)}\]]|$"),
176 )
188 )
177 def _(event):
189 def _(event):
178 event.current_buffer.insert_text("''")
190 event.current_buffer.insert_text("''")
179 event.current_buffer.cursor_left()
191 event.current_buffer.cursor_left()
180
192
193 @kb.add(
194 '"',
195 filter=focused_insert
196 & auto_match
197 & not_inside_unclosed_string
198 & preceding_text(r'^.*""$'),
199 )
200 def _(event):
201 event.current_buffer.insert_text('""""')
202 event.current_buffer.cursor_left(3)
203
204 @kb.add(
205 "'",
206 filter=focused_insert
207 & auto_match
208 & not_inside_unclosed_string
209 & preceding_text(r"^.*''$"),
210 )
211 def _(event):
212 event.current_buffer.insert_text("''''")
213 event.current_buffer.cursor_left(3)
214
181 # raw string
215 # raw string
182 @kb.add(
216 @kb.add(
183 "(", filter=focused_insert & auto_match & preceding_text(r".*(r|R)[\"'](-*)$")
217 "(", filter=focused_insert & auto_match & preceding_text(r".*(r|R)[\"'](-*)$")
General Comments 0
You need to be logged in to leave comments. Login now