1919_HISTORY_LIMIT = const (5 + 1 )
2020
2121
22+ CHAR_CTRL_A = const (1 )
23+ CHAR_CTRL_B = const (2 )
24+ CHAR_CTRL_C = const (3 )
25+ CHAR_CTRL_D = const (4 )
26+ CHAR_CTRL_E = const (5 )
27+
28+
2229async def execute (code , g , s ):
2330 if not code .strip ():
2431 return
@@ -43,7 +50,7 @@ async def __code():
4350
4451 async def kbd_intr_task (exec_task , s ):
4552 while True :
46- if ord (await s .read (1 )) == 0x03 :
53+ if ord (await s .read (1 )) == CHAR_CTRL_C :
4754 exec_task .cancel ()
4855 return
4956
@@ -102,7 +109,8 @@ async def task(g=None, prompt="--> "):
102109 while True :
103110 hist_b = 0 # How far back in the history are we currently.
104111 sys .stdout .write (prompt )
105- cmd = ""
112+ cmd : str = ""
113+ paste = False
106114 while True :
107115 b = await s .read (1 )
108116 pc = c # save previous character
@@ -112,6 +120,10 @@ async def task(g=None, prompt="--> "):
112120 if c < 0x20 or c > 0x7E :
113121 if c == 0x0A :
114122 # LF
123+ if paste :
124+ sys .stdout .write (b )
125+ cmd += b
126+ continue
115127 # If the previous character was also LF, and was less
116128 # than 20 ms ago, this was likely due to CRLF->LFLF
117129 # conversion, so ignore this linefeed.
@@ -135,25 +147,34 @@ async def task(g=None, prompt="--> "):
135147 if cmd :
136148 cmd = cmd [:- 1 ]
137149 sys .stdout .write ("\x08 \x08 " )
138- elif c == 0x02 :
139- # Ctrl-B
150+ elif c == CHAR_CTRL_B :
140151 continue
141- elif c == 0x03 :
142- # Ctrl-C
143- if pc == 0x03 and time .ticks_diff (t , pt ) < 20 :
152+ elif c == CHAR_CTRL_C :
153+ if paste :
154+ break
155+ if pc == CHAR_CTRL_C and time .ticks_diff (t , pt ) < 20 :
144156 # Two very quick Ctrl-C (faster than a human
145157 # typing) likely means mpremote trying to
146158 # escape.
147159 asyncio .new_event_loop ()
148160 return
149161 sys .stdout .write ("\n " )
150162 break
151- elif c == 0x04 :
152- # Ctrl-D
163+ elif c == CHAR_CTRL_D :
164+ if paste :
165+ result = await execute (cmd , g , s )
166+ if result is not None :
167+ sys .stdout .write (repr (result ))
168+ sys .stdout .write ("\n " )
169+ break
170+
153171 sys .stdout .write ("\n " )
154172 # Shutdown asyncio.
155173 asyncio .new_event_loop ()
156174 return
175+ elif c == CHAR_CTRL_E :
176+ sys .stdout .write ("paste mode; Ctrl-C to cancel, Ctrl-D to finish\n ===\n " )
177+ paste = True
157178 elif c == 0x1B :
158179 # Start of escape sequence.
159180 key = await s .read (2 )
0 commit comments