Skip to content
Snippets Groups Projects
Commit 128529c2 authored by g0dil's avatar g0dil
Browse files

Console: Fix autocomplete / autocd support

parent 60f67bfa
No related branches found
No related tags found
No related merge requests found
......@@ -249,7 +249,7 @@ senf::console::Executor::traverseNode(ParseCommandInfo::TokensRange const & path
boost::prior(path.end())),
dir);
DirectoryNode & base (*dir.back().lock());
std::string const & name (boost::prior(path.end())->value());
std::string const & name (complete(base, boost::prior(path.end())->value()));
if (policy_)
policy_( base, name );
return dir.back().lock()->get(name);
......@@ -281,9 +281,10 @@ senf::console::Executor::traverseDirectory(ParseCommandInfo::TokensRange const &
;
else {
DirectoryNode & base (*dir.back().lock());
std::string name (complete(base, i->value()));
if (policy_)
policy_( base, i->value() );
dir.push_back(base[i->value()].thisptr());
policy_( base, name );
dir.push_back(base[name].thisptr());
}
}
}
......@@ -295,6 +296,17 @@ senf::console::Executor::traverseDirectory(ParseCommandInfo::TokensRange const &
}
}
prefix_ std::string senf::console::Executor::complete(DirectoryNode & dir,
std::string const & name)
{
if (! dir.hasChild(name)) {
DirectoryNode::ChildrenRange completions (dir.completions(name));
if (completions.size() == 1)
return completions.begin()->first;
}
return name;
}
///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_
//#include "Executor.mpp"
......
......@@ -145,6 +145,7 @@ namespace console {
GenericNode & traverseNode(ParseCommandInfo::TokensRange const & path);
void traverseDirectory(ParseCommandInfo::TokensRange const & path,
Path & dir);
std::string complete(DirectoryNode & dir, std::string const & name);
struct InvalidPathException {};
struct InvalidDirectoryException {};
......
......@@ -229,6 +229,38 @@ BOOST_AUTO_UNIT_TEST(executorPolicy)
senf::console::root().remove("dir2");
}
BOOST_AUTO_UNIT_TEST(executorAuto)
{
senf::console::root().mkdir("dir1").mkdir("dir3");
senf::console::root().mkdir("dir2").doc("Helptext").add("test",&testCommand);
senf::console::Executor executor;
executor
.autocomplete(true)
.autocd(true);
senf::console::CommandParser parser;
{
std::stringstream os;
parser.parse("dir2", &setCommand);
executor(os, commands.back());
BOOST_CHECK_EQUAL( executor.cwdPath(), "/dir2" );
BOOST_CHECK_EQUAL( os.str(), "" );
}
{
std::stringstream os;
parser.parse("t", &setCommand);
executor(os, commands.back());
BOOST_CHECK_EQUAL( os.str(), "testCommand\n" );
}
commands.clear();
senf::console::root().remove("dir1");
senf::console::root().remove("dir2");
}
///////////////////////////////cc.e////////////////////////////////////////
#undef prefix_
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment