Show More
@@ -1,5 +1,16 b'' | |||||
|
1 | """ | |||
|
2 | Module to define and register Terminal IPython shortcuts with | |||
|
3 | :any:`prompt_toolkit` | |||
|
4 | """ | |||
|
5 | ||||
|
6 | # Copyright (c) IPython Development Team. | |||
|
7 | # Distributed under the terms of the Modified BSD License. | |||
|
8 | ||||
|
9 | import warnings | |||
1 | import signal |
|
10 | import signal | |
2 | import sys |
|
11 | import sys | |
|
12 | from typing import Callable | |||
|
13 | ||||
3 |
|
14 | |||
4 | from prompt_toolkit.enums import DEFAULT_BUFFER, SEARCH_BUFFER |
|
15 | from prompt_toolkit.enums import DEFAULT_BUFFER, SEARCH_BUFFER | |
5 | from prompt_toolkit.filters import (HasFocus, HasSelection, Condition, |
|
16 | from prompt_toolkit.filters import (HasFocus, HasSelection, Condition, | |
@@ -60,7 +71,7 b' def register_ipython_shortcuts(registry, shell):' | |||||
60 |
|
71 | |||
61 | registry.add_binding(Keys.ControlO, |
|
72 | registry.add_binding(Keys.ControlO, | |
62 | filter=(HasFocus(DEFAULT_BUFFER) |
|
73 | filter=(HasFocus(DEFAULT_BUFFER) | |
63 |
& EmacsInsertMode()))(newline_ |
|
74 | & EmacsInsertMode()))(newline_autoindent_outer(shell.input_splitter)) | |
64 |
|
75 | |||
65 | registry.add_binding(Keys.F2, |
|
76 | registry.add_binding(Keys.F2, | |
66 | filter=HasFocus(DEFAULT_BUFFER) |
|
77 | filter=HasFocus(DEFAULT_BUFFER) | |
@@ -166,11 +177,20 b' def force_exit(event):' | |||||
166 | def indent_buffer(event): |
|
177 | def indent_buffer(event): | |
167 | event.current_buffer.insert_text(' ' * 4) |
|
178 | event.current_buffer.insert_text(' ' * 4) | |
168 |
|
179 | |||
|
180 | @undoc | |||
169 | def newline_with_copy_margin(event): |
|
181 | def newline_with_copy_margin(event): | |
170 | """ |
|
182 | """ | |
|
183 | DEPRECATED since IPython 6.0 | |||
|
184 | ||||
|
185 | See :any:`newline_autoindent_outer` for a replacement. | |||
|
186 | ||||
171 | Preserve margin and cursor position when using |
|
187 | Preserve margin and cursor position when using | |
172 | Control-O to insert a newline in EMACS mode |
|
188 | Control-O to insert a newline in EMACS mode | |
173 | """ |
|
189 | """ | |
|
190 | warnings.warn("`newline_with_copy_margin(event)` is deprecated since IPython 6.0. " | |||
|
191 | "see `newline_autoindent_outer(shell)(event)` for a replacement.", | |||
|
192 | DeprecationWarning, stacklevel=2) | |||
|
193 | ||||
174 | b = event.current_buffer |
|
194 | b = event.current_buffer | |
175 | cursor_start_pos = b.document.cursor_position_col |
|
195 | cursor_start_pos = b.document.cursor_position_col | |
176 | b.newline(copy_margin=True) |
|
196 | b.newline(copy_margin=True) | |
@@ -180,6 +200,30 b' def newline_with_copy_margin(event):' | |||||
180 | pos_diff = cursor_start_pos - cursor_end_pos |
|
200 | pos_diff = cursor_start_pos - cursor_end_pos | |
181 | b.cursor_right(count=pos_diff) |
|
201 | b.cursor_right(count=pos_diff) | |
182 |
|
202 | |||
|
203 | def newline_autoindent_outer(inputsplitter) -> Callable[..., None]: | |||
|
204 | """ | |||
|
205 | Return a function suitable for inserting a indented newline after the cursor. | |||
|
206 | ||||
|
207 | Fancier version of deprecated ``newline_with_copy_margin`` which should | |||
|
208 | compute the correct indentation of the inserted line. That is to say, indent | |||
|
209 | by 4 extra space after a function definition, class definition, context | |||
|
210 | manager... And dedent by 4 space after ``pass``, ``return``, ``raise ...``. | |||
|
211 | """ | |||
|
212 | ||||
|
213 | def newline_autoindent(event): | |||
|
214 | """insert a newline after the cursor indented appropriately.""" | |||
|
215 | b = event.current_buffer | |||
|
216 | d = b.document | |||
|
217 | ||||
|
218 | if b.complete_state: | |||
|
219 | b.cancel_completion() | |||
|
220 | text = d.text[:d.cursor_position] + '\n' | |||
|
221 | _, indent = inputsplitter.check_complete(text) | |||
|
222 | b.insert_text('\n' + (' ' * (indent or 0)), move_cursor=False) | |||
|
223 | ||||
|
224 | return newline_autoindent | |||
|
225 | ||||
|
226 | ||||
183 | def open_input_in_editor(event): |
|
227 | def open_input_in_editor(event): | |
184 | event.cli.current_buffer.tempfile_suffix = ".py" |
|
228 | event.cli.current_buffer.tempfile_suffix = ".py" | |
185 | event.cli.current_buffer.open_in_editor(event.cli) |
|
229 | event.cli.current_buffer.open_in_editor(event.cli) |
General Comments 0
You need to be logged in to leave comments.
Login now