From d94bb93f10365a39d90cc0d4d4b151fc797767df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 30 Jan 2016 20:11:52 +0100 Subject: Implement blackhole register "_ --- main.c | 2 ++ register.c | 43 +++++++++++++++++++++++++++++++++---------- register.h | 4 ++++ vis.c | 1 + vis.h | 1 + 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/main.c b/main.c index 03a1362..487ce3c 100644 --- 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 index 30ad19c..30e4c58 100644 --- 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 index 22edd22..1b14688 100644 --- 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 index c7089ca..3edc766 100644 --- 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 index fe30fa4..8de1f51 100644 --- 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 */ }; -- cgit v1.2.3