Move implementation of +hold to Go
No need to pay python interpreter startup cost for --hold
This commit is contained in:
parent
38a7fa73e3
commit
f5d2c35755
@ -26,19 +26,9 @@ def runpy(args: List[str]) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def hold(args: List[str]) -> None:
|
def hold(args: List[str]) -> None:
|
||||||
import subprocess
|
from kitty.constants import kitty_tool_exe
|
||||||
ret = 1
|
args = ['kitty-tool', '__hold_till_enter__'] + args[1:]
|
||||||
try:
|
os.execvp(kitty_tool_exe(), args)
|
||||||
ret = subprocess.Popen(args[1:]).wait()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
pass
|
|
||||||
except FileNotFoundError:
|
|
||||||
print(f'Could not find {args[1]!r} to execute', file=sys.stderr)
|
|
||||||
except Exception as e:
|
|
||||||
print(e, file=sys.stderr)
|
|
||||||
from kitty.utils import hold_till_enter
|
|
||||||
hold_till_enter()
|
|
||||||
raise SystemExit(ret)
|
|
||||||
|
|
||||||
|
|
||||||
def open_urls(args: List[str]) -> None:
|
def open_urls(args: List[str]) -> None:
|
||||||
|
|||||||
@ -15,7 +15,7 @@ from .child import Child
|
|||||||
from .cli import parse_args
|
from .cli import parse_args
|
||||||
from .cli_stub import LaunchCLIOptions
|
from .cli_stub import LaunchCLIOptions
|
||||||
from .clipboard import set_clipboard_string, set_primary_selection
|
from .clipboard import set_clipboard_string, set_primary_selection
|
||||||
from .constants import kitty_exe, shell_path
|
from .constants import kitty_tool_exe, shell_path
|
||||||
from .fast_data_types import (
|
from .fast_data_types import (
|
||||||
add_timer, get_boss, get_options, get_os_window_title, patch_color_profiles
|
add_timer, get_boss, get_options, get_os_window_title, patch_color_profiles
|
||||||
)
|
)
|
||||||
@ -565,7 +565,7 @@ def launch(
|
|||||||
else:
|
else:
|
||||||
if opts.hold:
|
if opts.hold:
|
||||||
cmd = kw['cmd'] or [shell_path]
|
cmd = kw['cmd'] or [shell_path]
|
||||||
kw['cmd'] = [kitty_exe(), '+hold'] + cmd
|
kw['cmd'] = [kitty_tool_exe(), '__hold_till_enter__'] + cmd
|
||||||
if force_target_tab:
|
if force_target_tab:
|
||||||
tab = target_tab
|
tab = target_tab
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -8,7 +8,7 @@ from typing import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from .cli_stub import CLIOptions
|
from .cli_stub import CLIOptions
|
||||||
from .constants import kitty_exe
|
from .constants import kitty_tool_exe
|
||||||
from .layout.interface import all_layouts
|
from .layout.interface import all_layouts
|
||||||
from .options.types import Options
|
from .options.types import Options
|
||||||
from .options.utils import resize_window, to_layout_names, window_size
|
from .options.utils import resize_window, to_layout_names, window_size
|
||||||
@ -211,7 +211,7 @@ def create_sessions(
|
|||||||
if special_window is None:
|
if special_window is None:
|
||||||
cmd = args.args if args and args.args else resolved_shell(opts)
|
cmd = args.args if args and args.args else resolved_shell(opts)
|
||||||
if args and args.hold:
|
if args and args.hold:
|
||||||
cmd = [kitty_exe(), '+hold'] + cmd
|
cmd = [kitty_tool_exe(), '__hold_till_enter__'] + cmd
|
||||||
from kitty.tabs import SpecialWindow
|
from kitty.tabs import SpecialWindow
|
||||||
cwd: Optional[str] = args.directory if respect_cwd and args else None
|
cwd: Optional[str] = args.directory if respect_cwd and args else None
|
||||||
special_window = SpecialWindow(cmd, cwd_from=cwd_from, cwd=cwd)
|
special_window = SpecialWindow(cmd, cwd_from=cwd_from, cwd=cwd)
|
||||||
|
|||||||
@ -17,7 +17,7 @@ from typing import (
|
|||||||
from .borders import Border, Borders
|
from .borders import Border, Borders
|
||||||
from .child import Child
|
from .child import Child
|
||||||
from .cli_stub import CLIOptions
|
from .cli_stub import CLIOptions
|
||||||
from .constants import appname, kitty_exe
|
from .constants import appname, kitty_tool_exe
|
||||||
from .fast_data_types import (
|
from .fast_data_types import (
|
||||||
GLFW_MOUSE_BUTTON_LEFT, GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS, GLFW_RELEASE, add_tab,
|
GLFW_MOUSE_BUTTON_LEFT, GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS, GLFW_RELEASE, add_tab,
|
||||||
attach_window, current_focused_os_window_id, detach_window, get_boss,
|
attach_window, current_focused_os_window_id, detach_window, get_boss,
|
||||||
@ -413,7 +413,7 @@ class Tab: # {{{
|
|||||||
cmd[:0] = shlex.split(line)
|
cmd[:0] = shlex.split(line)
|
||||||
else:
|
else:
|
||||||
cmd[:0] = [resolved_shell(get_options())[0]]
|
cmd[:0] = [resolved_shell(get_options())[0]]
|
||||||
cmd[:0] = [kitty_exe(), '+hold']
|
cmd[:0] = [kitty_tool_exe(), '__hold_till_enter__']
|
||||||
fenv: Dict[str, str] = {}
|
fenv: Dict[str, str] = {}
|
||||||
if env:
|
if env:
|
||||||
fenv.update(env)
|
fenv.update(env)
|
||||||
|
|||||||
@ -10,6 +10,7 @@ import (
|
|||||||
"kitty/tools/cmd/clipboard"
|
"kitty/tools/cmd/clipboard"
|
||||||
"kitty/tools/cmd/edit_in_kitty"
|
"kitty/tools/cmd/edit_in_kitty"
|
||||||
"kitty/tools/cmd/update_self"
|
"kitty/tools/cmd/update_self"
|
||||||
|
"kitty/tools/tui"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = fmt.Print
|
var _ = fmt.Print
|
||||||
@ -25,4 +26,14 @@ func KittyToolEntryPoints(root *cli.Command) {
|
|||||||
edit_in_kitty.EntryPoint(root)
|
edit_in_kitty.EntryPoint(root)
|
||||||
// clipboard
|
// clipboard
|
||||||
clipboard.EntryPoint(root)
|
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
72
tools/tui/hold.go
Normal 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)
|
||||||
|
}
|
||||||
@ -242,6 +242,14 @@ func (self *Loop) SetCursorShape(shape CursorShapes, blink bool) {
|
|||||||
self.QueueWriteString(CursorShape(shape, blink))
|
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) {
|
func (self *Loop) MoveCursorHorizontally(amt int) {
|
||||||
if amt != 0 {
|
if amt != 0 {
|
||||||
suffix := "C"
|
suffix := "C"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user