Add chez-scintilla: Chez Scheme FFI bindings for Scintilla + termbox

ober

5d8620d01b800d1608076ab2f150b06e192e1b37

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6c1c914
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.so
+*.wpo
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..8746b4f
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,65 @@
+.PHONY: all build shim clean test vendor-deps
+
+# Gerbil-scintilla vendor directory (reuse already-built artifacts)
+GERBIL_SCINTILLA ?= $(HOME)/mine/gerbil-scintilla
+
+# Vendor paths
+VENDOR          = $(GERBIL_SCINTILLA)/vendor
+SCI_DIR         = $(VENDOR)/scintilla
+SCI_TB_DIR      = $(SCI_DIR)/termbox
+TERMBOX_DIR     = $(SCI_TB_DIR)/termbox_next
+LEXILLA_DIR     = $(VENDOR)/lexilla
+
+# Static archives
+SCINTILLA_A     = $(SCI_DIR)/bin/scintilla.a
+TERMBOX_A       = $(TERMBOX_DIR)/bin/termbox.a
+LEXILLA_A       = $(LEXILLA_DIR)/bin/liblexilla.a
+
+# Include paths
+CC_INCLUDES = \
+	-I$(SCI_DIR)/include \
+	-I$(SCI_DIR)/src \
+	-I$(SCI_TB_DIR) \
+	-I$(TERMBOX_DIR)/src \
+	-I$(LEXILLA_DIR)/include
+
+# Chez Scheme library path
+CHEZ_LIB = src
+SHIM_SO  = chez_scintilla_shim.so
+
+all: build
+
+# Build the C shim shared object
+shim: $(SHIM_SO)
+
+$(SHIM_SO): chez_scintilla_shim.c $(SCINTILLA_A) $(LEXILLA_A) $(TERMBOX_A)
+	gcc -shared -fPIC -o $@ $< \
+		$(CC_INCLUDES) \
+		-Wl,--whole-archive $(SCINTILLA_A) $(LEXILLA_A) $(TERMBOX_A) -Wl,--no-whole-archive \
+		-lstdc++ -lpthread
+
+# Build everything: shim + compile Scheme libraries
+build: $(SHIM_SO)
+	@echo "Compiling Scheme libraries..."
+	@CHEZ_SCINTILLA_LIB=$(CURDIR) \
+	scheme --libdirs $(CHEZ_LIB) --compile-imported-libraries --program /dev/null \
+		< <(echo '(import (chez-scintilla ffi) (chez-scintilla constants) (chez-scintilla scintilla) (chez-scintilla tui) (chez-scintilla lexer) (chez-scintilla style) (chez-scintilla search) (chez-scintilla folding) (chez-scintilla autocomplete) (chez-scintilla markers))') \
+		2>&1 || true
+	@echo "Build complete."
+
+# Run tests
+test: build
+	CHEZ_SCINTILLA_LIB=$(CURDIR) \
+	scheme --libdirs $(CHEZ_LIB) --script tests/run-tests.ss
+
+# Check that vendor deps exist
+vendor-deps:
+	@test -f $(SCINTILLA_A) || (echo "ERROR: scintilla.a not found. Run 'make vendor-deps' in $(GERBIL_SCINTILLA)" && exit 1)
+	@test -f $(LEXILLA_A) || (echo "ERROR: liblexilla.a not found." && exit 1)
+	@test -f $(TERMBOX_A) || (echo "ERROR: termbox.a not found." && exit 1)
+	@echo "Vendor dependencies OK."
+
+clean:
+	rm -f $(SHIM_SO)
+	find src -name '*.so' -delete
+	find src -name '*.wpo' -delete
diff --git a/chez_scintilla_shim.c b/chez_scintilla_shim.c
new file mode 100644
index 0000000..58288c1
--- /dev/null
+++ b/chez_scintilla_shim.c
@@ -0,0 +1,341 @@
+/* chez_scintilla_shim.c — C shim for Chez Scheme FFI to Scintilla + termbox
+ *
+ * Extracted from gerbil-scintilla/ffi.ss c-declare block.
+ * Provides: instance lifecycle, message passing, notification ring buffer,
+ *           input, display, clipboard, lexilla, and termbox wrappers.
+ *
+ * All functions use simple C types (void*, int, long, const char*)
+ * compatible with Chez Scheme's foreign-procedure.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "Scintilla.h"
+#include "ScintillaTermbox.h"
+#include "Lexilla.h"
+#include "termbox.h"
+
+/* ================================================================
+   Types
+   ================================================================ */
+typedef intptr_t sptr_t;
+typedef uintptr_t uptr_t;
+typedef void Scintilla;
+
+/* ================================================================
+   Notification ring buffer (per-instance)
+   ================================================================ */
+#define NOTIFY_RING_SIZE 64
+
+typedef struct {
+    int    code;
+    long   position;
+    int    ch;
+    int    modifiers;
+    int    modification_type;
+    char   text[256];
+    long   length;
+    long   lines_added;
+    int    message;
+    long   line;
+    int    fold_level_now;
+    int    fold_level_prev;
+    int    margin;
+    int    list_type;
+    int    x;
+    int    y;
+    int    token;
+    int    updated;
+} notify_entry_t;
+
+typedef struct instance_node {
+    Scintilla           *view;
+    notify_entry_t       ring[NOTIFY_RING_SIZE];
+    int                  ring_head;
+    int                  ring_tail;
+    struct instance_node *next;
+} instance_node_t;
+
+static instance_node_t *instance_list = NULL;
+
+/* Current notification (static, for drain_one -> accessor pattern) */
+static notify_entry_t current_scn;
+
+/* Find instance node by view pointer */
+static instance_node_t *find_instance(Scintilla *view) {
+    instance_node_t *n = instance_list;
+    while (n) {
+        if (n->view == view) return n;
+        n = n->next;
+    }
+    return NULL;
+}
+
+/* Notification callback — called synchronously from C++ */
+static void notification_callback(Scintilla *view, int msg,
+                                  SCNotification *scn, void *userdata) {
+    instance_node_t *inst = find_instance(view);
+    if (!inst) return;
+
+    int next_head = (inst->ring_head + 1) % NOTIFY_RING_SIZE;
+    if (next_head == inst->ring_tail) {
+        /* Ring full — drop oldest */
+        inst->ring_tail = (inst->ring_tail + 1) % NOTIFY_RING_SIZE;
+    }
+
+    notify_entry_t *e = &inst->ring[inst->ring_head];
+    e->code              = scn->nmhdr.code;
+    e->position          = (long)scn->position;
+    e->ch                = scn->ch;
+    e->modifiers         = scn->modifiers;
+    e->modification_type = scn->modificationType;
+    e->length            = (long)scn->length;
+    e->lines_added       = (long)scn->linesAdded;
+    e->message           = scn->message;
+    e->line              = (long)scn->line;
+    e->fold_level_now    = scn->foldLevelNow;
+    e->fold_level_prev   = scn->foldLevelPrev;
+    e->margin            = scn->margin;
+    e->list_type         = scn->listType;
+    e->x                 = scn->x;
+    e->y                 = scn->y;
+    e->token             = scn->token;
+    e->updated           = scn->updated;
+
+    if (scn->text && scn->length > 0) {
+        int copy_len = scn->length < 255 ? scn->length : 255;
+        memcpy(e->text, scn->text, copy_len);
+        e->text[copy_len] = '\0';
+    } else {
+        e->text[0] = '\0';
+    }
+
+    inst->ring_head = next_head;
+}
+
+/* ================================================================
+   Instance lifecycle
+   ================================================================ */
+void *chez_scintilla_new(void) {
+    Scintilla *sci = scintilla_new(notification_callback, NULL);
+    if (!sci) return NULL;
+
+    instance_node_t *node = (instance_node_t *)malloc(sizeof(instance_node_t));
+    node->view      = sci;
+    node->ring_head = 0;
+    node->ring_tail = 0;
+    node->next      = instance_list;
+    instance_list   = node;
+
+    return (void *)sci;
+}
+
+void chez_scintilla_delete(void *handle) {
+    Scintilla *sci = (Scintilla *)handle;
+    /* Remove from instance list */
+    instance_node_t **pp = &instance_list;
+    while (*pp) {
+        if ((*pp)->view == sci) {
+            instance_node_t *rm = *pp;
+            *pp = rm->next;
+            free(rm);
+            break;
+        }
+        pp = &(*pp)->next;
+    }
+    scintilla_delete(sci);
+}
+
+/* ================================================================
+   Message passing
+   ================================================================ */
+long chez_scintilla_send_message(void *handle, unsigned int msg,
+                                 unsigned long wparam, long lparam) {
+    return (long)scintilla_send_message((Scintilla *)handle, msg,
+                                        (uptr_t)wparam, (sptr_t)lparam);
+}
+
+/* Send message with string as lparam (cast char* to sptr_t) */
+long chez_scintilla_send_message_string(void *handle, unsigned int msg,
+                                        unsigned long wparam, const char *str) {
+    return (long)scintilla_send_message((Scintilla *)handle, msg,
+                                        (uptr_t)wparam, (sptr_t)str);
+}
+
+/* Receive string: call msg twice (get length, then fill buffer) */
+#define RECV_BUF_SIZE 65536
+static char recv_buf[RECV_BUF_SIZE];
+
+const char *chez_scintilla_receive_string(void *handle, unsigned int msg,
+                                          unsigned long wparam) {
+    long len = (long)scintilla_send_message((Scintilla *)handle, msg,
+                                            (uptr_t)wparam, (sptr_t)NULL);
+    if (len <= 0) {
+        recv_buf[0] = '\0';
+        return recv_buf;
+    }
+    if (len >= RECV_BUF_SIZE) len = RECV_BUF_SIZE - 1;
+    scintilla_send_message((Scintilla *)handle, msg,
+                           (uptr_t)wparam, (sptr_t)recv_buf);
+    recv_buf[len] = '\0';
+    return recv_buf;
+}
+
+/* Set property: wparam = key string, lparam = value string */
+long chez_scintilla_set_property(void *handle, unsigned int msg,
+                                 const char *key, const char *value) {
+    return (long)scintilla_send_message((Scintilla *)handle, msg,
+                                        (uptr_t)key, (sptr_t)value);
+}
+
+/* ================================================================
+   Input
+   ================================================================ */
+void chez_scintilla_send_key(void *handle, int key,
+                              int shift, int ctrl, int alt) {
+    scintilla_send_key((Scintilla *)handle, key, shift, ctrl, alt);
+}
+
+int chez_scintilla_send_mouse(void *handle, int event, int button,
+                               int y, int x,
+                               int shift, int ctrl, int alt) {
+    return scintilla_send_mouse((Scintilla *)handle, event, button,
+                                y, x, shift, ctrl, alt);
+}
+
+/* ================================================================
+   Display
+   ================================================================ */
+void chez_scintilla_refresh(void *handle) {
+    scintilla_refresh((Scintilla *)handle);
+}
+
+void chez_scintilla_resize(void *handle, int width, int height) {
+    scintilla_resize((Scintilla *)handle, width, height);
+}
+
+void chez_scintilla_move(void *handle, int x, int y) {
+    scintilla_move((Scintilla *)handle, x, y);
+}
+
+/* ================================================================
+   Clipboard
+   ================================================================ */
+const char *chez_scintilla_get_clipboard(void *handle) {
+    int len = 0;
+    char *buf = scintilla_get_clipboard((Scintilla *)handle, &len);
+    if (!buf) return "";
+    /* Copy into static buffer so Chez can read it, then free */
+    if (len >= RECV_BUF_SIZE) len = RECV_BUF_SIZE - 1;
+    memcpy(recv_buf, buf, len);
+    recv_buf[len] = '\0';
+    free(buf);
+    return recv_buf;
+}
+
+/* ================================================================
+   Lexilla integration
+   ================================================================ */
+#define SCI_SETILEXER_MSG 4033
+
+void chez_scintilla_set_lexer_language(void *handle, const char *lang) {
+    ILexer5 *lexer = CreateLexer(lang);
+    scintilla_send_message((Scintilla *)handle, SCI_SETILEXER_MSG,
+                           0, (sptr_t)lexer);
+}
+
+/* ================================================================
+   Notification drain
+   ================================================================ */
+int chez_scintilla_drain_one(void *handle) {
+    instance_node_t *inst = find_instance((Scintilla *)handle);
+    if (!inst) return 0;
+    if (inst->ring_head == inst->ring_tail) return 0;
+
+    current_scn = inst->ring[inst->ring_tail];
+    inst->ring_tail = (inst->ring_tail + 1) % NOTIFY_RING_SIZE;
+    return 1;
+}
+
+int    chez_scn_code(void)              { return current_scn.code; }
+long   chez_scn_position(void)          { return current_scn.position; }
+int    chez_scn_ch(void)                { return current_scn.ch; }
+int    chez_scn_modifiers(void)         { return current_scn.modifiers; }
+int    chez_scn_modification_type(void) { return current_scn.modification_type; }
+const char *chez_scn_text(void)         { return current_scn.text; }
+long   chez_scn_length(void)            { return current_scn.length; }
+long   chez_scn_lines_added(void)       { return current_scn.lines_added; }
+int    chez_scn_message(void)           { return current_scn.message; }
+long   chez_scn_line(void)              { return current_scn.line; }
+int    chez_scn_fold_level_now(void)    { return current_scn.fold_level_now; }
+int    chez_scn_fold_level_prev(void)   { return current_scn.fold_level_prev; }
+int    chez_scn_margin(void)            { return current_scn.margin; }
+int    chez_scn_list_type(void)         { return current_scn.list_type; }
+int    chez_scn_x(void)                 { return current_scn.x; }
+int    chez_scn_y(void)                 { return current_scn.y; }
+int    chez_scn_token(void)             { return current_scn.token; }
+int    chez_scn_updated(void)           { return current_scn.updated; }
+
+/* ================================================================
+   Termbox wrappers
+   ================================================================ */
+static struct tb_event last_tb_event;
+
+int  chez_tb_init(void)           { return tb_init(); }
+void chez_tb_shutdown(void)       { tb_shutdown(); }
+int  chez_tb_width(void)          { return tb_width(); }
+int  chez_tb_height(void)         { return tb_height(); }
+void chez_tb_clear(void)          { tb_clear(); }
+void chez_tb_present(void)        { tb_present(); }
+void chez_tb_set_cursor(int x, int y) { tb_set_cursor(x, y); }
+
+int chez_tb_poll_event(void) {
+    return tb_poll_event(&last_tb_event);
+}
+
+int chez_tb_peek_event(int timeout_ms) {
+    return tb_peek_event(&last_tb_event, timeout_ms);
+}
+
+int          chez_tb_event_type(void) { return last_tb_event.type; }
+int          chez_tb_event_mod(void)  { return last_tb_event.mod; }
+int          chez_tb_event_key(void)  { return last_tb_event.key; }
+unsigned int chez_tb_event_ch(void)   { return last_tb_event.ch; }
+int          chez_tb_event_w(void)    { return last_tb_event.w; }
+int          chez_tb_event_h(void)    { return last_tb_event.h; }
+int          chez_tb_event_x(void)    { return last_tb_event.x; }
+int          chez_tb_event_y(void)    { return last_tb_event.y; }
+
+/* ================================================================
+   Termbox extended wrappers
+   ================================================================ */
+void chez_tb_change_cell(int x, int y, uint32_t ch, uint32_t fg, uint32_t bg) {
+    tb_change_cell(x, y, ch, fg, bg);
+}
+
+void chez_tb_set_clear_attributes(uint32_t fg, uint32_t bg) {
+    tb_set_clear_attributes(fg, bg);
+}
+
+int chez_tb_select_input_mode(int mode) {
+    return tb_select_input_mode(mode);
+}
+
+int chez_tb_select_output_mode(int mode) {
+    return tb_select_output_mode(mode);
+}
+
+void chez_tb_print_string(int x, int y, uint32_t fg, uint32_t bg, const char *str) {
+    uint32_t ch;
+    while (*str) {
+        int len = utf8_char_to_unicode(&ch, str);
+        if (len <= 0) break;
+        tb_change_cell(x, y, ch, fg, bg);
+        x++;
+        str += len;
+    }
+}
diff --git a/src/chez-scintilla/autocomplete.sls b/src/chez-scintilla/autocomplete.sls
new file mode 100644
index 0000000..fd8b531
--- /dev/null
+++ b/src/chez-scintilla/autocomplete.sls
@@ -0,0 +1,180 @@
+;;; Autocomplete and calltips for Scintilla
+;;; Chez Scheme port of gerbil-scintilla/autocomplete.ss
+;;;
+;;; Provides functions for autocompletion lists and call tips.
+
+(library (chez-scintilla autocomplete)
+  (export
+    ;; Autocomplete
+    editor-autocomplete-show
+    editor-autocomplete-cancel
+    editor-autocomplete-active?
+    editor-autocomplete-pos-start
+    editor-autocomplete-complete
+    editor-autocomplete-select
+    editor-autocomplete-get-current
+    editor-autocomplete-stops
+
+    ;; Autocomplete settings
+    editor-autocomplete-set-separator
+    editor-autocomplete-get-separator
+    editor-autocomplete-set-ignore-case
+    editor-autocomplete-get-ignore-case?
+    editor-autocomplete-set-choose-single
+    editor-autocomplete-get-choose-single?
+    editor-autocomplete-set-auto-hide
+    editor-autocomplete-get-auto-hide?
+    editor-autocomplete-set-drop-rest-of-word
+    editor-autocomplete-get-drop-rest-of-word?
+    editor-autocomplete-set-cancel-at-start
+    editor-autocomplete-get-cancel-at-start?
+    editor-autocomplete-set-order
+    editor-autocomplete-get-order
+    editor-autocomplete-set-max-width
+    editor-autocomplete-get-max-width
+    editor-autocomplete-set-max-height
+    editor-autocomplete-get-max-height
+    editor-autocomplete-set-fill-ups
+
+    ;; Calltips
+    editor-calltip-show
+    editor-calltip-cancel
+    editor-calltip-active?
+    editor-calltip-pos-start
+    editor-calltip-set-highlight
+    editor-calltip-set-background
+    editor-calltip-set-foreground
+    editor-calltip-set-foreground-highlight)
+
+  (import (chezscheme)
+          (chez-scintilla constants)
+          (chez-scintilla scintilla))
+
+  ;; ====================================================================
+  ;; Autocomplete operations
+  ;; ====================================================================
+
+  (define (editor-autocomplete-show editor len-entered items)
+    (send-message/string editor SCI_AUTOCSHOW items))
+
+  (define (editor-autocomplete-cancel editor)
+    (send-message editor SCI_AUTOCCANCEL))
+
+  (define (editor-autocomplete-active? editor)
+    (not (zero? (send-message editor SCI_AUTOCACTIVE))))
+
+  (define (editor-autocomplete-pos-start editor)
+    (send-message editor SCI_AUTOCPOSSTART))
+
+  (define (editor-autocomplete-complete editor)
+    (send-message editor SCI_AUTOCCOMPLETE))
+
+  (define (editor-autocomplete-select editor text)
+    (send-message/string editor SCI_AUTOCSELECT text))
+
+  (define (editor-autocomplete-get-current editor)
+    (send-message editor SCI_AUTOCGETCURRENT))
+
+  (define (editor-autocomplete-stops editor chars)
+    (send-message/string editor SCI_AUTOCSTOPS chars))
+
+  ;; ====================================================================
+  ;; Autocomplete settings
+  ;; ====================================================================
+
+  (define (editor-autocomplete-set-separator editor char-code)
+    (send-message editor SCI_AUTOCSETSEPARATOR char-code))
+
+  (define (editor-autocomplete-get-separator editor)
+    (send-message editor SCI_AUTOCGETSEPARATOR))
+
+  (define (editor-autocomplete-set-ignore-case editor ignore?)
+    (send-message editor SCI_AUTOCSETIGNORECASE (if ignore? 1 0)))
+
+  (define (editor-autocomplete-get-ignore-case? editor)
+    (not (zero? (send-message editor SCI_AUTOCGETIGNORECASE))))
+
+  (define (editor-autocomplete-set-choose-single editor choose?)
+    (send-message editor SCI_AUTOCSETCHOOSESINGLE (if choose? 1 0)))
+
+  (define (editor-autocomplete-get-choose-single? editor)
+    (not (zero? (send-message editor SCI_AUTOCGETCHOOSESINGLE))))
+
+  (define (editor-autocomplete-set-auto-hide editor hide?)
+    (send-message editor SCI_AUTOCSETAUTOHIDE (if hide? 1 0)))
+
+  (define (editor-autocomplete-get-auto-hide? editor)
+    (not (zero? (send-message editor SCI_AUTOCGETAUTOHIDE))))
+
+  (define (editor-autocomplete-set-drop-rest-of-word editor drop?)
+    (send-message editor SCI_AUTOCSETDROPRESTOFWORD (if drop? 1 0)))
+
+  (define (editor-autocomplete-get-drop-rest-of-word? editor)
+    (not (zero? (send-message editor SCI_AUTOCGETDROPRESTOFWORD))))
+
+  (define (editor-autocomplete-set-cancel-at-start editor cancel?)
+    (send-message editor SCI_AUTOCSETCANCELATSTART (if cancel? 1 0)))
+
+  (define (editor-autocomplete-get-cancel-at-start? editor)
+    (not (zero? (send-message editor SCI_AUTOCGETCANCELATSTART))))
+
+  (define (editor-autocomplete-set-order editor order)
+    (send-message editor SCI_AUTOCSETORDER
+                  (case order
+                    ((presorted) SC_ORDER_PRESORTED)
+                    ((perform-sort) SC_ORDER_PERFORMSORT)
+                    ((custom) SC_ORDER_CUSTOM)
+                    (else SC_ORDER_PRESORTED))))
+
+  (define (editor-autocomplete-get-order editor)
+    (let ((mode (send-message editor SCI_AUTOCGETORDER)))
+      (cond
+        ((= mode SC_ORDER_PRESORTED) 'presorted)
+        ((= mode SC_ORDER_PERFORMSORT) 'perform-sort)
+        ((= mode SC_ORDER_CUSTOM) 'custom)
+        (else 'presorted))))
+
+  (define (editor-autocomplete-set-max-width editor chars)
+    (send-message editor SCI_AUTOCSETMAXWIDTH chars))
+
+  (define (editor-autocomplete-get-max-width editor)
+    (send-message editor SCI_AUTOCGETMAXWIDTH))
+
+  (define (editor-autocomplete-set-max-height editor rows)
+    (send-message editor SCI_AUTOCSETMAXHEIGHT rows))
+
+  (define (editor-autocomplete-get-max-height editor)
+    (send-message editor SCI_AUTOCGETMAXHEIGHT))
+
+  (define (editor-autocomplete-set-fill-ups editor chars)
+    (send-message/string editor SCI_AUTOCSETFILLUPS chars))
+
+  ;; ====================================================================
+  ;; Calltips
+  ;; ====================================================================
+
+  (define (editor-calltip-show editor pos text)
+    (send-message/string editor SCI_CALLTIPSHOW text))
+
+  (define (editor-calltip-cancel editor)
+    (send-message editor SCI_CALLTIPCANCEL))
+
+  (define (editor-calltip-active? editor)
+    (not (zero? (send-message editor SCI_CALLTIPACTIVE))))
+
+  (define (editor-calltip-pos-start editor)
+    (send-message editor SCI_CALLTIPPOSSTART))
+
+  (define (editor-calltip-set-highlight editor highlight-start highlight-end)
+    (send-message editor SCI_CALLTIPSETHLT highlight-start highlight-end))
+
+  (define (editor-calltip-set-background editor color)
+    (send-message editor SCI_CALLTIPSETBACK color))
+
+  (define (editor-calltip-set-foreground editor color)
+    (send-message editor SCI_CALLTIPSETFORE color))
+
+  (define (editor-calltip-set-foreground-highlight editor color)
+    (send-message editor SCI_CALLTIPSETFOREHLT color))
+
+) ;; end library
diff --git a/src/chez-scintilla/constants.sls b/src/chez-scintilla/constants.sls
new file mode 100644
index 0000000..4c38c32
--- /dev/null
+++ b/src/chez-scintilla/constants.sls
@@ -0,0 +1,837 @@
+;;; Scintilla message and notification constants
+;;; Chez Scheme port of gerbil-scintilla/constants.ss
+
+(library (chez-scintilla constants)
+  (export
+    ;; Text operations
+    SCI_SETTEXT SCI_GETTEXT SCI_GETTEXTLENGTH SCI_GETCHARACTERPOINTER
+    SCI_ADDTEXT SCI_ADDSTYLEDTEXT SCI_INSERTTEXT SCI_CHANGEINSERTION
+    SCI_CLEARALL SCI_DELETERANGE SCI_CLEARDOCUMENTSTYLE SCI_APPENDTEXT
+    SCI_REPLACESEL SCI_TAB SCI_BACKTAB
+    ;; Selection and navigation
+    SCI_GETLENGTH SCI_GETCHARAT SCI_GETCURRENTPOS SCI_GETANCHOR
+    SCI_SETANCHOR SCI_SETCURRENTPOS SCI_SETSEL SCI_GETSELTEXT
+    SCI_SELECTALL SCI_GOTOPOS SCI_GOTOLINE
+    SCI_GETSELECTIONSTART SCI_GETSELECTIONEND
+    SCI_SETSELECTIONSTART SCI_SETSELECTIONEND SCI_GETSELECTIONEMPTY
+    SCI_SETMOVEEXTENDSSELECTION SCI_GETMOVEEXTENDSSELECTION
+    ;; Line operations
+    SCI_GETLINE SCI_GETLINECOUNT SCI_LINEFROMPOSITION SCI_POSITIONFROMLINE
+    SCI_GETLINEENDPOSITION SCI_LINESONSCREEN SCI_LINELENGTH
+    SCI_GETCOLUMN SCI_FINDCOLUMN SCI_POSITIONFROMPOINT
+    SCI_POSITIONFROMPOINTCLOSE SCI_POINTXFROMPOSITION SCI_POINTYFROMPOSITION
+    ;; Styling
+    SCI_GETSTYLEAT SCI_STYLECLEARALL SCI_STYLESETFORE SCI_STYLESETBACK
+    SCI_STYLESETBOLD SCI_STYLESETITALIC SCI_STYLESETSIZE SCI_STYLESETFONT
+    SCI_STYLESETEOLFILLED SCI_STYLERESETDEFAULT SCI_STYLESETUNDERLINE
+    SCI_STYLEGETFORE SCI_STYLEGETBACK SCI_STYLEGETBOLD SCI_STYLEGETITALIC
+    SCI_STYLEGETSIZE SCI_STYLEGETFONT SCI_STYLEGETUNDERLINE
+    SCI_STYLESETCASE SCI_STYLEGETCASE SCI_STYLESETCHARACTERSET
+    SCI_STYLESETVISIBLE SCI_STYLEGETVISIBLE SCI_STYLESETCHANGEABLE
+    SCI_STYLEGETCHANGEABLE SCI_STYLESETHOTSPOT SCI_STYLEGETHOTSPOT
+    SCI_STYLESETWEIGHT SCI_STYLEGETWEIGHT
+    ;; Style numbers
+    STYLE_DEFAULT STYLE_LINENUMBER STYLE_BRACELIGHT STYLE_BRACEBAD
+    STYLE_CONTROLCHAR STYLE_INDENTGUIDE STYLE_CALLTIP
+    STYLE_FOLDDISPLAYTEXT STYLE_LASTPREDEFINED STYLE_MAX
+    ;; Font weight
+    SC_WEIGHT_NORMAL SC_WEIGHT_SEMIBOLD SC_WEIGHT_BOLD
+    ;; Case mapping
+    SC_CASE_MIXED SC_CASE_UPPER SC_CASE_LOWER SC_CASE_CAMEL
+    ;; Lexer
+    SCI_SETLEXER SCI_GETLEXER SCI_SETLEXERLANGUAGE SCI_GETLEXERLANGUAGE
+    SCI_COLOURISE SCI_SETPROPERTY SCI_GETPROPERTY SCI_SETKEYWORDS
+    SCI_DESCRIBEKEYWORDSETS SCI_DESCRIBEPROPERTY SCI_GETPROPERTYEXPANDED
+    SCI_GETPROPERTYINT SCI_PRIVATELEXERCALL SCI_SETILEXER
+    SCI_LOADLEXERLIBRARY SCI_CREATELOADER
+    ;; Lexer IDs
+    SCLEX_CONTAINER SCLEX_NULL SCLEX_PYTHON SCLEX_CPP SCLEX_HTML
+    SCLEX_XML SCLEX_PERL SCLEX_SQL SCLEX_VB SCLEX_PROPERTIES
+    SCLEX_ERRORLIST SCLEX_MAKEFILE SCLEX_BATCH SCLEX_XCODE SCLEX_LATEX
+    SCLEX_LUA SCLEX_DIFF SCLEX_CONF SCLEX_PASCAL SCLEX_AVE SCLEX_ADA
+    SCLEX_LISP SCLEX_RUBY SCLEX_EIFFEL SCLEX_EIFFELKW SCLEX_TCL
+    SCLEX_NNCRONTAB SCLEX_BULLANT SCLEX_VBSCRIPT SCLEX_BAAN
+    SCLEX_MATLAB SCLEX_SCRIPTOL SCLEX_ASM SCLEX_CPPNOCASE
+    SCLEX_FORTRAN SCLEX_F77 SCLEX_CSS SCLEX_POV SCLEX_LOUT
+    SCLEX_ESCRIPT SCLEX_PS SCLEX_NSIS SCLEX_MMIXAL SCLEX_CLW
+    SCLEX_CLWNOCASE SCLEX_LOT SCLEX_YAML SCLEX_TEX SCLEX_METAPOST
+    SCLEX_POWERBASIC SCLEX_FORTH SCLEX_ERLANG SCLEX_OCTAVE SCLEX_MSSQL
+    SCLEX_VERILOG SCLEX_KIX SCLEX_GUI4CLI SCLEX_SPECMAN SCLEX_AU3
+    SCLEX_APDL SCLEX_BASH SCLEX_ASN1 SCLEX_VHDL SCLEX_CAML
+    SCLEX_BLITZBASIC SCLEX_PUREBASIC SCLEX_HASKELL SCLEX_PHPSCRIPT
+    SCLEX_TADS3 SCLEX_REBOL SCLEX_SMALLTALK SCLEX_FLAGSHIP SCLEX_CSOUND
+    SCLEX_FREEBASIC SCLEX_INNOSETUP SCLEX_OPAL SCLEX_SPICE SCLEX_D
+    SCLEX_CMAKE SCLEX_GAP SCLEX_PLM SCLEX_PROGRESS SCLEX_ABAQUS
+    SCLEX_ASYMPTOTE SCLEX_R SCLEX_MAGIK SCLEX_POWERSHELL SCLEX_MYSQL
+    SCLEX_PO SCLEX_TAL SCLEX_COBOL SCLEX_TACL SCLEX_SORCUS
+    SCLEX_POWERPRO SCLEX_NIMROD SCLEX_SML SCLEX_MARKDOWN SCLEX_TXT2TAGS
+    SCLEX_A68K SCLEX_MODULA SCLEX_COFFEESCRIPT SCLEX_TCMD SCLEX_AVS
+    SCLEX_ECL SCLEX_OSCRIPT SCLEX_VISUALPROLOG SCLEX_LITERATEHASKELL
+    SCLEX_STTXT SCLEX_KVIRC SCLEX_RUST SCLEX_DMAP SCLEX_AS SCLEX_DMIS
+    SCLEX_REGISTRY SCLEX_BIBTEX SCLEX_SREC SCLEX_IHEX SCLEX_TEHEX
+    SCLEX_JSON SCLEX_EDIFACT SCLEX_INDENT SCLEX_MAXIMA SCLEX_STATA
+    SCLEX_SAS SCLEX_NIM SCLEX_CIL SCLEX_X12 SCLEX_DATAFLEX
+    SCLEX_HOLLYWOOD SCLEX_RAKU SCLEX_FSHARP SCLEX_JULIA SCLEX_ASCIIDOC
+    SCLEX_GDSCRIPT SCLEX_SCHEME
+    ;; Undo/Redo
+    SCI_UNDO SCI_CANUNDO SCI_EMPTYUNDOBUFFER SCI_REDO SCI_CANREDO
+    SCI_SETUNDOCOLLECTION SCI_GETUNDOCOLLECTION
+    SCI_BEGINUNDOACTION SCI_ENDUNDOACTION SCI_ADDUNDOACTION
+    ;; Search and replace
+    SCI_SEARCHANCHOR SCI_SEARCHNEXT SCI_SEARCHPREV SCI_FINDTEXT
+    SCI_SEARCHINTARGET SCI_REPLACETARGET SCI_REPLACETARGETRE
+    SCI_SETTARGETSTART SCI_GETTARGETSTART SCI_SETTARGETEND SCI_GETTARGETEND
+    SCI_TARGETFROMSELECTION SCI_TARGETWHOLEDOCUMENT
+    SCI_SETSEARCHFLAGS SCI_GETSEARCHFLAGS SCI_GETTARGETTEXT SCI_SETTARGETRANGE
+    SCFIND_NONE SCFIND_WHOLEWORD SCFIND_MATCHCASE SCFIND_WORDSTART
+    SCFIND_REGEXP SCFIND_POSIX SCFIND_CXX11REGEX
+    ;; Markers
+    SCI_MARKERDEFINE SCI_MARKERSETFORE SCI_MARKERSETBACK
+    SCI_MARKERSETBACKSELECTED SCI_MARKERENABLEHIGHLIGHT
+    SCI_MARKERADD SCI_MARKERDELETE SCI_MARKERDELETEALL
+    SCI_MARKERGET SCI_MARKERNEXT SCI_MARKERPREVIOUS
+    SCI_MARKERDEFINEPIXMAP SCI_MARKERADDSET SCI_MARKERSETALPHA
+    SCI_MARKERSETLAYER SCI_MARKERGETLAYER
+    SC_MARK_CIRCLE SC_MARK_ROUNDRECT SC_MARK_ARROW SC_MARK_SMALLRECT
+    SC_MARK_SHORTARROW SC_MARK_EMPTY SC_MARK_ARROWDOWN SC_MARK_MINUS
+    SC_MARK_PLUS SC_MARK_VLINE SC_MARK_LCORNER SC_MARK_TCORNER
+    SC_MARK_BOXPLUS SC_MARK_BOXPLUSCONNECTED SC_MARK_BOXMINUS
+    SC_MARK_BOXMINUSCONNECTED SC_MARK_LCORNERCURVE SC_MARK_TCORNERCURVE
+    SC_MARK_CIRCLEPLUS SC_MARK_CIRCLEPLUSCONNECTED
+    SC_MARK_CIRCLEMINUS SC_MARK_CIRCLEMINUSCONNECTED
+    SC_MARK_BACKGROUND SC_MARK_DOTDOTDOT SC_MARK_ARROWS SC_MARK_PIXMAP
+    SC_MARK_FULLRECT SC_MARK_LEFTRECT SC_MARK_AVAILABLE
+    SC_MARK_UNDERLINE SC_MARK_RGBAIMAGE SC_MARK_BOOKMARK
+    SC_MARK_VERTICALBOOKMARK
+    SC_MARKNUM_FOLDEREND SC_MARKNUM_FOLDEROPENMID SC_MARKNUM_FOLDERMIDTAIL
+    SC_MARKNUM_FOLDERTAIL SC_MARKNUM_FOLDERSUB SC_MARKNUM_FOLDER
+    SC_MARKNUM_FOLDEROPEN SC_MASK_FOLDERS
+    ;; Folding
+    SCI_SETFOLDLEVEL SCI_GETFOLDLEVEL SCI_GETLASTCHILD SCI_GETFOLDPARENT
+    SCI_SHOWLINES SCI_HIDELINES SCI_GETLINEVISIBLE SCI_GETALLLINESVISIBLE
+    SCI_SETFOLDEXPANDED SCI_GETFOLDEXPANDED SCI_TOGGLEFOLD
+    SCI_TOGGLEFOLDSHOWTEXT SCI_FOLDLINE SCI_FOLDCHILDREN SCI_EXPANDCHILDREN
+    SCI_FOLDALL SCI_CONTRACTEDFOLDNEXT SCI_SETAUTOMATICFOLD
+    SCI_GETAUTOMATICFOLD SCI_SETFOLDFLAGS SCI_ENSUREVISIBLE
+    SCI_ENSUREVISIBLEENFORCEPOLICY SCI_SETFOLDMARGINCOLOUR
+    SCI_SETFOLDMARGINHICOLOUR
+    SC_FOLDLEVELBASE SC_FOLDLEVELWHITEFLAG SC_FOLDLEVELHEADERFLAG
+    SC_FOLDLEVELNUMBERMASK
+    SC_FOLDACTION_CONTRACT SC_FOLDACTION_EXPAND SC_FOLDACTION_TOGGLE
+    SC_FOLDACTION_CONTRACT_EVERY_LEVEL
+    SC_AUTOMATICFOLD_NONE SC_AUTOMATICFOLD_SHOW SC_AUTOMATICFOLD_CLICK
+    SC_AUTOMATICFOLD_CHANGE
+    ;; Edge
+    SCI_SETEDGEMODE SCI_GETEDGEMODE SCI_SETEDGECOLUMN SCI_GETEDGECOLUMN
+    SCI_SETEDGECOLOUR SCI_GETEDGECOLOUR
+    EDGE_NONE EDGE_LINE EDGE_BACKGROUND EDGE_MULTILINE
+    ;; Scrolling
+    SCI_SETFIRSTVISIBLELINE SCI_GETFIRSTVISIBLELINE SCI_LINESCROLL
+    SCI_SCROLLCARET SCI_SCROLLRANGE SCI_SETXOFFSET SCI_GETXOFFSET
+    SCI_CHOOSECARETX SCI_SETXCARETPOLICY SCI_SETYCARETPOLICY
+    SCI_SETVISIBLEPOLICY SCI_SETHSCROLLBAR SCI_GETHSCROLLBAR
+    SCI_SETVSCROLLBAR SCI_GETVSCROLLBAR
+    CARET_SLOP CARET_STRICT CARET_JUMPS CARET_EVEN
+    ;; Indicators
+    SCI_INDICSETSTYLE SCI_INDICGETSTYLE SCI_INDICSETFORE SCI_INDICGETFORE
+    SCI_INDICSETUNDER SCI_INDICGETUNDER SCI_INDICSETHOVERSTYLE
+    SCI_INDICGETHOVERSTYLE SCI_INDICSETHOVERFORE SCI_INDICGETHOVERFORE
+    SCI_INDICSETFLAGS SCI_INDICGETFLAGS SCI_SETINDICATORCURRENT
+    SCI_GETINDICATORCURRENT SCI_SETINDICATORVALUE SCI_GETINDICATORVALUE
+    SCI_INDICATORFILLRANGE SCI_INDICATORCLEARRANGE SCI_INDICATORALLONFOR
+    SCI_INDICATORVALUEAT SCI_INDICATORSTART SCI_INDICATOREND
+    INDIC_PLAIN INDIC_SQUIGGLE INDIC_TT INDIC_DIAGONAL INDIC_STRIKE
+    INDIC_HIDDEN INDIC_BOX INDIC_ROUNDBOX INDIC_STRAIGHTBOX INDIC_DASH
+    INDIC_DOTS INDIC_SQUIGGLELOW INDIC_DOTBOX INDIC_SQUIGGLEPIXMAP
+    INDIC_COMPOSITIONTHICK INDIC_COMPOSITIONTHIN INDIC_FULLBOX
+    INDIC_TEXTFORE INDIC_POINT INDIC_POINTCHARACTER INDIC_GRADIENT
+    INDIC_GRADIENTCENTRE
+    ;; Autocomplete
+    SCI_AUTOCSHOW SCI_AUTOCCANCEL SCI_AUTOCACTIVE SCI_AUTOCPOSSTART
+    SCI_AUTOCCOMPLETE SCI_AUTOCSTOPS SCI_AUTOCSETSEPARATOR SCI_AUTOCGETSEPARATOR
+    SCI_AUTOCSELECT SCI_AUTOCGETCURRENT SCI_AUTOCGETCURRENTTEXT
+    SCI_AUTOCSETCANCELATSTART SCI_AUTOCGETCANCELATSTART
+    SCI_AUTOCSETFILLUPS SCI_AUTOCSETCHOOSESINGLE SCI_AUTOCGETCHOOSESINGLE
+    SCI_AUTOCSETIGNORECASE SCI_AUTOCGETIGNORECASE
+    SCI_AUTOCSETCASEINSENSITIVEBEHAVIOUR SCI_AUTOCGETCASEINSENSITIVEBEHAVIOUR
+    SCI_AUTOCSETMULTI SCI_AUTOCGETMULTI SCI_AUTOCSETORDER SCI_AUTOCGETORDER
+    SCI_USERLISTSHOW SCI_AUTOCSETAUTOHIDE SCI_AUTOCGETAUTOHIDE
+    SCI_AUTOCSETOPTIONS SCI_AUTOCGETOPTIONS
+    SCI_AUTOCSETDROPRESTOFWORD SCI_AUTOCGETDROPRESTOFWORD
+    SCI_REGISTERIMAGE SCI_CLEARREGISTEREDIMAGES SCI_AUTOCGETTYPESEPARATOR
+    SCI_AUTOCSETTYPESEPARATOR SCI_AUTOCSETMAXWIDTH SCI_AUTOCGETMAXWIDTH
+    SCI_AUTOCSETMAXHEIGHT SCI_AUTOCGETMAXHEIGHT
+    SC_ORDER_PRESORTED SC_ORDER_PERFORMSORT SC_ORDER_CUSTOM
+    SC_CASEINSENSITIVEBEHAVIOUR_RESPECTCASE SC_CASEINSENSITIVEBEHAVIOUR_IGNORECASE
+    SC_MULTIAUTOC_ONCE SC_MULTIAUTOC_EACH
+    ;; Calltips
+    SCI_CALLTIPSHOW SCI_CALLTIPCANCEL SCI_CALLTIPACTIVE SCI_CALLTIPPOSSTART
+    SCI_CALLTIPSETPOSSTART SCI_CALLTIPSETHLT SCI_CALLTIPSETBACK
+    SCI_CALLTIPSETFORE SCI_CALLTIPSETFOREHLT SCI_CALLTIPUSESTYLE
+    SCI_CALLTIPSETPOSITION
+    ;; Margins
+    SCI_SETMARGINTYPEN SCI_GETMARGINTYPEN SCI_SETMARGINWIDTHN
+    SCI_GETMARGINWIDTHN SCI_SETMARGINMASKN SCI_GETMARGINMASKN
+    SCI_SETMARGINSENSITIVEN SCI_GETMARGINSENSITIVEN
+    SCI_SETMARGINCURSORN SCI_GETMARGINCURSORN
+    SCI_SETMARGINBACKN SCI_GETMARGINBACKN SCI_SETMARGINS SCI_GETMARGINS
+    SCI_MARGINSETTEXT SCI_MARGINGETTEXT SCI_MARGINSETSTYLE
+    SCI_MARGINGETSTYLE SCI_MARGINSETSTYLES SCI_MARGINGETSTYLES
+    SCI_MARGINTEXTCLEARALL SCI_MARGINSETSTYLEOFFSET SCI_MARGINGETSTYLEOFFSET
+    SCI_SETMARGINOPTIONS SCI_GETMARGINOPTIONS
+    SC_MARGIN_SYMBOL SC_MARGIN_NUMBER SC_MARGIN_BACK SC_MARGIN_FORE
+    SC_MARGIN_TEXT SC_MARGIN_RTEXT SC_MARGIN_COLOUR
+    ;; Brace matching
+    SCI_BRACEHIGHLIGHT SCI_BRACEHIGHLIGHTINDICATOR SCI_BRACEBADLIGHT
+    SCI_BRACEBADLIGHTINDICATOR SCI_BRACEMATCH SCI_BRACEMATCHNEXT
+    ;; Tab and indentation
+    SCI_SETTABWIDTH SCI_GETTABWIDTH SCI_SETTABMINIMUMWIDTH SCI_GETTABMINIMUMWIDTH
+    SCI_CLEARTABSTOPS SCI_ADDTABSTOP SCI_GETNEXTTABSTOP
+    SCI_SETUSETABS SCI_GETUSETABS SCI_SETINDENT SCI_GETINDENT
+    SCI_SETTABINDENTS SCI_GETTABINDENTS SCI_SETBACKSPACEUNINDENTS
+    SCI_GETBACKSPACEUNINDENTS SCI_SETLINEINDENTATION SCI_GETLINEINDENTATION
+    SCI_GETLINEINDENTPOSITION SCI_SETINDENTATIONGUIDES SCI_GETINDENTATIONGUIDES
+    SCI_SETHIGHLIGHTGUIDE SCI_GETHIGHLIGHTGUIDE
+    SC_IV_NONE SC_IV_REAL SC_IV_LOOKFORWARD SC_IV_LOOKBOTH
+    ;; EOL
+    SCI_SETEOLMODE SCI_GETEOLMODE SCI_CONVERTEOLS SCI_SETVIEWEOL SCI_GETVIEWEOL
+    SC_EOL_CRLF SC_EOL_CR SC_EOL_LF
+    ;; Whitespace
+    SCI_SETVIEWWS SCI_GETVIEWWS SCI_SETWHITESPACEFORE SCI_SETWHITESPACEBACK
+    SCI_SETWHITESPACESIZE SCI_GETWHITESPACESIZE
+    SCI_SETEXTRAASCENT SCI_GETEXTRAASCENT SCI_SETEXTRADESCENT SCI_GETEXTRADESCENT
+    SCWS_INVISIBLE SCWS_VISIBLEALWAYS SCWS_VISIBLEAFTERINDENT
+    SCWS_VISIBLEONLYININDENT
+    ;; Cursor
+    SCI_SETCURSOR SCI_GETCURSOR
+    SC_CURSORNORMAL SC_CURSORARROW SC_CURSORWAIT SC_CURSORREVERSEARROW
+    ;; Caret
+    SCI_SETCARETSTYLE SCI_GETCARETSTYLE SCI_SETCARETFORE SCI_GETCARETFORE
+    SCI_SETCARETWIDTH SCI_GETCARETWIDTH SCI_SETCARETPERIOD SCI_GETCARETPERIOD
+    SCI_SETCARETLINEVISIBLE SCI_GETCARETLINEVISIBLE
+    SCI_SETCARETLINEBACK SCI_GETCARETLINEBACK
+    SCI_SETCARETLINEBACKALPHA SCI_GETCARETLINEBACKALPHA
+    SCI_SETCARETLINELAYER SCI_GETCARETLINELAYER
+    SCI_SETCARETLINEFRAME SCI_GETCARETLINEFRAME
+    SCI_SETCARETSTICKY SCI_GETCARETSTICKY SCI_TOGGLECARETSTICKY
+    CARETSTYLE_INVISIBLE CARETSTYLE_LINE CARETSTYLE_BLOCK
+    CARETSTYLE_OVERSTRIKE_BAR CARETSTYLE_OVERSTRIKE_BLOCK
+    CARETSTYLE_CURSES CARETSTYLE_INS_MASK
+    SC_CARETSTICKY_OFF SC_CARETSTICKY_ON SC_CARETSTICKY_WHITESPACE
+    ;; Selection
+    SCI_SETSELFORE SCI_SETSELBACK SCI_GETSELALPHA SCI_SETSELALPHA
+    SCI_GETSELECTIONLAYER SCI_SETSELECTIONLAYER
+    SCI_SETSELEOLFILLED SCI_GETSELEOLFILLED SCI_HIDESELECTION
+    SCI_GETSELECTIONS SCI_CLEARSELECTIONS SCI_SETSELECTION SCI_ADDSELECTION
+    SCI_DROPSELECTIONN SCI_SETMAINSELECTION SCI_GETMAINSELECTION
+    SCI_SETSELECTIONNCARET SCI_GETSELECTIONNCARET
+    SCI_SETSELECTIONNCARETVIRTUALSPACE SCI_GETSELECTIONNCARETVIRTUALSPACE
+    SCI_SETSELECTIONNANCHOR SCI_GETSELECTIONNANCHOR
+    SCI_SETSELECTIONNANCHORVIRTUALSPACE SCI_GETSELECTIONNANCHORVIRTUALSPACE
+    SCI_SETSELECTIONNSTART SCI_GETSELECTIONNSTART
+    SCI_SETSELECTIONNEND SCI_GETSELECTIONNEND
+    SCI_SETRECTANGULARSELECTIONCARET SCI_GETRECTANGULARSELECTIONCARET
+    SCI_SETRECTANGULARSELECTIONCARETVIRTUALSPACE
+    SCI_GETRECTANGULARSELECTIONCARETVIRTUALSPACE
+    SCI_SETRECTANGULARSELECTIONANCHOR SCI_GETRECTANGULARSELECTIONANCHOR
+    SCI_SETRECTANGULARSELECTIONANCHORVIRTUALSPACE
+    SCI_GETRECTANGULARSELECTIONANCHORVIRTUALSPACE
+    SCI_SETVIRTUALSPACEOPTIONS SCI_GETVIRTUALSPACEOPTIONS
+    SCI_SETRECTANGULARSELECTIONMODIFIER SCI_GETRECTANGULARSELECTIONMODIFIER
+    SCI_SETADDITIONALSELFORE SCI_SETADDITIONALSELBACK
+    SCI_SETADDITIONALSELALPHA SCI_GETADDITIONALSELALPHA
+    SCI_SETADDITIONALCARETFORE SCI_GETADDITIONALCARETFORE
+    SCI_SETADDITIONALCARETSBLINK SCI_GETADDITIONALCARETSBLINK
+    SCI_SETADDITIONALCARETSVISIBLE SCI_GETADDITIONALCARETSVISIBLE
+    SCI_ROTATESELECTION SCI_SWAPMAINANCHORCARET
+    SCI_MULTIPLESELECTADDNEXT SCI_MULTIPLESELECTADDEACH
+    SCI_SETSELECTIONMODE SCI_GETSELECTIONMODE SCI_GETSELECTIONISRECTANGLE
+    SC_SEL_STREAM SC_SEL_RECTANGLE SC_SEL_LINES SC_SEL_THIN
+    ;; Notifications
+    SCN_STYLENEEDED SCN_CHARADDED SCN_SAVEPOINTREACHED SCN_SAVEPOINTLEFT
+    SCN_MODIFYATTEMPTRO SCN_KEY SCN_DOUBLECLICK SCN_UPDATEUI SCN_MODIFIED
+    SCN_MACRORECORD SCN_MARGINCLICK SCN_NEEDSHOWN SCN_PAINTED
+    SCN_USERLISTSELECTION SCN_URIDROPPED SCN_DWELLSTART SCN_DWELLEND
+    SCN_ZOOM SCN_HOTSPOTCLICK SCN_HOTSPOTDOUBLECLICK SCN_CALLTIPCLICK
+    SCN_AUTOCSELECTION SCN_INDICATORCLICK SCN_INDICATORRELEASE
+    SCN_AUTOCCANCELLED SCN_AUTOCCHARDELETED SCN_HOTSPOTRELEASECLICK
+    SCN_FOCUSIN SCN_FOCUSOUT SCN_AUTOCCOMPLETED SCN_MARGINRIGHTCLICK
+    SCN_AUTOCSELECTIONCHANGE
+    ;; Modification flags
+    SC_MOD_INSERTTEXT SC_MOD_DELETETEXT SC_MOD_CHANGESTYLE SC_MOD_CHANGEFOLD
+    SC_PERFORMED_USER SC_PERFORMED_UNDO SC_PERFORMED_REDO
+    SC_MULTISTEPUNDOREDO SC_LASTSTEPINUNDOREDO SC_MOD_CHANGEMARKER
+    SC_MOD_BEFOREINSERT SC_MOD_BEFOREDELETE SC_MULTILINEUNDOREDO
+    SC_STARTACTION SC_MOD_CHANGEINDICATOR SC_MOD_CHANGELINESTATE
+    SC_MOD_CHANGEMARGIN SC_MOD_CHANGEANNOTATION SC_MOD_CONTAINER
+    SC_MOD_LEXERSTATE SC_MOD_INSERTCHECK SC_MOD_CHANGETABSTOPS
+    SC_MOD_CHANGEEOLANNOTATION SC_MODEVENTMASKALL
+    ;; Update flags
+    SC_UPDATE_CONTENT SC_UPDATE_SELECTION SC_UPDATE_V_SCROLL SC_UPDATE_H_SCROLL
+    ;; Line wrap
+    SCI_SETWRAPMODE SCI_GETWRAPMODE SCI_SETWRAPVISUALFLAGS SCI_GETWRAPVISUALFLAGS
+    SCI_SETWRAPVISUALFLAGSLOCATION SCI_GETWRAPVISUALFLAGSLOCATION
+    SCI_SETWRAPSTARTINDENT SCI_GETWRAPSTARTINDENT
+    SCI_SETWRAPINDENTMODE SCI_GETWRAPINDENTMODE
+    SCI_SETLAYOUTCACHE SCI_GETLAYOUTCACHE
+    SCI_SETPOSITIONCACHE SCI_GETPOSITIONCACHE
+    SC_WRAP_NONE SC_WRAP_WORD SC_WRAP_CHAR SC_WRAP_WHITESPACE
+    SC_WRAPVISUALFLAG_NONE SC_WRAPVISUALFLAG_END SC_WRAPVISUALFLAG_START
+    SC_WRAPVISUALFLAG_MARGIN
+    SC_WRAPINDENT_FIXED SC_WRAPINDENT_SAME SC_WRAPINDENT_INDENT
+    SC_WRAPINDENT_DEEPINDENT
+    ;; Zoom
+    SCI_ZOOMIN SCI_ZOOMOUT SCI_SETZOOM SCI_GETZOOM
+    ;; Clipboard
+    SCI_CUT SCI_COPY SCI_PASTE SCI_CLEAR SCI_CANPASTE
+    SCI_COPYRANGE SCI_COPYTEXT SCI_COPYALLOWLINE
+    SCI_SETPASTECONVERTENDINGS SCI_GETPASTECONVERTENDINGS
+    ;; Error handling
+    SCI_SETSTATUS SCI_GETSTATUS
+    SC_STATUS_OK SC_STATUS_FAILURE SC_STATUS_BADALLOC
+    SC_STATUS_WARN_START SC_STATUS_WARN_REGEX
+    ;; Document management
+    SCI_GETDOCPOINTER SCI_SETDOCPOINTER SCI_CREATEDOCUMENT
+    SCI_ADDREFDOCUMENT SCI_RELEASEDOCUMENT SCI_GETDOCUMENTOPTIONS
+    SC_DOCUMENTOPTION_DEFAULT SC_DOCUMENTOPTION_STYLES_NONE
+    SC_DOCUMENTOPTION_TEXT_LARGE
+    ;; Printing
+    SCI_FORMATRANGE SCI_SETPRINTMAGNIFICATION SCI_GETPRINTMAGNIFICATION
+    SCI_SETPRINTCOLOURMODE SCI_GETPRINTCOLOURMODE
+    SCI_SETPRINTWRAPMODE SCI_GETPRINTWRAPMODE
+    SC_PRINT_NORMAL SC_PRINT_INVERTLIGHT SC_PRINT_BLACKONWHITE
+    SC_PRINT_COLOURONWHITE SC_PRINT_COLOURONWHITEDEFAULTBG SC_PRINT_SCREENCOLOURS
+    ;; Direct access
+    SCI_GETDIRECTFUNCTION SCI_GETDIRECTPOINTER SCI_GETDIRECTSTATUSFUNCTION
+    SCI_SETCHARACTERCATEGORYOPTIMIZATION SCI_GETCHARACTERCATEGORYOPTIMIZATION
+    ;; Virtual keys
+    SCK_DOWN SCK_UP SCK_LEFT SCK_RIGHT SCK_HOME SCK_END SCK_PRIOR SCK_NEXT
+    SCK_DELETE SCK_INSERT SCK_ESCAPE SCK_BACK SCK_TAB SCK_RETURN
+    SCK_ADD SCK_SUBTRACT SCK_DIVIDE SCK_WIN SCK_RWIN SCK_MENU
+    ;; Key modifiers
+    SCMOD_NORM SCMOD_SHIFT SCMOD_CTRL SCMOD_ALT SCMOD_SUPER SCMOD_META
+    ;; Read-only and modification
+    SCI_SETREADONLY SCI_GETREADONLY SCI_SETOVERTYPE SCI_GETOVERTYPE
+    SCI_SETSAVEPOINT SCI_GETMODIFY
+    ;; Word navigation
+    SCI_WORDSTARTPOSITION SCI_WORDENDPOSITION SCI_ISRANGEWORD
+    ;; Mouse dwell
+    SCI_SETMOUSEDWELLTIME SCI_GETMOUSEDWELLTIME
+    ;; Colors helper
+    rgb->scintilla scintilla->rgb
+    ;; Mouse event types
+    SCM_PRESS SCM_DRAG SCM_RELEASE)
+
+  (import (chezscheme))
+
+  ;; ---- Text operations ----
+  (define SCI_SETTEXT 2181)
+  (define SCI_GETTEXT 2182)
+  (define SCI_GETTEXTLENGTH 2183)
+  (define SCI_GETCHARACTERPOINTER 2520)
+  (define SCI_ADDTEXT 2001)
+  (define SCI_ADDSTYLEDTEXT 2002)
+  (define SCI_INSERTTEXT 2003)
+  (define SCI_CHANGEINSERTION 2672)
+  (define SCI_CLEARALL 2004)
+  (define SCI_DELETERANGE 2645)
+  (define SCI_CLEARDOCUMENTSTYLE 2005)
+  (define SCI_APPENDTEXT 2282)
+  (define SCI_REPLACESEL 2170)
+  (define SCI_TAB 2327)
+  (define SCI_BACKTAB 2328)
+
+  ;; ---- Selection and navigation ----
+  (define SCI_GETLENGTH 2006)
+  (define SCI_GETCHARAT 2007)
+  (define SCI_GETCURRENTPOS 2008)
+  (define SCI_GETANCHOR 2009)
+  (define SCI_SETANCHOR 2026)
+  (define SCI_SETCURRENTPOS 2141)
+  (define SCI_SETSEL 2160)
+  (define SCI_GETSELTEXT 2161)
+  (define SCI_SELECTALL 2013)
+  (define SCI_GOTOPOS 2025)
+  (define SCI_GOTOLINE 2024)
+  (define SCI_GETSELECTIONSTART 2143)
+  (define SCI_GETSELECTIONEND 2145)
+  (define SCI_SETSELECTIONSTART 2142)
+  (define SCI_SETSELECTIONEND 2144)
+  (define SCI_GETSELECTIONEMPTY 2650)
+  (define SCI_SETMOVEEXTENDSSELECTION 2719)
+  (define SCI_GETMOVEEXTENDSSELECTION 2720)
+
+  ;; ---- Line operations ----
+  (define SCI_GETLINE 2153)
+  (define SCI_GETLINECOUNT 2154)
+  (define SCI_LINEFROMPOSITION 2166)
+  (define SCI_POSITIONFROMLINE 2167)
+  (define SCI_GETLINEENDPOSITION 2136)
+  (define SCI_LINESONSCREEN 2370)
+  (define SCI_LINELENGTH 2350)
+  (define SCI_GETCOLUMN 2129)
+  (define SCI_FINDCOLUMN 2456)
+  (define SCI_POSITIONFROMPOINT 2022)
+  (define SCI_POSITIONFROMPOINTCLOSE 2023)
+  (define SCI_POINTXFROMPOSITION 2164)
+  (define SCI_POINTYFROMPOSITION 2165)
+
+  ;; ---- Styling ----
+  (define SCI_GETSTYLEAT 2010)
+  (define SCI_STYLECLEARALL 2050)
+  (define SCI_STYLESETFORE 2051)
+  (define SCI_STYLESETBACK 2052)
+  (define SCI_STYLESETBOLD 2053)
+  (define SCI_STYLESETITALIC 2054)
+  (define SCI_STYLESETSIZE 2055)
+  (define SCI_STYLESETFONT 2056)
+  (define SCI_STYLESETEOLFILLED 2057)
+  (define SCI_STYLERESETDEFAULT 2058)
+  (define SCI_STYLESETUNDERLINE 2059)
+  (define SCI_STYLEGETFORE 2481)
+  (define SCI_STYLEGETBACK 2482)
+  (define SCI_STYLEGETBOLD 2483)
+  (define SCI_STYLEGETITALIC 2484)
+  (define SCI_STYLEGETSIZE 2485)
+  (define SCI_STYLEGETFONT 2486)
+  (define SCI_STYLEGETUNDERLINE 2488)
+  (define SCI_STYLESETCASE 2060)
+  (define SCI_STYLEGETCASE 2489)
+  (define SCI_STYLESETCHARACTERSET 2066)
+  (define SCI_STYLESETVISIBLE 2074)