diff --git a/main.go b/main.go index ecdcb71d..7a6b26c9 100644 --- a/main.go +++ b/main.go @@ -2,11 +2,25 @@ package main import ( "context" + "fmt" + "os" + "os/signal" + "syscall" "github.com/jmorganca/ollama/cmd" "github.com/spf13/cobra" ) func main() { + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT) + + go func() { + <-sigChan + fmt.Print("\033[?25h") + + os.Exit(0) + }() + cobra.CheckErr(cmd.NewCLI().ExecuteContext(context.Background())) } diff --git a/progress/progress.go b/progress/progress.go index 78917e9c..89e90a8d 100644 --- a/progress/progress.go +++ b/progress/progress.go @@ -81,9 +81,6 @@ func (p *Progress) render() error { p.mu.Lock() defer p.mu.Unlock() - fmt.Fprint(p.w, "\033[?25l") - defer fmt.Fprint(p.w, "\033[?25h") - // clear already rendered progress lines for i := 0; i < p.pos; i++ { if i > 0 { @@ -107,6 +104,9 @@ func (p *Progress) render() error { func (p *Progress) start() { p.ticker = time.NewTicker(100 * time.Millisecond) + fmt.Fprint(p.w, "\033[?25l") + defer fmt.Fprintln(p.w, "\033[?25h") + for range p.ticker.C { p.render() } diff --git a/progress/spinner.go b/progress/spinner.go index 62ed4f09..99d6b973 100644 --- a/progress/spinner.go +++ b/progress/spinner.go @@ -10,8 +10,6 @@ type Spinner struct { message string messageWidth int - parts []string - value int ticker *time.Ticker @@ -22,10 +20,8 @@ type Spinner struct { func NewSpinner(message string) *Spinner { s := &Spinner{ message: message, - parts: []string{ - "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏", - }, started: time.Now(), + value: 231, } go s.start() return s @@ -48,18 +44,21 @@ func (s *Spinner) String() string { } if s.stopped.IsZero() { - spinner := s.parts[s.value] - sb.WriteString(spinner) - sb.WriteString(" ") + sb.WriteString(fmt.Sprintf("\033[48;5;%dm ", s.value)) + sb.WriteString("\033[0m") } return sb.String() } func (s *Spinner) start() { - s.ticker = time.NewTicker(100 * time.Millisecond) + s.ticker = time.NewTicker(40 * time.Millisecond) for range s.ticker.C { - s.value = (s.value + 1) % len(s.parts) + if s.value < 255 { + s.value++ + } else { + s.value = 231 + } if !s.stopped.IsZero() { return }