anchor.diff:     * Shift + SPACE works automatically on the right editor (ICEMultiDocObserver)
      * Automatic insertion is handled in TCESynMemo.KeyUp()
      *)
  -  TCEStaticEditorMacro = class(TWritableLfmTextComponent, ICEMultiDocObserver)
  +  TCEStaticEditorMacro = class(TWritableLfmTextComponent, ICEMultiDocObserver, ICEEditableOptions)
     private
  +    //TODO-cfeature: exposes fCompletor shortcut with ICEEDItableShortcut
       fCompletor: TSynAutoComplete;
       fMacros: TStringList;
       fDoc: TCESynMemo;
       fAutomatic: boolean;
  +    fOptions: TStaticMacrosOptions;
  +    fOptionBackup: TStaticMacrosOptions;
       procedure sanitize;
       procedure addDefaults;
       procedure updateCompletor;
  
positive.code:     procedure docFocused(aDoc: TCESynMemo);
      procedure docChanged(aDoc: TCESynMemo);
      procedure docClosing(aDoc: TCESynMemo);
    published
      // list of string with the format $<..>alnum=<..>
      property macros: TStringList read fMacros write setMacros;
  
negative.code:   inherited;
    fAutomatic := true;
    fCompletor := TSynAutoComplete.Create(self);
    fCompletor.ShortCut := 8224; // SHIFT + SPACE
    fMacros := TStringList.Create;
    fMacros.Delimiter := '=';
    addDefaults;
    //
    fOptions := TStaticMacrosOptions.create(self);
    fOptionBackup := TStaticMacrosOptions.create(self);
    fname := getCoeditDocPath + OptFname;
    if fileExists(fname) then
    begin
      fOptions.loadFromFile(fname);
      // old option file will create a streaming error.
      if fOptions.hasLoaded then
      	fOptions.AssignTo(self)
      else
      	fOptions.Assign(self);
    end
    else fOptions.Assign(self);
    //
    sanitize;
    updateCompletor;
  