vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit bd1b8f26fc4a5b838ac5614507867b81e52185bc parent 9ddab815578c499bf7459e2cad06026d0df6e1ef Author: Marc André Tanner <mat@brain-dump.org> Date: Thu, 15 Jun 2017 13:32:31 +0200 vis: implement pairwise selection combinator: shorter Diffstat:
| M | main.c | | | 17 | +++++++++++++++++ |
1 file changed, 17 insertions(+), 0 deletions(-)
diff --git a/main.c b/main.c @@ -91,6 +91,7 @@ static const char *selections_combine(Vis*, const char *keys, const Arg *arg); static Filerange combine_union(const Filerange*, const Filerange*); static Filerange combine_intersect(const Filerange*, const Filerange*); static Filerange combine_longer(const Filerange*, const Filerange*); +static Filerange combine_shorter(const Filerange*, const Filerange*); /* adjust current used count according to keys */ static const char *count(Vis*, const char *keys, const Arg *arg); /* move to the count-th line or if not given either to the first (arg->i < 0) @@ -302,6 +303,7 @@ enum { VIS_ACTION_SELECTIONS_COMBINE_UNION, VIS_ACTION_SELECTIONS_COMBINE_INTERSECT, VIS_ACTION_SELECTIONS_COMBINE_LONGER, + VIS_ACTION_SELECTIONS_COMBINE_SHORTER, VIS_ACTION_TEXT_OBJECT_WORD_OUTER, VIS_ACTION_TEXT_OBJECT_WORD_INNER, VIS_ACTION_TEXT_OBJECT_LONGWORD_OUTER, @@ -1107,6 +1109,11 @@ static const KeyAction vis_action[] = { VIS_HELP("Pairwise combine: take longer") selections_combine, { .combine = combine_longer } }, + [VIS_ACTION_SELECTIONS_COMBINE_SHORTER] = { + "vis-selections-combine-shorter", + VIS_HELP("Pairwise combine: take shorter") + selections_combine, { .combine = combine_shorter } + }, [VIS_ACTION_TEXT_OBJECT_WORD_OUTER] = { "vis-textobject-word-outer", VIS_HELP("A word leading and trailing whitespace included") @@ -1836,6 +1843,16 @@ static Filerange combine_longer(const Filerange *r1, const Filerange *r2) { return l1 < l2 ? *r2 : *r1; } +static Filerange combine_shorter(const Filerange *r1, const Filerange *r2) { + if (!r1) + return *r2; + if (!r2) + return *r1; + size_t l1 = text_range_size(r1); + size_t l2 = text_range_size(r2); + return l1 < l2 ? *r1 : *r2; +} + static const char *selections_combine(Vis *vis, const char *keys, const Arg *arg) { View *view = vis_view(vis); enum VisRegister reg = vis_register_used(vis);