Установка приглашения в пользовательском верхнем уровне OCaml
В пользовательском верхнем уровне OCaml есть способ программно установить приглашение из #
к чему-то еще? Я хотел бы иметь возможность изменить его в ответ на последнюю из моих пользовательских функций пользователя (вроде как в bash
как вы можете установить PS1
). Я даже не могу найти директиву, чтобы изменить это. Спасибо!
1 ответ
В toplevel/toploop.ml:
let prompt =
if !Clflags.noprompt then ""
else if !first_line then "# "
else if Lexer.in_comment () then "* "
else " "
in
Но ждать! Вычисленная подсказка передается !read_interactive_input
и эта ссылка экспортируется:
В toplevel/toploop.mli:
(* Hooks for external line editor *)
val read_interactive_input : (string -> string -> int -> int * bool) ref
Казалось бы, все, что вам нужно сделать, это изменить значение Toploop.read_interactive_input
от его значения по умолчанию до функции, которая игнорирует переданное приглашение и печатает тот, который вы хотите вместо этого.
Значение по умолчанию для read_interactive_input
является:
let read_input_default prompt buffer len =
output_string Pervasives.stdout prompt; flush Pervasives.stdout;
let i = ref 0 in
try
while true do
if !i >= len then raise Exit;
let c = input_char Pervasives.stdin in
buffer.[!i] <- c;
incr i;
if c = '\n' then raise Exit;
done;
(!i, false)
with
| End_of_file ->
(!i, true)
| Exit ->
(!i, false)
Таким образом, вы можете использовать:
# let my_read_input prompt buffer len =
output_string Pervasives.stdout "%%%" ; flush Pervasives.stdout;
let i = ref 0 in
try
while true do
if !i >= len then raise Exit;
let c = input_char Pervasives.stdin in
buffer.[!i] <- c;
incr i;
if c = '\n' then raise Exit;
done;
(!i, false)
with
| End_of_file ->
(!i, true)
| Exit ->
(!i, false)
;;
val my_read_input : 'a -> string -> int -> int * bool = <fun>
# Toploop.read_interactive_input := my_read_input ;;
- : unit = ()
%%%