src: Drop selections that only contain whitespace on _

Fixes #2387
This commit is contained in:
Frank LENORMAND 2018-09-24 16:39:18 +03:00
parent 93f913705a
commit 3d79107773
2 changed files with 20 additions and 4 deletions

View File

@ -312,7 +312,8 @@ Yanking (copying) and pasting use the *"* register by default (See <<registers#,
option or the count parameter for tabstop option or the count parameter for tabstop
*_*:: *_*::
trim selections unselect whitespace surrounding each selection, drop those that only
contain whitespace
*<a-)>*:: *<a-)>*::
rotate selections content, if specified, the count groups selections, rotate selections content, if specified, the count groups selections,

View File

@ -1711,17 +1711,32 @@ void spaces_to_tabs(Context& context, NormalParams params)
void trim_selections(Context& context, NormalParams) void trim_selections(Context& context, NormalParams)
{ {
auto& buffer = context.buffer(); auto& buffer = context.buffer();
for (auto& sel : context.selections()) auto& selections = context.selections();
Vector<int> to_remove;
for (int i = 0; i < (int)selections.size(); ++i)
{ {
auto& sel = selections[i];
auto beg = buffer.iterator_at(sel.min()); auto beg = buffer.iterator_at(sel.min());
auto end = buffer.iterator_at(sel.max()); auto end = buffer.iterator_at(sel.max());
while (beg != end and is_blank(*beg)) while (beg != end and is_blank(*beg))
++beg; ++beg;
while (beg != end and is_blank(*end)) while (beg != end and is_blank(*end))
--end; --end;
sel.min() = beg.coord();
sel.max() = end.coord(); if (beg == end and is_blank(*beg))
to_remove.push_back(i);
else
{
sel.min() = beg.coord();
sel.max() = end.coord();
}
} }
if (to_remove.size() == selections.size())
throw runtime_error{"no selections remaining"};
for (auto& i : to_remove | reverse())
selections.remove(i);
} }
SelectionList read_selections_from_register(char reg, Context& context) SelectionList read_selections_from_register(char reg, Context& context)