Add a join function for joining strings using a specific char
This commit is contained in:
parent
71bfe5498d
commit
8cc96ec36b
41
src/main.cc
41
src/main.cc
|
@ -59,15 +59,9 @@ void register_env_vars()
|
||||||
}, {
|
}, {
|
||||||
"buflist",
|
"buflist",
|
||||||
[](StringView name, const Context& context)
|
[](StringView name, const Context& context)
|
||||||
{
|
{ return join(transformed(BufferManager::instance(),
|
||||||
String res;
|
[](const safe_ptr<Buffer>& b)
|
||||||
for (auto& buf : BufferManager::instance())
|
{ return b->display_name(); }), ':'); }
|
||||||
{
|
|
||||||
if (not res.empty())
|
|
||||||
res += ":";
|
|
||||||
res += buf->display_name();
|
|
||||||
}
|
|
||||||
return res; }
|
|
||||||
}, {
|
}, {
|
||||||
"timestamp",
|
"timestamp",
|
||||||
[](StringView name, const Context& context)
|
[](StringView name, const Context& context)
|
||||||
|
@ -80,15 +74,7 @@ void register_env_vars()
|
||||||
}, {
|
}, {
|
||||||
"selections",
|
"selections",
|
||||||
[](StringView name, const Context& context)
|
[](StringView name, const Context& context)
|
||||||
{ auto sels = context.selections_content();
|
{ return join(context.selections_content(), ':'); }
|
||||||
String res;
|
|
||||||
for (size_t i = 0; i < sels.size(); ++i)
|
|
||||||
{
|
|
||||||
res += escape(sels[i], ':', '\\');
|
|
||||||
if (i != sels.size() - 1)
|
|
||||||
res += ':';
|
|
||||||
}
|
|
||||||
return res; }
|
|
||||||
}, {
|
}, {
|
||||||
"runtime",
|
"runtime",
|
||||||
[](StringView name, const Context& context)
|
[](StringView name, const Context& context)
|
||||||
|
@ -130,24 +116,17 @@ void register_env_vars()
|
||||||
"selection_desc",
|
"selection_desc",
|
||||||
[](StringView name, const Context& context)
|
[](StringView name, const Context& context)
|
||||||
{ auto& sel = context.selections().main();
|
{ auto& sel = context.selections().main();
|
||||||
auto beg = sel.min();
|
auto beg = sel.min();
|
||||||
return to_string(beg.line + 1) + "." + to_string(beg.column + 1) + "+" +
|
return to_string(beg.line + 1) + "." + to_string(beg.column + 1) + "+" +
|
||||||
to_string((int)context.buffer().distance(beg, sel.max())+1); }
|
to_string((int)context.buffer().distance(beg, sel.max())+1); }
|
||||||
}, {
|
}, {
|
||||||
"selections_desc",
|
"selections_desc",
|
||||||
[](StringView name, const Context& context)
|
[](StringView name, const Context& context)
|
||||||
{
|
{ return join(transformed(context.selections(), [&](const Selection& sel) {
|
||||||
String res;
|
|
||||||
for (auto& sel : context.selections())
|
|
||||||
{
|
|
||||||
auto beg = sel.min();
|
auto beg = sel.min();
|
||||||
if (not res.empty())
|
return to_string(beg.line + 1) + "." + to_string(beg.column + 1) + "+" +
|
||||||
res += ':';
|
|
||||||
res += to_string(beg.line + 1) + "." + to_string(beg.column + 1) + "+" +
|
|
||||||
to_string((int)context.buffer().distance(beg, sel.max())+1);
|
to_string((int)context.buffer().distance(beg, sel.max())+1);
|
||||||
}
|
}), ':'); }
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}, {
|
}, {
|
||||||
"window_width",
|
"window_width",
|
||||||
[](StringView name, const Context& context)
|
[](StringView name, const Context& context)
|
||||||
|
|
|
@ -721,7 +721,7 @@ void split_lines(Context& context, NormalParams)
|
||||||
selections = std::move(res);
|
selections = std::move(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
void join_select_spaces(Context& context, NormalParams)
|
void join_lines_select_spaces(Context& context, NormalParams)
|
||||||
{
|
{
|
||||||
auto& buffer = context.buffer();
|
auto& buffer = context.buffer();
|
||||||
std::vector<Selection> selections;
|
std::vector<Selection> selections;
|
||||||
|
@ -746,7 +746,7 @@ void join_select_spaces(Context& context, NormalParams)
|
||||||
context.selections().insert(" "_str, InsertMode::Replace);
|
context.selections().insert(" "_str, InsertMode::Replace);
|
||||||
}
|
}
|
||||||
|
|
||||||
void join(Context& context, NormalParams params)
|
void join_lines(Context& context, NormalParams params)
|
||||||
{
|
{
|
||||||
SelectionList sels{context.selections()};
|
SelectionList sels{context.selections()};
|
||||||
auto restore_sels = on_scope_end([&]{
|
auto restore_sels = on_scope_end([&]{
|
||||||
|
@ -754,7 +754,7 @@ void join(Context& context, NormalParams params)
|
||||||
context.selections() = std::move(sels);
|
context.selections() = std::move(sels);
|
||||||
});
|
});
|
||||||
|
|
||||||
join_select_spaces(context, params);
|
join_lines_select_spaces(context, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<bool matching>
|
template<bool matching>
|
||||||
|
@ -1430,8 +1430,8 @@ KeyMap keymap =
|
||||||
{ alt('{'), { "extend to inner object start", select_object<ObjectFlags::ToBegin | ObjectFlags::Inner, SelectMode::Extend> } },
|
{ alt('{'), { "extend to inner object start", select_object<ObjectFlags::ToBegin | ObjectFlags::Inner, SelectMode::Extend> } },
|
||||||
{ alt('}'), { "extend to inner object end", select_object<ObjectFlags::ToEnd | ObjectFlags::Inner, SelectMode::Extend> } },
|
{ alt('}'), { "extend to inner object end", select_object<ObjectFlags::ToEnd | ObjectFlags::Inner, SelectMode::Extend> } },
|
||||||
|
|
||||||
{ alt('j'), { "join lines", join } },
|
{ alt('j'), { "join lines", join_lines } },
|
||||||
{ alt('J'), { "join lines and select spaces", join_select_spaces } },
|
{ alt('J'), { "join lines and select spaces", join_lines_select_spaces } },
|
||||||
|
|
||||||
{ alt('k'), { "keep selections matching given regex", keep<true> } },
|
{ alt('k'), { "keep selections matching given regex", keep<true> } },
|
||||||
{ alt('K'), { "keep selections not matching given regex", keep<false> } },
|
{ alt('K'), { "keep selections not matching given regex", keep<false> } },
|
||||||
|
|
|
@ -235,6 +235,19 @@ std::vector<StringView> split(StringView str, char separator);
|
||||||
String escape(StringView str, StringView characters, char escape);
|
String escape(StringView str, StringView characters, char escape);
|
||||||
String unescape(StringView str, StringView characters, char escape);
|
String unescape(StringView str, StringView characters, char escape);
|
||||||
|
|
||||||
|
template<typename Container>
|
||||||
|
String join(const Container& container, char joiner)
|
||||||
|
{
|
||||||
|
String res;
|
||||||
|
for (const auto& str : container)
|
||||||
|
{
|
||||||
|
if (not res.empty())
|
||||||
|
res += joiner;
|
||||||
|
res += escape(str, joiner, '\\');
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
inline String operator"" _str(const char* str, size_t)
|
inline String operator"" _str(const char* str, size_t)
|
||||||
{
|
{
|
||||||
return String(str);
|
return String(str);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user