diff --git a/src/lib/interactive.ml b/src/lib/interactive.ml index 5417ec5..1f4cc92 100644 --- a/src/lib/interactive.ml +++ b/src/lib/interactive.ml @@ -29,10 +29,34 @@ module Make (S : Types.State) (E : Types.Exec) = struct (Fpath.normalize @@ S.cwd state |> subst_tilde |> Fpath.to_string); Format.flush_str_formatter () + let file_path_completitions () = + let complete path completions = + let completions from_path = + match (Unix.stat from_path).st_kind with + | S_DIR -> + let entries = Sys.readdir from_path in + Array.iter + (fun e -> + LNoise.add_completion completions (Filename.concat from_path e)) + entries + | S_REG -> LNoise.add_completion completions path + | _ -> () + | exception Unix.Unix_error (Unix.ENOENT, _, _) -> () + in + match Unix.(stat path).st_kind with + | exception Unix.Unix_error (Unix.ENOENT, _, _) -> + let dirname = Filename.dirname path in + completions dirname + | S_DIR -> completions path + | _ -> () + in + LNoise.set_completion_callback complete + let run ?(prompt = default_prompt) initial_ctx = Sys.set_signal Sys.sigttou Sys.Signal_ignore; Sys.set_signal Sys.sigttin Sys.Signal_ignore; Sys.set_signal Sys.sigtstp Sys.Signal_ignore; + file_path_completitions (); let rec loop (ctx : Eval.ctx Exit.t) = Option.iter (Fmt.epr "%s%!") (S.lookup (Exit.value ctx).state ~param:"PS1"