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