1
1
mirror of https://github.com/mawww/kakoune.git synced 2024-08-16 16:20:38 +03:00
This commit is contained in:
Philipp Jungkamp 2024-06-27 15:54:54 +02:00 committed by GitHub
commit f812403782
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 39 deletions

View File

@ -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]... [+<line>[:<col>]|+:]\n\n"
write_stdout(format("Usage: {} [options] [--] [file]... [+<line>[:<col>]|+:]\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<Vector<String>>();
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<StringView> files;
Optional<BufferCoord> 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<BufferCoord>({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<Vector<StringView>>();
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);

View File

@ -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<bool> 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);

View File

@ -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<Flags>) { 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<BufferCoord> get_coord() const { return m_coord; }
private:
ParameterList m_params;
Vector<size_t, MemoryDomain::Commands> m_positional_indices;
HashMap<String, StringView> m_switches;
Optional<State> m_state;
Optional<BufferCoord> m_coord;
};
}