aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/acme
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/acme')
-rw-r--r--src/cmd/acme/dat.h1
-rw-r--r--src/cmd/acme/exec.c25
-rw-r--r--src/cmd/acme/text.c64
-rw-r--r--src/cmd/acme/wind.c3
4 files changed, 92 insertions, 1 deletions
diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h
index 8c4b14ee..451ba392 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 1df01c71..3a568f8a 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 }
@@ -1393,6 +1396,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 4832de8e..e47c97d2 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,19 +748,74 @@ 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 */
@@ -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);
}