From 8d4a7bb807af7cccef0ea9c1764822fae90776a0 Mon Sep 17 00:00:00 2001 From: Patrick Ferris Date: Sun, 18 Jan 2026 17:04:42 +0000 Subject: [PATCH] Basic tab completion Stock linenoise does not have mid-tab completion, we will need to find a patch somewhere for that. --- src/lib/interactive.ml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) 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" -- 2.51.2