static void StartMultiplierBuilder(ViBuilderContext ctx, ViBuilder nextBuilder) { int factor = 1; int multiplier = 0; ctx.Builder = (ViBuilderContext x) => { int c = (int)x.LastKey.Char; if (c >= (int)'0' && c <= (int)'9') { //don't eat '0' if not preceded by non-zero digit //pass on to interpret as goto line start if (c == (int)'0' && factor == 1) { ctx.Multiplier *= multiplier; ctx.Builder = nextBuilder; return(ctx.Builder(ctx)); } int d = c - (int)'0'; multiplier = multiplier * factor + d; factor *= 10; return(true); } else { ctx.Multiplier *= multiplier; ctx.Builder = nextBuilder; return(ctx.Builder(ctx)); } }; ctx.Builder(ctx); }
public static ViBuilder InsertBuilder(ViBuilder preInsertActions) { var lastInserted = new StringBuilder(); bool inUndoTx = false; return((ViBuilderContext ctx) => { var l = ctx.LastKey; bool noModifiers = l.Modifiers == ModifierType.None; ctx.Message = ctx.Mode == ViEditorMode.Replace? "-- REPLACE --" : "-- INSERT --"; // FIXME: Figure out how to handle EndAtomicUndo and BeginAtomicUndo if ((noModifiers && l.Key == Key.Escape) || (l.Char == 'c' && (l.Modifiers & ModifierType.ControlMask) != 0)) { ctx.RunAction((ViEditor ed) => { if (inUndoTx) { Console.WriteLine("TODO: EndAtomicUndo"); //ed.Document.EndAtomicUndo (); inUndoTx = false; } ed.LastInsertedText = lastInserted.ToString(); ed.SetMode(ViEditorMode.Normal); }); return true; } //keypad motions etc if (preInsertActions(ctx)) { if (inUndoTx) { Console.WriteLine("TODO: EndAtomicUndo"); //ctx.RunAction ( (ed) => ed.Document.EndAtomicUndo () ); } inUndoTx = false; ctx.SuppressCompleted(); lastInserted.Length = 0; return true; } if (l.Char != '\0' && noModifiers) { if (!inUndoTx) { Console.WriteLine("TODO: BeginAtomicUndo"); //ctx.RunAction ( (ed) => ed.Document.BeginAtomicUndo () ); } inUndoTx = true; ctx.SuppressCompleted(); lastInserted.Append(l.Char); ctx.InsertChar(l.Char); return true; } return false; }); }
public static ViBuilder InsertBuilder(ViBuilder preInsertActions) { var lastInserted = new StringBuilder (); bool inUndoTx = false; return (ViBuilderContext ctx) => { var l = ctx.LastKey; bool noModifiers = l.Modifiers == ModifierType.None; ctx.Message = ctx.Mode == ViEditorMode.Replace? "-- REPLACE --" : "-- INSERT --"; // FIXME: Figure out how to handle EndAtomicUndo and BeginAtomicUndo if ((noModifiers && l.Key == Key.Escape) || (l.Char == 'c' && (l.Modifiers & ModifierType.ControlMask) != 0)) { ctx.RunAction ((ViEditor ed) => { if (inUndoTx) { Console.WriteLine("TODO: EndAtomicUndo"); //ed.Document.EndAtomicUndo (); inUndoTx = false; } ed.LastInsertedText = lastInserted.ToString (); ed.SetMode (ViEditorMode.Normal); }); return true; } //keypad motions etc if (preInsertActions (ctx)) { if (inUndoTx) { Console.WriteLine("TODO: EndAtomicUndo"); //ctx.RunAction ( (ed) => ed.Document.EndAtomicUndo () ); } inUndoTx = false; ctx.SuppressCompleted (); lastInserted.Length = 0; return true; } if (l.Char != '\0' && noModifiers) { if (!inUndoTx) { Console.WriteLine("TODO: BeginAtomicUndo"); //ctx.RunAction ( (ed) => ed.Document.BeginAtomicUndo () ); } inUndoTx = true; ctx.SuppressCompleted (); lastInserted.Append (l.Char); ctx.InsertChar (l.Char); return true; } return false; }; }
public static ViBuilder RegisterBuilder(ViBuilder nextBuilder) { return((ViBuilderContext ctx) => { var k = ctx.LastKey; if (k.Char == '"') { ViBuilders.StartRegisterBuilder(ctx, nextBuilder); return true; } else { ctx.Builder = nextBuilder; return ctx.Builder(ctx); } }); }
public static ViBuilder MultiplierBuilder(ViBuilder nextBuilder) { return((ViBuilderContext ctx) => { var k = ctx.LastKey; if (char.IsDigit(k.Char)) { ViBuilders.StartMultiplierBuilder(ctx, nextBuilder); return true; } else { ctx.Builder = nextBuilder; return ctx.Builder(ctx); } }); }
static void StartRegisterBuilder (ViBuilderContext ctx, ViBuilder nextBuilder) { if (ctx.Register != '\0') { ctx.Error = "Register already set"; return; } ctx.Builder = (ViBuilderContext x) => { char c = x.LastKey.Char; if (!ViEditor.IsValidRegister (c)) { x.Error = "Invalid register"; return true; } x.Register = c; x.Builder = nextBuilder; return true; }; }
static void StartRegisterBuilder(ViBuilderContext ctx, ViBuilder nextBuilder) { if (ctx.Register != '\0') { ctx.SetError("Register already set"); return; } ctx.Builder = (ViBuilderContext x) => { char c = x.LastKey.Char; if (!ViEditor.IsValidRegister(c)) { x.SetError("Invalid register"); return(true); } x.Register = c; x.Builder = nextBuilder; return(true); }; }
static void StartMultiplierBuilder(ViBuilderContext ctx, ViBuilder nextBuilder) { int factor = 1; int multiplier = 0; ctx.Builder = (ViBuilderContext x) => { int c = (int)x.LastKey.Char; if (c >= (int)'0' && c <= (int)'9') { int d = c - (int)'0'; multiplier = multiplier * factor + d; factor *= 10; return(true); } else { ctx.Multiplier *= multiplier; ctx.Builder = nextBuilder; return(ctx.Builder(ctx)); } }; ctx.Builder(ctx); }
static ViBuilderContext() { normalBuilder = ViBuilders.RegisterBuilder ( ViBuilders.MultiplierBuilder ( ViBuilders.First (normalActions.Builder, motions.Builder, nonCharMotions.Builder))); insertActions = ViBuilders.First (nonCharMotions.Builder, insertEditActions.Builder); }
public static ViBuilder RegisterBuilder (ViBuilder nextBuilder) { return (ViBuilderContext ctx) => { var k = ctx.LastKey; if (k.Char == '"') { ViBuilders.StartRegisterBuilder (ctx, nextBuilder); return true; } else { ctx.Builder = nextBuilder; return ctx.Builder (ctx); } }; }
public static ViBuilder MultiplierBuilder (ViBuilder nextBuilder) { return (ViBuilderContext ctx) => { var k = ctx.LastKey; if (char.IsDigit (k.Char)) { ViBuilders.StartMultiplierBuilder (ctx, nextBuilder); return true; } else { ctx.Builder = nextBuilder; return ctx.Builder (ctx); } }; }
static void StartMultiplierBuilder (ViBuilderContext ctx, ViBuilder nextBuilder) { int factor = 1; int multiplier = 0; ctx.Builder = (ViBuilderContext x) => { int c = (int)x.LastKey.Char; if (c >= (int)'0' && c <= (int)'9') { //don't eat '0' if not preceded by non-zero digit //pass on to interpret as goto line start if (c == (int)'0' && factor == 1) { ctx.Multiplier *= multiplier; ctx.Builder = nextBuilder; return ctx.Builder (ctx); } int d = c - (int)'0'; multiplier = multiplier * factor + d; factor *= 10; return true; } else { ctx.Multiplier *= multiplier; ctx.Builder = nextBuilder; return ctx.Builder (ctx); } }; ctx.Builder (ctx); }
static void StartMultiplierBuilder (ViBuilderContext ctx, ViBuilder nextBuilder) { int factor = 1; int multiplier = 0; ctx.Builder = (ViBuilderContext x) => { int c = (int)x.LastKey.Char; if (c >= (int)'0' && c <= (int)'9') { int d = c - (int)'0'; multiplier = multiplier * factor + d; factor *= 10; return true; } else { ctx.Multiplier *= multiplier; ctx.Builder = nextBuilder; return ctx.Builder (ctx); } }; ctx.Builder (ctx); }
public void Add(ViKey key, ViBuilder builder, bool runInstantly) { this.builders[key] = new BuilderAction(builder, runInstantly); }
public void Add(ViKey key, ViBuilder builder) { Add(key, builder, false); }
public BuilderAction(ViBuilder builder, bool runInstantly) { this.Builder = builder; this.RunInstantly = runInstantly; }