aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/ops.h
blob: bffb692d00629fe1bcaa089b8520aeb86f09f4a2 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#ifndef NVIM_OPS_H
#define NVIM_OPS_H

#include <stdbool.h>
#include <stddef.h>

#include "nvim/ascii.h"
#include "nvim/eval/typval.h"
#include "nvim/eval/typval_defs.h"
#include "nvim/ex_cmds_defs.h"
#include "nvim/extmark.h"
#include "nvim/macros.h"
#include "nvim/normal.h"
#include "nvim/os/time.h"
#include "nvim/pos.h"
#include "nvim/types.h"

typedef int (*Indenter)(void);

// flags for do_put()
#define PUT_FIXINDENT    1      // make indent look nice
#define PUT_CURSEND      2      // leave cursor after end of new text
#define PUT_CURSLINE     4      // leave cursor on last line of new text
#define PUT_LINE         8      // put register as lines
#define PUT_LINE_SPLIT   16     // split line for linewise register
#define PUT_LINE_FORWARD 32     // put linewise register below Visual sel.
#define PUT_BLOCK_INNER  64     // in block mode, do not add trailing spaces
#define ITER_REGISTER_NULL 0

// 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 USER_REGISTERS_START 39
#define NUM_REGISTERS USER_REGISTERS_START

// Operator IDs; The order must correspond to opchars[] in ops.c!
#define OP_NOP          0       // no pending operation
#define OP_DELETE       1       // "d"  delete operator
#define OP_YANK         2       // "y"  yank operator
#define OP_CHANGE       3       // "c"  change operator
#define OP_LSHIFT       4       // "<"  left shift operator
#define OP_RSHIFT       5       // ">"  right shift operator
#define OP_FILTER       6       // "!"  filter operator
#define OP_TILDE        7       // "g~" switch case operator
#define OP_INDENT       8       // "="  indent operator
#define OP_FORMAT       9       // "gq" format operator
#define OP_COLON        10      // ":"  colon operator
#define OP_UPPER        11      // "gU" make upper case operator
#define OP_LOWER        12      // "gu" make lower case operator
#define OP_JOIN         13      // "J"  join operator, only for Visual mode
#define OP_JOIN_NS      14      // "gJ"  join operator, only for Visual mode
#define OP_ROT13        15      // "g?" rot-13 encoding
#define OP_REPLACE      16      // "r"  replace chars, only for Visual mode
#define OP_INSERT       17      // "I"  Insert column, only for Visual mode
#define OP_APPEND       18      // "A"  Append column, only for Visual mode
#define OP_FOLD         19      // "zf" define a fold
#define OP_FOLDOPEN     20      // "zo" open folds
#define OP_FOLDOPENREC  21      // "zO" open folds recursively
#define OP_FOLDCLOSE    22      // "zc" close folds
#define OP_FOLDCLOSEREC 23      // "zC" close folds recursively
#define OP_FOLDDEL      24      // "zd" delete folds
#define OP_FOLDDELREC   25      // "zD" delete folds recursively
#define OP_FORMAT2      26      // "gw" format operator, keeps cursor pos
#define OP_FUNCTION     27      // "g@" call 'operatorfunc'
#define OP_NR_ADD       28      // "<C-A>" Add to the number or alphabetic
                                // character (OP_ADD conflicts with Perl)
#define OP_NR_SUB       29      // "<C-X>" Subtract from the number or
                                // alphabetic character

/// Flags for get_reg_contents().
enum GRegFlags {
  kGRegNoExpr  = 1,  ///< Do not allow expression register.
  kGRegExprSrc = 2,  ///< Return expression itself for "=" register.
  kGRegList    = 4,  ///< Return list.
};

/// Definition of one register
typedef struct yankreg {
  char **y_array;           ///< Pointer to an array of line pointers.
  size_t y_size;            ///< Number of lines in y_array.
  MotionType y_type;        ///< Register type
  colnr_T y_width;          ///< Register width (only valid for y_type == kBlockWise).
  Timestamp timestamp;      ///< Time when register was last modified.
  dict_T *additional_data;  ///< Additional data from ShaDa file.
} yankreg_T;

/// Modes for get_yank_register()
typedef enum {
  YREG_PASTE,
  YREG_YANK,
  YREG_PUT,
} yreg_mode_t;
/// Returns a reference to a user-defined register.
int get_userreg(const int regname);

/// 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 CHAR_ORD_LOW(regname) + 10;
  } else if (ASCII_ISUPPER(regname)) {
    return CHAR_ORD_UP(regname) + 10;
  } else if (regname == '-') {
    return DELETION_REGISTER;
  } else if (regname == '*') {
    return STAR_REGISTER;
  } else if (regname == '+') {
    return PLUS_REGISTER;
  } else {
    return get_userreg(regname);
  }
}

struct yank_registers;
typedef struct yank_registers yank_registers_T;

typedef size_t iter_register_T;

#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ops.h.generated.h"
#endif
#endif  // NVIM_OPS_H