1
1
mirror of https://github.com/mawww/kakoune.git synced 2024-10-05 17:18:00 +03:00

Compare commits

...

5 Commits

Author SHA1 Message Date
Philipp Jungkamp
0c09cbea5c
Merge 5b888e5ac6 into e0bbd1e7ca 2024-07-01 21:56:37 +00:00
Philipp Jungkamp
5b888e5ac6 Use WithCoord parameter parsing for argv
This moves the parameter parsing for the `+<line>:<column>` switch
of the commandline to the `ParametersParser`. The position switch now
respects the `--` separator between switches and files.

The manpage does not document the old behaviour of `+:[column]`.
`+:[column]` works exactly like `+`. This is compatible with the
previously documented behaviour for `+:`.

The help message is does not mention that omitting the line or column
moves the cursor to the last line or column. The explanation in the
manpage should suffice.
2024-07-01 23:51:53 +02:00
Philipp Jungkamp
0cdb088981 Add WithCoord flag to ParameterDesc
Adding the `WithCoord` flag will make the `ParametersParser` try to
parse a special `+<line>:<column>` VIM-style switch.
2024-06-16 20:30:56 +02:00
Philipp Jungkamp
7e9c4b7f6a Remove --help commandline special case
This special case was not handled in the `ParametersParser` and
therefore did not respect the `--` separator for switches.
2024-06-16 18:39:03 +02:00
Philipp Jungkamp
385a1aec18 Show [--] in -help output
The current help output of kakoune doesn't mention that a double dash
(`--`) can be used to separate the files from options.
2024-06-16 14:48:37 +02:00
4 changed files with 40 additions and 46 deletions

View File

@ -14,7 +14,8 @@
.Op Fl ui Ar ui_type
.Op Fl e Ar command
.Op Fl E Ar command
.Op Sy + Ns Ar line Ns Oo Sy \&: Ns Ar column Oc | Sy +:
.Op Sy + Ns Oo Ns Ar line Oc | Sy + Ns Ar line Ns Sy \&: Ns Oo Ns Ar column Oc
.Op Fl Fl
.Op Ar file ...
.
.Nm
@ -151,10 +152,10 @@ Begin in
.Em readonly mode ,
all the buffers opened will not be written to disk.
.
.It Sy + Ns Ar line Ns Oo Sy \&: Ns Ar column Oc | Sy +:
.It Sy + Ns Oo Ns Ar line Oc | Sy + Ns Ar line Ns Sy \&: Ns Oo Ns Ar column Oc
Specify a target line and column for the first file.
When the plus sign is followed by only a colon, then the cursor is sent
to the last line of the file.
When the line is omitted the cursor will go to the end of the buffer.
When colon is present but the column is omitted the cursor will got to the end of the given line.
.
.It Ar file ...
One or more

View File

@ -1103,18 +1103,17 @@ 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] [+[line] | +line:[column]] [--] [file]...\n\n"
"Options:\n"
"{}\n"
"Prefixing a positional argument with a plus (`+`) sign will place the\n"
"cursor at a given set of coordinates, or the end of the buffer if the plus\n"
"sign is followed only by a colon (`:`)\n",
"You can specify the initial position of the cursor using +[line] or +line:[column].\n",
argv[0], generate_switches_doc(param_desc.switches)));
return 0;
};
@ -1123,9 +1122,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");
@ -1186,32 +1182,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"))
{
@ -1223,14 +1195,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;
};
}