From 57ef0e29c00ad98eabaf4ccdf472093afb8bdeb9 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 30 Mar 2023 08:26:45 +0530 Subject: [PATCH] Wait for keypress on panic in alternate screen kittens --- tools/tui/loop/api.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tools/tui/loop/api.go b/tools/tui/loop/api.go index 234ba7972..813722c36 100644 --- a/tools/tui/loop/api.go +++ b/tools/tui/loop/api.go @@ -5,6 +5,8 @@ package loop import ( "encoding/base64" "fmt" + "os" + "runtime/debug" "strings" "time" @@ -248,6 +250,25 @@ func (self *Loop) DebugPrintln(args ...any) { } func (self *Loop) Run() (err error) { + defer func() { + if r := recover(); r != nil { + stack := utils.Splitlines(string(debug.Stack())) + err = fmt.Errorf("Paniced: %s", r) + fmt.Fprintf(os.Stderr, "\r\nPaniced with error: %s\r\nStacktrace:\r\n", r) + for _, line := range stack { + fmt.Fprintf(os.Stderr, "%s\r\n", line) + } + if self.terminal_options.alternate_screen { + term, err := tty.OpenControllingTerm(tty.SetRaw) + if err == nil { + defer term.RestoreAndClose() + fmt.Println("Press any key to exit.\r") + buf := make([]byte, 16) + term.Read(buf) + } + } + } + }() return self.run() }