123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109open!Core_kernelopen!ImportmoduleQ=structincludeQletabbrev_mode="abbrev-mode"|>Symbol.internanddefine_minor_mode="define-minor-mode"|>Symbol.internandgoto_address_mode="goto-address-mode"|>Symbol.internandread_only_mode="read-only-mode"|>Symbol.internandview_mode="view-mode"|>Symbol.internandvisual_line_mode="visual-line-mode"|>Symbol.internendtypet={function_name:Symbol.t;variable_name:Symbol.t}[@@derivingfields,sexp_of]letcompare_name=Comparable.liftSymbol.compare_name~f:function_nameletabbrev={function_name=Q.abbrev_mode;variable_name=Q.abbrev_mode}letgoto_address={function_name=Q.goto_address_mode;variable_name=Q.goto_address_mode};;letread_only={function_name=Q.read_only_mode;variable_name=Q.buffer_read_only}letview={function_name=Q.view_mode;variable_name=Q.view_mode}letvisual_line={function_name=Q.visual_line_mode;variable_name=Q.visual_line_mode};;letis_enabledt=Current_buffer.value{symbol=t.variable_name;type_=Value.Type.bool}|>Option.value~default:false;;letdisablet=Symbol.funcall1_it.function_name(0|>Value.of_int_exn)letenablet=Symbol.funcall1_it.function_name(1|>Value.of_int_exn)letall_minor_modes=ref[]modulePrivate=structletall_minor_modes()=!all_minor_modes|>List.sort~compare:compare_nameendletdefine_minor_modenamehere~docstring?(define_keys=[])~mode_line~global?(initialize=fun()->())()=letkeymap_var=Var.create(Symbol.intern(concat[name|>Symbol.name;"-map"]))Keymap.type_inCurrent_buffer.set_valuekeymap_var(Keymap.create());letkeymap=Current_buffer.value_exnkeymap_varinList.iterdefine_keys~f:(fun(keys,symbol)->Keymap.define_keykeymap(Key_sequence.create_exnkeys)(Symbolsymbol));letdocstring=concat[String.stripdocstring;"\n\n";Documentation.Special_sequence.keymapkeymap_var.symbol]inForm.eval_i(Form.list[Q.define_minor_mode|>Form.symbol;name|>Form.symbol;docstring|>String.strip|>Form.string;Q.K.lighter|>Form.symbol;String.concat[" ";mode_line]|>Form.string;Q.K.keymap|>Form.symbol;Var.symbol_as_valuekeymap_var|>Form.of_value_exn;Q.K.global|>Form.symbol;Value.of_boolglobal|>Form.of_value_exn;Form.list[Q.funcall|>Form.symbol;Form.quote(Function.createhere~args:[](fun_->initialize();Value.nil)|>Function.to_value)]]);lett={function_name=name;variable_name=name}inall_minor_modes:=t::!all_minor_modes;t;;letkeymapt=List.Assoc.find(Current_buffer.value_exnKeymap.minor_mode_map_alist)t.function_name~equal:Symbol.equal;;letkeymap_exnt=matchkeymaptwith|Somex->x|None->raise_s[%message"minor mode has no keymap"~minor_mode:(t:t)];;