mirror of
https://github.com/ollama/ollama.git
synced 2026-01-29 07:12:03 +03:00
fix: handle Enter key pressed during model loading (#13839)
This commit is contained in:
@@ -159,6 +159,7 @@ func generateInteractive(cmd *cobra.Command, opts runOptions) error {
|
|||||||
sb.WriteString(before)
|
sb.WriteString(before)
|
||||||
if !ok {
|
if !ok {
|
||||||
fmt.Fprintln(&sb)
|
fmt.Fprintln(&sb)
|
||||||
|
scanner.Prompt.UseAlt = true
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,21 @@ func (i *Instance) Readline() (string, error) {
|
|||||||
|
|
||||||
var currentLineBuf []rune
|
var currentLineBuf []rune
|
||||||
|
|
||||||
|
// draining tracks if we're processing buffered input from cooked mode.
|
||||||
|
// In cooked mode Enter sends \n, but in raw mode Ctrl+J sends \n.
|
||||||
|
// We treat \n from cooked mode as submit, not multiline.
|
||||||
|
// We check Buffered() after the first read since the bufio buffer is
|
||||||
|
// empty until then. This is compatible with """ multiline mode in
|
||||||
|
// interactive.go since each Readline() call is independent.
|
||||||
|
var draining, stopDraining bool
|
||||||
|
|
||||||
for {
|
for {
|
||||||
|
// Apply deferred state change from previous iteration
|
||||||
|
if stopDraining {
|
||||||
|
draining = false
|
||||||
|
stopDraining = false
|
||||||
|
}
|
||||||
|
|
||||||
// don't show placeholder when pasting unless we're in multiline mode
|
// don't show placeholder when pasting unless we're in multiline mode
|
||||||
showPlaceholder := !i.Pasting || i.Prompt.UseAlt
|
showPlaceholder := !i.Pasting || i.Prompt.UseAlt
|
||||||
if buf.IsEmpty() && showPlaceholder {
|
if buf.IsEmpty() && showPlaceholder {
|
||||||
@@ -105,6 +119,15 @@ func (i *Instance) Readline() (string, error) {
|
|||||||
|
|
||||||
r, err := i.Terminal.Read()
|
r, err := i.Terminal.Read()
|
||||||
|
|
||||||
|
// After reading, check if there's more buffered data. If so, we're
|
||||||
|
// processing cooked-mode input. Once buffer empties, the current
|
||||||
|
// char is the last buffered one (still drain it), then stop next iteration.
|
||||||
|
if i.Terminal.reader.Buffered() > 0 {
|
||||||
|
draining = true
|
||||||
|
} else if draining {
|
||||||
|
stopDraining = true
|
||||||
|
}
|
||||||
|
|
||||||
if buf.IsEmpty() {
|
if buf.IsEmpty() {
|
||||||
fmt.Print(ClearToEOL)
|
fmt.Print(ClearToEOL)
|
||||||
}
|
}
|
||||||
@@ -232,15 +255,20 @@ func (i *Instance) Readline() (string, error) {
|
|||||||
fd := os.Stdin.Fd()
|
fd := os.Stdin.Fd()
|
||||||
return handleCharCtrlZ(fd, i.Terminal.termios)
|
return handleCharCtrlZ(fd, i.Terminal.termios)
|
||||||
case CharCtrlJ:
|
case CharCtrlJ:
|
||||||
i.pastedLines = append(i.pastedLines, buf.String())
|
// If not draining cooked-mode input, treat as multiline
|
||||||
buf.Buf.Clear()
|
if !draining {
|
||||||
buf.Pos = 0
|
i.pastedLines = append(i.pastedLines, buf.String())
|
||||||
buf.DisplayPos = 0
|
buf.Buf.Clear()
|
||||||
buf.LineHasSpace.Clear()
|
buf.Pos = 0
|
||||||
fmt.Println()
|
buf.DisplayPos = 0
|
||||||
fmt.Print(i.Prompt.AltPrompt)
|
buf.LineHasSpace.Clear()
|
||||||
i.Prompt.UseAlt = true
|
fmt.Println()
|
||||||
continue
|
fmt.Print(i.Prompt.AltPrompt)
|
||||||
|
i.Prompt.UseAlt = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// Draining cooked-mode input: treat \n as submit
|
||||||
|
fallthrough
|
||||||
case CharEnter:
|
case CharEnter:
|
||||||
output := buf.String()
|
output := buf.String()
|
||||||
if len(i.pastedLines) > 0 {
|
if len(i.pastedLines) > 0 {
|
||||||
|
|||||||
Reference in New Issue
Block a user