Skip to content

Commit b50c026

Browse files
committed
restore a behaviour which was broken by b2fe479ec33c (more than 3 years ago :-/): correctly propagate unrecognized escape sequences, so that they are handled by later steps; in particular, this allows M-backspace to work again]
1 parent 67de44e commit b50c026

File tree

3 files changed

+49
-4
lines changed

3 files changed

+49
-4
lines changed

pyrepl/console.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ def __init__(self, evt, data, raw=''):
3030
def __repr__(self):
3131
return 'Event(%r, %r)' % (self.evt, self.data)
3232

33+
def __eq__(self, other):
34+
return (self.evt == other.evt and
35+
self.data == other.data and
36+
self.raw == other.raw)
3337

3438
class Console(object):
3539
"""Attributes:

pyrepl/unix_eventqueue.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,21 @@ def push(self, char):
114114
self.insert(Event('key', k, self.flush_buf()))
115115
self.k = self.ck
116116

117+
elif self.buf and self.buf[0] == 033: # 033 == escape
118+
# escape sequence not recognized by our keymap: propagate it
119+
# outside so that i can be recognized as an M-... key (see also
120+
# the docstring in keymap.py, in particular the line \\E.
121+
trace('unrecognized escape sequence, propagating...')
122+
self.k = self.ck
123+
self.insert(Event('key', '\033', '\033'))
124+
for c in self.flush_buf()[1:]:
125+
self.push(chr(c))
126+
117127
else:
118128
try:
119129
decoded = bytes(self.buf).decode(self.encoding)
120-
except:
130+
except UnicodeError:
121131
return
122-
123-
self.insert(Event('key', decoded, self.flush_buf()))
132+
else:
133+
self.insert(Event('key', decoded, self.flush_buf()))
124134
self.k = self.ck

testing/test_unix_reader.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from __future__ import unicode_literals
2-
from pyrepl.unix_eventqueue import EncodedQueue
2+
from pyrepl.unix_eventqueue import EncodedQueue, Event
33

44

55
def test_simple():
@@ -14,3 +14,34 @@ def test_simple():
1414
assert q.get() is None
1515
assert event.data == a
1616
assert event.raw == b
17+
18+
19+
def test_propagate_escape():
20+
def send(keys):
21+
for c in keys:
22+
q.push(c)
23+
24+
events = []
25+
while True:
26+
event = q.get()
27+
if event is None:
28+
break
29+
events.append(event)
30+
return events
31+
32+
keymap = {
33+
b'\033': {b'U': 'up', b'D': 'down'},
34+
b'\xf7': 'backspace',
35+
}
36+
q = EncodedQueue(keymap, 'utf-8')
37+
38+
# normal behaviour
39+
assert send(b'\033U') == [Event('key', 'up', bytearray(b'\033U'))]
40+
assert send(b'\xf7') == [Event('key', 'backspace', bytearray(b'\xf7'))]
41+
42+
# escape propagation: simulate M-backspace
43+
events = send(b'\033\xf7')
44+
assert events == [
45+
Event('key', '\033', bytearray(b'\033')),
46+
Event('key', 'backspace', bytearray(b'\xf7'))
47+
]

0 commit comments

Comments
 (0)