add autoindent (-a) and chording.

clean up argument parsing.
This commit is contained in:
rsc 2005-01-27 06:10:35 +00:00
parent 4ac5f249ad
commit 17ab31aac6
8 changed files with 113 additions and 74 deletions

View file

@ -176,7 +176,7 @@ int remotefd0 = 0;
int remotefd1 = 1;
void
bootterm(char *machine, char **argv, char **end)
bootterm(char *machine, char **argv)
{
int ph2t[2], pt2h[2];
@ -186,7 +186,6 @@ bootterm(char *machine, char **argv, char **end)
close(remotefd0);
close(remotefd1);
argv[0] = "samterm";
*end = 0;
execvp(samterm, argv);
fprint(2, "can't exec %s: %r\n", samterm);
_exits("damn");
@ -202,7 +201,6 @@ bootterm(char *machine, char **argv, char **end)
close(pt2h[0]);
close(pt2h[1]);
argv[0] = "samterm";
*end = 0;
execvp(samterm, argv);
fprint(2, "can't exec: ");
perror(samterm);
@ -269,12 +267,12 @@ connectto(char *machine, char **argv)
}
void
startup(char *machine, int Rflag, char **argv, char **end, char **files)
startup(char *machine, int Rflag, char **argv, char **files)
{
if(machine)
connectto(machine, files);
if(!Rflag)
bootterm(machine, argv, end);
bootterm(machine, argv);
downloaded = 1;
outTs(Hversion, VERSION);
}

View file

@ -66,7 +66,7 @@ typedef enum Hmesg
Hsnarflen, /* report length of implicit snarf */
Hack, /* request acknowledgement */
Hexit,
Hplumb, /* return plumb message to terminal */
Hplumb, /* return plumb message to terminal - version 1 */
HMAX,
}Hmesg;
typedef struct Header{

View file

@ -42,58 +42,40 @@ main(int volatile argc, char **volatile argv)
{
int volatile i;
String *t;
char **ap, **arg;
char *termargs[10], **ap;
ap = termargs;
*ap++ = "samterm";
ARGBEGIN{
case 'd':
dflag++;
break;
case 'r':
machine = EARGF(usage());
break;
case 'R':
Rflag++;
break;
case 't':
samterm = EARGF(usage());
break;
case 's':
rsamname = EARGF(usage());
break;
default:
dprint("sam: unknown flag %c\n", ARGC());
usage();
/* options for samterm */
case 'a':
*ap++ = "-a";
break;
case 'W':
*ap++ = "-W";
*ap++ = EARGF(usage());
break;
}ARGEND
*ap = nil;
arg = argv++;
ap = argv;
while(argc>1 && argv[0] && argv[0][0]=='-'){
switch(argv[0][1]){
case 'd':
dflag++;
break;
case 'r':
--argc, argv++;
if(argc == 1)
usage();
machine = *argv;
break;
case 'R':
Rflag++;
break;
case 't':
--argc, argv++;
if(argc == 1)
usage();
samterm = *argv;
break;
case 's':
--argc, argv++;
if(argc == 1)
usage();
rsamname = *argv;
break;
case 'x': /* x11 option - strip the x */
strcpy(*argv+1, *argv+2);
*ap++ = *argv++;
*ap++ = *argv;
argc--;
break;
case 'W':
--argc, argv++;
break;
default:
dprint("sam: unknown flag %c\n", argv[0][1]);
exits("usage");
}
--argc, argv++;
}
Strinit(&cmdstr);
Strinit0(&lastpat);
Strinit0(&lastregexp);
@ -106,12 +88,13 @@ main(int volatile argc, char **volatile argv)
disk = diskinit();
if(home == 0)
home = "/";
fprint(2, "argc %d argv %s\n", argc, *argv);
if(!dflag)
startup(machine, Rflag, arg, ap, argv);
startup(machine, Rflag, termargs, argv);
notify(notifyf);
getcurwd();
if(argc>1){
for(i=0; i<argc-1; i++){
if(argc>0){
for(i=0; i<argc; i++){
if(!setjmp(mainloop)){
t = tmpcstr(argv[i]);
Straddc(t, '\0');

View file

@ -295,7 +295,7 @@ void settempfile(void);
int skipbl(void);
void snarf(File*, Posn, Posn, Buffer*, int);
void sortname(File*);
void startup(char*, int, char**, char**, char**);
void startup(char*, int, char**, char**);
void state(File*, int);
int statfd(int, ulong*, uvlong*, long*, long*, long*);
int statfile(char*, ulong*, uvlong*, long*, long*, long*);

View file

@ -253,10 +253,11 @@ fldelete(Flayer *l, long p0, long p1)
int
flselect(Flayer *l)
{
int ret = 0;
int ret;
if(l->visible!=All)
flupfront(l);
frselect(&l->f, mousectl);
ret = 0;
if(l->f.p0==l->f.p1){
if(mousep->msec-l->click<Clicktime && l->f.p0+l->origin==l->p0){
ret = 1;

View file

@ -23,11 +23,13 @@ long modified = 0; /* strange lookahead for menus */
char hostlock = 1;
char hasunlocked = 0;
int maxtab = 8;
int chord;
int autoindent;
void
threadmain(int argc, char *argv[])
{
int i, got, scr;
int i, got, scr, w;
Text *t;
Rectangle r;
Flayer *nwhich;
@ -98,7 +100,11 @@ dup(2, 1);
scr = which && ptinrect(mousep->xy, which->scroll);
if(mousep->buttons)
flushtyping(1);
if(mousep->buttons&1){
if(chord==1 && !mousep->buttons)
chord = 0;
if(chord)
chord |= mousep->buttons;
else if(mousep->buttons&1){
if(nwhich){
if(nwhich!=which)
current(nwhich);
@ -111,6 +117,8 @@ dup(2, 1);
t->lock++;
}else if(t!=&cmd)
outcmd();
if(mousep->buttons&1)
chord = mousep->buttons;
}
}
}else if((mousep->buttons&2) && which){
@ -126,10 +134,22 @@ dup(2, 1);
}
mouseunblock();
}
if(chord){
t = (Text*)which->user1;
if(!t->lock && !hostlock){
w = which-t->l;
if(chord&2){
cut(t, w, 1, 1);
chord &= ~2;
}else if(chord&4){
paste(t, w);
chord &= ~4;
}
}
}
}
}
void
resize(void)
{
@ -394,7 +414,7 @@ center(Flayer *l, long a)
}
int
onethird(Flayer *l, long a)
thirds(Flayer *l, long a, int n)
{
Text *t;
Rectangle s;
@ -405,7 +425,7 @@ onethird(Flayer *l, long a)
if(a > t->rasp.nrunes)
a = t->rasp.nrunes;
s = insetrect(l->scroll, 1);
lines = ((s.max.y-s.min.y)/l->f.font->height+1)/3;
lines = (n*(s.max.y-s.min.y)/l->f.font->height+1)/3;
if (lines < 2)
lines = 2;
outTsll(Torigin, t->tag, a, lines);
@ -414,6 +434,18 @@ onethird(Flayer *l, long a)
return 0;
}
int
onethird(Flayer *l, long a)
{
return thirds(l, a, 1);
}
int
twothirds(Flayer *l, long a)
{
return thirds(l, a, 2);
}
void
flushtyping(int clearesc)
{
@ -495,7 +527,20 @@ type(Flayer *l, int res) /* what a bloody mess this is */
}
}
*p++ = c;
if(c == '\n' || p >= buf+sizeof(buf)/sizeof(buf[0]))
if(autoindent)
if(c == '\n'){
/* autoindent */
int cursor, ch;
cursor = ctlu(&t->rasp, 0, a+(p-buf)-1);
while(p < buf+nelem(buf)){
ch = raspc(&t->rasp, cursor++);
if(ch == ' ' || ch == '\t')
*p++ = ch;
else
break;
}
}
if(c == '\n' || p >= buf+nelem(buf))
break;
}
if(p > buf){

View file

@ -25,17 +25,28 @@ static char *exname;
#define STACK 16384
void
usage(void)
{
fprint(2, "usage: samterm -a -W winsize\n");
threadexitsall("usage");
}
void
getscreen(int argc, char **argv)
{
int i;
char *t;
/* not exactly right */
for(i=0; i<argc-1; i++){
if(strcmp(argv[i], "-W") == 0)
winsize = argv[i+1];
}
ARGBEGIN{
case 'a':
autoindent = 1;
break;
case 'W':
winsize = EARGF(usage());
break;
default:
usage();
}ARGEND
if(initdraw(panic1, nil, "sam") < 0){
fprint(2, "samterm: initdraw: %r\n");

View file

@ -88,6 +88,7 @@ extern int hversion;
extern int plumbfd;
extern int hostfd[2];
extern int exiting;
extern int autoindent;
#define gettext sam_gettext /* stupid gcc built-in functions */
Rune *gettext(Flayer*, long, ulong*);