diff --git a/getpkg/src/BashrcEditor.cpp b/getpkg/src/BashrcEditor.cpp index 6b212c4..d46385b 100644 --- a/getpkg/src/BashrcEditor.cpp +++ b/getpkg/src/BashrcEditor.cpp @@ -24,8 +24,8 @@ namespace dropshelltool return out; } - static constexpr const char *BLOCK_START = "#---DROPSHELL-TOOL-START---"; - static constexpr const char *BLOCK_END = "#---DROPSHELL-TOOL-END---"; + static constexpr const char *BLOCK_START = "#---GETPKG-TOOL-START---"; + static constexpr const char *BLOCK_END = "#--GETPKG-TOOL-END---"; BashrcEditor::BashrcEditor() { diff --git a/getpkg/src/DropshellScriptManager.cpp b/getpkg/src/DropshellScriptManager.cpp index 0dac648..97a2d1a 100644 --- a/getpkg/src/DropshellScriptManager.cpp +++ b/getpkg/src/DropshellScriptManager.cpp @@ -4,6 +4,7 @@ #include #include #include +#include namespace dropshelltool { extern const std::filesystem::path DROPSHELL_RC_PATH; @@ -72,19 +73,23 @@ void DropshellScriptManager::addAutocomplete(const std::string& toolName) { std::ifstream infile(dropshelltool::DROPSHELL_RC_PATH); std::vector lines; std::string line; + std::string funcName = "_" + toolName + "_autocomplete"; - std::string blockStart = "# DROPSHELL-AUTOCOMPLETE-START: " + toolName; - std::string blockEnd = "# DROPSHELL-AUTOCOMPLETE-END: " + toolName; - std::string funcDef; - funcDef += blockStart + "\n"; - funcDef += funcName + "() {\n"; - funcDef += " local cur=\"${COMP_WORDS[COMP_CWORD]}\"\n"; - funcDef += " mapfile -t completions < <(" + toolName + " autocomplete \"${COMP_WORDS[@]:1:${COMP_CWORD}-1}\")\n"; - funcDef += " mapfile -t COMPREPLY < <(compgen -W \"${completions[*]}\" -- \"$cur\")\n"; - funcDef += "}\n"; - funcDef += blockEnd + "\n"; - std::string completeLine = "complete -F " + funcName + " " + toolName + " # dropshell-autocomplete:" + toolName; - bool blockFound = false, completeFound = false; + + std::string blockStart = "# GETPKG-AUTOCOMPLETE-START: " + toolName; + std::string blockEnd = "# GETPKG-AUTOCOMPLETE-END: " + toolName; + + std::vector funcLines; + funcLines.push_back(blockStart); + funcLines.push_back(funcName + "() {"); + funcLines.push_back(" local cur=\"${COMP_WORDS[COMP_CWORD]}\""); + funcLines.push_back(" mapfile -t completions < <(" + toolName + " autocomplete \"${COMP_WORDS[@]:1:${COMP_CWORD}-1}\")"); + funcLines.push_back(" mapfile -t COMPREPLY < <(compgen -W \"${completions[*]}\" -- \"$cur\")"); + funcLines.push_back("}"); + funcLines.push_back(blockEnd); + + std::string completeLine = "complete -F " + funcName + " " + toolName + " # autocomplete: " + toolName; + bool blockFound = false; bool inBlock = false; while (std::getline(infile, line)) { if (!inBlock && trim(line) == blockStart) { @@ -95,20 +100,23 @@ void DropshellScriptManager::addAutocomplete(const std::string& toolName) { if (inBlock) { if (trim(line) == blockEnd) { inBlock = false; - lines.push_back(funcDef); // Add new function block + // Add all function lines + for (const auto& funcLine : funcLines) { + lines.push_back(funcLine); + } } continue; // Skip all lines in the old block } - if (line.find("# dropshell-autocomplete:" + toolName) != std::string::npos) { - completeFound = true; - lines.push_back(completeLine); - } else { + else lines.push_back(line); - } } infile.close(); - if (!blockFound) lines.push_back(funcDef); - if (!completeFound) lines.push_back(completeLine); + if (!blockFound) { + // Add all function lines + for (const auto& funcLine : funcLines) { + lines.push_back(funcLine); + } + } std::ofstream outfile(dropshelltool::DROPSHELL_RC_PATH, std::ios::trunc); for (const auto& l : lines) outfile << l << "\n"; outfile.close();