##// END OF EJS Templates
Merge pull request #12586 from mskar/auto_match...
Matthias Bussonnier -
r27376:b2c3261b merge
parent child Browse files
Show More
@@ -188,6 +188,15 b' class TerminalInteractiveShell(InteractiveShell):'
188 allow_none=True
188 allow_none=True
189 ).tag(config=True)
189 ).tag(config=True)
190
190
191 auto_match = Bool(
192 False,
193 help="""
194 Automatically add/delete closing bracket or quote when opening bracket or quote is entered/deleted.
195 Brackets: (), [], {}
196 Quotes: '', \"\"
197 """,
198 ).tag(config=True)
199
191 mouse_support = Bool(False,
200 mouse_support = Bool(False,
192 help="Enable mouse support in the prompt\n(Note: prevents selecting text with the mouse)"
201 help="Enable mouse support in the prompt\n(Note: prevents selecting text with the mouse)"
193 ).tag(config=True)
202 ).tag(config=True)
@@ -85,12 +85,169 b' def create_ipython_shortcuts(shell):'
85
85
86 kb.add('f2', filter=has_focus(DEFAULT_BUFFER))(open_input_in_editor)
86 kb.add('f2', filter=has_focus(DEFAULT_BUFFER))(open_input_in_editor)
87
87
88 if shell.display_completions == 'readlinelike':
88 @Condition
89 kb.add('c-i', filter=(has_focus(DEFAULT_BUFFER)
89 def auto_match():
90 & ~has_selection
90 return shell.auto_match
91 & insert_mode
91
92 & ~cursor_in_leading_ws
92 focused_insert = (vi_insert_mode | emacs_insert_mode) & has_focus(DEFAULT_BUFFER)
93 ))(display_completions_like_readline)
93 _preceding_text_cache = {}
94 _following_text_cache = {}
95
96 def preceding_text(pattern):
97 try:
98 return _preceding_text_cache[pattern]
99 except KeyError:
100 pass
101 m = re.compile(pattern)
102
103 def _preceding_text():
104 app = get_app()
105 return bool(m.match(app.current_buffer.document.current_line_before_cursor))
106
107 condition = Condition(_preceding_text)
108 _preceding_text_cache[pattern] = condition
109 return condition
110
111 def following_text(pattern):
112 try:
113 return _following_text_cache[pattern]
114 except KeyError:
115 pass
116 m = re.compile(pattern)
117
118 def _following_text():
119 app = get_app()
120 return bool(m.match(app.current_buffer.document.current_line_after_cursor))
121
122 condition = Condition(_following_text)
123 _following_text_cache[pattern] = condition
124 return condition
125
126 # auto match
127 @kb.add("(", filter=focused_insert & auto_match & following_text(r"[,)}\]]|$"))
128 def _(event):
129 event.current_buffer.insert_text("()")
130 event.current_buffer.cursor_left()
131
132 @kb.add("[", filter=focused_insert & auto_match & following_text(r"[,)}\]]|$"))
133 def _(event):
134 event.current_buffer.insert_text("[]")
135 event.current_buffer.cursor_left()
136
137 @kb.add("{", filter=focused_insert & auto_match & following_text(r"[,)}\]]|$"))
138 def _(event):
139 event.current_buffer.insert_text("{}")
140 event.current_buffer.cursor_left()
141
142 @kb.add('"', filter=focused_insert & auto_match & following_text(r"[,)}\]]|$"))
143 def _(event):
144 event.current_buffer.insert_text('""')
145 event.current_buffer.cursor_left()
146
147 @kb.add("'", filter=focused_insert & auto_match & following_text(r"[,)}\]]|$"))
148 def _(event):
149 event.current_buffer.insert_text("''")
150 event.current_buffer.cursor_left()
151
152 # raw string
153 @kb.add("(", filter=focused_insert & preceding_text(r".*(r|R)[\"'](-*)$"))
154 def _(event):
155 matches = re.match(
156 r".*(r|R)[\"'](-*)",
157 event.current_buffer.document.current_line_before_cursor,
158 )
159 dashes = matches.group(2) or ""
160 event.current_buffer.insert_text("()" + dashes)
161 event.current_buffer.cursor_left(len(dashes) + 1)
162
163 @kb.add("[", filter=focused_insert & preceding_text(r".*(r|R)[\"'](-*)$"))
164 def _(event):
165 matches = re.match(
166 r".*(r|R)[\"'](-*)",
167 event.current_buffer.document.current_line_before_cursor,
168 )
169 dashes = matches.group(2) or ""
170 event.current_buffer.insert_text("[]" + dashes)
171 event.current_buffer.cursor_left(len(dashes) + 1)
172
173 @kb.add("{", filter=focused_insert & preceding_text(r".*(r|R)[\"'](-*)$"))
174 def _(event):
175 matches = re.match(
176 r".*(r|R)[\"'](-*)",
177 event.current_buffer.document.current_line_before_cursor,
178 )
179 dashes = matches.group(2) or ""
180 event.current_buffer.insert_text("{}" + dashes)
181 event.current_buffer.cursor_left(len(dashes) + 1)
182
183 @kb.add('"', filter=focused_insert & preceding_text(r".*(r|R)$"))
184 def _(event):
185 event.current_buffer.insert_text('""')
186 event.current_buffer.cursor_left()
187
188 @kb.add("'", filter=focused_insert & preceding_text(r".*(r|R)$"))
189 def _(event):
190 event.current_buffer.insert_text("''")
191 event.current_buffer.cursor_left()
192
193 # just move cursor
194 @kb.add(")", filter=focused_insert & auto_match & following_text(r"^\)"))
195 @kb.add("]", filter=focused_insert & auto_match & following_text(r"^\]"))
196 @kb.add("}", filter=focused_insert & auto_match & following_text(r"^\}"))
197 @kb.add('"', filter=focused_insert & auto_match & following_text('^"'))
198 @kb.add("'", filter=focused_insert & auto_match & following_text("^'"))
199 def _(event):
200 event.current_buffer.cursor_right()
201
202 @kb.add(
203 "backspace",
204 filter=focused_insert
205 & preceding_text(r".*\($")
206 & auto_match
207 & following_text(r"^\)"),
208 )
209 @kb.add(
210 "backspace",
211 filter=focused_insert
212 & preceding_text(r".*\[$")
213 & auto_match
214 & following_text(r"^\]"),
215 )
216 @kb.add(
217 "backspace",
218 filter=focused_insert
219 & preceding_text(r".*\{$")
220 & auto_match
221 & following_text(r"^\}"),
222 )
223 @kb.add(
224 "backspace",
225 filter=focused_insert
226 & preceding_text('.*"$')
227 & auto_match
228 & following_text('^"'),
229 )
230 @kb.add(
231 "backspace",
232 filter=focused_insert
233 & preceding_text(r".*'$")
234 & auto_match
235 & following_text(r"^'"),
236 )
237 def _(event):
238 event.current_buffer.delete()
239 event.current_buffer.delete_before_cursor()
240
241 if shell.display_completions == "readlinelike":
242 kb.add(
243 "c-i",
244 filter=(
245 has_focus(DEFAULT_BUFFER)
246 & ~has_selection
247 & insert_mode
248 & ~cursor_in_leading_ws
249 ),
250 )(display_completions_like_readline)
94
251
95 if sys.platform == "win32":
252 if sys.platform == "win32":
96 kb.add("c-v", filter=(has_focus(DEFAULT_BUFFER) & ~vi_mode))(win_paste)
253 kb.add("c-v", filter=(has_focus(DEFAULT_BUFFER) & ~vi_mode))(win_paste)
General Comments 0
You need to be logged in to leave comments. Login now