Beispiel #1
0
        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);
        }
Beispiel #2
0
        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;
            });
        }
Beispiel #3
0
        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;
            };
        }
Beispiel #4
0
 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);
         }
     });
 }
Beispiel #5
0
 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);
         }
     });
 }
Beispiel #6
0
		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;
			};
		}
Beispiel #7
0
 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);
     };
 }
Beispiel #8
0
        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);
        }
Beispiel #9
0
 static ViBuilderContext()
 {
     normalBuilder =
         ViBuilders.RegisterBuilder (
             ViBuilders.MultiplierBuilder (
                 ViBuilders.First (normalActions.Builder, motions.Builder, nonCharMotions.Builder)));
     insertActions = ViBuilders.First (nonCharMotions.Builder, insertEditActions.Builder);
 }
Beispiel #10
0
		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);
				}
			};
		}
Beispiel #11
0
		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);
				}
			};
		}
Beispiel #12
0
		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);
		}
Beispiel #13
0
		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);
		}
Beispiel #14
0
 public void Add(ViKey key, ViBuilder builder, bool runInstantly)
 {
     this.builders[key] = new BuilderAction(builder, runInstantly);
 }
Beispiel #15
0
 public void Add(ViKey key, ViBuilder builder)
 {
     Add(key, builder, false);
 }
Beispiel #16
0
 public BuilderAction(ViBuilder builder, bool runInstantly)
 {
     this.Builder      = builder;
     this.RunInstantly = runInstantly;
 }