From 244dbe3a77bf548f73d8781da7327f30e818b08a Mon Sep 17 00:00:00 2001 From: ZyX Date: Sat, 25 Apr 2015 18:47:31 +0300 Subject: viminfo: First version of ShaDa file dumping What works: 1. ShaDa file dumping: header, registers, jump list, history, search patterns, substitute strings, variables. 2. ShaDa file reading: registers, global marks, variables. Most was not tested. TODO: 1. Merging. 2. Reading history, local marks, jump and buffer lists. 3. Documentation update. 4. Converting some data from &encoding. 5. Safer variant of dumping viminfo (dump to temporary file then rename). 6. Removing old viminfo code (currently masked with `#if 0` in a ShaDa file for reference). --- src/nvim/ops.h | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'src/nvim/ops.h') diff --git a/src/nvim/ops.h b/src/nvim/ops.h index 99683165f9..4da5cfc93d 100644 --- a/src/nvim/ops.h +++ b/src/nvim/ops.h @@ -4,6 +4,8 @@ #include #include "nvim/types.h" +#include "nvim/api/private/defs.h" +#include "nvim/os/time.h" typedef int (*Indenter)(void); @@ -47,14 +49,6 @@ typedef int (*Indenter)(void); #define OP_FORMAT2 26 /* "gw" format operator, keeps cursor pos */ #define OP_FUNCTION 27 /* "g@" call 'operatorfunc' */ -/// Contents of a yank (read-write) register -typedef struct yankreg { - char_u **y_array; ///< pointer to array of line pointers - linenr_T y_size; ///< number of lines in y_array - char_u y_type; ///< MLINE, MCHAR or MBLOCK - colnr_T y_width; ///< only set if y_type == MBLOCK -} yankreg_T; - /// Flags for get_reg_contents(). enum GRegFlags { kGRegNoExpr = 1, ///< Do not allow expression register. @@ -62,6 +56,16 @@ enum GRegFlags { kGRegList = 4 ///< Return list. }; +/// Definition of one register +typedef struct yankreg { + char_u **y_array; ///< Pointer to an array of line pointers. + linenr_T y_size; ///< Number of lines in y_array. + char_u y_type; ///< Register type: MLINE, MCHAR or MBLOCK. + colnr_T y_width; ///< Register width (only valid for y_type == MBLOCK). + Timestamp timestamp; ///< Time when register was last modified. + Dictionary *additional_data; ///< Additional data from ShaDa file. +} yankreg_T; + #ifdef INCLUDE_GENERATED_DECLARATIONS # include "ops.h.generated.h" #endif -- cgit From 43fe98c9fb350b428d05021995c8892e080054b2 Mon Sep 17 00:00:00 2001 From: ZyX Date: Sun, 19 Jul 2015 21:23:15 +0300 Subject: shada: Add support for merging everything like described in the doc --- src/nvim/ops.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/nvim/ops.h') diff --git a/src/nvim/ops.h b/src/nvim/ops.h index 4da5cfc93d..5565f1631f 100644 --- a/src/nvim/ops.h +++ b/src/nvim/ops.h @@ -3,6 +3,8 @@ #include +#include "nvim/macros.h" +#include "nvim/ascii.h" #include "nvim/types.h" #include "nvim/api/private/defs.h" #include "nvim/os/time.h" @@ -17,6 +19,22 @@ typedef int (*Indenter)(void); #define PUT_LINE_SPLIT 16 /* split line for linewise register */ #define PUT_LINE_FORWARD 32 /* put linewise register below Visual sel. */ +/* + * Registers: + * 0 = register for latest (unnamed) yank + * 1..9 = registers '1' to '9', for deletes + * 10..35 = registers 'a' to 'z' + * 36 = delete register '-' + * 37 = selection register '*' + * 38 = clipboard register '+' + */ +#define DELETION_REGISTER 36 +#define NUM_SAVED_REGISTERS 37 +// The following registers should not be saved in ShaDa file: +#define STAR_REGISTER 37 +#define PLUS_REGISTER 38 +#define NUM_REGISTERS 39 + /* * Operator IDs; The order must correspond to opchars[] in ops.c! */ @@ -66,6 +84,31 @@ typedef struct yankreg { Dictionary *additional_data; ///< Additional data from ShaDa file. } yankreg_T; +/// Convert register name into register index +/// +/// @param[in] regname Register name. +/// +/// @return Index in y_regs array or -1 if register name was not recognized. +static inline int op_reg_index(const int regname) + FUNC_ATTR_CONST +{ + if (ascii_isdigit(regname)) { + return regname - '0'; + } else if (ASCII_ISLOWER(regname)) { + return CharOrdLow(regname) + 10; + } else if (ASCII_ISUPPER(regname)) { + return CharOrdUp(regname) + 10; + } else if (regname == '-') { + return DELETION_REGISTER; + } else if (regname == '*') { + return STAR_REGISTER; + } else if (regname == '+') { + return PLUS_REGISTER; + } else { + return -1; + } +} + #ifdef INCLUDE_GENERATED_DECLARATIONS # include "ops.h.generated.h" #endif -- cgit From 07d9ab26c6526c0d9af0435f1adeb614a1b88743 Mon Sep 17 00:00:00 2001 From: ZyX Date: Mon, 3 Aug 2015 23:06:06 +0300 Subject: *: Make ShaDa code use VimL values for additional_\* data --- src/nvim/ops.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/nvim/ops.h') diff --git a/src/nvim/ops.h b/src/nvim/ops.h index 5565f1631f..507f933acf 100644 --- a/src/nvim/ops.h +++ b/src/nvim/ops.h @@ -6,7 +6,7 @@ #include "nvim/macros.h" #include "nvim/ascii.h" #include "nvim/types.h" -#include "nvim/api/private/defs.h" +#include "nvim/eval_defs.h" #include "nvim/os/time.h" typedef int (*Indenter)(void); @@ -81,7 +81,7 @@ typedef struct yankreg { char_u y_type; ///< Register type: MLINE, MCHAR or MBLOCK. colnr_T y_width; ///< Register width (only valid for y_type == MBLOCK). Timestamp timestamp; ///< Time when register was last modified. - Dictionary *additional_data; ///< Additional data from ShaDa file. + dict_T *additional_data; ///< Additional data from ShaDa file. } yankreg_T; /// Convert register name into register index -- cgit