vis
a vi-like editor based on Plan 9's structural regular expressions
git clone https://9o.is/git/vis.git
commit cd4eb19232ef61866f4ebdd4cc7470e3a7929d59 parent 4e8e6647dc24a6e7a4b695b21053b5f2a3ac2ef0 Author: Marc André Tanner <mat@brain-dump.org> Date: Sat, 30 Jan 2016 20:11:52 +0100 Implement blackhole register "_ Diffstat:
| M | main.c | | | 2 | ++ |
| M | register.c | | | 43 | +++++++++++++++++++++++++++++++++---------- |
| M | register.h | | | 4 | ++++ |
| M | vis.c | | | 1 | + |
| M | vis.h | | | 1 | + |
5 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/main.c b/main.c @@ -1306,6 +1306,8 @@ static const char *key2register(Vis *vis, const char *keys, enum VisRegister *re return NULL; if (keys[0] >= 'a' && keys[0] <= 'z') *reg = keys[0] - 'a'; + else if (keys[0] == '_') + *reg = VIS_REG_BLACKHOLE; return keys+1; } diff --git a/register.c b/register.c @@ -11,22 +11,45 @@ void register_release(Register *reg) { } const char *register_get(Register *reg, size_t *len) { - *len = reg->buf.len; - return reg->buf.data; + switch (reg->type) { + case REGISTER_NORMAL: + *len = reg->buf.len; + return reg->buf.data; + case REGISTER_BLACKHOLE: + default: + *len = 0; + return NULL; + } } bool register_put(Register *reg, Text *txt, Filerange *range) { - size_t len = text_range_size(range); - if (!buffer_grow(®->buf, len)) + switch (reg->type) { + case REGISTER_NORMAL: + { + size_t len = text_range_size(range); + if (!buffer_grow(®->buf, len)) + return false; + reg->buf.len = text_bytes_get(txt, range->start, len, reg->buf.data); + return true; + } + case REGISTER_BLACKHOLE: + return true; + default: return false; - reg->buf.len = text_bytes_get(txt, range->start, len, reg->buf.data); - return true; + } } bool register_append(Register *reg, Text *txt, Filerange *range) { - size_t len = text_range_size(range); - if (!buffer_grow(®->buf, reg->buf.len + len)) + switch (reg->type) { + case REGISTER_NORMAL: + { + size_t len = text_range_size(range); + if (!buffer_grow(®->buf, reg->buf.len + len)) + return false; + reg->buf.len += text_bytes_get(txt, range->start, len, reg->buf.data + reg->buf.len); + return true; + } + default: return false; - reg->buf.len += text_bytes_get(txt, range->start, len, reg->buf.data + reg->buf.len); - return true; + } } diff --git a/register.h b/register.h @@ -9,6 +9,10 @@ typedef struct { Buffer buf; bool linewise; /* place register content on a new line when inserting? */ + enum { + REGISTER_NORMAL, + REGISTER_BLACKHOLE, + } type; } Register; void register_release(Register *reg); diff --git a/vis.c b/vis.c @@ -315,6 +315,7 @@ Vis *vis_new(Ui *ui, VisEvent *event) { vis->ui->init(vis->ui, vis); vis->tabwidth = 8; vis->expandtab = false; + vis->registers[VIS_REG_BLACKHOLE].type = REGISTER_BLACKHOLE; action_reset(&vis->action); if (!(vis->search_pattern = text_regex_new())) goto err; diff --git a/vis.h b/vis.h @@ -348,6 +348,7 @@ enum VisRegister { VIS_REG_u, VIS_REG_v, VIS_REG_w, VIS_REG_x, VIS_REG_y, VIS_REG_z, VIS_REG_DEFAULT, /* used when no other register is specified */ + VIS_REG_BLACKHOLE, /* /dev/null register */ VIS_REG_PROMPT, /* internal register which shadows DEFAULT in PROMPT mode */ VIS_REG_INVALID, /* has to be the last enum member */ };