Move implementation of +hold to Go

No need to pay python interpreter startup cost for --hold
This commit is contained in:
Kovid Goyal
2022-12-01 22:34:56 +05:30
parent 38a7fa73e3
commit f5d2c35755
7 changed files with 100 additions and 19 deletions

View File

@@ -10,6 +10,7 @@ import (
"kitty/tools/cmd/clipboard"
"kitty/tools/cmd/edit_in_kitty"
"kitty/tools/cmd/update_self"
"kitty/tools/tui"
)
var _ = fmt.Print
@@ -25,4 +26,14 @@ func KittyToolEntryPoints(root *cli.Command) {
edit_in_kitty.EntryPoint(root)
// clipboard
clipboard.EntryPoint(root)
// __hold_till_enter__
root.AddSubCommand(&cli.Command{
Name: "__hold_till_enter__",
Hidden: true,
OnlyArgsAllowed: true,
Run: func(cmd *cli.Command, args []string) (rc int, err error) {
tui.ExecAndHoldTillEnter(args)
return
},
})
}

72
tools/tui/hold.go Normal file
View File

@@ -0,0 +1,72 @@
// License: GPLv3 Copyright: 2022, Kovid Goyal, <kovid at kovidgoyal.net>
package tui
import (
"errors"
"fmt"
"os"
"os/exec"
"kitty/tools/tui/loop"
)
var _ = fmt.Print
func HoldTillEnter(start_with_newline bool) {
lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors, loop.NoMouseTracking)
if err != nil {
return
}
lp.OnInitialize = func() (string, error) {
lp.SetCursorVisible(false)
if start_with_newline {
lp.QueueWriteString("\r\n")
}
lp.QueueWriteString("\x1b[1;32mPress Enter or Esc to exit\x1b[m")
return "", nil
}
lp.OnFinalize = func() string {
lp.SetCursorVisible(true)
return ""
}
lp.OnKeyEvent = func(event *loop.KeyEvent) error {
if event.MatchesPressOrRepeat("enter") || event.MatchesPressOrRepeat("esc") || event.MatchesPressOrRepeat("ctrl+c") || event.MatchesPressOrRepeat("ctrl+d") {
event.Handled = true
lp.Quit(0)
}
return nil
}
lp.Run()
}
func ExecAndHoldTillEnter(cmdline []string) {
if len(cmdline) == 0 {
HoldTillEnter(false)
os.Exit(0)
}
var cmd *exec.Cmd
if len(cmdline) == 1 {
cmd = exec.Command(cmdline[0])
} else {
cmd = exec.Command(cmdline[0], cmdline[1:]...)
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
var ee *exec.ExitError
err := cmd.Run()
is_exit_error := err != nil && errors.As(err, &ee)
if err != nil && !is_exit_error {
fmt.Fprintln(os.Stderr, err)
}
HoldTillEnter(true)
if err == nil {
os.Exit(0)
}
if is_exit_error {
os.Exit(ee.ExitCode())
}
os.Exit(1)
}

View File

@@ -242,6 +242,14 @@ func (self *Loop) SetCursorShape(shape CursorShapes, blink bool) {
self.QueueWriteString(CursorShape(shape, blink))
}
func (self *Loop) SetCursorVisible(visible bool) {
if visible {
self.QueueWriteString(DECTCEM.EscapeCodeToSet())
} else {
self.QueueWriteString(DECTCEM.EscapeCodeToReset())
}
}
func (self *Loop) MoveCursorHorizontally(amt int) {
if amt != 0 {
suffix := "C"