tex: yank and put commands - 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 1ed75144175e7ea9b167a76c9b096b4c144ddfad
(DIR) parent 01c3c8a62f1daee16d343488699f804c72dbca91
(HTM) Author: Ali Gholami Rudi <ali@rudi.ir>
Date: Tue, 5 May 2015 18:00:31 +0430
ex: yank and put commands
Diffstat:
M ex.c | 50 ++++++++++++++++++++++++++++----
M reg.c | 22 ++++++++++++----------
2 files changed, 57 insertions(+), 15 deletions(-)
---
(DIR) diff --git a/ex.c b/ex.c
t@@ -155,13 +155,13 @@ static int ex_region(char *loc, int *beg, int *end)
return 0;
}
while (*loc) {
- char *r = loc;
- while (*loc && *loc != ';' && *loc != ',')
- loc++;
- *beg = *end;
- *end = ex_lineno(r) + 1;
+ int end0 = *end;
+ *end = ex_lineno(loc) + 1;
+ *beg = naddr++ ? end0 - 1 : *end - 1;
if (!naddr++)
*beg = *end - 1;
+ while (*loc && *loc != ';' && *loc != ',')
+ loc++;
if (!*loc)
break;
if (*loc == ';')
t@@ -284,17 +284,55 @@ static void ec_print(char *ec)
}
}
+static void ex_yank(int reg, int beg, int end)
+{
+ char *buf = lbuf_cp(xb, beg, end);
+ reg_put(reg, buf, 1);
+ free(buf);
+}
+
static void ec_delete(char *ec)
{
char loc[EXLEN];
+ char arg[EXLEN];
int beg, end;
ex_loc(ec, loc);
+ ex_arg(ec, arg);
if (!ex_region(loc, &beg, &end) && lbuf_len(xb)) {
+ ex_yank(arg[0], beg, end);
lbuf_rm(xb, beg, end);
xrow = beg;
}
}
+static void ec_yank(char *ec)
+{
+ char loc[EXLEN];
+ char arg[EXLEN];
+ int beg, end;
+ ex_loc(ec, loc);
+ ex_arg(ec, arg);
+ if (!ex_region(loc, &beg, &end) && lbuf_len(xb))
+ ex_yank(arg[0], beg, end);
+}
+
+static void ec_put(char *ec)
+{
+ char loc[EXLEN];
+ char arg[EXLEN];
+ int beg, end;
+ int lnmode;
+ char *buf;
+ int n = lbuf_len(xb);
+ ex_loc(ec, loc);
+ ex_arg(ec, arg);
+ buf = reg_get(arg[0], &lnmode);
+ if (buf && !ex_region(loc, &beg, &end)) {
+ lbuf_put(xb, end, buf);
+ xrow = MIN(lbuf_len(xb) - 1, end + lbuf_len(xb) - n - 1);
+ }
+}
+
static void ec_lnum(char *ec)
{
char loc[EXLEN];
t@@ -397,12 +435,14 @@ static struct excmd {
{"e", "edit", ec_edit},
{"=", "=", ec_lnum},
{"k", "mark", ec_mark},
+ {"pu", "put", ec_put},
{"q", "quit", ec_quit},
{"r", "read", ec_read},
{"w", "write", ec_write},
{"u", "undo", ec_undo},
{"r", "redo", ec_redo},
{"s", "substitute", ec_substitute},
+ {"ya", "yank", ec_yank},
{"", "", ec_print},
};
(DIR) diff --git a/reg.c b/reg.c
t@@ -2,25 +2,27 @@
#include <string.h>
#include "vi.h"
-static char *reg;
-static int lnmode;
+static char *bufs[256];
+static int lnmode[256];
char *reg_get(int c, int *ln)
{
- *ln = lnmode;
- return reg;
+ *ln = lnmode[c];
+ return bufs[c];
}
void reg_put(int c, char *s, int ln)
{
- char *nreg = malloc(strlen(s) + 1);
- strcpy(nreg, s);
- free(reg);
- reg = nreg;
- lnmode = ln;
+ char *buf = malloc(strlen(s) + 1);
+ strcpy(buf, s);
+ free(bufs[c]);
+ bufs[c] = buf;
+ lnmode[c] = ln;
}
void reg_done(void)
{
- free(reg);
+ int i;
+ for (i = 0; i < LEN(bufs); i++)
+ free(bufs[i]);
}