@@ -144,7 +144,7 @@ int readline_process_char(int c) {
144144 goto right_arrow_key ;
145145 } else if (c == CHAR_CTRL_K ) {
146146 // CTRL-K is kill from cursor to end-of-line, inclusive
147- vstr_cut_tail_bytes (rl .line , last_line_len - rl .cursor_pos );
147+ vstr_cut_tail_bytes (rl .line , rl . line -> len - rl .cursor_pos );
148148 // set redraw parameters
149149 redraw_from_cursor = true;
150150 } else if (c == CHAR_CTRL_N ) {
@@ -155,6 +155,7 @@ int readline_process_char(int c) {
155155 goto up_arrow_key ;
156156 } else if (c == CHAR_CTRL_U ) {
157157 // CTRL-U is kill from beginning-of-line up to cursor
158+ cont_chars = count_cont_bytes (rl .line -> buf + rl .orig_line_len , rl .line -> buf + rl .cursor_pos );
158159 vstr_cut_out_bytes (rl .line , rl .orig_line_len , rl .cursor_pos - rl .orig_line_len );
159160 // set redraw parameters
160161 redraw_step_back = rl .cursor_pos - rl .orig_line_len ;
@@ -342,6 +343,7 @@ int readline_process_char(int c) {
342343 if (c == '~' ) {
343344 if (rl .escape_seq_buf [0 ] == '1' || rl .escape_seq_buf [0 ] == '7' ) {
344345home_key :
346+ cont_chars = count_cont_bytes (rl .line -> buf + rl .orig_line_len , rl .line -> buf + rl .cursor_pos );
345347 redraw_step_back = rl .cursor_pos - rl .orig_line_len ;
346348 } else if (rl .escape_seq_buf [0 ] == '4' || rl .escape_seq_buf [0 ] == '8' ) {
347349end_key :
@@ -352,7 +354,12 @@ int readline_process_char(int c) {
352354delete_key :
353355#endif
354356 if (rl .cursor_pos < rl .line -> len ) {
355- vstr_cut_out_bytes (rl .line , rl .cursor_pos , 1 );
357+ size_t len = 1 ;
358+ while (UTF8_IS_CONT (rl .line -> buf [rl .cursor_pos + len ]) &&
359+ rl .cursor_pos + len < rl .line -> len ) {
360+ len ++ ;
361+ }
362+ vstr_cut_out_bytes (rl .line , rl .cursor_pos , len );
356363 redraw_from_cursor = true;
357364 }
358365 } else {
0 commit comments