diff options
Diffstat (limited to 'src/cmd/acme')
-rw-r--r-- | src/cmd/acme/dat.h | 1 | ||||
-rw-r--r-- | src/cmd/acme/exec.c | 25 | ||||
-rw-r--r-- | src/cmd/acme/text.c | 64 | ||||
-rw-r--r-- | src/cmd/acme/wind.c | 3 |
4 files changed, 92 insertions, 1 deletions
diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h index 8a81c97d..3a3d2e78 100644 --- a/src/cmd/acme/dat.h +++ b/src/cmd/acme/dat.h @@ -269,6 +269,7 @@ struct Window int utflastqid; int utflastboff; int utflastq; + uchar tabexpand; /* expand tab char with space*body.tabstop */ int tagsafe; /* taglines is correct */ int tagexpand; int taglines; diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c index 0fc6c16b..ad818505 100644 --- a/src/cmd/acme/exec.c +++ b/src/cmd/acme/exec.c @@ -54,6 +54,7 @@ void putall(Text*, Text*, Text*, int, int, Rune*, int); void sendx(Text*, Text*, Text*, int, int, Rune*, int); void sort(Text*, Text*, Text*, int, int, Rune*, int); void tab(Text*, Text*, Text*, int, int, Rune*, int); +void tabexpand(Text*, Text*, Text*, int, int, Rune*, int); void zeroxx(Text*, Text*, Text*, int, int, Rune*, int); typedef struct Exectab Exectab; @@ -93,6 +94,7 @@ static Rune LSend[] = { 'S', 'e', 'n', 'd', 0 }; static Rune LSnarf[] = { 'S', 'n', 'a', 'r', 'f', 0 }; static Rune LSort[] = { 'S', 'o', 'r', 't', 0 }; static Rune LTab[] = { 'T', 'a', 'b', 0 }; +static Rune LTabexpand[] = { 'T', 'a', 'b', 'e', 'x', 'p', 'a', 'n', 'd', 0 }; static Rune LUndo[] = { 'U', 'n', 'd', 'o', 0 }; static Rune LZerox[] = { 'Z', 'e', 'r', 'o', 'x', 0 }; @@ -124,6 +126,7 @@ Exectab exectab[] = { { LSnarf, cut, FALSE, TRUE, FALSE }, { LSort, sort, FALSE, XXX, XXX }, { LTab, tab, FALSE, XXX, XXX }, + { LTabexpand, tabexpand, FALSE, XXX, XXX }, { LUndo, undo, FALSE, TRUE, XXX }, { LZerox, zeroxx, FALSE, XXX, XXX }, { nil, 0, 0, 0, 0 } @@ -1459,6 +1462,28 @@ tab(Text *et, Text *_0, Text *argt, int _1, int _2, Rune *arg, int narg) } void +tabexpand(Text *et, Text *_0, Text *argt, int _1, int _2, Rune *arg, int narg) +{ + Window *w; + + USED(_0); + USED(_1); + USED(_2); + + if(et==nil || et->w==nil) + return; + w = et->w; + + if(w->tabexpand){ + w->tabexpand = FALSE; + warning(nil, "%.*S: Tabexpand OFF\n", w->body.file->nname, w->body.file->name); + }else{ + w->tabexpand = TRUE; + warning(nil, "%.*S: Tabexpand ON\n", w->body.file->nname, w->body.file->name); + } +} + +void runproc(void *argvp) { /* args: */ diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c index 8ff5884d..241665ff 100644 --- a/src/cmd/acme/text.c +++ b/src/cmd/acme/text.c @@ -243,6 +243,9 @@ textload(Text *t, uint q0, char *file, int setqid) dbuf = nil; while((n=dirread(fd, &dbuf)) > 0){ for(i=0; i<n; i++){ +// if(dbuf[i].name[0] == '.'){ +// continue; /* do not list dot files */ +// } dl = emalloc(sizeof(Dirlist)); j = strlen(dbuf[i].name); tmp = emalloc(j+1+1); @@ -745,21 +748,76 @@ texttype(Text *t, Rune r) } else textshow(t, t->file->b.nc, t->file->b.nc, FALSE); return; + case 0x09: /* ^I (TAB) */ + if(t->what!=Body) + break; + if(t->w->tabexpand == TRUE){ + for(i=0; i < t->w->body.tabstop; i++){ + texttype(t, ' '); + } + return; + }else + break; /* fall through to normal code */ case 0x01: /* ^A: beginning of line */ typecommit(t); /* go to where ^U would erase, if not already at BOL */ nnb = 0; if(t->q0>0 && textreadc(t, t->q0-1)!='\n') nnb = textbswidth(t, 0x15); + /* if already at beginning, wrap backwards to previous line if possible */ + if (nnb == 0 && t->q0>0) { + textshow(t, t->q0-1, t->q0-1, TRUE); + return; + } textshow(t, t->q0-nnb, t->q0-nnb, TRUE); return; case 0x05: /* ^E: end of line */ typecommit(t); q0 = t->q0; + /* if already at end, wrap forward to the next line if possible */ + if (q0<t->file->b.nc && textreadc(t, q0) == '\n') { + q0++; + textshow(t, q0, q0, TRUE); + return; + } while(q0<t->file->b.nc && textreadc(t, q0)!='\n') q0++; textshow(t, q0, q0, TRUE); return; + case 0x0E: /* ^N: move one line down */ + typecommit(t); + q0 = t->q0; + nnb = 0; + if(q0>0 && textreadc(t, q0-1)!='\n') + nnb = textbswidth(t, 0x15); + while(q0<t->file->b.nc && textreadc(t, q0)!='\n') + q0++; + if (q0+1 <= t->file->b.nc) + q0++; + while(q0<t->file->b.nc && textreadc(t, q0)!='\n' && nnb--) + q0++; + textshow(t, q0, q0, TRUE); + return; + case 0x10: /* ^P: move one line up */ + typecommit(t); + q0 = t->q0; + nnb = 0; + n = 0; + if(q0>0 && textreadc(t, q0-1)!='\n') + nnb = textbswidth(t, 0x15); + q0 -= nnb; + if (q0>0) + q0--; + while (q0>0 && textreadc(t, q0-1)!='\n') + if (q0 == 0) + break; + else { + q0--; + n++; + } + q0 += (nnb > n) ? n : nnb; + textshow(t, q0, q0, TRUE); + return; case Kcmd+'c': /* %C: copy */ typecommit(t); cut(t, t, nil, TRUE, FALSE, nil, 0); @@ -771,7 +829,11 @@ texttype(Text *t, Rune r) case Kcmd+'Z': /* %-shift-Z: redo */ typecommit(t); undo(t, nil, nil, FALSE, 0, nil, 0); - return; + return; + case Kcmd+'s': /* %S: save/put file */ + typecommit(t); + put(&t->w->body, nil, nil, XXX, XXX, nil, 0); + return; Tagdown: /* expand tag to show all text */ diff --git a/src/cmd/acme/wind.c b/src/cmd/acme/wind.c index 19b52f5c..9010192a 100644 --- a/src/cmd/acme/wind.c +++ b/src/cmd/acme/wind.c @@ -81,9 +81,12 @@ wininit(Window *w, Window *clone, Rectangle r) w->filemenu = TRUE; w->maxlines = w->body.fr.maxlines; w->autoindent = globalautoindent; + w->tabexpand = FALSE; if(clone){ w->dirty = clone->dirty; w->autoindent = clone->autoindent; + w->tabexpand = clone->tabexpand; + w->body.tabstop = clone->body.tabstop; textsetselect(&w->body, clone->body.q0, clone->body.q1); winsettag(w); } |