use the new history system

Ignore-this: 3a1d9830d09215b8c34ac97ee79fd97d

darcs-hash:20120212190432-c41ad-865dd5a514e2a3175f6c5412f54567fb7861638c
This commit is contained in:
Jeremie Dimino 2012-02-12 20:04:32 +01:00
parent 0f9b05239e
commit 361d6459f6
4 changed files with 55 additions and 15 deletions

View File

@ -17,6 +17,8 @@ module String_set = Set.Make(String)
let version = UTop_version.version let version = UTop_version.version
let history = LTerm_history.create []
(* +-----------------------------------------------------------------+ (* +-----------------------------------------------------------------+
| Hooks | | Hooks |
+-----------------------------------------------------------------+ *) +-----------------------------------------------------------------+ *)

View File

@ -14,6 +14,19 @@ open React
val version : string val version : string
(** Version of utop. *) (** Version of utop. *)
val history : LTerm_history.t
(** The history used by utop. You can configure limits using the
[LTerm_history] module.
For example if you want to limit the history to 1000 line, add
these lines to your ~/.ocamlinit file:
{[
#require "lambda-term";;
LTerm_history.set_max_entries UTop.history 1000;;
]}
*)
val count : int React.signal val count : int React.signal
(** The number of commands already executed. *) (** The number of commands already executed. *)

View File

@ -22,16 +22,15 @@ module String_set = Set.Make(String)
| History | | History |
+-----------------------------------------------------------------+ *) +-----------------------------------------------------------------+ *)
let history = ref []
let init_history () = let init_history () =
let hist_name = Filename.concat LTerm_resources.home ".utop-history" in let fn = Filename.concat LTerm_resources.home ".utop-history" in
(* Save history on exit. *) (* Save history on exit. *)
Lwt_main.at_exit (fun () -> LTerm_read_line.save_history hist_name !history); Lwt_main.at_exit (fun () -> LTerm_history.save UTop.history ~append:true fn);
(* Load history. *) (* Load history. *)
lwt h = LTerm_read_line.load_history hist_name in try_lwt
history := h; LTerm_history.load UTop.history fn
return () with Unix.Unix_error (error, func, arg) ->
Lwt_log.error_f "cannot load history from %S: %s: %s" fn func (Unix.error_message error)
(* +-----------------------------------------------------------------+ (* +-----------------------------------------------------------------+
| offset --> index | | offset --> index |
@ -72,7 +71,7 @@ let parse_and_check input eos_is_error =
(* Read a phrase. If the result is a value, it is guaranteed to by a (* Read a phrase. If the result is a value, it is guaranteed to by a
valid phrase (i.e. typable and compilable). *) valid phrase (i.e. typable and compilable). *)
class read_phrase ~term = object(self) class read_phrase ~term = object(self)
inherit [Parsetree.toplevel_phrase UTop.result] LTerm_read_line.engine ~history:!history () as super inherit [Parsetree.toplevel_phrase UTop.result] LTerm_read_line.engine ~history:(LTerm_history.contents UTop.history) () as super
inherit [Parsetree.toplevel_phrase UTop.result] LTerm_read_line.term term as super_term inherit [Parsetree.toplevel_phrase UTop.result] LTerm_read_line.term term as super_term
val mutable return_value = None val mutable return_value = None
@ -94,7 +93,7 @@ class read_phrase ~term = object(self)
try try
let result = parse_and_check input false in let result = parse_and_check input false in
return_value <- Some result; return_value <- Some result;
history := LTerm_read_line.add_entry input !history; LTerm_history.add UTop.history input;
return result return result
with UTop.Need_more -> with UTop.Need_more ->
(* Input not finished, continue. *) (* Input not finished, continue. *)
@ -619,7 +618,8 @@ let args = Arg.align [
"-emacs", Arg.Set emacs_mode, " Run in emacs mode"; "-emacs", Arg.Set emacs_mode, " Run in emacs mode";
] ]
let usage = "Usage: utop <options> <object-files> [script-file [arguments]]\noptions are:" let app_name = Filename.basename Sys.executable_name
let usage = Printf.sprintf "Usage: %s <options> <object-files> [script-file [arguments]]\noptions are:" app_name
let common_init () = let common_init () =
(* Initializes toplevel environment. *) (* Initializes toplevel environment. *)
@ -643,7 +643,13 @@ let common_init () =
if Sys.file_exists fn then if Sys.file_exists fn then
ignore (Toploop.use_silently Format.err_formatter fn) ignore (Toploop.use_silently Format.err_formatter fn)
let main () = let load_inputrc () =
try_lwt
LTerm_inputrc.load ()
with Unix.Unix_error (error, func, arg) ->
Lwt_log.error_f "cannot key bindings from %S: %s: %s" LTerm_inputrc.default func (Unix.error_message error)
let main_aux () =
Arg.parse args file_argument usage; Arg.parse args file_argument usage;
if not (prepare ()) then exit 2; if not (prepare ()) then exit 2;
if !emacs_mode then begin if !emacs_mode then begin
@ -661,7 +667,7 @@ let main () =
(* Install our out phrase printer. *) (* Install our out phrase printer. *)
Toploop.print_out_phrase := print_out_phrase term !Toploop.print_out_phrase; Toploop.print_out_phrase := print_out_phrase term !Toploop.print_out_phrase;
(* Load user data. *) (* Load user data. *)
Lwt_main.run (join [init_history (); UTop_styles.load (); LTerm_inputrc.load ()]); Lwt_main.run (join [init_history (); UTop_styles.load (); load_inputrc ()]);
(* Display a welcome message. *) (* Display a welcome message. *)
Lwt_main.run (welcome term); Lwt_main.run (welcome term);
(* Common initialization. *) (* Common initialization. *)
@ -683,3 +689,18 @@ let main () =
end; end;
(* Don't let the standard toplevel run... *) (* Don't let the standard toplevel run... *)
exit 0 exit 0
let main () =
try
main_aux ()
with exn ->
(match exn with
| Unix.Unix_error (error, func, "") ->
Printf.eprintf "%s: %s: %s\n" app_name func (Unix.error_message error)
| Unix.Unix_error (error, func, arg) ->
Printf.eprintf "%s: %s(%S): %s\n" app_name func arg (Unix.error_message error)
| exn ->
Printf.eprintf "Fatal error: exception %s\n" (Printexc.to_string exn));
Printexc.print_backtrace stderr;
flush stderr;
exit 2

View File

@ -55,8 +55,9 @@ let styles = {
} }
let load () = let load () =
let fn = Filename.concat LTerm_resources.home ".utoprc" in
try_lwt try_lwt
lwt res = LTerm_resources.load (Filename.concat LTerm_resources.home ".utoprc") in lwt res = LTerm_resources.load fn in
styles.style_keyword <- LTerm_resources.get_style "keyword" res; styles.style_keyword <- LTerm_resources.get_style "keyword" res;
styles.style_symbol <- LTerm_resources.get_style "symbol" res; styles.style_symbol <- LTerm_resources.get_style "symbol" res;
styles.style_ident <- LTerm_resources.get_style "identifier" res; styles.style_ident <- LTerm_resources.get_style "identifier" res;
@ -84,8 +85,11 @@ let load () =
| str -> raise (LTerm_resources.Error (Printf.sprintf "invalid profile %S" str))); | str -> raise (LTerm_resources.Error (Printf.sprintf "invalid profile %S" str)));
UTop_private.error_style := styles.style_error; UTop_private.error_style := styles.style_error;
return () return ()
with Unix.Unix_error(Unix.ENOENT, _, _) -> with
return () | Unix.Unix_error(Unix.ENOENT, _, _) ->
return ()
| Unix.Unix_error (error, func, arg) ->
Lwt_log.error_f "cannot load styles from %S: %s: %s" fn func (Unix.error_message error)
let stylise stylise tokens = let stylise stylise tokens =
let rec loop tokens = let rec loop tokens =