@@ -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