aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2017-06-14 22:54:06 +0200
committerMarc André Tanner <mat@brain-dump.org>2017-06-15 15:51:43 +0200
commitf000d2f9c924bb964203d7dba27b3290045c6853 (patch)
tree38dfb204c458979ff298cc466ec6c64f69173798
parent4b2513c5e1587319ec14ec511a01cfbad331ac79 (diff)
downloadvis-f000d2f9c924bb964203d7dba27b3290045c6853.tar.gz
vis-f000d2f9c924bb964203d7dba27b3290045c6853.tar.xz
vis: add basic infrastructure to store selections in registers
-rw-r--r--vis-core.h1
-rw-r--r--vis-registers.c35
-rw-r--r--vis.h18
3 files changed, 54 insertions, 0 deletions
diff --git a/vis-core.h b/vis-core.h
index d043207..cd93096 100644
--- a/vis-core.h
+++ b/vis-core.h
@@ -40,6 +40,7 @@ struct Mode {
};
typedef struct {
+ Array selections;
Array values;
bool linewise; /* place register content on a new line when inserting? */
bool append;
diff --git a/vis-registers.c b/vis-registers.c
index aae7fdc..3e69b13 100644
--- a/vis-registers.c
+++ b/vis-registers.c
@@ -29,6 +29,7 @@ static ssize_t read_buffer(void *context, char *data, size_t len) {
bool register_init(Register *reg) {
Buffer buf;
buffer_init(&buf);
+ array_init_sized(&reg->selections, sizeof(SelectionRegion));
array_init_sized(&reg->values, sizeof(Buffer));
return array_add(&reg->values, &buf);
}
@@ -36,6 +37,7 @@ bool register_init(Register *reg) {
void register_release(Register *reg) {
if (!reg)
return;
+ array_release(&reg->selections);
size_t n = array_capacity(&reg->values);
for (size_t i = 0; i < n; i++)
buffer_release(array_get(&reg->values, i));
@@ -239,6 +241,39 @@ const char *vis_register_slot_get(Vis *vis, enum VisRegister id, size_t slot, si
return NULL;
}
+Array vis_register_selections_get(Vis *vis, enum VisRegister id) {
+ Array sel;
+ array_init_sized(&sel, sizeof(Filerange));
+ Register *reg = register_from(vis, id);
+ if (!reg)
+ return sel;
+ View *view = vis->win->view;
+ size_t len = array_length(&reg->selections);
+ array_reserve(&sel, len);
+ for (size_t i = 0; i < len; i++) {
+ SelectionRegion *sr = array_get(&reg->selections, i);
+ Filerange r = view_regions_restore(view, sr);
+ if (text_range_valid(&r))
+ array_add(&sel, &r);
+ }
+ //selections_normalize(&sel);
+ return sel;
+}
+
+void vis_register_selections_set(Vis *vis, enum VisRegister id, Array *sel) {
+ Register *reg = register_from(vis, id);
+ if (!reg)
+ return;
+ array_clear(&reg->selections);
+ View *view = vis->win->view;
+ for (size_t i = 0, len = array_length(sel); i < len; i++) {
+ SelectionRegion ss;
+ Filerange *r = array_get(sel, i);
+ if (view_regions_save(view, r, &ss))
+ array_add(&reg->selections, &ss);
+ }
+}
+
const RegisterDef vis_registers[] = {
[VIS_REG_DEFAULT] = { '"', VIS_HELP("Unnamed register") },
[VIS_REG_ZERO] = { '0', VIS_HELP("Yank register") },
diff --git a/vis.h b/vis.h
index a4f1d46..2afa00f 100644
--- a/vis.h
+++ b/vis.h
@@ -13,6 +13,7 @@ typedef struct Win Win;
#include "view.h"
#include "text-regex.h"
#include "libutf.h"
+#include "array.h"
#ifndef CONFIG_HELP
#define CONFIG_HELP 1
@@ -755,6 +756,23 @@ const char *vis_register_slot_get(Vis*, enum VisRegister, size_t slot, size_t *l
bool vis_register_put(Vis*, enum VisRegister, const char *data, size_t len);
bool vis_register_slot_put(Vis*, enum VisRegister, size_t slot, const char *data, size_t len);
/**
+ * Store a set of ``Filerange``s in a register.
+ *
+ * @param id The register to use.
+ * @param sel The array containing the file ranges.
+ */
+void vis_register_selections_set(Vis*, enum VisRegister id, Array *sel);
+/**
+ * Get an array of file ranges stored in the register.
+ *
+ * @rst
+ * .. warning:: The caller must eventually free the Array by calling
+ * ``array_release``.
+ * @endrst
+ */
+Array vis_register_selections_get(Vis*, enum VisRegister id);
+
+/**
* @}
* @defgroup vis_macros
* @{