readline: fix cursor position with prompt including ansi escape sequences
							parent
							
								
									73bd82e706
								
							
						
					
					
						commit
						f8ab629986
					
				|  | @ -36,6 +36,7 @@ mut: | |||
|   overwrite bool | ||||
|   cursor_row_offset int | ||||
|   prompt string | ||||
|   prompt_offset int | ||||
|   previous_lines []ustring | ||||
|   search_index int | ||||
|   is_tty bool | ||||
|  |  | |||
|  | @ -93,6 +93,7 @@ pub fn (r mut Readline) read_line_utf8(prompt string) ?ustring { | |||
|   r.cursor = 0 | ||||
|   r.prompt = prompt | ||||
|   r.search_index = 0 | ||||
|   r.prompt_offset = get_prompt_offset(prompt) | ||||
|   if r.previous_lines.len <= 1 { | ||||
|     r.previous_lines << ''.ustring() | ||||
|     r.previous_lines << ''.ustring() | ||||
|  | @ -150,6 +151,19 @@ pub fn read_line(prompt string) ?string { | |||
|   return s | ||||
| } | ||||
| 
 | ||||
| fn get_prompt_offset(prompt string) int { | ||||
|   mut len := 0 | ||||
| 
 | ||||
|   for i := 0; i < prompt.len; i++ { | ||||
|     if prompt[i] == `\e` { | ||||
|       for ;i < prompt.len && prompt[i] != `m`; i++ {} | ||||
|     } else { | ||||
|       len = len + 1 | ||||
|     } | ||||
|   } | ||||
|   return prompt.len - len | ||||
| } | ||||
| 
 | ||||
| fn (r Readline) analyse(c int) Action { | ||||
|   match c { | ||||
|     `\0`  { return .eof } | ||||
|  | @ -291,7 +305,7 @@ fn (r mut Readline) refresh_line() { | |||
|   if end_of_input[0] == 0 && end_of_input[1] > 0 { | ||||
|     print('\n') | ||||
|   } | ||||
|   shift_cursor(cursor_pos[0], - (end_of_input[1] - cursor_pos[1])) | ||||
|   shift_cursor(cursor_pos[0] - r.prompt_offset, - (end_of_input[1] - cursor_pos[1])) | ||||
|   r.cursor_row_offset = cursor_pos[1] | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue