1#ifndef NVIM_OPS_H
2#define NVIM_OPS_H
3
4#include <stdbool.h>
5
6#include "nvim/macros.h"
7#include "nvim/ascii.h"
8#include "nvim/types.h"
9#include "nvim/eval/typval.h"
10#include "nvim/os/time.h"
11#include "nvim/normal.h" // for MotionType and oparg_T
12#include "nvim/ex_cmds_defs.h" // for exarg_T
13
14typedef int (*Indenter)(void);
15
16/* flags for do_put() */
17#define PUT_FIXINDENT 1 /* make indent look nice */
18#define PUT_CURSEND 2 /* leave cursor after end of new text */
19#define PUT_CURSLINE 4 /* leave cursor on last line of new text */
20#define PUT_LINE 8 /* put register as lines */
21#define PUT_LINE_SPLIT 16 /* split line for linewise register */
22#define PUT_LINE_FORWARD 32 /* put linewise register below Visual sel. */
23
24/*
25 * Registers:
26 * 0 = register for latest (unnamed) yank
27 * 1..9 = registers '1' to '9', for deletes
28 * 10..35 = registers 'a' to 'z'
29 * 36 = delete register '-'
30 * 37 = selection register '*'
31 * 38 = clipboard register '+'
32 */
33#define DELETION_REGISTER 36
34#define NUM_SAVED_REGISTERS 37
35// The following registers should not be saved in ShaDa file:
36#define STAR_REGISTER 37
37#define PLUS_REGISTER 38
38#define NUM_REGISTERS 39
39
40// Operator IDs; The order must correspond to opchars[] in ops.c!
41#define OP_NOP 0 // no pending operation
42#define OP_DELETE 1 // "d" delete operator
43#define OP_YANK 2 // "y" yank operator
44#define OP_CHANGE 3 // "c" change operator
45#define OP_LSHIFT 4 // "<" left shift operator
46#define OP_RSHIFT 5 // ">" right shift operator
47#define OP_FILTER 6 // "!" filter operator
48#define OP_TILDE 7 // "g~" switch case operator
49#define OP_INDENT 8 // "=" indent operator
50#define OP_FORMAT 9 // "gq" format operator
51#define OP_COLON 10 // ":" colon operator
52#define OP_UPPER 11 // "gU" make upper case operator
53#define OP_LOWER 12 // "gu" make lower case operator
54#define OP_JOIN 13 // "J" join operator, only for Visual mode
55#define OP_JOIN_NS 14 // "gJ" join operator, only for Visual mode
56#define OP_ROT13 15 // "g?" rot-13 encoding
57#define OP_REPLACE 16 // "r" replace chars, only for Visual mode
58#define OP_INSERT 17 // "I" Insert column, only for Visual mode
59#define OP_APPEND 18 // "A" Append column, only for Visual mode
60#define OP_FOLD 19 // "zf" define a fold
61#define OP_FOLDOPEN 20 // "zo" open folds
62#define OP_FOLDOPENREC 21 // "zO" open folds recursively
63#define OP_FOLDCLOSE 22 // "zc" close folds
64#define OP_FOLDCLOSEREC 23 // "zC" close folds recursively
65#define OP_FOLDDEL 24 // "zd" delete folds
66#define OP_FOLDDELREC 25 // "zD" delete folds recursively
67#define OP_FORMAT2 26 // "gw" format operator, keeps cursor pos
68#define OP_FUNCTION 27 // "g@" call 'operatorfunc'
69#define OP_NR_ADD 28 // "<C-A>" Add to the number or alphabetic
70 // character (OP_ADD conflicts with Perl)
71#define OP_NR_SUB 29 // "<C-X>" Subtract from the number or
72 // alphabetic character
73
74/// Flags for get_reg_contents().
75enum GRegFlags {
76 kGRegNoExpr = 1, ///< Do not allow expression register.
77 kGRegExprSrc = 2, ///< Return expression itself for "=" register.
78 kGRegList = 4 ///< Return list.
79};
80
81/// Definition of one register
82typedef struct yankreg {
83 char_u **y_array; ///< Pointer to an array of line pointers.
84 size_t y_size; ///< Number of lines in y_array.
85 MotionType y_type; ///< Register type
86 colnr_T y_width; ///< Register width (only valid for y_type == kBlockWise).
87 Timestamp timestamp; ///< Time when register was last modified.
88 dict_T *additional_data; ///< Additional data from ShaDa file.
89} yankreg_T;
90
91/// Convert register name into register index
92///
93/// @param[in] regname Register name.
94///
95/// @return Index in y_regs array or -1 if register name was not recognized.
96static inline int op_reg_index(const int regname)
97 FUNC_ATTR_CONST
98{
99 if (ascii_isdigit(regname)) {
100 return regname - '0';
101 } else if (ASCII_ISLOWER(regname)) {
102 return CharOrdLow(regname) + 10;
103 } else if (ASCII_ISUPPER(regname)) {
104 return CharOrdUp(regname) + 10;
105 } else if (regname == '-') {
106 return DELETION_REGISTER;
107 } else if (regname == '*') {
108 return STAR_REGISTER;
109 } else if (regname == '+') {
110 return PLUS_REGISTER;
111 } else {
112 return -1;
113 }
114}
115
116#ifdef INCLUDE_GENERATED_DECLARATIONS
117# include "ops.h.generated.h"
118#endif
119#endif // NVIM_OPS_H
120