Implement %val{selections_char_desc}

Fixes #3194
This commit is contained in:
Jason Felice 2019-11-11 21:06:37 -05:00 committed by Maxime Coste
parent 6eb820dc54
commit 5fae16faef
7 changed files with 43 additions and 11 deletions

View File

@ -311,6 +311,12 @@ The following expansions are supported (with required context _in italics_):
the number of bytes from the start of the line to the cursor (like the number of bytes from the start of the line to the cursor (like
`%val{cursor_column}`), and all are 1-based decimal integers `%val{cursor_column}`), and all are 1-based decimal integers
*%val{selections_char_desc}*::
_in window scope_ +
unquoted list of the ranges of all selections, in the same format as
`%val{selection_desc}`, except that the columns are in codepoints rather
than bytes
*%val{selections_desc}*:: *%val{selections_desc}*::
_in window scope_ + _in window scope_ +
unquoted list of the ranges of all selections, in the same format as unquoted list of the ranges of all selections, in the same format as

View File

@ -252,7 +252,11 @@ static const EnvVarDesc builtin_env_vars[] = { {
}, { }, {
"selections_desc", false, "selections_desc", false,
[](StringView name, const Context& context, Quoting quoting) [](StringView name, const Context& context, Quoting quoting)
{ return selection_list_to_string(context.selections()); } { return selection_list_to_string<false>(context.selections()); }
}, {
"selections_char_desc", false,
[](StringView name, const Context& context, Quoting quoting)
{ return selection_list_to_string<true>(context.selections()); }
}, { }, {
"selection_length", false, "selection_length", false,
[](StringView name, const Context& context, Quoting quoting) -> String [](StringView name, const Context& context, Quoting quoting) -> String
@ -793,7 +797,7 @@ int run_server(StringView session, StringView server_init,
kak_assert(local_client); kak_assert(local_client);
const String client_name = local_client->context().name(); const String client_name = local_client->context().name();
const String buffer_name = local_client->context().buffer().name(); const String buffer_name = local_client->context().buffer().name();
const String selections = selection_list_to_string(local_client->context().selections()); const String selections = selection_list_to_string<false>(local_client->context().selections());
ClientManager::instance().remove_client(*local_client, true, 0); ClientManager::instance().remove_client(*local_client, true, 0);
client_manager.clear_client_trash(); client_manager.clear_client_trash();

View File

@ -480,13 +480,13 @@ String selection_to_string(const Selection& selection)
cursor.line + 1, cursor.column + 1); cursor.line + 1, cursor.column + 1);
} }
String selection_list_to_string(const SelectionList& selections) String selection_to_string_char(const Buffer& buffer, const Selection& selection)
{ {
auto beg = &*selections.begin(), end = &*selections.end(); const auto& cursor = selection.cursor();
auto main = beg + selections.main_index(); const auto& anchor = selection.anchor();
using View = ConstArrayView<Selection>; return format("{}.{},{}.{}",
return join(concatenated(View{main, end}, View{beg, main}) | anchor.line + 1, buffer[anchor.line].char_count_to(anchor.column) + 1,
transform(selection_to_string), ' ', false); cursor.line + 1, buffer[cursor.line].char_count_to(cursor.column) + 1);
} }
Selection selection_from_string(StringView desc) Selection selection_from_string(StringView desc)

View File

@ -95,7 +95,6 @@ struct SelectionList
SelectionList(Buffer& buffer, Vector<Selection> s, size_t timestamp); SelectionList(Buffer& buffer, Vector<Selection> s, size_t timestamp);
void update(bool merge = true); void update(bool merge = true);
void check_invariant() const; void check_invariant() const;
const Selection& main() const { return (*this)[m_main]; } const Selection& main() const { return (*this)[m_main]; }
@ -157,9 +156,27 @@ private:
Vector<Selection> compute_modified_ranges(const Buffer& buffer, size_t timestamp); Vector<Selection> compute_modified_ranges(const Buffer& buffer, size_t timestamp);
String selection_to_string(const Selection& selection);
String selection_list_to_string(const SelectionList& selection);
Selection selection_from_string(StringView desc); Selection selection_from_string(StringView desc);
String selection_to_string(const Selection& selection);
String selection_to_string_char(const Buffer& buffer, const Selection& selection);
template<bool char_columns>
String selection_list_to_string(const SelectionList& selections)
{
auto& buffer = selections.buffer();
kak_assert(selections.timestamp() == buffer.timestamp());
auto to_string = [&](const Selection& selection) {
return char_columns ? selection_to_string_char(buffer, selection)
: selection_to_string(selection);
};
auto beg = &*selections.begin(), end = &*selections.end();
auto main = beg + selections.main_index();
using View = ConstArrayView<Selection>;
return join(concatenated(View{main, end}, View{beg, main}) |
transform(to_string), ' ', false);
}
template<class StringArray> template<class StringArray>
SelectionList selection_list_from_strings(Buffer& buffer, StringArray&& descs, size_t timestamp, size_t main) SelectionList selection_list_from_strings(Buffer& buffer, StringArray&& descs, size_t timestamp, size_t main)

View File

@ -0,0 +1,4 @@
sin%(gle)-byte
%(λx.)λy.y x - start on wide char
∃e∈%(C.∀)g∈C.g⊗e≡e⊗g≡e - tabs, ending on wide char
%(x̦̏)- combining characters

View File

@ -0,0 +1 @@
4.2,4.4 1.4,1.6 2.1,2.3 3.5,3.7