public bool Run(DefinitionCacheItem cmd, IEnumerable<string> args) { var arguments = args.ToList(); Logger.Write("Removing the command name from parameters: " + arguments[0]); arguments.RemoveAt(0); if (cmd.Type == DefinitionCacheItemType.Script || cmd.Type == DefinitionCacheItemType.LanguageScript) { Logger.Write("Running command as script"); var script = new Script(Bootstrapper.Settings.RootPath, Environment.CurrentDirectory, cmd.Location); var sb = new StringBuilder(); // On language commands remove the second argument too if // it matches the command name (oi langcommand vs oi C# langcommand) if (cmd.Type == DefinitionCacheItemType.LanguageScript && arguments.Count > 0 && Bootstrapper.Settings.EnabledLanguages.Contains(args.ElementAt(0))) { Logger.Write("Removing second parameter from language command as it's a language script prefixed by language: " + arguments[0]); arguments.RemoveAt(0); } for (int i = 0; i < arguments.Count; i++) { sb.Append(" \"" + arguments[i] + "\""); } script.Run( sb.ToString(), (command) => { Bootstrapper.DispatchAndCompleteMessage( command, () => { Logger.Write("Writing end of command"); script.Write("end-of-command"); }); }); } else if (cmd.Type == DefinitionCacheItemType.Language) { Logger.Write("Running command as language command"); var language = new LanguagePlugin(cmd.Location, Bootstrapper.DispatchMessage); // If default language command add original parameter if (args.ElementAt(0) != language.GetLanguage()) arguments.Insert(0, args.ElementAt(0)); language.Run(arguments.ToArray()); } else { Logger.Write("Running command as built in command"); var command = Bootstrapper.GetDefaultHandlers() .FirstOrDefault(x => x.Command == args.ElementAt(0)); if (command == null) return false; command.Execute(arguments.ToArray()); _eventDispatcher(string.Format("builtin command ran \"{0}\" {1}", command.Command, new CommandStringParser().GetArgumentString(arguments))); } return true; }