aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaximilian Bosch <maximilian@mbosch.me>2018-05-12 20:00:59 +0200
committerMaximilian Bosch <maximilian@mbosch.me>2018-07-02 11:05:59 +0200
commit6b74fdac271cb12f1e9a56b13c77c027404b9a00 (patch)
tree85736eeb4f52dafcc8b5f0e4f3c2a2db7f7ca743 /src
parenta91c4ca01f720711d80a6f7d16ead70ce8f5f741 (diff)
search.cc: improve UX for `nix search`
As proposed in #1634 the `nix search` command could use some improvements. Initially 0413aeb35d6ee869a98b6565781c1cf47dc80080 added some basic sorting behavior using `std::map`, a next step would be an improvement of the output. This patch includes the following changes: * Use `$PAGER` for outputs with `RunPager` from `shared.hh`: The same behavior is defined for `nix-env --query`, furthermore it makes searching huge results way easier. * Simplified result blocks: The new output is heavily inspired by the output from `nox`, the first line shows the attribute path and the derivaiton name (`attribute path (derivation name)`) and the description in the second line.
Diffstat (limited to 'src')
-rw-r--r--src/nix/search.cc30
1 files changed, 20 insertions, 10 deletions
diff --git a/src/nix/search.cc b/src/nix/search.cc
index 539676698..4cb1efa79 100644
--- a/src/nix/search.cc
+++ b/src/nix/search.cc
@@ -7,19 +7,25 @@
#include "common-args.hh"
#include "json.hh"
#include "json-to-value.hh"
+#include "shared.hh"
#include <regex>
#include <fstream>
using namespace nix;
-std::string hilite(const std::string & s, const std::smatch & m)
+std::string wrap(std::string prefix, std::string s)
+{
+ return prefix + s + ANSI_NORMAL;
+}
+
+std::string hilite(const std::string & s, const std::smatch & m, std::string postfix)
{
return
m.empty()
? s
: std::string(m.prefix())
- + ANSI_RED + std::string(m.str()) + ANSI_NORMAL
+ + ANSI_RED + std::string(m.str()) + postfix
+ std::string(m.suffix());
}
@@ -75,6 +81,10 @@ struct CmdSearch : SourceExprCommand, MixJSON
"To search for git and frontend or gui:",
"nix search git 'frontend|gui'"
},
+ Example{
+ "To display the description of the found packages:",
+ "nix search git --verbose"
+ }
};
}
@@ -164,14 +174,10 @@ struct CmdSearch : SourceExprCommand, MixJSON
} else {
results[attrPath] = fmt(
- "Attribute name: %s\n"
- "Package name: %s\n"
- "Version: %s\n"
- "Description: %s\n",
- hilite(attrPath, attrPathMatch),
- hilite(name, nameMatch),
- parsed.version,
- hilite(description, descriptionMatch));
+ "* %s (%s)\n %s\n",
+ wrap("\e[0;1m", hilite(attrPath, attrPathMatch, "\e[0;1m")),
+ wrap("\e[0;2m", hilite(parsed.fullName, nameMatch, "\e[0;2m")),
+ hilite(description, descriptionMatch, ANSI_NORMAL));
}
}
@@ -263,6 +269,10 @@ struct CmdSearch : SourceExprCommand, MixJSON
throw SysError("cannot rename '%s' to '%s'", tmpFile, jsonCacheFileName);
}
+ if (results.size() == 0)
+ throw Error("no results for the given search term(s)!");
+
+ RunPager pager;
for (auto el : results) std::cout << el.second << "\n";
}