dotemacs

My Emacs configuration
git clone git://git.entf.net/dotemacs
Log | Files | Refs | LICENSE

elisp.c (6626B)


      1 #include "elisp.h"
      2 #include <stdio.h>
      3 
      4 // Emacs symbols
      5 emacs_value Qt;
      6 emacs_value Qnil;
      7 emacs_value Qnormal;
      8 emacs_value Qbold;
      9 emacs_value Qitalic;
     10 emacs_value Qforeground;
     11 emacs_value Qbackground;
     12 emacs_value Qweight;
     13 emacs_value Qunderline;
     14 emacs_value Qslant;
     15 emacs_value Qreverse;
     16 emacs_value Qstrike;
     17 emacs_value Qextend;
     18 emacs_value Qface;
     19 emacs_value Qbox;
     20 emacs_value Qbar;
     21 emacs_value Qhbar;
     22 emacs_value Qcursor_type;
     23 emacs_value Qemacs_major_version;
     24 emacs_value Qvterm_line_wrap;
     25 emacs_value Qrear_nonsticky;
     26 emacs_value Qvterm_prompt;
     27 
     28 // Emacs functions
     29 emacs_value Fblink_cursor_mode;
     30 emacs_value Fsymbol_value;
     31 emacs_value Flength;
     32 emacs_value Flist;
     33 emacs_value Fnth;
     34 emacs_value Ferase_buffer;
     35 emacs_value Finsert;
     36 emacs_value Fgoto_char;
     37 emacs_value Fforward_char;
     38 emacs_value Fforward_line;
     39 emacs_value Fgoto_line;
     40 emacs_value Fdelete_lines;
     41 emacs_value Frecenter;
     42 emacs_value Fset_window_point;
     43 emacs_value Fwindow_body_height;
     44 emacs_value Fpoint;
     45 
     46 emacs_value Fput_text_property;
     47 emacs_value Fadd_text_properties;
     48 emacs_value Fset;
     49 emacs_value Fvterm_flush_output;
     50 emacs_value Fget_buffer_window_list;
     51 emacs_value Fselected_window;
     52 emacs_value Fvterm_set_title;
     53 emacs_value Fvterm_set_directory;
     54 emacs_value Fvterm_invalidate;
     55 emacs_value Feq;
     56 emacs_value Fvterm_get_color;
     57 emacs_value Fvterm_eval;
     58 emacs_value Fvterm_selection;
     59 
     60 /* Set the function cell of the symbol named NAME to SFUN using
     61    the 'fset' function.  */
     62 void bind_function(emacs_env *env, const char *name, emacs_value Sfun) {
     63   emacs_value Qfset = env->intern(env, "fset");
     64   emacs_value Qsym = env->intern(env, name);
     65 
     66   env->funcall(env, Qfset, 2, (emacs_value[]){Qsym, Sfun});
     67 }
     68 
     69 /* Provide FEATURE to Emacs.  */
     70 void provide(emacs_env *env, const char *feature) {
     71   emacs_value Qfeat = env->intern(env, feature);
     72   emacs_value Qprovide = env->intern(env, "provide");
     73 
     74   env->funcall(env, Qprovide, 1, (emacs_value[]){Qfeat});
     75 }
     76 
     77 emacs_value symbol_value(emacs_env *env, emacs_value symbol) {
     78   return env->funcall(env, Fsymbol_value, 1, (emacs_value[]){symbol});
     79 }
     80 
     81 int string_bytes(emacs_env *env, emacs_value string) {
     82   ptrdiff_t size = 0;
     83   env->copy_string_contents(env, string, NULL, &size);
     84   return size;
     85 }
     86 
     87 emacs_value length(emacs_env *env, emacs_value string) {
     88   return env->funcall(env, Flength, 1, (emacs_value[]){string});
     89 }
     90 
     91 emacs_value list(emacs_env *env, emacs_value elements[], ptrdiff_t len) {
     92   return env->funcall(env, Flist, len, elements);
     93 }
     94 emacs_value nth(emacs_env *env, int idx, emacs_value list) {
     95   emacs_value eidx = env->make_integer(env, idx);
     96   return env->funcall(env, Fnth, 2, (emacs_value[]){eidx, list});
     97 }
     98 
     99 void put_text_property(emacs_env *env, emacs_value string, emacs_value property,
    100                        emacs_value value) {
    101   emacs_value start = env->make_integer(env, 0);
    102   emacs_value end = length(env, string);
    103 
    104   env->funcall(env, Fput_text_property, 5,
    105                (emacs_value[]){start, end, property, value, string});
    106 }
    107 
    108 void add_text_properties(emacs_env *env, emacs_value string,
    109                          emacs_value property) {
    110   emacs_value start = env->make_integer(env, 0);
    111   emacs_value end = length(env, string);
    112 
    113   env->funcall(env, Fadd_text_properties, 4,
    114                (emacs_value[]){start, end, property, string});
    115 }
    116 
    117 void erase_buffer(emacs_env *env) { env->funcall(env, Ferase_buffer, 0, NULL); }
    118 
    119 void insert(emacs_env *env, emacs_value string) {
    120   env->funcall(env, Finsert, 1, (emacs_value[]){string});
    121 }
    122 
    123 void goto_char(emacs_env *env, int pos) {
    124   emacs_value point = env->make_integer(env, pos);
    125   env->funcall(env, Fgoto_char, 1, (emacs_value[]){point});
    126 }
    127 
    128 void forward_line(emacs_env *env, int n) {
    129   emacs_value nline = env->make_integer(env, n);
    130   env->funcall(env, Fforward_line, 1, (emacs_value[]){nline});
    131 }
    132 void goto_line(emacs_env *env, int n) {
    133   emacs_value nline = env->make_integer(env, n);
    134   env->funcall(env, Fgoto_line, 1, (emacs_value[]){nline});
    135 }
    136 void delete_lines(emacs_env *env, int linenum, int count, bool del_whole_line) {
    137   emacs_value Qlinenum = env->make_integer(env, linenum);
    138   emacs_value Qcount = env->make_integer(env, count);
    139   if (del_whole_line) {
    140     env->funcall(env, Fdelete_lines, 3, (emacs_value[]){Qlinenum, Qcount, Qt});
    141   } else {
    142     env->funcall(env, Fdelete_lines, 3,
    143                  (emacs_value[]){Qlinenum, Qcount, Qnil});
    144   }
    145 }
    146 void recenter(emacs_env *env, emacs_value pos) {
    147   env->funcall(env, Frecenter, 1, (emacs_value[]){pos});
    148 }
    149 emacs_value point(emacs_env *env) { return env->funcall(env, Fpoint, 0, NULL); }
    150 
    151 void set_window_point(emacs_env *env, emacs_value win, emacs_value point) {
    152   env->funcall(env, Fset_window_point, 2, (emacs_value[]){win, point});
    153 }
    154 emacs_value window_body_height(emacs_env *env, emacs_value win) {
    155   return env->funcall(env, Fwindow_body_height, 1, (emacs_value[]){win});
    156 }
    157 
    158 bool eq(emacs_env *env, emacs_value e1, emacs_value e2) {
    159   emacs_value Qeq = env->funcall(env, Feq, 2, (emacs_value[]){e1, e2});
    160   return env->is_not_nil(env, Qeq);
    161 }
    162 
    163 void forward_char(emacs_env *env, emacs_value n) {
    164   env->funcall(env, Fforward_char, 1, (emacs_value[]){n});
    165 }
    166 
    167 emacs_value get_buffer_window_list(emacs_env *env) {
    168   return env->funcall(env, Fget_buffer_window_list, 3,
    169                       (emacs_value[]){Qnil, Qnil, Qt});
    170 }
    171 
    172 emacs_value selected_window(emacs_env *env) {
    173   return env->funcall(env, Fselected_window, 0, (emacs_value[]){});
    174 }
    175 
    176 void set_cursor_type(emacs_env *env, emacs_value cursor_type) {
    177   env->funcall(env, Fset, 2, (emacs_value[]){Qcursor_type, cursor_type});
    178 }
    179 
    180 void set_cursor_blink(emacs_env *env, bool blink) {
    181   env->funcall(env, Fblink_cursor_mode, 1,
    182                (emacs_value[]){env->make_integer(env, blink)});
    183 }
    184 
    185 emacs_value vterm_get_color(emacs_env *env, int index) {
    186   emacs_value idx = env->make_integer(env, index);
    187   return env->funcall(env, Fvterm_get_color, 1, (emacs_value[]){idx});
    188 }
    189 
    190 void set_title(emacs_env *env, emacs_value string) {
    191   env->funcall(env, Fvterm_set_title, 1, (emacs_value[]){string});
    192 }
    193 
    194 void set_directory(emacs_env *env, emacs_value string) {
    195   env->funcall(env, Fvterm_set_directory, 1, (emacs_value[]){string});
    196 }
    197 
    198 void vterm_invalidate(emacs_env *env) {
    199   env->funcall(env, Fvterm_invalidate, 0, NULL);
    200 }
    201 emacs_value vterm_eval(emacs_env *env, emacs_value string) {
    202   return env->funcall(env, Fvterm_eval, 1, (emacs_value[]){string});
    203 }
    204 
    205 emacs_value vterm_selection(emacs_env *env, emacs_value selection_target,
    206                             emacs_value selection_data) {
    207   return env->funcall(env, Fvterm_selection, 2,
    208                       (emacs_value[]){selection_target, selection_data});
    209 }