-
Notifications
You must be signed in to change notification settings - Fork 137
/
elisp.c
210 lines (179 loc) · 6.54 KB
/
elisp.c
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include "elisp.h"
#include <stdio.h>
// Emacs symbols
emacs_value Qt;
emacs_value Qnil;
emacs_value Qnormal;
emacs_value Qbold;
emacs_value Qitalic;
emacs_value Qforeground;
emacs_value Qbackground;
emacs_value Qweight;
emacs_value Qunderline;
emacs_value Qslant;
emacs_value Qreverse;
emacs_value Qstrike;
emacs_value Qextend;
emacs_value Qface;
emacs_value Qbox;
emacs_value Qbar;
emacs_value Qhbar;
emacs_value Qcursor_type;
emacs_value Qemacs_major_version;
emacs_value Qvterm_line_wrap;
emacs_value Qrear_nonsticky;
emacs_value Qvterm_prompt;
// Emacs functions
emacs_value Fblink_cursor_mode;
emacs_value Fsymbol_value;
emacs_value Flength;
emacs_value Flist;
emacs_value Fnth;
emacs_value Ferase_buffer;
emacs_value Finsert;
emacs_value Fgoto_char;
emacs_value Fforward_char;
emacs_value Fforward_line;
emacs_value Fgoto_line;
emacs_value Fdelete_lines;
emacs_value Frecenter;
emacs_value Fset_window_point;
emacs_value Fwindow_body_height;
emacs_value Fpoint;
emacs_value Fapply;
emacs_value Fput_text_property;
emacs_value Fadd_text_properties;
emacs_value Fset;
emacs_value Fvterm_flush_output;
emacs_value Fget_buffer_window_list;
emacs_value Fselected_window;
emacs_value Fvterm_set_title;
emacs_value Fvterm_set_directory;
emacs_value Fvterm_invalidate;
emacs_value Feq;
emacs_value Fvterm_get_color;
emacs_value Fvterm_eval;
emacs_value Fvterm_set_selection;
/* Set the function cell of the symbol named NAME to SFUN using
the 'fset' function. */
void bind_function(emacs_env *env, const char *name, emacs_value Sfun) {
emacs_value Qfset = env->intern(env, "fset");
emacs_value Qsym = env->intern(env, name);
env->funcall(env, Qfset, 2, (emacs_value[]){Qsym, Sfun});
}
/* Provide FEATURE to Emacs. */
void provide(emacs_env *env, const char *feature) {
emacs_value Qfeat = env->intern(env, feature);
emacs_value Qprovide = env->intern(env, "provide");
env->funcall(env, Qprovide, 1, (emacs_value[]){Qfeat});
}
emacs_value symbol_value(emacs_env *env, emacs_value symbol) {
return env->funcall(env, Fsymbol_value, 1, (emacs_value[]){symbol});
}
int string_bytes(emacs_env *env, emacs_value string) {
ptrdiff_t size = 0;
env->copy_string_contents(env, string, NULL, &size);
return size;
}
emacs_value length(emacs_env *env, emacs_value string) {
return env->funcall(env, Flength, 1, (emacs_value[]){string});
}
emacs_value list(emacs_env *env, emacs_value elements[], ptrdiff_t len) {
return env->funcall(env, Flist, len, elements);
}
emacs_value nth(emacs_env *env, int idx, emacs_value list) {
emacs_value eidx = env->make_integer(env, idx);
return env->funcall(env, Fnth, 2, (emacs_value[]){eidx, list});
}
void put_text_property(emacs_env *env, emacs_value string, emacs_value property,
emacs_value value) {
emacs_value start = env->make_integer(env, 0);
emacs_value end = length(env, string);
env->funcall(env, Fput_text_property, 5,
(emacs_value[]){start, end, property, value, string});
}
void add_text_properties(emacs_env *env, emacs_value string,
emacs_value property) {
emacs_value start = env->make_integer(env, 0);
emacs_value end = length(env, string);
env->funcall(env, Fadd_text_properties, 4,
(emacs_value[]){start, end, property, string});
}
void erase_buffer(emacs_env *env) { env->funcall(env, Ferase_buffer, 0, NULL); }
void insert(emacs_env *env, emacs_value string) {
env->funcall(env, Finsert, 1, (emacs_value[]){string});
}
void goto_char(emacs_env *env, int pos) {
emacs_value point = env->make_integer(env, pos);
env->funcall(env, Fgoto_char, 1, (emacs_value[]){point});
}
void forward_line(emacs_env *env, int n) {
emacs_value nline = env->make_integer(env, n);
env->funcall(env, Fforward_line, 1, (emacs_value[]){nline});
}
void goto_line(emacs_env *env, int n) {
emacs_value nline = env->make_integer(env, n);
env->funcall(env, Fgoto_line, 1, (emacs_value[]){nline});
}
void delete_lines(emacs_env *env, int linenum, int count, bool del_whole_line) {
emacs_value Qlinenum = env->make_integer(env, linenum);
emacs_value Qcount = env->make_integer(env, count);
if (del_whole_line) {
env->funcall(env, Fdelete_lines, 3, (emacs_value[]){Qlinenum, Qcount, Qt});
} else {
env->funcall(env, Fdelete_lines, 3,
(emacs_value[]){Qlinenum, Qcount, Qnil});
}
}
void recenter(emacs_env *env, emacs_value pos) {
env->funcall(env, Frecenter, 1, (emacs_value[]){pos});
}
emacs_value point(emacs_env *env) { return env->funcall(env, Fpoint, 0, NULL); }
void set_window_point(emacs_env *env, emacs_value win, emacs_value point) {
env->funcall(env, Fset_window_point, 2, (emacs_value[]){win, point});
}
emacs_value window_body_height(emacs_env *env, emacs_value win) {
return env->funcall(env, Fwindow_body_height, 1, (emacs_value[]){win});
}
bool eq(emacs_env *env, emacs_value e1, emacs_value e2) {
emacs_value Qeq = env->funcall(env, Feq, 2, (emacs_value[]){e1, e2});
return env->is_not_nil(env, Qeq);
}
void forward_char(emacs_env *env, emacs_value n) {
env->funcall(env, Fforward_char, 1, (emacs_value[]){n});
}
emacs_value get_buffer_window_list(emacs_env *env) {
return env->funcall(env, Fget_buffer_window_list, 3,
(emacs_value[]){Qnil, Qnil, Qt});
}
emacs_value selected_window(emacs_env *env) {
return env->funcall(env, Fselected_window, 0, (emacs_value[]){});
}
void set_cursor_type(emacs_env *env, emacs_value cursor_type) {
env->funcall(env, Fset, 2, (emacs_value[]){Qcursor_type, cursor_type});
}
void set_cursor_blink(emacs_env *env, bool blink) {
env->funcall(env, Fblink_cursor_mode, 1,
(emacs_value[]){env->make_integer(env, blink)});
}
emacs_value vterm_get_color(emacs_env *env, int index, emacs_value args) {
emacs_value idx = env->make_integer(env, index);
return env->funcall(env, Fapply, 3, (emacs_value[]){ Fvterm_get_color, idx, args });
}
void set_title(emacs_env *env, emacs_value string) {
env->funcall(env, Fvterm_set_title, 1, (emacs_value[]){string});
}
void set_directory(emacs_env *env, emacs_value string) {
env->funcall(env, Fvterm_set_directory, 1, (emacs_value[]){string});
}
void vterm_invalidate(emacs_env *env) {
env->funcall(env, Fvterm_invalidate, 0, NULL);
}
emacs_value vterm_eval(emacs_env *env, emacs_value string) {
return env->funcall(env, Fvterm_eval, 1, (emacs_value[]){string});
}
emacs_value vterm_set_selection(emacs_env *env, emacs_value selection_target,
emacs_value selection_data) {
return env->funcall(env, Fvterm_set_selection, 2,
(emacs_value[]){selection_target, selection_data});
}