diff options
Diffstat (limited to 'sam.c')
| -rw-r--r-- | sam.c | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -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 */ |
