1 | #ifndef NVIM_BUFFER_H |
2 | #define NVIM_BUFFER_H |
3 | |
4 | #include "nvim/vim.h" |
5 | #include "nvim/window.h" |
6 | #include "nvim/pos.h" // for linenr_T |
7 | #include "nvim/ex_cmds_defs.h" // for exarg_T |
8 | #include "nvim/screen.h" // for StlClickRecord |
9 | #include "nvim/func_attr.h" |
10 | #include "nvim/eval.h" |
11 | #include "nvim/macros.h" |
12 | |
13 | // Values for buflist_getfile() |
14 | enum getf_values { |
15 | GETF_SETMARK = 0x01, // set pcmark before jumping |
16 | GETF_ALT = 0x02, // jumping to alternate file (not buf num) |
17 | GETF_SWITCH = 0x04, // respect 'switchbuf' settings when jumping |
18 | }; |
19 | |
20 | // Return values of getfile() |
21 | enum getf_retvalues { |
22 | GETFILE_ERROR = 1, // normal error |
23 | GETFILE_NOT_WRITTEN = 2, // "not written" error |
24 | GETFILE_SAME_FILE = 0, // success, same file |
25 | GETFILE_OPEN_OTHER = -1, // success, opened another file |
26 | GETFILE_UNUSED = 8 |
27 | }; |
28 | |
29 | // Values for buflist_new() flags |
30 | enum bln_values { |
31 | BLN_CURBUF = 1, // May re-use curbuf for new buffer |
32 | BLN_LISTED = 2, // Put new buffer in buffer list |
33 | BLN_DUMMY = 4, // Allocating dummy buffer |
34 | BLN_NEW = 8, // create a new buffer |
35 | BLN_NOOPT = 16, // Don't copy options to existing buffer |
36 | }; |
37 | |
38 | // Values for action argument for do_buffer() |
39 | enum dobuf_action_values { |
40 | DOBUF_GOTO = 0, // go to specified buffer |
41 | DOBUF_SPLIT = 1, // split window and go to specified buffer |
42 | DOBUF_UNLOAD = 2, // unload specified buffer(s) |
43 | DOBUF_DEL = 3, // delete specified buffer(s) from buflist |
44 | DOBUF_WIPE = 4, // delete specified buffer(s) really |
45 | }; |
46 | |
47 | // Values for start argument for do_buffer() |
48 | enum dobuf_start_values { |
49 | DOBUF_CURRENT = 0, // "count" buffer from current buffer |
50 | DOBUF_FIRST = 1, // "count" buffer from first buffer |
51 | DOBUF_LAST = 2, // "count" buffer from last buffer |
52 | DOBUF_MOD = 3, // "count" mod. buffer from current buffer |
53 | }; |
54 | |
55 | // flags for buf_freeall() |
56 | enum bfa_values { |
57 | BFA_DEL = 1, // buffer is going to be deleted |
58 | BFA_WIPE = 2, // buffer is going to be wiped out |
59 | BFA_KEEP_UNDO = 4, // do not free undo information |
60 | }; |
61 | |
62 | #ifdef INCLUDE_GENERATED_DECLARATIONS |
63 | # include "buffer.h.generated.h" |
64 | #endif |
65 | |
66 | static inline void buf_set_changedtick(buf_T *const buf, |
67 | const varnumber_T changedtick) |
68 | REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE; |
69 | |
70 | /// Set b:changedtick, also checking b: for consistency in debug build |
71 | /// |
72 | /// @param[out] buf Buffer to set changedtick in. |
73 | /// @param[in] changedtick New value. |
74 | static inline void buf_set_changedtick(buf_T *const buf, |
75 | const varnumber_T changedtick) |
76 | { |
77 | typval_T old_val = buf->changedtick_di.di_tv; |
78 | |
79 | #ifndef NDEBUG |
80 | dictitem_T *const changedtick_di = tv_dict_find( |
81 | buf->b_vars, S_LEN("changedtick" )); |
82 | assert(changedtick_di != NULL); |
83 | assert(changedtick_di->di_tv.v_type == VAR_NUMBER); |
84 | assert(changedtick_di->di_tv.v_lock == VAR_FIXED); |
85 | // For some reason formatc does not like the below. |
86 | # ifndef UNIT_TESTING_LUA_PREPROCESSING |
87 | assert(changedtick_di->di_flags == (DI_FLAGS_RO|DI_FLAGS_FIX)); |
88 | # endif |
89 | assert(changedtick_di == (dictitem_T *)&buf->changedtick_di); |
90 | #endif |
91 | buf->changedtick_di.di_tv.vval.v_number = changedtick; |
92 | |
93 | if (tv_dict_is_watched(buf->b_vars)) { |
94 | tv_dict_watcher_notify(buf->b_vars, |
95 | (char *)buf->changedtick_di.di_key, |
96 | &buf->changedtick_di.di_tv, |
97 | &old_val); |
98 | } |
99 | } |
100 | |
101 | static inline varnumber_T buf_get_changedtick(const buf_T *const buf) |
102 | REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE REAL_FATTR_PURE |
103 | REAL_FATTR_WARN_UNUSED_RESULT; |
104 | |
105 | /// Get b:changedtick value |
106 | /// |
107 | /// Faster then querying b:. |
108 | /// |
109 | /// @param[in] buf Buffer to get b:changedtick from. |
110 | static inline varnumber_T buf_get_changedtick(const buf_T *const buf) |
111 | { |
112 | return buf->changedtick_di.di_tv.vval.v_number; |
113 | } |
114 | |
115 | static inline void buf_inc_changedtick(buf_T *const buf) |
116 | REAL_FATTR_NONNULL_ALL REAL_FATTR_ALWAYS_INLINE; |
117 | |
118 | /// Increment b:changedtick value |
119 | /// |
120 | /// Also checks b: for consistency in case of debug build. |
121 | /// |
122 | /// @param[in,out] buf Buffer to increment value in. |
123 | static inline void buf_inc_changedtick(buf_T *const buf) |
124 | { |
125 | buf_set_changedtick(buf, buf_get_changedtick(buf) + 1); |
126 | } |
127 | |
128 | #endif // NVIM_BUFFER_H |
129 | |