@@ -16,7 +16,7 @@ class Editor:
1616 b"\x03 " : 0x11 ,
1717 b"\r " : 0x0a ,
1818 b"\x7f " : 0x08 ,
19- b"\x1b [3~" : 0x7f ,
19+ b"\x1b [3~" : 0xfffc ,
2020 b"\x1b [Z" : 0x15 ,
2121 b"\x1b [3;5~" : 0x18 ,
2222 b"\x11 " : 0x11 ,
@@ -210,7 +210,7 @@ def line_edit(self, prompt, default):
210210 if (len (res ) > 0 ):
211211 res = res [:len (res )- 1 ]
212212 self .wr ('\b \b ' )
213- elif key == 0x7f :
213+ elif key == 0xfffc :
214214 self .wr ('\b \b ' * len (res ))
215215 res = ''
216216 elif 0x20 <= key < 0xfff0 :
@@ -236,8 +236,27 @@ def find_in_file(self, pattern, pos, end):
236236 self .col = match + spos
237237 self .cur_line = line
238238 return len (pattern )
239- def handle_cursor_keys (self , key ):
239+ def undo_add (self , lnum , text , key , span = 1 ):
240+ self .changed = '*'
241+ if self .undo_limit > 0 and (
242+ len (self .undo ) == 0 or key == 0 or self .undo [- 1 ][3 ] != key or self .undo [- 1 ][0 ] != lnum ):
243+ if len (self .undo ) >= self .undo_limit :
244+ del self .undo [0 ]
245+ self .undo_zero -= 1
246+ self .undo .append ((lnum , span , text , key , self .col ))
247+ def delete_lines (self , yank ):
248+ lrange = self .line_range ()
249+ if yank : self .yank_buffer = self .content [lrange [0 ]:lrange [1 ]]
250+ self .undo_add (lrange [0 ], self .content [lrange [0 ]:lrange [1 ]], 0 , 0 )
251+ del self .content [lrange [0 ]:lrange [1 ]]
252+ if self .content == []:
253+ self .content = ["" ]
254+ self .total_lines = len (self .content )
255+ self .cur_line = lrange [0 ]
256+ self .mark = None
257+ def handle_edit_keys (self , key ):
240258 l = self .content [self .cur_line ]
259+ jut = self .col - len (l )
241260 if key == 0x0d :
242261 if self .cur_line < self .total_lines - 1 :
243262 self .cur_line += 1
@@ -258,6 +277,16 @@ def handle_cursor_keys(self, key):
258277 if self .col > 0 : self .col -= 1
259278 elif key == 0x1e :
260279 self .col += 1
280+ elif 0x20 <= key < 0xfff0 :
281+ self .mark = None
282+ if jut >= 0 :
283+ if key != 0x20 :
284+ self .undo_add (self .cur_line , [l ], 0x41 )
285+ self .content [self .cur_line ] = l + ' ' * jut + chr (key )
286+ else :
287+ self .undo_add (self .cur_line , [l ], 0x20 if key == 0x20 else 0x41 )
288+ self .content [self .cur_line ] = l [:self .col ] + chr (key ) + l [self .col :]
289+ self .col += 1
261290 elif key == 0x10 :
262291 self .col = self .spaces (l ) if self .col == 0 else 0
263292 elif key == 0x03 :
@@ -356,53 +385,18 @@ def handle_cursor_keys(self, key):
356385 self .row = self .height - 1
357386 elif key == 0x0c :
358387 self .mark = self .cur_line if self .mark == None else None
359- else :
360- return False
361- return True
362- def undo_add (self , lnum , text , key , span = 1 ):
363- self .changed = '*'
364- if self .undo_limit > 0 and (
365- len (self .undo ) == 0 or key == 0 or self .undo [- 1 ][3 ] != key or self .undo [- 1 ][0 ] != lnum ):
366- if len (self .undo ) >= self .undo_limit :
367- del self .undo [0 ]
368- self .undo_zero -= 1
369- self .undo .append ((lnum , span , text , key , self .col ))
370- def delete_lines (self , yank ):
371- lrange = self .line_range ()
372- if yank : self .yank_buffer = self .content [lrange [0 ]:lrange [1 ]]
373- self .undo_add (lrange [0 ], self .content [lrange [0 ]:lrange [1 ]], 0 , 0 )
374- del self .content [lrange [0 ]:lrange [1 ]]
375- if self .content == []:
376- self .content = ["" ]
377- self .total_lines = len (self .content )
378- self .cur_line = lrange [0 ]
379- self .mark = None
380- def handle_edit_keys (self , key ):
381- from os import rename , unlink
382- l = self .content [self .cur_line ]
383- jut = self .col - len (l )
384- if key == 0x7f :
388+ elif key == 0xfffc :
385389 if self .mark != None :
386390 self .delete_lines (False )
387391 elif jut < 0 :
388- self .undo_add (self .cur_line , [l ], 0x7f )
392+ self .undo_add (self .cur_line , [l ], 0xfffc )
389393 self .content [self .cur_line ] = l [:self .col ] + l [self .col + 1 :]
390394 elif (self .cur_line + 1 ) < self .total_lines :
391395 self .undo_add (self .cur_line , [l , self .content [self .cur_line + 1 ]], 0 )
392396 if jut > 0 :
393397 l += ' ' * jut
394398 self .content [self .cur_line ] = l + self .content .pop (self .cur_line + 1 )
395399 self .total_lines -= 1
396- elif 0x20 <= key < 0xfff0 :
397- self .mark = None
398- if jut >= 0 :
399- if key != 0x20 :
400- self .undo_add (self .cur_line , [l ], 0x41 )
401- self .content [self .cur_line ] = l + ' ' * jut + chr (key )
402- else :
403- self .undo_add (self .cur_line , [l ], 0x20 if key == 0x20 else 0x41 )
404- self .content [self .cur_line ] = l [:self .col ] + chr (key ) + l [self .col :]
405- self .col += 1
406400 elif key == 0x08 :
407401 if self .mark != None :
408402 self .delete_lines (False )
@@ -579,8 +573,6 @@ def edit_loop(self):
579573 self .goto (self .height , 0 )
580574 self .clear_to_eol ()
581575 return None
582- elif self .handle_cursor_keys (key ):
583- pass
584576 else : self .handle_edit_keys (key )
585577 except Exception as err :
586578 self .message = "{}" .format (err )
0 commit comments