Reworked multipliers and deletion

This commit is contained in:
sloum 2020-01-14 21:22:28 -08:00
parent 2574c8e911
commit 39f37d7ffd
1 changed files with 104 additions and 116 deletions

220
hermes.c
View File

@ -1157,9 +1157,28 @@ void editorCommandKp(int c) {
case 'k':
case 'h':
case 'l':
while (counter > 0) {
editorMoveCursor(c);
counter--;
{
int vx = E.cx;
int vy = E.cy;
while (counter > 0) {
editorMoveCursor(c);
counter--;
}
if (!deleting) break;
E.vx = vx;
E.vy = vy;
if (c == 'h' && E.vx > 0) E.vx--;
if (c == 'j') {
E.vx = 0;
E.cx = E.row[E.cy].size - 1;
}
if (c == 'k') {
E.vx = E.row[E.vy].size - 1;
E.cx = 0;
}
if (c == 'l' && E.cx > 0) E.cx--;
editorDeleteSelection();
if (c == 'k' || c == 'j') editorDelRow(E.cy);
}
break;
case '\033':
@ -1169,6 +1188,7 @@ void editorCommandKp(int c) {
{
int c = editorReadKey();
if (c) {
if (c == '\033') break;
E.mode = InputMode;
editorMoveCursor(ARROW_RIGHT);
editorDeleteChar();
@ -1179,67 +1199,42 @@ void editorCommandKp(int c) {
}
break;
case 'g':
if (deleting) {
int totlen = 0;
int j;
for (j = 0; j <= E.cy; j++)
totlen += E.row[j].size + 1;
char *buf = malloc(totlen);
char *p = buf;
int count = E.cy;
E.cy = 0;
E.rowoff = 0;
while (count >= 0) {
memcpy(p, E.row[E.cy].chars, E.row[E.cy].size);
p += E.row[E.cy].size;
*p = '\r';
p++;
deleting = 1;
editorCommandKp('d');
count--;
}
editorUpdatePaste(buf, totlen);
} else {
{
int vx = E.cx;
int vy = E.cy;
E.cy = 0;
E.cx = 0;
E.rowoff = 0;
if (!deleting) break;
E.vx = vx;
E.vy = vy;
int extraRow = 0;
E.vx--;
if (E.vx < 0) {
if (E.vy < 1) break;
E.vy--;
E.vx = E.row[E.vy].size - 1;
extraRow = 1;
}
editorDeleteSelection();
if (extraRow) editorDelRow(0);
}
break;
case 'G':
if (deleting) {
int totlen = 0;
int j;
for (j = E.cy; j < E.numRows; j++)
totlen += E.row[j].size + 1;
char *buf = malloc(totlen);
char *p = buf;
int count = E.numRows - E.cy - 1;
if (count < 0) count = 0;
while (count >= 0) {
memcpy(p, E.row[E.cy].chars, E.row[E.cy].size);
p += E.row[E.cy].size;
*p = '\r';
p++;
deleting = 1;
editorCommandKp('d');
count--;
}
editorUpdatePaste(buf, totlen);
} else {
if (E.numRows > E.screenRows) {
E.cy = E.numRows - 1;
E.rowoff = E.numRows - E.screenRows - 1;
} else {
E.cy = E.numRows - 1;
}
{
int vx = E.cx;
int vy = E.cy;
E.cy = E.numRows - 1;
E.cx = E.row[E.cy].size - 1;
if (E.cx < 0) E.cx = 0;
if (!deleting) {
if (E.numRows > E.screenRows) E.rowoff = E.numRows - E.screenRows - 1;
break;
}
E.vx = vx;
E.vy = vy;
editorDeleteSelection();
}
break;
case '\r':
@ -1247,8 +1242,6 @@ void editorCommandKp(int c) {
counter--;
if (counter > E.numRows - 1) {
E.cy = E.numRows - 1;
} else if (counter < 0) {
E.cy = 0;
} else {
E.cy = counter;
}
@ -1293,19 +1286,21 @@ void editorCommandKp(int c) {
deleting++;
return;
} else {
int sz = E.row[E.cy].size + 1;
char *buf = malloc(sz);
strcpy(buf, E.row[E.cy].chars);
buf[sz - 1] = '\r';
editorUpdatePaste(buf, sz);
free(buf);
int start_x = E.cx;
int start_y = E.cy;
int end_x, end_y;
end_y = E.cy + counter;
if (end_y >= E.numRows) end_y = E.numRows - 1;
end_x = E.row[end_y].size - 1;
editorCopyRange(0, start_y, end_x, end_y);
while (counter > 0) {
editorDelRow(E.cy);
if (E.cy == E.numRows) E.cy--;
if (E.cy < 0) E.cy = 0;
// if (E.cx >= E.row[E.cy].size) E.cx = E.row[E.cy].size;
counter--;
}
E.cx = start_x;
if (E.cx >= E.row[E.cy].size) E.cx = E.row[E.cy].size - 1;
break;
}
case '$':
@ -1329,26 +1324,23 @@ void editorCommandKp(int c) {
break;
case 'w':
{
int start_x = E.cx;
int start_y = E.cy;
int vx = E.cx;
int vy = E.cy;
while (counter > 0) {
editorNextWord();
counter--;
}
if (!deleting) break;
int end_x, end_y;
E.vx = vx;
E.vy = vy;
if (E.cx == 0) {
if (E.cy == 0) break;
end_y = E.cy - 1;
end_x = E.row[E.cy].size - 1;
E.cy--;
E.cx = E.row[E.cy].size - 1;
} else {
end_x = E.cx - 1;
end_y = E.cy;
}
editorCopyRange(start_x, start_y, end_x, end_y);
while (E.cx != start_x || E.cy != start_y) {
editorDeleteChar();
E.cx--;
}
editorDeleteSelection();
if (E.cx > E.row[E.cy].size - 1) E.cx = E.row[E.cy].size - 1;
}
break;
@ -1378,54 +1370,50 @@ void editorCommandKp(int c) {
break;
}
case 'b':
while (counter > 0) {
if (deleting) {
int start_x = E.cx;
int start_y = E.cy;
editorPrevWord();
int end_x = E.cx;
int end_y = E.cy;
E.cx = start_x;
E.cy = start_y;
editorUpdatePaste(&E.row[E.cy].chars[end_x], start_x - end_x);
while (E.cy != end_y || E.cx != end_x) {
editorDeleteChar();
}
} else {
editorPrevWord();
{
int start_x = E.cx;
int start_y = E.cy;
if (start_x > 0) {
start_x--;
} else if (start_y > 0) {
start_y--;
start_x = E.row[start_y].size - 1;
}
counter--;
while (counter > 0) {
editorPrevWord();
counter--;
}
if (!deleting) break;
E.vx = start_x;
E.vy = start_y;
editorDeleteSelection();
}
break;
case 'e':
while (counter > 0) {
if (deleting) {
int start_x = E.cx;
int start_y = E.cy;
editorEndOfWord();
editorUpdatePaste(&E.row[E.cy].chars[start_x], E.cx - start_x);
while (E.cy != start_y || E.cx != start_x) {
editorDeleteChar();
}
E.mode = InputMode;
editorMoveCursor(ARROW_RIGHT);
editorDeleteChar();
E.mode = CommandMode;
if (E.cx == E.row[E.cy].size) editorMoveCursor(ARROW_LEFT);
} else {
{
int vx = E.cx;
int vy = E.cy;
while (counter > 0) {
editorEndOfWord();
counter--;
}
counter--;
if (!deleting) break;
E.vx = vx;
E.vy = vy;
editorDeleteSelection();
}
break;
case '^':
if (deleting) {
editorUpdatePaste(&E.row[E.cy].chars[0], E.cx);
while (E.cx > 0) {
editorDeleteChar();
}
} else {
{
int vx = E.cx;
E.cx = 0;
if (deleting) {
E.vx = vx;
E.vy = E.cy;
if (E.vx > 0) E.vx--;
editorDeleteSelection();
}
}
break;
case 'v':
@ -1437,9 +1425,9 @@ void editorCommandKp(int c) {
break;
case 'V':
if (E.mode == CommandMode) {
E.vx = 0;
E.vx = E.row[E.cy].size - 1;
E.vy = E.cy;
E.cx = E.row[E.cy].size - 1;
E.cx = 0;
E.mode = VisualMode;
}
break;