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