Skip to content

Commit 96a6435

Browse files
Fixes previous_key_sequences: make a copy of key_sequences before calling the handler + initialize to an empty list.
1 parent ce49e84 commit 96a6435

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

prompt_toolkit/key_binding/input_processor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def __init__(self, registry, cli_ref):
9393
self.reset()
9494

9595
def reset(self):
96-
self._previous_key_sequence = None
96+
self._previous_key_sequence = []
9797
self._previous_handler = None
9898

9999
self._process_coroutine = self._process()
@@ -173,7 +173,7 @@ def _process(self):
173173

174174
# Exact matches found, call handler.
175175
if not is_prefix_of_longer_match and matches:
176-
self._call_handler(matches[-1], key_sequence=buffer)
176+
self._call_handler(matches[-1], key_sequence=buffer[:])
177177
del buffer[:] # Keep reference.
178178

179179
# No match found.

tests/test_key_binding.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,45 @@ def test_common_prefix(processor, handlers):
9696
processor.process_keys()
9797

9898
assert handlers.called == ['control_x', 'control_d']
99+
100+
101+
def test_previous_key_sequence(processor, handlers):
102+
"""
103+
test whether we receive the correct previous_key_sequence.
104+
"""
105+
events = []
106+
def handler(event):
107+
events.append(event)
108+
109+
# Build registry.
110+
registry = Registry()
111+
registry.add_binding('a', 'a')(handler)
112+
registry.add_binding('b', 'b')(handler)
113+
processor = InputProcessor(registry, lambda: None)
114+
115+
# Create processor and feed keys.
116+
processor.feed(KeyPress('a', 'a'))
117+
processor.feed(KeyPress('a', 'a'))
118+
processor.feed(KeyPress('b', 'b'))
119+
processor.feed(KeyPress('b', 'b'))
120+
processor.process_keys()
121+
122+
# Test.
123+
assert len(events) == 2
124+
assert len(events[0].key_sequence) == 2
125+
assert events[0].key_sequence[0].key == 'a'
126+
assert events[0].key_sequence[0].data == 'a'
127+
assert events[0].key_sequence[1].key == 'a'
128+
assert events[0].key_sequence[1].data == 'a'
129+
assert events[0].previous_key_sequence == []
130+
131+
assert len(events[1].key_sequence) == 2
132+
assert events[1].key_sequence[0].key == 'b'
133+
assert events[1].key_sequence[0].data == 'b'
134+
assert events[1].key_sequence[1].key == 'b'
135+
assert events[1].key_sequence[1].data == 'b'
136+
assert len(events[1].previous_key_sequence) == 2
137+
assert events[1].previous_key_sequence[0].key == 'a'
138+
assert events[1].previous_key_sequence[0].data == 'a'
139+
assert events[1].previous_key_sequence[1].key == 'a'
140+
assert events[1].previous_key_sequence[1].data == 'a'

0 commit comments

Comments
 (0)