diff options
| author | Marc André Tanner <mat@brain-dump.org> | 2017-06-14 22:54:06 +0200 |
|---|---|---|
| committer | Marc André Tanner <mat@brain-dump.org> | 2017-06-15 15:51:43 +0200 |
| commit | f000d2f9c924bb964203d7dba27b3290045c6853 (patch) | |
| tree | 38dfb204c458979ff298cc466ec6c64f69173798 | |
| parent | 4b2513c5e1587319ec14ec511a01cfbad331ac79 (diff) | |
| download | vis-f000d2f9c924bb964203d7dba27b3290045c6853.tar.gz vis-f000d2f9c924bb964203d7dba27b3290045c6853.tar.xz | |
vis: add basic infrastructure to store selections in registers
| -rw-r--r-- | vis-core.h | 1 | ||||
| -rw-r--r-- | vis-registers.c | 35 | ||||
| -rw-r--r-- | vis.h | 18 |
3 files changed, 54 insertions, 0 deletions
@@ -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(®->selections, sizeof(SelectionRegion)); array_init_sized(®->values, sizeof(Buffer)); return array_add(®->values, &buf); } @@ -36,6 +37,7 @@ bool register_init(Register *reg) { void register_release(Register *reg) { if (!reg) return; + array_release(®->selections); size_t n = array_capacity(®->values); for (size_t i = 0; i < n; i++) buffer_release(array_get(®->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(®->selections); + array_reserve(&sel, len); + for (size_t i = 0; i < len; i++) { + SelectionRegion *sr = array_get(®->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(®->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(®->selections, &ss); + } +} + const RegisterDef vis_registers[] = { [VIS_REG_DEFAULT] = { '"', VIS_HELP("Unnamed register") }, [VIS_REG_ZERO] = { '0', VIS_HELP("Yank register") }, @@ -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 * @{ |
