--- /soft/eclipse/eclipse4.1/lib_pd/opium_light/help.op	Sat Feb 20 16:09:16 1999
+++ help.op	Tue Aug 15 17:03:29 2000
@@ -41,8 +41,28 @@
 :- tool(show_all/2).
 
 help_Op :-
-	opium_write(help, "\nThere are the following help commands: \n"),
-	show_all(commands, help).
+	write(help, 
+		"\nThere are the following help commands for Morphine: \n"),
+	show_all(commands, help),
+
+	% I copied this message here because I found no way to extend the
+	% help/0 command by using its previous definition. 
+        write(help, "\nAnd here is the help message for ECLiPSe: \n\n"),
+	 write(help, 
+	    "   After the prompt [<module>]: ECLiPSe waits for a goal.\n"),
+        write(help, 
+	    "   To type in clauses, call [user] or compile(user), and then\n"),
+        write(help, 
+	    "   enter the clauses ended by ^D (EOF).\n\n"),
+        write(help, 
+	    "   Call help(Pred/Arity) or help(Pred) or help(String)\n"),
+        write(help, 
+	    "   to get help on a specific built-in predicate.\n\n"),
+        write(help, 
+	    "   Call demo (in xeclipse) to invoke the demo programs.\n\n"),
+        write(help, 
+	    "   This message can be modified by setting the handler for event 231.\n").
+
 
 /* if a user types "help" he will see opium_help and not the sepia help 
  * opium_help is explicitly defined here, only so that the error handler
@@ -284,6 +304,9 @@
 man_Op(X) :-
 	opium_nl(help).
 
+% To avoid typing brackets when using the man command.
+:- op(1190, fy, man).
+
 /*
  *  man_int/1
  *  print help information on object with name Name
@@ -328,7 +351,7 @@
 	parameters	: [],
 	message		:
 "Command which shows all the scenarios, their commands and the corresponding \n\
-explanations in the file \"File\" (in LaTex format). It also does some fixes \n\
+explanations in the file \"File\" (in LaTeX format). It also does some fixes \n\
 in the LaTeX file. The LaTeX file will then be called <File>.tex afterwards. \n\
 In order to get a printable <File>.dvi, use command latex_manual/1."
 	).
@@ -357,8 +380,7 @@
 	writeln(Manual, "\\tableofcontents"),
 	writeln(Manual, "\\end{document}"),
 	close(Manual),
-	get_opium_file(fixmanual, FixF),
-	concat_atom([FixF, ' ', File, '> /dev/null'], Cmd1),
+	concat_atom([fixmanual, ' ', File, '> /dev/null'], Cmd1),
 	system(Cmd1),
 	concat_atom([File, '.tex'], LatexFile),
 	concat_atom(['rm -f ', LatexFile], Cmd2),
@@ -728,16 +750,65 @@
 	opium_printf(help, "demo_goal: %w\ncondition: %w\n%w\n", [DemoGoal, Condition, Message]).
 print_man_Op(tty, ArgList, ArgType, Message, DefaultValue, ObjType) :-
 	!,
-	opium_printf(help, "%w\n", [Message]),
+	print_message(help, Message), nl,
 	print_arg_type(tty, ArgList, ArgType),
 	print_default_value(tty, DefaultValue),
 	print_object_type(tty, DefaultValue, ObjType).
 print_man_Op(Manual, ArgList, ArgType, Message, DefaultValue, ObjType) :-
-	writeln(Manual, Message),
+	print_message(Manual, Message), nl,
 	print_arg_type(Manual, ArgList, ArgType),
 	print_default_value(Manual, DefaultValue),
 	print_object_type(Manual, DefaultValue, ObjType).
 
+
+% Print on-line help messages in such a way that they fit into 80 columns. 
+print_message(Stream, Msg) :-
+	% To make sure that Msg is a string
+	( string(Msg) -> MsgStr = Msg ; atom_string(Msg, MsgStr) ),
+	% To take into account the existing `\n\'.
+	split_string(MsgStr, "\n\\", "", ListStr),
+	print_message_list(Stream, ListStr).
+
+print_message_list(Stream, []).
+print_message_list(Stream, [X|Tail]) :-
+	print_message2([Stream, X]),
+	print_message_list(Stream, Tail).
+
+print_message2([Stream, Msg]) :-
+	Max = 80,
+	string_length(Msg, Length),
+	( Length > Max ->
+		print_message3(Stream, Msg, Max)
+	;
+		writeln(Stream, Msg)
+	).
+
+print_message3(Stream, Msg, Max) :-
+	(
+		% Make sure that there is at least one " " character in the Msg
+		% before trying to truncate the line at the first " ".
+		not(substring(Msg, " ", _)),
+		write(Stream, Msg),
+		!
+	;
+		(
+			% The Max th character is a " ". We truncate the line here.
+			substring(Msg, " ", Max),
+			substring(Msg, 1, Max, MsgBegin),
+			append_strings(MsgBegin, MsgEnd, Msg),
+			writeln(Stream, MsgBegin),
+			print_message2([Stream, MsgEnd]),
+			!
+		;
+			% The Max nt character is not a " ". We recursively try again
+			% Max - 1. 
+			Max2 is Max - 1,
+			print_message3(Stream, Msg, Max2)
+		)
+	).
+% To prevent print_message3/3 from looping. Should not be necessary
+print_message3(_,_,0).
+
 print_arg_type(_, _, []) :- !.
 print_arg_type(tty, [Arg | AList], [Type | TList]) :-
 	!,
@@ -777,5 +848,63 @@
 
 
 
-
-
+%------------------------------------------------------------------------------%
+opium_command(
+	name		: apropos,
+	arg_list	: [Name],
+	arg_type_list	: [atom],
+	abbrev		: a,
+	interface	: button,
+	command_type	: opium,
+	implementation	: apropos_Op,
+	parameters	: [],
+	message		:
+"Command which displays all the commands, primitives, procedures, parameters, \
+or types for which Name is a substring of.\n\
+Example: \n\
+[morphine]: apropos man.\n\
+    man\n\
+    manual\n\
+    latex_manual\n\
+    window_command\n\
+    opium_command_in_module\n\
+    print_man\n\
+" ).
+
+apropos_Op(X) :-
+	findall(Result, apropos(X, Result), Found),
+	display_apropos_result(Found),
+	nl.
+
+apropos(X, Result) :-
+	setof(Names, get_help_info(_, Names,_,_,_,_,_,_,_,_), L),
+	maplist(atom_string, L, Lstr),
+	atom_string(X, Xstr),
+	find_in_list(Xstr, Lstr, Result).
+
+% get_help_info(Type, Name, ArgList, ArgType, Abbrev, Scenario, Module, Message, 
+% DefaultValue, ObjType)
+
+
+find_in_list(String, [Names|_], Names) :-
+	substring(Names, String, _).
+find_in_list(String, [_|Xs], Result) :-
+	find_in_list(String, Xs, Result).
+
+display_apropos_result([]).
+display_apropos_result([NamesStr|Xs]) :-
+	atom_string(Names, NamesStr),
+	get_help_info(Type, Names,_,_,Abbrev,_,_,_,_,_),
+	(
+	    nonvar(Abbrev),
+	    ( Type = commands ; Type = primitives),
+	    printf("    %s (%w)\n", [Names, Abbrev]),
+	    !
+	;
+	    printf("    %s\n", [Names])
+	),
+	display_apropos_result(Xs).
+
+% To avoid typing brackets when using the apropos command. 
+:- op(1190, fy, apropos).
+:- op(1190, fy, a).
