diff --git a/src/main.cc b/src/main.cc index 0c63403bd..a9b824cee 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1102,13 +1102,14 @@ int main(int argc, char* argv[]) { "debug", { ArgCompleter{}, "initial debug option value" } }, { "version", { {}, "display kakoune version and exit" } }, { "ro", { {}, "readonly mode" } }, - { "help", { {}, "display a help message and quit" } } } + { "help", { {}, "display a help message and quit" } } }, + ParameterDesc::Flags::WithCoord }; try { auto show_usage = [&]() { - write_stdout(format("Usage: {} [options] [file]... [+[:]|+:]\n\n" + write_stdout(format("Usage: {} [options] [--] [file]... [+[:]|+:]\n\n" "Options:\n" "{}\n" "Prefixing a positional argument with a plus (`+`) sign will place the\n" @@ -1122,9 +1123,6 @@ int main(int argc, char* argv[]) | transform([](auto* s) { return String{s}; }) | gather>(); - if (contains(params, "--help"_sv)) - return show_usage(); - ParametersParser parser{params, param_desc}; const bool show_help_message = (bool)parser.get_switch("help"); @@ -1185,32 +1183,8 @@ int main(int argc, char* argv[]) parser.get_switch("i").value_or(StringView{})); } - Vector files; - Optional init_coord; - for (auto& name : parser) - { - if (not name.empty() and name[0_byte] == '+') - { - if (name == "+" or name == "+:") - { - client_init = client_init + "; exec gj"; - continue; - } - auto colon = find(name, ':'); - if (auto line = str_to_int_ifp({name.begin()+1, colon})) - { - init_coord = std::max({0,0}, { - *line - 1, - colon != name.end() ? - str_to_int_ifp({colon+1, name.end()}).value_or(1) - 1 - : 0 - }); - continue; - } - } - - files.emplace_back(name); - } + auto init_coord = parser.get_coord(); + auto files = parser | gather>(); if (auto server_session = parser.get_switch("c")) { @@ -1222,14 +1196,11 @@ int main(int argc, char* argv[]) return -1; } } + String new_files; - for (auto name : files) { - new_files += format("edit '{}'", escape(real_path(name), "'", '\'')); - if (init_coord) { - new_files += format(" {} {}", init_coord->line + 1, init_coord->column + 1); - init_coord.reset(); - } - new_files += ";"; + for (auto file : files) + { + new_files += format("edit -- '{}'\n", escape(real_path(file), "'", '\'')); } return run_client(*server_session, {}, new_files + client_init, init_coord, ui_type, false); diff --git a/src/parameters_parser.cc b/src/parameters_parser.cc index 755753239..e01dfddc1 100644 --- a/src/parameters_parser.cc +++ b/src/parameters_parser.cc @@ -31,6 +31,7 @@ ParametersParser::ParametersParser(ParameterList params, const ParameterDesc& de const bool switches_only_at_start = desc.flags & ParameterDesc::Flags::SwitchesOnlyAtStart; const bool ignore_unknown_switches = desc.flags & ParameterDesc::Flags::IgnoreUnknownSwitches; bool only_pos = desc.flags & ParameterDesc::Flags::SwitchesAsPositional; + bool with_coord = desc.flags & ParameterDesc::Flags::WithCoord; Vector switch_seen(desc.switches.size(), false); for (size_t i = 0; i < params.size(); ++i) @@ -40,6 +41,25 @@ ParametersParser::ParametersParser(ParameterList params, const ParameterDesc& de m_state = State::Switch; only_pos = true; } + else if (not only_pos and with_coord and not params[i].empty() and params[i][0_byte] == '+') + { + m_state = State::Switch; + with_coord = false; + const auto coord_str = params[i].substr(1_byte); + const auto colon = find(coord_str, ':'); + + const auto line_str = StringView{coord_str.begin(), colon}; + const LineCount line = line_str.empty() ? INT_MAX : std::max(1, str_to_int(line_str)) - 1; + + ByteCount column = 0; + if (colon != coord_str.end()) + { + const auto column_str = StringView{colon + 1, coord_str.end()}; + column = column_str.empty() ? INT_MAX : std::max(1, str_to_int(column_str)) - 1; + } + + m_coord = BufferCoord{line, column}; + } else if (not only_pos and not params[i].empty() and params[i][0_byte] == '-') { StringView switch_name = params[i].substr(1_byte); diff --git a/src/parameters_parser.hh b/src/parameters_parser.hh index c11dc5012..ba32a366e 100644 --- a/src/parameters_parser.hh +++ b/src/parameters_parser.hh @@ -5,6 +5,7 @@ #include "hash_map.hh" #include "meta.hh" #include "array_view.hh" +#include "coord.hh" #include "optional.hh" #include "flags.hh" #include "string.hh" @@ -62,7 +63,8 @@ struct ParameterDesc None = 0, SwitchesOnlyAtStart = 0b0001, SwitchesAsPositional = 0b0010, - IgnoreUnknownSwitches = 0b0100 + IgnoreUnknownSwitches = 0b0100, + WithCoord = 0b1000, }; friend constexpr bool with_bit_ops(Meta::Type) { return true; } @@ -142,12 +144,14 @@ struct ParametersParser iterator end() const { return iterator(*this, m_positional_indices.size()); } State state() const { return *m_state; } + Optional get_coord() const { return m_coord; } private: ParameterList m_params; Vector m_positional_indices; HashMap m_switches; Optional m_state; + Optional m_coord; }; }