@@ -247,17 +247,17 @@ def __init__(self, stream, echo_char, ctrl_chars, prompt=""):
247247 self .eof_pressed = False
248248 self .literal_next = False
249249 self .ctrl = ctrl_chars
250- self ._dispatch = {
251- ctrl_chars ['SOH' ]: self ._handle_move_start , # Ctrl+A
252- ctrl_chars ['ENQ' ]: self ._handle_move_end , # Ctrl+E
253- ctrl_chars ['VT' ]: self ._handle_kill_forward , # Ctrl+K
254- ctrl_chars ['KILL' ]: self ._handle_kill_line , # Ctrl+U
255- ctrl_chars ['WERASE' ]: self ._handle_erase_word , # Ctrl+W
256- ctrl_chars ['ERASE' ]: self ._handle_erase , # DEL
257- '\b ' : self ._handle_erase , # Backspace
250+ self .dispatch = {
251+ ctrl_chars ['SOH' ]: self .handle_move_start , # Ctrl+A
252+ ctrl_chars ['ENQ' ]: self .handle_move_end , # Ctrl+E
253+ ctrl_chars ['VT' ]: self .handle_kill_forward , # Ctrl+K
254+ ctrl_chars ['KILL' ]: self .handle_kill_line , # Ctrl+U
255+ ctrl_chars ['WERASE' ]: self .handle_erase_word , # Ctrl+W
256+ ctrl_chars ['ERASE' ]: self .handle_erase , # DEL
257+ '\b ' : self .handle_erase , # Backspace
258258 }
259259
260- def _refresh_display (self , prev_len = None ):
260+ def refresh_display (self , prev_len = None ):
261261 """Redraw the entire password line with *echo_char*."""
262262 prompt_len = len (self .prompt )
263263 # Use prev_len if given, otherwise current password length
@@ -269,48 +269,48 @@ def _refresh_display(self, prev_len=None):
269269 self .stream .write ('\b ' * (len (self .password ) - self .cursor_pos ))
270270 self .stream .flush ()
271271
272- def _insert_char (self , char ):
272+ def insert_char (self , char ):
273273 """Insert *char* at cursor position."""
274274 self .password .insert (self .cursor_pos , char )
275275 self .cursor_pos += 1
276276 # Only refresh if inserting in middle
277277 if self .cursor_pos < len (self .password ):
278- self ._refresh_display ()
278+ self .refresh_display ()
279279 else :
280280 self .stream .write (self .echo_char )
281281 self .stream .flush ()
282282
283- def _handle_move_start (self ):
283+ def handle_move_start (self ):
284284 """Move cursor to beginning (Ctrl+A)."""
285285 self .cursor_pos = 0
286286
287- def _handle_move_end (self ):
287+ def handle_move_end (self ):
288288 """Move cursor to end (Ctrl+E)."""
289289 self .cursor_pos = len (self .password )
290290
291- def _handle_erase (self ):
291+ def handle_erase (self ):
292292 """Delete character before cursor (Backspace/DEL)."""
293293 if self .cursor_pos <= 0 :
294294 return
295295 prev_len = len (self .password )
296296 del self .password [self .cursor_pos - 1 ]
297297 self .cursor_pos -= 1
298- self ._refresh_display (prev_len )
298+ self .refresh_display (prev_len )
299299
300- def _handle_kill_line (self ):
300+ def handle_kill_line (self ):
301301 """Erase entire line (Ctrl+U)."""
302302 prev_len = len (self .password )
303303 self .password .clear ()
304304 self .cursor_pos = 0
305- self ._refresh_display (prev_len )
305+ self .refresh_display (prev_len )
306306
307- def _handle_kill_forward (self ):
307+ def handle_kill_forward (self ):
308308 """Kill from cursor to end (Ctrl+K)."""
309309 prev_len = len (self .password )
310310 del self .password [self .cursor_pos :]
311- self ._refresh_display (prev_len )
311+ self .refresh_display (prev_len )
312312
313- def _handle_erase_word (self ):
313+ def handle_erase_word (self ):
314314 """Erase previous word (Ctrl+W)."""
315315 old_cursor = self .cursor_pos
316316 # Skip trailing spaces
@@ -322,11 +322,11 @@ def _handle_erase_word(self):
322322 # Remove the deleted portion
323323 prev_len = len (self .password )
324324 del self .password [self .cursor_pos :old_cursor ]
325- self ._refresh_display (prev_len )
325+ self .refresh_display (prev_len )
326326
327- def _handle (self , char ):
327+ def handle (self , char ):
328328 """Handle a single character input. Returns True if handled."""
329- handler = self ._dispatch .get (char )
329+ handler = self .dispatch .get (char )
330330 if handler :
331331 handler ()
332332 return True
@@ -342,7 +342,7 @@ def readline(self, input):
342342 break
343343 # Handle literal next mode FIRST (Ctrl+V quotes next char)
344344 elif self .literal_next :
345- self ._insert_char (char )
345+ self .insert_char (char )
346346 self .literal_next = False
347347 # Check if it's the LNEXT character
348348 elif char == self .ctrl ['LNEXT' ]:
@@ -355,12 +355,12 @@ def readline(self, input):
355355 break
356356 elif char == '\x00 ' :
357357 pass
358- elif self ._handle (char ):
358+ elif self .handle (char ):
359359 # Dispatched to handler
360360 pass
361361 else :
362362 # Insert as normal character
363- self ._insert_char (char )
363+ self .insert_char (char )
364364
365365 self .eof_pressed = (char == self .ctrl ['EOF' ])
366366
0 commit comments