aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Langley <agl@golang.org>2012-01-14 10:59:11 -0500
committerAdam Langley <agl@golang.org>2012-01-14 10:59:11 -0500
commita9e1f6d7a67d0cc423765e83193640335e8b8301 (patch)
treed6e1c834b8370019333f7a3b572fe14887cc44c3
parent423a09760bf90fe16dc03251792360daf8a99de0 (diff)
downloadgo-a9e1f6d7a67d0cc423765e83193640335e8b8301.tar.gz
go-a9e1f6d7a67d0cc423765e83193640335e8b8301.zip
exp/terminal: add SetPrompt and handle large pastes.
(This was missing in the last change because I uploaded it from the wrong machine.) Large pastes previously misbehaved because the code tried reading from the terminal before checking whether an line was already buffered. Large pastes can cause multiples lines to be read at once from the terminal. R=bradfitz CC=golang-dev https://golang.org/cl/5542049
-rw-r--r--src/pkg/exp/terminal/terminal.go62
1 files changed, 34 insertions, 28 deletions
diff --git a/src/pkg/exp/terminal/terminal.go b/src/pkg/exp/terminal/terminal.go
index 809e88cacf..5fd862e595 100644
--- a/src/pkg/exp/terminal/terminal.go
+++ b/src/pkg/exp/terminal/terminal.go
@@ -463,6 +463,31 @@ func (t *Terminal) readLine() (line string, err error) {
}
for {
+ rest := t.remainder
+ lineOk := false
+ for !lineOk {
+ var key int
+ key, rest = bytesToKey(rest)
+ if key < 0 {
+ break
+ }
+ if key == keyCtrlD {
+ return "", io.EOF
+ }
+ line, lineOk = t.handleKey(key)
+ }
+ if len(rest) > 0 {
+ n := copy(t.inBuf[:], rest)
+ t.remainder = t.inBuf[:n]
+ } else {
+ t.remainder = nil
+ }
+ t.c.Write(t.outBuf)
+ t.outBuf = t.outBuf[:0]
+ if lineOk {
+ return
+ }
+
// t.remainder is a slice at the beginning of t.inBuf
// containing a partial key sequence
readBuf := t.inBuf[len(t.remainder):]
@@ -476,38 +501,19 @@ func (t *Terminal) readLine() (line string, err error) {
return
}
- if err == nil {
- t.remainder = t.inBuf[:n+len(t.remainder)]
- rest := t.remainder
- lineOk := false
- for !lineOk {
- var key int
- key, rest = bytesToKey(rest)
- if key < 0 {
- break
- }
- if key == keyCtrlD {
- return "", io.EOF
- }
- line, lineOk = t.handleKey(key)
- }
- if len(rest) > 0 {
- n := copy(t.inBuf[:], rest)
- t.remainder = t.inBuf[:n]
- } else {
- t.remainder = nil
- }
- t.c.Write(t.outBuf)
- t.outBuf = t.outBuf[:0]
- if lineOk {
- return
- }
- continue
- }
+ t.remainder = t.inBuf[:n+len(t.remainder)]
}
panic("unreachable")
}
+// SetPrompt sets the prompt to be used when reading subsequent lines.
+func (t *Terminal) SetPrompt(prompt string) {
+ t.lock.Lock()
+ defer t.lock.Unlock()
+
+ t.prompt = prompt
+}
+
func (t *Terminal) SetSize(width, height int) {
t.lock.Lock()
defer t.lock.Unlock()