aboutsummaryrefslogtreecommitdiff
path: root/ide/wg_ScriptView.ml
diff options
context:
space:
mode:
authorPierre-Marie Pédrot2019-03-22 11:44:53 +0100
committerPierre-Marie Pédrot2019-03-22 11:44:53 +0100
commit1d68c24736b4cf68ac0c2f70122e3f3d28f0e876 (patch)
treea127ea878af8c0232b1fe80901b20ffa82baca3b /ide/wg_ScriptView.ml
parent582d92dfd7a3f8fe5cb2bbf24c2f1e200a479053 (diff)
parent4298d6c15c425fd66e9673dee3fa27a3e9caafc9 (diff)
Merge PR #8560: Unicode bindings for CoqIDE that works out of the box
Reviewed-by: Zimmi48 Ack-by: charguer Reviewed-by: gares Reviewed-by: ppedrot
Diffstat (limited to 'ide/wg_ScriptView.ml')
-rw-r--r--ide/wg_ScriptView.ml45
1 files changed, 45 insertions, 0 deletions
diff --git a/ide/wg_ScriptView.ml b/ide/wg_ScriptView.ml
index e95176bf4d..8802eb0f1c 100644
--- a/ide/wg_ScriptView.ml
+++ b/ide/wg_ScriptView.ml
@@ -10,6 +10,8 @@
open Preferences
+exception Abort
+
type insert_action = {
ins_val : string;
ins_off : int;
@@ -405,6 +407,49 @@ object (self)
self#buffer#delete_mark (`MARK stop_mark)
| _ -> ()
+ method apply_unicode_binding () =
+ (* Auxiliary method to reach the beginning of line or the
+ nearest space before the iterator. *)
+ let rec get_line_start iter =
+ if iter#starts_line || Glib.Unichar.isspace iter#char then iter
+ else get_line_start iter#backward_char
+ in
+ (* Main action *)
+ let buffer = self#buffer in
+ let insert = buffer#get_iter `INSERT in
+ let insert_mark = buffer#create_mark ~left_gravity:false insert in
+ let () = buffer#begin_user_action () in
+ let word_to_insert =
+ try
+ let line_start = get_line_start insert in
+ let prev_backslash_search = insert#backward_search ~limit:line_start "\\" in
+ let backslash =
+ match prev_backslash_search with
+ | None -> raise Abort
+ | Some (backslash_start,backslash_stop) -> backslash_start
+ in
+ let prefix = backslash#get_text ~stop:insert in
+ let word =
+ match Unicode_bindings.lookup prefix with
+ | None -> raise Abort
+ | Some word -> word
+ in
+ let was_deleted = buffer#delete_interactive ~start:backslash ~stop:insert () in
+ if not was_deleted then raise Abort;
+ word
+ with Abort -> " "
+ (* Insert a space if no binding applies. This is to make sure that the user
+ gets some visual feedback that the keystroke was taken into account.
+ And also avoid slowing down users who press "Shift" for capitalizing the
+ first letter of a sentence just before typing the "Space" that comes in
+ front of that first letter. *)
+ in
+ let insert2 = buffer#get_iter_at_mark (`MARK insert_mark) in
+ let _was_inserted = buffer#insert_interactive ~iter:insert2 word_to_insert in
+ let () = self#buffer#end_user_action () in
+ self#buffer#delete_mark (`MARK insert_mark)
+
+
method complete_popup = popup
method undo = undo_manager#undo