aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.c2
-rw-r--r--register.c43
-rw-r--r--register.h4
-rw-r--r--vis.c1
-rw-r--r--vis.h1
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(&reg->buf, len))
+ switch (reg->type) {
+ case REGISTER_NORMAL:
+ {
+ size_t len = text_range_size(range);
+ if (!buffer_grow(&reg->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(&reg->buf, reg->buf.len + len))
+ switch (reg->type) {
+ case REGISTER_NORMAL:
+ {
+ size_t len = text_range_size(range);
+ if (!buffer_grow(&reg->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 */
};