aboutsummaryrefslogtreecommitdiff
path: root/sam.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-11-27 23:46:17 +0100
committerMarc André Tanner <mat@brain-dump.org>2016-11-28 12:03:11 +0100
commit71262efa24013d45023dc2406b046768828c8ad7 (patch)
tree74e13405e099cf93631db8f4b8755de458b57c4b /sam.c
parent970901d37cccb365e67be018414b193fede8ca40 (diff)
downloadvis-71262efa24013d45023dc2406b046768828c8ad7.tar.gz
vis-71262efa24013d45023dc2406b046768828c8ad7.tar.xz
sam: introduce `m as an address refering to mark m
Diffstat (limited to 'sam.c')
-rw-r--r--sam.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/sam.c b/sam.c
index 7499242..2c4fcb6 100644
--- a/sam.c
+++ b/sam.c
@@ -405,6 +405,7 @@ const char *sam_error(enum SamError err) {
[SAM_ERR_COMMAND] = "Unknown command",
[SAM_ERR_EXECUTE] = "Error executing command",
[SAM_ERR_NEWLINE] = "Newline expected",
+ [SAM_ERR_MARK] = "Invalid mark",
};
return err < LENGTH(error_msg) ? error_msg[err] : NULL;
@@ -581,6 +582,14 @@ static Address *address_parse_simple(Vis *vis, const char **s, enum SamError *er
addr.type = 'l';
addr.number = parse_number(s);
break;
+ case '`':
+ (*s)++;
+ if ((addr.number = vis_mark_from(vis, **s)) == VIS_MARK_INVALID) {
+ *err = SAM_ERR_MARK;
+ return NULL;
+ }
+ (*s)++;
+ break;
case '/': /* regexp forwards */
case '?': /* regexp backwards */
addr.regex = parse_regex(vis, s);
@@ -882,6 +891,12 @@ static Filerange address_evaluate(Address *addr, File *file, Filerange *range, i
case 'g':
ret = address_line_evaluate(addr, file, range, sign);
break;
+ case '`':
+ {
+ size_t pos = text_mark_get(file->text, file->marks[addr->number]);
+ ret = text_range_new(pos, pos);
+ break;
+ }
case '?':
sign = sign == 0 ? -1 : -sign;
/* fall through */