Improve auto-completion for the 'icinga2 console' command

refs #8776
This commit is contained in:
Gunnar Beutner 2015-03-18 08:10:32 +01:00
parent cd9dfd5744
commit a2b701ad44
2 changed files with 37 additions and 0 deletions

View File

@ -120,6 +120,41 @@ static char *ConsoleCompleteHelper(const char *word, int state)
AddSuggestion(matches, word, kv.first); AddSuggestion(matches, word, kv.first);
} }
} }
String::SizeType cperiod = aword.RFind(".");
if (cperiod != -1) {
String pword = aword.SubStr(0, cperiod);
Value value;
try {
Expression *expr = ConfigCompiler::CompileText("temp", pword);
if (expr)
value = expr->Evaluate(l_ScriptFrame);
if (value.IsObjectType<Dictionary>()) {
Dictionary::Ptr dict = value;
ObjectLock olock(dict);
BOOST_FOREACH(const Dictionary::Pair& kv, dict) {
AddSuggestion(matches, word, pword + "." + kv.first);
}
}
Type::Ptr type = value.GetReflectionType();
Object::Ptr prototype = type->GetPrototype();
Dictionary::Ptr dict = dynamic_pointer_cast<Dictionary>(prototype);
if (dict) {
ObjectLock olock(dict);
BOOST_FOREACH(const Dictionary::Pair& kv, dict) {
AddSuggestion(matches, word, pword + "." + kv.first);
}
}
} catch (...) { /* Ignore the exception */ }
}
} }
if (state >= matches.size()) if (state >= matches.size())
@ -141,6 +176,7 @@ int ConsoleCommand::Run(const po::variables_map& vm, const std::vector<std::stri
#ifdef HAVE_EDITLINE #ifdef HAVE_EDITLINE
rl_completion_entry_function = ConsoleCompleteHelper; rl_completion_entry_function = ConsoleCompleteHelper;
rl_completion_append_character = '\0';
#endif /* HAVE_EDITLINE */ #endif /* HAVE_EDITLINE */
String addr, session; String addr, session;

View File

@ -27,6 +27,7 @@ int add_history(const char *line);
typedef char *ELFunction(const char *, int); typedef char *ELFunction(const char *, int);
extern char rl_completion_append_character;
extern ELFunction *rl_completion_entry_function; extern ELFunction *rl_completion_entry_function;
} }