From 3d79107773c2b734982e6236188984dd8d20343d Mon Sep 17 00:00:00 2001 From: Frank LENORMAND Date: Mon, 24 Sep 2018 16:39:18 +0300 Subject: [PATCH] src: Drop selections that only contain whitespace on `_` Fixes #2387 --- doc/pages/keys.asciidoc | 3 ++- src/normal.cc | 21 ++++++++++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/doc/pages/keys.asciidoc b/doc/pages/keys.asciidoc index 64942837..c0e3235c 100644 --- a/doc/pages/keys.asciidoc +++ b/doc/pages/keys.asciidoc @@ -312,7 +312,8 @@ Yanking (copying) and pasting use the *"* register by default (See <*:: rotate selections content, if specified, the count groups selections, diff --git a/src/normal.cc b/src/normal.cc index eb71ce4a..dc68614d 100644 --- a/src/normal.cc +++ b/src/normal.cc @@ -1711,17 +1711,32 @@ void spaces_to_tabs(Context& context, NormalParams params) void trim_selections(Context& context, NormalParams) { auto& buffer = context.buffer(); - for (auto& sel : context.selections()) + auto& selections = context.selections(); + Vector to_remove; + + for (int i = 0; i < (int)selections.size(); ++i) { + auto& sel = selections[i]; auto beg = buffer.iterator_at(sel.min()); auto end = buffer.iterator_at(sel.max()); while (beg != end and is_blank(*beg)) ++beg; while (beg != end and is_blank(*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)