tex: buffer command to switch buffers - neatvi - [fork] simple vi-type editor with UTF-8 support (HTM) git clone git://src.adamsgaard.dk/neatvi (DIR) Log (DIR) Files (DIR) Refs (DIR) README --- (DIR) commit 6b277fa8365863fddf94654a739152959a10e3ee (DIR) parent 13b5534f46724cc6200c0aeb36800c5f3b33801e (HTM) Author: Conny Wagenius <cjw@voidptr.se> Date: Fri, 5 Feb 2021 11:12:13 +0330 ex: buffer command to switch buffers :b lists buffers and :b# selects a buffer. Diffstat: M ex.c | 64 +++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 20 deletions(-) --- (DIR) diff --git a/ex.c b/ex.c t@@ -28,13 +28,16 @@ static int xkwddir; /* the last search direction */ static int xgdep; /* global command recursion depth */ static struct buf { - char ft[32]; - char *path; + char ft[32]; /* file type */ + char *path; /* file path */ struct lbuf *lb; - int row, off, top, td; + int row, off, top; + short id, td; /* buffer id and text direction */ long mtime; /* modification time */ } bufs[8]; +static int bufs_cnt = 0; /* number of allocated buffers */ + static int bufs_find(char *path) { int i; t@@ -68,6 +71,7 @@ static int bufs_open(char *path) if (!bufs[i].lb) break; bufs_free(i); + bufs[i].id = ++bufs_cnt; bufs[i].path = uc_dup(path); bufs[i].lb = lbuf_make(); bufs[i].row = 0; t@@ -79,21 +83,16 @@ static int bufs_open(char *path) return i; } -static void bufs_swap(int i, int j) -{ - struct buf tmp; - if (i == j) - return; - memcpy(&tmp, &bufs[i], sizeof(tmp)); - memcpy(&bufs[i], &bufs[j], sizeof(tmp)); - memcpy(&bufs[j], &tmp, sizeof(tmp)); -} - static void bufs_switch(int idx) { - if (idx > 1) - bufs_swap(0, 1); - bufs_swap(0, idx); + struct buf tmp; + bufs[0].row = xrow; + bufs[0].off = xoff; + bufs[0].top = xtop; + bufs[0].td = xtd; + memcpy(&tmp, &bufs[idx], sizeof(tmp)); + memmove(&bufs[1], &bufs[0], sizeof(tmp) * idx); + memcpy(&bufs[0], &tmp, sizeof(tmp)); xrow = bufs[0].row; xoff = bufs[0].off; xtop = bufs[0].top; t@@ -352,6 +351,34 @@ static int ex_modifiedbuffer(char *msg) return 1; } +static int ec_buffer(char *ec) +{ + char arg[EXLEN]; + char ln[128]; + int id; + int i; + ex_arg(ec, arg); + id = arg[0] ? atoi(arg) : 0; + for (i = 0; i < LEN(bufs) && bufs[i].lb; i++) { + if (id) { + if (id == bufs[i].id) + break; + } else { + char c = i < 2 ? "%#"[i] : ' '; + snprintf(ln, LEN(ln), "%i %c %s", + (int) bufs[i].id, c, bufs[i].path); + ex_print(ln); + } + } + if (id) { + if (i < LEN(bufs) && bufs[i].lb) + bufs_switch(i); + else + ex_show("no such buffer\n"); + } + return 0; +} + static int ec_quit(char *ec) { char cmd[EXLEN]; t@@ -375,10 +402,6 @@ static int ec_edit(char *ec) if (!strchr(cmd, '!')) if (xb && ex_modifiedbuffer("buffer modified\n")) return 1; - bufs[0].row = xrow; - bufs[0].off = xoff; - bufs[0].top = xtop; - bufs[0].td = xtd; if (path[0] && bufs_find(path) >= 0) { bufs_switch(bufs_find(path)); return 0; t@@ -924,6 +947,7 @@ static struct excmd { char *name; int (*ec)(char *s); } excmds[] = { + {"b", "buffer", ec_buffer}, {"p", "print", ec_print}, {"a", "append", ec_insert}, {"i", "insert", ec_insert},