From 5c600e15c1c1ab64f385de918c93d2bdb23955d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Thu, 6 Jul 2017 21:28:51 +0200 Subject: vis: use marks instead of registers to store selections The key binding remain the same, but the selections are now stored on a per-buffer basis. --- sam.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'sam.c') diff --git a/sam.c b/sam.c index fdbc4e4..d5b7bf5 100644 --- a/sam.c +++ b/sam.c @@ -1005,7 +1005,7 @@ static Filerange address_line_evaluate(Address *addr, File *file, Filerange *ran return text_range_new(line, text_line_next(txt, line)); } -static Filerange address_evaluate(Address *addr, File *file, Filerange *range, int sign) { +static Filerange address_evaluate(Address *addr, File *file, Selection *sel, Filerange *range, int sign) { Filerange ret = text_range_empty(); do { @@ -1024,7 +1024,12 @@ static Filerange address_evaluate(Address *addr, File *file, Filerange *range, i break; case '\'': { - size_t pos = text_mark_get(file->text, file->marks[addr->number]); + size_t pos = EPOS; + Array *marks = &file->marks[addr->number]; + size_t idx = sel ? view_selections_number(sel) : 0; + SelectionRegion *sr = array_get(marks, idx); + if (sr) + pos = text_mark_get(file->text, sr->cursor); ret = text_range_new(pos, pos); break; } @@ -1057,7 +1062,7 @@ static Filerange address_evaluate(Address *addr, File *file, Filerange *range, i { Filerange left, right; if (addr->left) - left = address_evaluate(addr->left, file, range, 0); + left = address_evaluate(addr->left, file, sel, range, 0); else left = text_range_new(0, 0); @@ -1065,7 +1070,7 @@ static Filerange address_evaluate(Address *addr, File *file, Filerange *range, i range = &left; if (addr->right) { - right = address_evaluate(addr->right, file, range, 0); + right = address_evaluate(addr->right, file, sel, range, 0); } else { size_t size = text_size(file->text); right = text_range_new(size, size); @@ -1093,7 +1098,7 @@ static bool count_evaluate(Command *cmd) { static bool sam_execute(Vis *vis, Win *win, Command *cmd, Selection *sel, Filerange *range) { bool ret = true; if (cmd->address && win) - *range = address_evaluate(cmd->address, win->file, range, 0); + *range = address_evaluate(cmd->address, win->file, sel, range, 0); cmd->iteration++; switch (cmd->argv[0][0]) { -- cgit v1.2.3