diff --git a/example/main.ml b/example/main.ml index 7735ea1..63fec56 100644 --- a/example/main.ml +++ b/example/main.ml @@ -18,7 +18,7 @@ let () = in match Bruit.bruit ~history ~complete prompt with | String (Some s) -> - Fmt.pr "\n%s\n%!" s; + Fmt.pr "%s\n%!" s; h := s :: !h; loop false | String None -> () diff --git a/src/bruit.ml b/src/bruit.ml index 9ac8020..0ecf283 100644 --- a/src/bruit.ml +++ b/src/bruit.ml @@ -408,6 +408,27 @@ let move_left_next_word (state : State.t) = let s = State.override ~pos:!pos state in refresh_line s +let delete_word (state : State.t) = + let pos = ref state.pos in + while !pos > 0 && Bytes.get state.buf !pos = ' ' do + decr pos + done; + while !pos > 0 && Bytes.get state.buf !pos <> ' ' do + decr pos + done; + let clen = state.pos - !pos in + let state = + if state.pos >= clen then begin + let dst = state.pos - clen in + let src = state.pos in + let len = state.len - state.pos in + Bytes.blit state.buf src state.buf dst len; + State.override ~pos:(state.pos - clen) ~len:(state.len - clen) state + end + else state + in + refresh_line state + let reverse_incr_search ~history (state : State.t) = let has_match = ref true in let search_buf = Buffer.create 16 in @@ -603,7 +624,10 @@ let edit_feed ~history state = | _ -> Editing state end | _ -> Editing state) - | _ -> + | Ctrl_a | Ctrl_g | Ctrl_e | Ctrl_p -> Editing state + | Unknown c when Uchar.(equal (of_int 8) c) (* ctrl+backspace *) -> + Editing (delete_word state) + | Unknown _ -> let state = edit_insert state uc in Editing state))