more explicit Keyword.keywords;
authorwenzelm
Thu, 06 Nov 2014 15:47:04 +0100
changeset 58923 cb9b69cca999
parent 58922 1f500b18c4c6
child 58924 b48bbd380d59
more explicit Keyword.keywords;
src/Doc/antiquote_setup.ML
src/Pure/Isar/keyword.ML
src/Pure/Isar/toplevel.ML
src/Pure/PIDE/command.ML
src/Pure/PIDE/command_span.ML
src/Pure/PIDE/document.ML
src/Pure/PIDE/resources.ML
src/Pure/Thy/thy_output.ML
src/Pure/Thy/thy_syntax.ML
src/Tools/try.ML
--- a/src/Doc/antiquote_setup.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Doc/antiquote_setup.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -195,14 +195,16 @@
   Keyword.is_keyword (Keyword.get_keywords ()) name;
 
 fun check_command ctxt (name, pos) =
-  is_some (Keyword.command_keyword name) andalso
-    let
-      val markup =
-        Outer_Syntax.scan (Keyword.get_keywords ()) Position.none name
-        |> maps (Outer_Syntax.command_reports (#2 (Outer_Syntax.get_syntax ())))
-        |> map (snd o fst);
-      val _ = Context_Position.reports ctxt (map (pair pos) markup);
-    in true end;
+  let val keywords = Keyword.get_keywords () in
+    is_some (Keyword.command_keyword keywords name) andalso
+      let
+        val markup =
+          Outer_Syntax.scan keywords Position.none name
+          |> maps (Outer_Syntax.command_reports (#2 (Outer_Syntax.get_syntax ())))
+          |> map (snd o fst);
+        val _ = Context_Position.reports ctxt (map (pair pos) markup);
+      in true end
+  end;
 
 fun check_system_option ctxt (name, pos) =
   (Context_Position.report ctxt pos (Options.default_markup (name, pos)); true)
--- a/src/Pure/Isar/keyword.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Pure/Isar/keyword.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -41,25 +41,25 @@
   val empty_keywords: keywords
   val merge_keywords: keywords * keywords -> keywords
   val add_keywords: string * T option -> keywords -> keywords
+  val is_keyword: keywords -> string -> bool
+  val command_keyword: keywords -> string -> T option
+  val command_files: keywords -> string -> Path.T -> Path.T list
+  val command_tags: keywords -> string -> string list
+  val is_diag: keywords -> string -> bool
+  val is_heading: keywords -> string -> bool
+  val is_theory_begin: keywords -> string -> bool
+  val is_theory_load: keywords -> string -> bool
+  val is_theory: keywords -> string -> bool
+  val is_theory_body: keywords -> string -> bool
+  val is_proof: keywords -> string -> bool
+  val is_proof_body: keywords -> string -> bool
+  val is_theory_goal: keywords -> string -> bool
+  val is_proof_goal: keywords -> string -> bool
+  val is_qed: keywords -> string -> bool
+  val is_qed_global: keywords -> string -> bool
+  val is_printed: keywords -> string -> bool
   val define: string * T option -> unit
   val get_keywords: unit -> keywords
-  val is_keyword: keywords -> string -> bool
-  val command_keyword: string -> T option
-  val command_files: string -> Path.T -> Path.T list
-  val command_tags: string -> string list
-  val is_diag: string -> bool
-  val is_heading: string -> bool
-  val is_theory_begin: string -> bool
-  val is_theory_load: string -> bool
-  val is_theory: string -> bool
-  val is_theory_body: string -> bool
-  val is_proof: string -> bool
-  val is_proof_body: string -> bool
-  val is_theory_goal: string -> bool
-  val is_proof_goal: string -> bool
-  val is_qed: string -> bool
-  val is_qed_global: string -> bool
-  val is_printed: string -> bool
 end;
 
 structure Keyword: KEYWORD =
@@ -134,7 +134,6 @@
 
 fun minor_keywords (Keywords {minor, ...}) = minor;
 fun major_keywords (Keywords {major, ...}) = major;
-fun commands (Keywords {commands, ...}) = commands;
 
 fun make_keywords (minor, major, commands) =
   Keywords {minor = minor, major = major, commands = commands};
@@ -172,18 +171,6 @@
       in (minor, major', commands') end));
 
 
-(* global state *)
-
-local val global_keywords = Unsynchronized.ref empty_keywords in
-
-fun define decl = CRITICAL (fn () => Unsynchronized.change global_keywords (add_keywords decl));
-fun get_keywords () = ! global_keywords;
-
-end;
-
-fun get_commands () = commands (get_keywords ());
-
-
 (* lookup *)
 
 fun is_keyword keywords s =
@@ -193,18 +180,18 @@
     val syms = Symbol.explode s;
   in Scan.is_literal minor syms orelse Scan.is_literal major syms end;
 
-fun command_keyword name = Symtab.lookup (get_commands ()) name;
+fun command_keyword (Keywords {commands, ...}) = Symtab.lookup commands;
 
-fun command_files name path =
-  (case command_keyword name of
+fun command_files keywords name path =
+  (case command_keyword keywords name of
     NONE => []
   | SOME (Keyword {kind, files, ...}) =>
       if kind <> kind_of thy_load then []
       else if null files then [path]
       else map (fn ext => Path.ext ext path) files);
 
-fun command_tags name =
-  (case command_keyword name of
+fun command_tags keywords name =
+  (case command_keyword keywords name of
     SOME (Keyword {tags, ...}) => tags
   | NONE => []);
 
@@ -212,12 +199,13 @@
 (* command categories *)
 
 fun command_category ks =
-  let val tab = Symtab.make_set (map kind_of ks) in
-    fn name =>
-      (case command_keyword name of
+  let
+    val tab = Symtab.make_set (map kind_of ks);
+    fun pred keywords name =
+      (case command_keyword keywords name of
         NONE => false
-      | SOME k => Symtab.defined tab (kind_of k))
-  end;
+      | SOME k => Symtab.defined tab (kind_of k));
+  in pred end;
 
 val is_diag = command_category [diag];
 
@@ -246,7 +234,18 @@
 val is_qed = command_category [qed, qed_script, qed_block];
 val is_qed_global = command_category [qed_global];
 
-val is_printed = is_theory_goal orf is_proof;
+fun is_printed keywords = is_theory_goal keywords orf is_proof keywords;
+
+
+
+(** global state **)
+
+local val global_keywords = Unsynchronized.ref empty_keywords in
+
+fun define decl = CRITICAL (fn () => Unsynchronized.change global_keywords (add_keywords decl));
+fun get_keywords () = ! global_keywords;
 
 end;
 
+end;
+
--- a/src/Pure/Isar/toplevel.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Pure/Isar/toplevel.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -88,7 +88,7 @@
   val reset_proof: state -> state option
   type result
   val join_results: result -> (transition * state) list
-  val element_result: transition Thy_Syntax.element -> state -> result * state
+  val element_result: Keyword.keywords -> transition Thy_Syntax.element -> state -> result * state
 end;
 
 structure Toplevel: TOPLEVEL =
@@ -681,10 +681,10 @@
             NONE => Goal.future_enabled 2
           | SOME t => Goal.future_enabled_timing t)));
 
-fun atom_result tr st =
+fun atom_result keywords tr st =
   let
     val st' =
-      if Goal.future_enabled 1 andalso Keyword.is_diag (name_of tr) then
+      if Goal.future_enabled 1 andalso Keyword.is_diag keywords (name_of tr) then
         (Execution.fork
           {name = "Toplevel.diag", pos = pos_of tr,
             pri = priority (timing_estimate true (Thy_Syntax.atom tr))}
@@ -694,10 +694,10 @@
 
 in
 
-fun element_result (Thy_Syntax.Element (tr, NONE)) st = atom_result tr st
-  | element_result (elem as Thy_Syntax.Element (head_tr, SOME element_rest)) st =
+fun element_result keywords (Thy_Syntax.Element (tr, NONE)) st = atom_result keywords tr st
+  | element_result keywords (elem as Thy_Syntax.Element (head_tr, SOME element_rest)) st =
       let
-        val (head_result, st') = atom_result head_tr st;
+        val (head_result, st') = atom_result keywords head_tr st;
         val (body_elems, end_tr) = element_rest;
         val estimate = timing_estimate false elem;
       in
@@ -705,7 +705,7 @@
         then
           let
             val proof_trs = maps Thy_Syntax.flat_element body_elems @ [end_tr];
-            val (proof_results, st'') = fold_map atom_result proof_trs st';
+            val (proof_results, st'') = fold_map (atom_result keywords) proof_trs st';
           in (Result_List (head_result :: proof_results), st'') end
         else
           let
@@ -721,7 +721,7 @@
                       val prf' = Proof_Node.apply (K state) prf;
                       val (result, result_state) =
                         State (SOME (Proof (prf', (finish, orig_gthy))), prev)
-                        |> fold_map element_result body_elems ||> command end_tr;
+                        |> fold_map (element_result keywords) body_elems ||> command end_tr;
                     in (Result_List result, presentation_context_of result_state) end))
               #> (fn (res, state') => state' |> put_result (Result_Future res));
 
--- a/src/Pure/PIDE/command.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Pure/PIDE/command.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -8,19 +8,21 @@
 sig
   type blob = (string * (SHA1.digest * string list) option) Exn.result
   val read_file: Path.T -> Position.T -> Path.T -> Token.file
-  val read: (unit -> theory) -> Path.T -> blob list -> Token.T list -> Toplevel.transition
+  val read: Keyword.keywords -> Path.T-> (unit -> theory) -> blob list -> Token.T list ->
+    Toplevel.transition
   type eval
   val eval_eq: eval * eval -> bool
   val eval_running: eval -> bool
   val eval_finished: eval -> bool
   val eval_result_state: eval -> Toplevel.state
-  val eval: (unit -> theory) -> Path.T -> blob list -> Token.T list -> eval -> eval
+  val eval: Keyword.keywords -> Path.T -> (unit -> theory) -> blob list -> Token.T list ->
+    eval -> eval
   type print
-  val print: bool -> (string * string list) list -> string ->
+  val print: bool -> (string * string list) list -> Keyword.keywords -> string ->
     eval -> print list -> print list option
   type print_fn = Toplevel.transition -> Toplevel.state -> unit
   type print_function =
-    {command_name: string, args: string list, exec_id: Document_ID.exec} ->
+    {keywords: Keyword.keywords, command_name: string, args: string list, exec_id: Document_ID.exec} ->
       {delay: Time.time option, pri: int, persistent: bool, strict: bool, print_fn: print_fn} option
   val print_function: string -> print_function -> unit
   val no_print_function: string -> unit
@@ -120,10 +122,10 @@
       | SOME exec_id => Position.put_id exec_id);
   in {src_path = src_path, lines = lines, digest = digest, pos = file_pos} end
 
-fun resolve_files master_dir blobs toks =
+fun resolve_files keywords master_dir blobs toks =
   (case Outer_Syntax.parse_spans toks of
     [span] => span
-      |> Command_Span.resolve_files (fn cmd => fn (path, pos) =>
+      |> Command_Span.resolve_files keywords (fn cmd => fn (path, pos) =>
         let
           fun make_file src_path (Exn.Res (file_node, NONE)) =
                 Exn.interruptible_capture (fn () =>
@@ -132,7 +134,7 @@
                (Position.reports [(pos, Markup.language_path), (pos, Markup.path file_node)];
                 Exn.Res (blob_file src_path lines digest file_node))
             | make_file _ (Exn.Exn e) = Exn.Exn e;
-          val src_paths = Keyword.command_files cmd path;
+          val src_paths = Keyword.command_files keywords cmd path;
         in
           if null blobs then
             map2 make_file src_paths (map (K (Exn.Res ("", NONE))) src_paths)
@@ -145,7 +147,7 @@
 
 in
 
-fun read init master_dir blobs span =
+fun read keywords master_dir init blobs span =
   let
     val syntax = #2 (Outer_Syntax.get_syntax ());
     val command_reports = Outer_Syntax.command_reports syntax;
@@ -161,7 +163,7 @@
   in
     if is_malformed then Toplevel.malformed pos "Malformed command syntax"
     else
-      (case Outer_Syntax.read_spans syntax (resolve_files master_dir blobs span) of
+      (case Outer_Syntax.read_spans syntax (resolve_files keywords master_dir blobs span) of
         [tr] => Toplevel.modify_init init tr
       | [] => Toplevel.ignored (#1 (Token.range_of span))
       | _ => Toplevel.malformed (#1 proper_range) "Exactly one command expected")
@@ -191,12 +193,12 @@
 
 local
 
-fun reset_state tr st0 = Toplevel.setmp_thread_position tr (fn () =>
+fun reset_state keywords tr st0 = Toplevel.setmp_thread_position tr (fn () =>
   let
     val name = Toplevel.name_of tr;
     val res =
-      if Keyword.is_theory_body name then Toplevel.reset_theory st0
-      else if Keyword.is_proof name then Toplevel.reset_proof st0
+      if Keyword.is_theory_body keywords name then Toplevel.reset_theory st0
+      else if Keyword.is_proof keywords name then Toplevel.reset_proof st0
       else NONE;
   in
     (case res of
@@ -204,8 +206,8 @@
     | SOME st => (Output.error_message (Toplevel.type_error tr st0 ^ " -- using reset state"); st))
   end) ();
 
-fun run int tr st =
-  if Goal.future_enabled 1 andalso Keyword.is_diag (Toplevel.name_of tr) then
+fun run keywords int tr st =
+  if Goal.future_enabled 1 andalso Keyword.is_diag keywords (Toplevel.name_of tr) then
     (Execution.fork {name = "Toplevel.diag", pos = Toplevel.pos_of tr, pri = ~1}
       (fn () => Toplevel.command_exception int tr st); ([], SOME st))
   else Toplevel.command_errors int tr st;
@@ -230,7 +232,7 @@
     SOME prf => status tr (Proof.status_markup prf)
   | NONE => ());
 
-fun eval_state span tr ({malformed, state, ...}: eval_state) =
+fun eval_state keywords span tr ({malformed, state, ...}: eval_state) =
   if malformed then
     {failed = true, malformed = malformed, command = tr, state = Toplevel.toplevel}
   else
@@ -238,10 +240,10 @@
       val _ = Multithreading.interrupted ();
 
       val malformed' = Toplevel.is_malformed tr;
-      val st = reset_state tr state;
+      val st = reset_state keywords tr state;
 
       val _ = status tr Markup.running;
-      val (errs1, result) = run true tr st;
+      val (errs1, result) = run keywords true tr st;
       val errs2 = (case result of NONE => [] | SOME st' => check_cmts span tr st');
       val errs = errs1 @ errs2;
       val _ = List.app (Future.error_message (Toplevel.pos_of tr)) errs;
@@ -262,15 +264,15 @@
 
 in
 
-fun eval init master_dir blobs span eval0 =
+fun eval keywords master_dir init blobs span eval0 =
   let
     val exec_id = Document_ID.make ();
     fun process () =
       let
         val tr =
           Position.setmp_thread_data (Position.id_only (Document_ID.print exec_id))
-            (fn () => read init master_dir blobs span |> Toplevel.exec_id exec_id) ();
-      in eval_state span tr (eval_result eval0) end;
+            (fn () => read keywords master_dir init blobs span |> Toplevel.exec_id exec_id) ();
+      in eval_state keywords span tr (eval_result eval0) end;
   in Eval {exec_id = exec_id, eval_process = memo exec_id process} end;
 
 end;
@@ -288,7 +290,7 @@
 type print_fn = Toplevel.transition -> Toplevel.state -> unit;
 
 type print_function =
-  {command_name: string, args: string list, exec_id: Document_ID.exec} ->
+  {keywords: Keyword.keywords, command_name: string, args: string list, exec_id: Document_ID.exec} ->
     {delay: Time.time option, pri: int, persistent: bool, strict: bool, print_fn: print_fn} option;
 
 local
@@ -310,7 +312,7 @@
 
 in
 
-fun print command_visible command_overlays command_name eval old_prints =
+fun print command_visible command_overlays keywords command_name eval old_prints =
   let
     val print_functions = Synchronized.value print_functions;
 
@@ -338,7 +340,11 @@
 
     fun new_print name args get_pr =
       let
-        val params = {command_name = command_name, args = args, exec_id = eval_exec_id eval};
+        val params =
+         {keywords = keywords,
+          command_name = command_name,
+          args = args,
+          exec_id = eval_exec_id eval};
       in
         (case Exn.capture (Runtime.controlled_execution NONE get_pr) params of
           Exn.Res NONE => NONE
@@ -385,8 +391,8 @@
 
 val _ =
   print_function "print_state"
-    (fn {command_name, ...} =>
-      if Keyword.is_printed command_name then
+    (fn {keywords, command_name, ...} =>
+      if Keyword.is_printed keywords command_name then
         SOME {delay = NONE, pri = 1, persistent = false, strict = true,
           print_fn = fn _ => fn st => if Toplevel.is_proof st then Toplevel.print_state st else ()}
       else NONE);
--- a/src/Pure/PIDE/command_span.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Pure/PIDE/command_span.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -10,7 +10,8 @@
   datatype span = Span of kind * Token.T list
   val kind: span -> kind
   val content: span -> Token.T list
-  val resolve_files: (string -> Path.T * Position.T -> Token.file Exn.result list) -> span -> span
+  val resolve_files: Keyword.keywords ->
+    (string -> Path.T * Position.T -> Token.file Exn.result list) -> span -> span
 end;
 
 structure Command_Span: COMMAND_SPAN =
@@ -49,10 +50,10 @@
 
 in
 
-fun resolve_files read_files span =
+fun resolve_files keywords read_files span =
   (case span of
     Span (Command_Span (cmd, pos), toks) =>
-      if Keyword.is_theory_load cmd then
+      if Keyword.is_theory_load keywords cmd then
         (case find_file (clean_tokens toks) of
           NONE => error ("Bad file argument of command " ^ quote cmd ^ Position.here pos)
         | SOME (i, path) =>
--- a/src/Pure/PIDE/document.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Pure/PIDE/document.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -466,7 +466,7 @@
   is_some (loaded_theory name) orelse
   can get_header node andalso (not full orelse is_some (get_result node));
 
-fun last_common state node_required node0 node =
+fun last_common keywords state node_required node0 node =
   let
     fun update_flags prev (visible, initial) =
       let
@@ -474,7 +474,8 @@
         val initial' = initial andalso
           (case prev of
             NONE => true
-          | SOME command_id => not (Keyword.is_theory_begin (the_command_name state command_id)));
+          | SOME command_id =>
+              not (Keyword.is_theory_begin keywords (the_command_name state command_id)));
       in (visible', initial') end;
 
     fun get_common ((prev, command_id), opt_exec) (_, ok, flags, assign_update) =
@@ -495,7 +496,9 @@
                   val command_overlays = overlays node command_id;
                   val command_name = the_command_name state command_id;
                 in
-                  (case Command.print command_visible command_overlays command_name eval prints of
+                  (case
+                    Command.print command_visible command_overlays keywords command_name eval prints
+                   of
                     SOME prints' => assign_update_new (command_id, SOME (eval, prints'))
                   | NONE => I)
                 end
@@ -513,7 +516,7 @@
 
 fun illegal_init _ = error "Illegal theory header after end of theory";
 
-fun new_exec state node proper_init command_id' (assign_update, command_exec, init) =
+fun new_exec keywords state node proper_init command_id' (assign_update, command_exec, init) =
   if not proper_init andalso is_none init then NONE
   else
     let
@@ -526,13 +529,14 @@
       val span = Lazy.force span0;
 
       val eval' =
-        Command.eval (fn () => the_default illegal_init init span)
-          (master_directory node) blobs span eval;
-      val prints' = perhaps (Command.print command_visible command_overlays command_name eval') [];
+        Command.eval keywords (master_directory node)
+          (fn () => the_default illegal_init init span) blobs span eval;
+      val prints' =
+        perhaps (Command.print command_visible command_overlays keywords command_name eval') [];
       val exec' = (eval', prints');
 
       val assign_update' = assign_update_new (command_id', SOME exec') assign_update;
-      val init' = if Keyword.is_theory_begin command_name then NONE else init;
+      val init' = if Keyword.is_theory_begin keywords command_name then NONE else init;
     in SOME (assign_update', (command_id', (eval', prints')), init') end;
 
 fun removed_execs node0 (command_id, exec_ids) =
@@ -558,6 +562,7 @@
               deps = map (Future.task_of o #2) deps, pri = 1, interrupts = false}
             (fn () => timeit ("Document.update " ^ name) (fn () =>
               let
+                val keywords = Keyword.get_keywords ();
                 val imports = map (apsnd Future.join) deps;
                 val imports_result_changed = exists (#4 o #1 o #2) imports;
                 val node_required = Symtab.defined required name;
@@ -574,7 +579,7 @@
 
                     val (print_execs, common, (still_visible, initial)) =
                       if imports_result_changed then (assign_update_empty, NONE, (true, true))
-                      else last_common state node_required node0 node;
+                      else last_common keywords state node_required node0 node;
                     val common_command_exec = the_default_entry node common;
 
                     val (updated_execs, (command_id', (eval', _)), _) =
@@ -583,7 +588,7 @@
                         iterate_entries_after common
                           (fn ((prev, id), _) => fn res =>
                             if not node_required andalso prev = visible_last node then NONE
-                            else new_exec state node proper_init id res) node;
+                            else new_exec keywords state node proper_init id res) node;
 
                     val assigned_execs =
                       (node0, updated_execs) |-> iterate_entries_after common
--- a/src/Pure/PIDE/resources.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Pure/PIDE/resources.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -82,9 +82,10 @@
     (case Token.get_files tok of
       [] =>
         let
+          val keywords = Keyword.get_keywords ();
           val master_dir = master_directory thy;
           val pos = Token.pos_of tok;
-          val src_paths = Keyword.command_files cmd (Path.explode name);
+          val src_paths = Keyword.command_files keywords cmd (Path.explode name);
         in map (Command.read_file master_dir pos) src_paths end
     | files => map Exn.release files));
 
@@ -123,17 +124,17 @@
   |> put_deps master_dir imports
   |> fold Thy_Header.declare_keyword keywords;
 
-fun excursion master_dir last_timing init elements =
+fun excursion keywords master_dir last_timing init elements =
   let
     fun prepare_span span =
       Command_Span.content span
-      |> Command.read init master_dir []
+      |> Command.read keywords master_dir init []
       |> (fn tr => Toplevel.put_timing (last_timing tr) tr);
 
     fun element_result span_elem (st, _) =
       let
         val elem = Thy_Syntax.map_element prepare_span span_elem;
-        val (results, st') = Toplevel.element_result elem st;
+        val (results, st') = Toplevel.element_result keywords elem st;
         val pos' = Toplevel.pos_of (Thy_Syntax.last_element elem);
       in (results, (st', pos')) end;
 
@@ -151,7 +152,7 @@
 
     val toks = Outer_Syntax.scan keywords text_pos text;
     val spans = Outer_Syntax.parse_spans toks;
-    val elements = Thy_Syntax.parse_elements spans;
+    val elements = Thy_Syntax.parse_elements keywords spans;
 
     fun init () =
       begin_theory master_dir header parents
@@ -160,7 +161,7 @@
 
     val (results, thy) =
       cond_timeit true ("theory " ^ quote name)
-        (fn () => excursion master_dir last_timing init elements);
+        (fn () => excursion keywords master_dir last_timing init elements);
 
     fun present () =
       let
@@ -171,8 +172,7 @@
           warning ("Cannot present theory with skipped proofs: " ^ quote name)
         else
           let val tex_source =
-            Thy_Output.present_thy keywords Keyword.command_tags
-              (Outer_Syntax.is_markup syntax) res toks
+            Thy_Output.present_thy keywords (Outer_Syntax.is_markup syntax) res toks
             |> Buffer.content;
           in if document then Present.theory_output name tex_source else () end
       end;
--- a/src/Pure/Thy/thy_output.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Pure/Thy/thy_output.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -25,7 +25,7 @@
   datatype markup = Markup | MarkupEnv | Verbatim
   val eval_antiq: Keyword.keywords -> Toplevel.state -> Antiquote.antiq -> string
   val check_text: Symbol_Pos.source -> Toplevel.state -> unit
-  val present_thy: Keyword.keywords -> (string -> string list) -> (markup -> string -> bool) ->
+  val present_thy: Keyword.keywords -> (markup -> string -> bool) ->
     (Toplevel.transition * Toplevel.state) list -> Token.T list -> Buffer.T
   val pretty_text: Proof.context -> string -> Pretty.T
   val pretty_term: Proof.context -> term -> Pretty.T
@@ -265,8 +265,7 @@
 
 in
 
-fun present_span keywords default_tags span state state'
-    (tag_stack, active_tag, newline, buffer, present_cont) =
+fun present_span keywords span state state' (tag_stack, active_tag, newline, buffer, present_cont) =
   let
     val present = fold (fn (tok, (flag, 0)) =>
         Buffer.add (output_token keywords state' tok)
@@ -281,7 +280,7 @@
     val active_tag' =
       if is_some tag' then tag'
       else if cmd_name = "end" andalso not (Toplevel.is_toplevel state') then NONE
-      else try hd (default_tags cmd_name);
+      else try hd (Keyword.command_tags keywords cmd_name);
     val edge = (active_tag, active_tag');
 
     val newline' =
@@ -351,7 +350,7 @@
 
 in
 
-fun present_thy keywords default_tags is_markup command_results toks =
+fun present_thy keywords is_markup command_results toks =
   let
     (* tokens *)
 
@@ -423,7 +422,7 @@
     (* present commands *)
 
     fun present_command tr span st st' =
-      Toplevel.setmp_thread_position tr (present_span keywords default_tags span st st');
+      Toplevel.setmp_thread_position tr (present_span keywords span st st');
 
     fun present _ [] = I
       | present st (((tr, st'), span) :: rest) = present_command tr span st st' #> present st' rest;
--- a/src/Pure/Thy/thy_syntax.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Pure/Thy/thy_syntax.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -14,7 +14,7 @@
   val map_element: ('a -> 'b) -> 'a element -> 'b element
   val flat_element: 'a element -> 'a list
   val last_element: 'a element -> 'a
-  val parse_elements: Command_Span.span list -> Command_Span.span element list
+  val parse_elements: Keyword.keywords -> Command_Span.span list -> Command_Span.span element list
 end;
 
 structure Thy_Syntax: THY_SYNTAX =
@@ -89,23 +89,27 @@
   Scan.one
     (fn (Command_Span.Span (Command_Span.Command_Span (name, _), _)) => pred name | _ => false);
 
-val proof_atom =
-  Scan.one
-    (fn (Command_Span.Span (Command_Span.Command_Span (name, _), _)) => Keyword.is_proof_body name
-      | _ => true) >> atom;
-
-fun proof_element x = (command_with Keyword.is_proof_goal -- proof_rest >> element || proof_atom) x
-and proof_rest x = (Scan.repeat proof_element -- command_with Keyword.is_qed) x;
-
-val other_element =
-  command_with Keyword.is_theory_goal -- proof_rest >> element ||
-  Scan.one not_eof >> atom;
+fun parse_element keywords =
+  let
+    val proof_atom =
+      Scan.one
+        (fn (Command_Span.Span (Command_Span.Command_Span (name, _), _)) =>
+              Keyword.is_proof_body keywords name
+          | _ => true) >> atom;
+    fun proof_element x =
+      (command_with (Keyword.is_proof_goal keywords) -- proof_rest >> element || proof_atom) x
+    and proof_rest x =
+      (Scan.repeat proof_element -- command_with (Keyword.is_qed keywords)) x;
+  in
+    command_with (Keyword.is_theory_goal keywords) -- proof_rest >> element ||
+    Scan.one not_eof >> atom
+  end;
 
 in
 
-val parse_elements =
+fun parse_elements keywords =
   Source.of_list #>
-  Source.source stopper (Scan.bulk other_element) #>
+  Source.source stopper (Scan.bulk (parse_element keywords)) #>
   Source.exhaust;
 
 end;
--- a/src/Tools/try.ML	Thu Nov 06 15:42:34 2014 +0100
+++ b/src/Tools/try.ML	Thu Nov 06 15:47:04 2014 +0100
@@ -96,8 +96,8 @@
 
 fun print_function ((name, (weight, auto, tool)): tool) =
   Command.print_function ("auto_" ^ name)
-    (fn {command_name, ...} =>
-      if Keyword.is_theory_goal command_name andalso Options.default_bool auto then
+    (fn {keywords, command_name, ...} =>
+      if Keyword.is_theory_goal keywords command_name andalso Options.default_bool auto then
         SOME
          {delay = SOME (seconds (Options.default_real @{system_option auto_time_start})),
           pri = ~ weight,