aboutsummaryrefslogtreecommitdiff
path: root/src/libcmd
diff options
context:
space:
mode:
authorNaïm Favier <n@monade.li>2022-02-19 18:51:18 +0100
committerNaïm Favier <n@monade.li>2022-03-07 12:01:54 +0100
commit5f06a91bf77e45c580202324ba2a5f0338a78b7e (patch)
tree556c491ac7efead11f7c8ec9da1cc28a8be62f6e /src/libcmd
parent7ddcb3920629bfaa0caf17b54eb63f3f951ba485 (diff)
Fix completion of nested attributes in completeInstallable
Without this, completing `nix eval -f file.nix foo.<Tab>` suggests `bar` instead of `foo.bar`, which messes up the command
Diffstat (limited to 'src/libcmd')
-rw-r--r--src/libcmd/installables.cc13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
index 13e85b1bb..c4fefb971 100644
--- a/src/libcmd/installables.cc
+++ b/src/libcmd/installables.cc
@@ -187,6 +187,8 @@ Strings SourceExprCommand::getDefaultFlakeAttrPathPrefixes()
void SourceExprCommand::completeInstallable(std::string_view prefix)
{
if (file) {
+ completionType = ctAttrs;
+
evalSettings.pureEval = false;
auto state = getEvalState();
Expr *e = state->parseExprFromFile(
@@ -215,13 +217,14 @@ void SourceExprCommand::completeInstallable(std::string_view prefix)
Value v2;
state->autoCallFunction(*autoArgs, v1, v2);
- completionType = ctAttrs;
-
if (v2.type() == nAttrs) {
for (auto & i : *v2.attrs) {
std::string name = i.name;
if (name.find(searchWord) == 0) {
- completions->add(i.name);
+ if (prefix_ == "")
+ completions->add(name);
+ else
+ completions->add(prefix_ + "." + name);
}
}
}
@@ -249,6 +252,8 @@ void completeFlakeRefWithFragment(
if (hash == std::string::npos) {
completeFlakeRef(evalState->store, prefix);
} else {
+ completionType = ctAttrs;
+
auto fragment = prefix.substr(hash + 1);
auto flakeRefS = std::string(prefix.substr(0, hash));
// FIXME: do tilde expansion.
@@ -264,8 +269,6 @@ void completeFlakeRefWithFragment(
flake. */
attrPathPrefixes.push_back("");
- completionType = ctAttrs;
-
for (auto & attrPathPrefixS : attrPathPrefixes) {
auto attrPathPrefix = parseAttrPath(*evalState, attrPathPrefixS);
auto attrPathS = attrPathPrefixS + std::string(fragment);