aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/acme/text.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/acme/text.c')
-rw-r--r--src/cmd/acme/text.c82
1 files changed, 53 insertions, 29 deletions
diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c
index 09422dda..4f70867e 100644
--- a/src/cmd/acme/text.c
+++ b/src/cmd/acme/text.c
@@ -692,10 +692,27 @@ texttype(Text *t, Rune r)
textshow(t, t->q1+1, t->q1+1, TRUE);
return;
case Kdown:
- if(t->what == Tag)
- goto Tagdown;
- n = t->fr.maxlines/3;
- goto case_Down;
+ typecommit(t);
+ q0 = t->q0;
+ nnb = 0;
+ if(t->q0>0 && textreadc(t, t->q0-1)!='\n')
+ nnb = textbswidth(t, 0x15);
+ while(q0<t->file->b.nc && textreadc(t, q0)!='\n')
+ q0++;
+ if (q0 == t->file->b.nc) {
+ textshow(t, q0, q0, TRUE);
+ return;
+ }
+ q0++;
+ while(nnb>=0 && q0<t->file->b.nc) {
+ if (textreadc(t, q0)=='\n')
+ break;
+ nnb--;
+ if (nnb >= 0)
+ q0++;
+ }
+ textshow(t, q0, q0, TRUE);
+ return;
case Kscrollonedown:
if(t->what == Tag)
goto Tagdown;
@@ -710,10 +727,26 @@ texttype(Text *t, Rune r)
textsetorigin(t, q0, TRUE);
return;
case Kup:
- if(t->what == Tag)
- goto Tagup;
- n = t->fr.maxlines/3;
- goto case_Up;
+ typecommit(t);
+ nnb = 0;
+ if(t->q0>0 && textreadc(t, t->q0-1)!='\n')
+ nnb = textbswidth(t, 0x15);
+ q1 = nnb;
+ if(t->q0-nnb > 1 && textreadc(t, t->q0-nnb-1)=='\n')
+ nnb++;
+ q0 = t->q0-nnb;
+ textshow(t, q0, q0, TRUE);
+
+ nnb = textbswidth(t, 0x15);
+ if (nnb <= 1)
+ return;
+ q0 = q0-nnb;
+ while (q1>0 && textreadc(t, q0)!='\n') {
+ q1--;
+ q0++;
+ }
+ textshow(t, q0, q0, TRUE);
+ return;
case Kscrolloneup:
if(t->what == Tag)
goto Tagup;
@@ -726,25 +759,6 @@ texttype(Text *t, Rune r)
textsetorigin(t, q0, TRUE);
return;
case Khome:
- typecommit(t);
- if(t->org > t->iq1) {
- q0 = textbacknl(t, t->iq1, 1);
- textsetorigin(t, q0, TRUE);
- } else
- textshow(t, 0, 0, FALSE);
- return;
- case Kend:
- typecommit(t);
- if(t->iq1 > t->org+t->fr.nchars) {
- if(t->iq1 > t->file->b.nc) {
- // should not happen, but does. and it will crash textbacknl.
- t->iq1 = t->file->b.nc;
- }
- q0 = textbacknl(t, t->iq1, 1);
- textsetorigin(t, q0, TRUE);
- } else
- textshow(t, t->file->b.nc, t->file->b.nc, FALSE);
- return;
case 0x01: /* ^A: beginning of line */
typecommit(t);
/* go to where ^U would erase, if not already at BOL */
@@ -753,6 +767,7 @@ texttype(Text *t, Rune r)
nnb = textbswidth(t, 0x15);
textshow(t, t->q0-nnb, t->q0-nnb, TRUE);
return;
+ case Kend:
case 0x05: /* ^E: end of line */
typecommit(t);
q0 = t->q0;
@@ -760,19 +775,26 @@ texttype(Text *t, Rune r)
q0++;
textshow(t, q0, q0, TRUE);
return;
+ case 0x03: /* Ctrl-c: copy */
case Kcmd+'c': /* %C: copy */
typecommit(t);
cut(t, t, nil, TRUE, FALSE, nil, 0);
return;
+ case 0x1a: /* Ctrl-z: undo */
case Kcmd+'z': /* %Z: undo */
typecommit(t);
undo(t, nil, nil, TRUE, 0, nil, 0);
return;
+ case 0x19: /* Ctrl-y: redo */
case Kcmd+'Z': /* %-shift-Z: redo */
typecommit(t);
undo(t, nil, nil, FALSE, 0, nil, 0);
return;
-
+ case 0x13: /* Ctrl-S: put file */
+ case Kcmd+'s':
+ typecommit(t);
+ put(&(t->w)->body, nil, nil, XXX, XXX, nil, 0);
+ return;
Tagdown:
/* expand tag to show all text */
if(!t->w->tagexpand){
@@ -796,6 +818,7 @@ texttype(Text *t, Rune r)
}
/* cut/paste must be done after the seq++/filemark */
switch(r){
+ case 0x18: /* Ctrl-X: cut */
case Kcmd+'x': /* %X: cut */
typecommit(t);
if(t->what == Body){
@@ -806,6 +829,7 @@ texttype(Text *t, Rune r)
textshow(t, t->q0, t->q0, 1);
t->iq1 = t->q0;
return;
+ case 0x16: /* Ctrl-V: paste */
case Kcmd+'v': /* %V: paste */
typecommit(t);
if(t->what == Body){
@@ -1661,4 +1685,4 @@ textreset(Text *t)
t->q1 = 0;
filereset(t->file);
bufreset(&t->file->b);
-}
+} \ No newline at end of file