#include "command.hh" #include "shared.hh" #include "eval.hh" #include "attr-path.hh" #include "editor-for.hh" #include "current-process.hh" #include using namespace nix; struct CmdEdit : InstallableCommand { std::string description() override { return "open the Nix expression of a Nix package in $EDITOR"; } std::string doc() override { return #include "edit.md" ; } Category category() override { return catSecondary; } void run(ref store, ref installable) override { auto state = getEvalState(); auto const installableValue = InstallableValue::require(installable); const auto [file, line] = [&] { auto [v, pos] = installableValue->toValue(*state); try { return findPackageFilename(*state, *v, installable->what()); } catch (NoPositionInfo &) { throw Error("cannot find position information for '%s", installableValue->what()); } }(); logger->pause(); auto args = editorFor(file, line); restoreProcessContext(); execvp(args.front().c_str(), stringsToCharPtrs(args).data()); std::string command; for (const auto &arg : args) command += " '" + arg + "'"; throw SysError("cannot run command%s", command); } }; static auto rCmdEdit = registerCommand("edit");