예제 #1
0
        /// <summary>
        /// Before PowerArgs parses the args, this hook inspects the command line for the indicator and if found
        /// takes over the command line and provides tab completion.
        /// </summary>
        /// <param name="context">The context used to inspect the command line arguments.</param>
        public override void BeforeParse(ArgHook.HookContext context)
        {
            if (Indicator == "" && context.CmdLineArgs.Length != 0)
            {
                return;
            }
            else if (Indicator != "" && (context.CmdLineArgs.Length != 1 || context.CmdLineArgs[0] != Indicator))
            {
                return;
            }

            var existingColor = Console.ForegroundColor;

            Console.ForegroundColor = ConsoleColor.Cyan;
            try
            {
                if (REPL && ShowREPLWelcome)
                {
                    Console.WriteLine();
                    var message = REPLWelcomeMessage.Replace("{{Indicator}}", REPLExitIndicator);
                    Console.WriteLine(message);
                    Console.WriteLine();
                    Console.Write(Indicator + "> ");
                    ShowREPLWelcome = false;
                }
                else if (REPL)
                {
                    Console.Write(Indicator + "> ");
                }
                else
                {
                    // This is a little hacky, but I could not find a better way to make the tab completion start on the same lime
                    // as the command line input
                    try
                    {
                        var lastLine = StdConsoleProvider.ReadALineOfConsoleOutput(Console.CursorTop - 1);
                        Console.CursorTop--;
                        Console.WriteLine(lastLine);
                        Console.CursorTop--;
                        Console.CursorLeft = lastLine.Length + 1;
                    }
                    catch (Exception)
                    {
                        Console.WriteLine();
                        Console.Write(Indicator + "> ");
                    }
                }
            }
            finally
            {
                Console.ForegroundColor = existingColor;
            }

            List <string> completions = FindTabCompletions(context.Definition.Arguments, context.Definition.Actions);

            List <ITabCompletionSource> completionSources = new List <ITabCompletionSource>();

            if (this.completionSource != null)
            {
                completionSources.Add((ITabCompletionSource)Activator.CreateInstance(this.completionSource));
            }
            completionSources.Add(new EnumTabCompletionSource(context.Definition));
            completionSources.Add(new SimpleTabCompletionSource(completions)
            {
                MinCharsBeforeCyclingBegins = 0
            });
            completionSources.Add(new FileSystemTabCompletionSource());

            string str            = null;
            var    newCommandLine = ConsoleHelper.ReadLine(ref str, LoadHistory(), new MultiTabCompletionSource(completionSources));

            if (REPL && newCommandLine.Length == 1 && string.Equals(newCommandLine[0], REPLExitIndicator, StringComparison.OrdinalIgnoreCase))
            {
                throw new REPLExitException();
            }

            if (REPL && newCommandLine.Length == 1 && newCommandLine[0] == "cls")
            {
                ConsoleHelper.ConsoleImpl.Clear();
                throw new REPLContinueException();
            }

            else if (REPL && newCommandLine.Length == 0 && string.IsNullOrWhiteSpace(REPLExitIndicator) == false)
            {
                throw new REPLContinueException();
            }

            context.CmdLineArgs = newCommandLine;
            AddToHistory(str);
        }