mirror of
https://github.com/go-sylixos/elvish.git
synced 2024-12-04 10:57:50 +08:00
Update working directory of elvish-stub.
This commit is contained in:
parent
158b4b82a5
commit
657448acf3
|
@ -177,7 +177,12 @@ func (ev *Evaler) EvalInteractive(text string, n *parse.Chunk) error {
|
||||||
// XXX Should use fd of /dev/terminal instead of 0.
|
// XXX Should use fd of /dev/terminal instead of 0.
|
||||||
if ev.Stub != nil && sys.IsATTY(0) {
|
if ev.Stub != nil && sys.IsATTY(0) {
|
||||||
ev.Stub.SetTitle(summarize(text))
|
ev.Stub.SetTitle(summarize(text))
|
||||||
err := sys.Tcsetpgrp(0, ev.Stub.Process().Pid)
|
dir, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
dir = "/"
|
||||||
|
}
|
||||||
|
ev.Stub.Chdir(dir)
|
||||||
|
err = sys.Tcsetpgrp(0, ev.Stub.Process().Pid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("failed to put stub in foreground:", err)
|
fmt.Println("failed to put stub in foreground:", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,7 +96,12 @@ func (stub *Stub) Terminate() {
|
||||||
|
|
||||||
// SetTitle sets the title of the stub.
|
// SetTitle sets the title of the stub.
|
||||||
func (stub *Stub) SetTitle(s string) {
|
func (stub *Stub) SetTitle(s string) {
|
||||||
stub.write.WriteString(s + "\n")
|
s = strings.TrimSpace(s)
|
||||||
|
fmt.Fprintf(stub.write, "t %d %s\n", len(s), s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (stub *Stub) Chdir(dir string) {
|
||||||
|
fmt.Fprintf(stub.write, "d %d %s\n", len(dir), dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signals returns a channel into which signals sent to the stub are relayed.
|
// Signals returns a channel into which signals sent to the stub are relayed.
|
||||||
|
|
|
@ -22,9 +22,7 @@ void handler(int signum) {
|
||||||
must(write(1, p, s+4-p) != -1, "write signum");
|
must(write(1, p, s+4-p) != -1, "write signum");
|
||||||
}
|
}
|
||||||
|
|
||||||
enum { ARGV0BUF = 32 };
|
enum { ARGV0MAX = 32 };
|
||||||
|
|
||||||
char argv0buf[ARGV0BUF];
|
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
int i;
|
int i;
|
||||||
|
@ -36,18 +34,28 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
must(write(1, "ok\n", 3) != -1, "write ok");
|
must(write(1, "ok\n", 3) != -1, "write ok");
|
||||||
|
|
||||||
while (1) {
|
char op;
|
||||||
if (fgets(argv0buf, ARGV0BUF, stdin) == NULL) {
|
int len;
|
||||||
if (feof(stdin)) {
|
char *buf;
|
||||||
exit(0);
|
int scanned;
|
||||||
} else {
|
while ((scanned = scanf(" %c%d ", &op, &len)) == 2) {
|
||||||
exit(10);
|
printf("op=%d, len=%d\n", op, len);
|
||||||
|
buf = malloc(len+1);
|
||||||
|
fgets(buf, len+1, stdin);
|
||||||
|
printf("buf=%s\n", buf);
|
||||||
|
if (op == 'd') {
|
||||||
|
// Change directory.
|
||||||
|
chdir(buf);
|
||||||
|
} else if (op == 't') {
|
||||||
|
if (len > ARGV0MAX) {
|
||||||
|
buf[ARGV0MAX] = '\0';
|
||||||
}
|
}
|
||||||
|
strcpy(argv[0], buf);
|
||||||
}
|
}
|
||||||
int n = strlen(argv0buf);
|
free(buf);
|
||||||
if (n > 0 && argv0buf[n-1] == '\n') {
|
|
||||||
argv0buf[n-1] = '\0';
|
|
||||||
}
|
|
||||||
strcpy(argv[0], argv0buf);
|
|
||||||
}
|
}
|
||||||
|
if (scanned != EOF) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user