Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 517a92f

Browse files
committed
Apply autosuggestion only at EOL.
As they are displayed only at EOL. Fixes #13724
1 parent b9c796a commit 517a92f

3 files changed

Lines changed: 58 additions & 9 deletions

File tree

IPython/terminal/shortcuts.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,22 @@ def cursor_in_leading_ws():
3232
return (not before) or before.isspace()
3333

3434

35+
# Needed for to accept autosuggestions in vi insert mode
36+
def _apply_autosuggest(event):
37+
"""
38+
Apply autosuggestion if at end of line.
39+
"""
40+
b = event.current_buffer
41+
d = b.document
42+
after_cursor = d.text[d.cursor_position :]
43+
lines = after_cursor.split("\n")
44+
end_of_current_line = lines[0].strip()
45+
suggestion = b.suggestion
46+
if (suggestion is not None) and (suggestion.text) and (end_of_current_line == ""):
47+
b.insert_text(suggestion.text)
48+
else:
49+
nc.end_of_line(event)
50+
3551
def create_ipython_shortcuts(shell):
3652
"""Set up the prompt_toolkit keyboard shortcuts for IPython"""
3753

@@ -267,15 +283,6 @@ def ebivim():
267283

268284
focused_insert_vi = has_focus(DEFAULT_BUFFER) & vi_insert_mode
269285

270-
# Needed for to accept autosuggestions in vi insert mode
271-
def _apply_autosuggest(event):
272-
b = event.current_buffer
273-
suggestion = b.suggestion
274-
if suggestion is not None and suggestion.text:
275-
b.insert_text(suggestion.text)
276-
else:
277-
nc.end_of_line(event)
278-
279286
@kb.add("end", filter=has_focus(DEFAULT_BUFFER) & (ebivim | ~vi_insert_mode))
280287
def _(event):
281288
_apply_autosuggest(event)

IPython/tests/test_shortcuts.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import pytest
2+
from IPython.terminal.shortcuts import _apply_autosuggest
3+
4+
from unittest.mock import Mock
5+
6+
7+
def make_event(text, cursor, suggestion):
8+
event = Mock()
9+
event.current_buffer = Mock()
10+
event.current_buffer.suggestion = Mock()
11+
event.current_buffer.cursor_position = cursor
12+
event.current_buffer.suggestion.text = suggestion
13+
event.current_buffer.document = Mock()
14+
event.current_buffer.document.get_end_of_line_position = Mock(return_value=0)
15+
event.current_buffer.document.text = text
16+
event.current_buffer.document.cursor_position = cursor
17+
return event
18+
19+
20+
@pytest.mark.parametrize(
21+
"text, cursor, suggestion, called",
22+
[
23+
("123456", 6, "123456789", True),
24+
("123456", 3, "123456789", False),
25+
("123456 \n789", 6, "123456789", True),
26+
],
27+
)
28+
def test_autosuggest_at_EOL(text, cursor, suggestion, called):
29+
"""
30+
test that autosuggest is only applied at end of line.
31+
"""
32+
33+
event = make_event(text, cursor, suggestion)
34+
event.current_buffer.insert_text = Mock()
35+
_apply_autosuggest(event)
36+
if called:
37+
event.current_buffer.insert_text.assert_called()
38+
else:
39+
event.current_buffer.insert_text.assert_not_called()
40+
# event.current_buffer.document.get_end_of_line_position.assert_called()

tools/retar.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
usage:
55
66
$ export SOURCE_DATE_EPOCH=$(date +%s)
7+
# or
8+
$ export SOURCE_DATE_EPOCH=$(git show -s --format=%ct HEAD)
79
...
810
$ python retar.py <tarfile.gz>
911

0 commit comments

Comments
 (0)