From b5c8067f175cd5bf1162ca938712ea671ac4514c Mon Sep 17 00:00:00 2001 From: Stefano Zacchiroli Date: Fri, 4 Nov 2005 15:08:47 +0000 Subject: [PATCH] added support for ALT-L expansion of tex macros --- helm/matita/matitaGui.ml | 46 +++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/helm/matita/matitaGui.ml b/helm/matita/matitaGui.ml index dc3fb07ce..c6a8aef6a 100644 --- a/helm/matita/matitaGui.ml +++ b/helm/matita/matitaGui.ml @@ -29,6 +29,8 @@ open MatitaGeneratedGui open MatitaGtkMisc open MatitaMisc +exception Found of int + let gui_instance = ref None class type browserWin = @@ -575,7 +577,7 @@ class gui () = MatitaLog.error (MatitaExcPp.to_string exn) else raise exn); (* script *) - let _ = source_buffer#connect#changed (fun _ -> next_ligatures <- []) in + ignore (source_buffer#connect#mark_set (fun _ _ -> next_ligatures <- [])); let _ = match GSourceView.source_language_from_file BuildTimeConf.lang_file with | None -> @@ -786,15 +788,43 @@ class gui () = source_buffer#delete ~start:iter ~stop:(iter#copy#backward_chars len); source_buffer#insert ~iter:(source_buffer#get_iter_at_mark `INSERT) s in + let get_ligature word = + let len = String.length word in + let aux_tex () = + try + for i = len - 1 downto 0 do + if HExtlib.is_alpha word.[i] then () + else + (if word.[i] = '\\' then raise (Found i) else raise (Found ~-1)) + done; + None + with Found i -> + if i = ~-1 then None else Some (String.sub word i (len - i)) + in + let aux_ligature () = + try + for i = len - 1 downto 0 do + if CicNotationLexer.is_ligature_char word.[i] then () + else raise (Found (i+1)) + done; + raise (Found 0) + with + | Found i -> + (try + Some (String.sub word i (len - i)) + with Invalid_argument _ -> None) + in + match aux_tex () with + | Some macro -> macro + | None -> (match aux_ligature () with Some l -> l | None -> word) + in (match next_ligatures with | [] -> (* find ligatures and fill next_ligatures, then try again *) - let last_word = iter#get_slice ~stop:iter#copy#backward_word_start in - let len = String.length last_word in - let i = ref (len - 1) in - while !i >= 0 && CicNotationLexer.is_ligature_char last_word.[!i] do - decr i - done; - let ligature = String.sub last_word (!i + 1) (len - (!i + 1)) in + let last_word = + iter#get_slice + ~stop:(iter#copy#backward_find_char Glib.Unichar.isspace) + in + let ligature = get_ligature last_word in (match CicNotationLexer.lookup_ligatures ligature with | [] -> () | hd :: tl -> -- 2.39.2