@@ -111,6 +111,7 @@ async def task(g=None, prompt="--> "):
111111 sys .stdout .write (prompt )
112112 cmd : str  =  "" 
113113 paste  =  False 
114+  curs  =  0  # cursor offset from end of cmd buffer 
114115 while  True :
115116 b  =  await  s .read (1 )
116117 pc  =  c  # save previous character 
@@ -129,6 +130,10 @@ async def task(g=None, prompt="--> "):
129130 # conversion, so ignore this linefeed. 
130131 if  pc  ==  0x0A  and  time .ticks_diff (t , pt ) <  20 :
131132 continue 
133+  if  curs :
134+  # move cursor to end of the line 
135+  sys .stdout .write ("\x1B [{}C" .format (curs ))
136+  curs  =  0 
132137 sys .stdout .write ("\n " )
133138 if  cmd :
134139 # Push current command. 
@@ -145,8 +150,16 @@ async def task(g=None, prompt="--> "):
145150 elif  c  ==  0x08  or  c  ==  0x7F :
146151 # Backspace. 
147152 if  cmd :
148-  cmd  =  cmd [:- 1 ]
149-  sys .stdout .write ("\x08  \x08 " )
153+  if  curs :
154+  cmd  =  "" .join ((cmd [: - curs  -  1 ], cmd [- curs :]))
155+  sys .stdout .write (
156+  "\x08 \x1B [K" 
157+  ) # move cursor back, erase to end of line 
158+  sys .stdout .write (cmd [- curs :]) # redraw line 
159+  sys .stdout .write ("\x1B [{}D" .format (curs )) # reset cursor location 
160+  else :
161+  cmd  =  cmd [:- 1 ]
162+  sys .stdout .write ("\x08  \x08 " )
150163 elif  c  ==  CHAR_CTRL_B :
151164 continue 
152165 elif  c  ==  CHAR_CTRL_C :
@@ -178,7 +191,7 @@ async def task(g=None, prompt="--> "):
178191 elif  c  ==  0x1B :
179192 # Start of escape sequence. 
180193 key  =  await  s .read (2 )
181-  if  key  in  ("[A" , "[B" ):
194+  if  key  in  ("[A" , "[B" ):# up, down 
182195 # Stash the current command. 
183196 hist [(hist_i  -  hist_b ) %  _HISTORY_LIMIT ] =  cmd 
184197 # Clear current command. 
@@ -194,12 +207,36 @@ async def task(g=None, prompt="--> "):
194207 # Update current command. 
195208 cmd  =  hist [(hist_i  -  hist_b ) %  _HISTORY_LIMIT ]
196209 sys .stdout .write (cmd )
210+  elif  key  ==  "[D" : # left 
211+  if  curs  <  len (cmd ) -  1 :
212+  curs  +=  1 
213+  sys .stdout .write ("\x1B " )
214+  sys .stdout .write (key )
215+  elif  key  ==  "[C" : # right 
216+  if  curs :
217+  curs  -=  1 
218+  sys .stdout .write ("\x1B " )
219+  sys .stdout .write (key )
220+  elif  key  ==  "[H" : # home 
221+  pcurs  =  curs 
222+  curs  =  len (cmd )
223+  sys .stdout .write ("\x1B [{}D" .format (curs  -  pcurs )) # move cursor left 
224+  elif  key  ==  "[F" : # end 
225+  pcurs  =  curs 
226+  curs  =  0 
227+  sys .stdout .write ("\x1B [{}C" .format (pcurs )) # move cursor right 
197228 else :
198229 # sys.stdout.write("\\x") 
199230 # sys.stdout.write(hex(c)) 
200231 pass 
201232 else :
202-  sys .stdout .write (b )
203-  cmd  +=  b 
233+  if  curs :
234+  # inserting into middle of line 
235+  cmd  =  "" .join ((cmd [:- curs ], b , cmd [- curs :]))
236+  sys .stdout .write (cmd [- curs  -  1  :]) # redraw line to end 
237+  sys .stdout .write ("\x1B [{}D" .format (curs )) # reset cursor location 
238+  else :
239+  sys .stdout .write (b )
240+  cmd  +=  b 
204241 finally :
205242 micropython .kbd_intr (3 )
0 commit comments