Improve performance when pasting large amounts of text into readline by not redrawing on every char

This commit is contained in:
Kovid Goyal 2022-10-09 09:15:17 +05:30
parent c0f17c279e
commit 834385baff
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 31 additions and 8 deletions

View File

@ -61,6 +61,7 @@ type Loop struct {
OnKeyEvent func(event *KeyEvent) error
// Called when text is received either from a key event or directly from the terminal
// Called with an empty string when bracketed paste ends
OnText func(text string, from_key_event bool, in_bracketed_paste bool) error
// Called when the terminal is resized

View File

@ -31,6 +31,7 @@ func new_loop() *Loop {
l.escape_code_parser.HandleSOS = l.handle_sos
l.escape_code_parser.HandlePM = l.handle_pm
l.escape_code_parser.HandleRune = l.handle_rune
l.escape_code_parser.HandleEndOfBracketedPaste = l.handle_end_of_bracketed_paste
return &l
}
@ -128,6 +129,12 @@ func (self *Loop) handle_rune(raw rune) error {
return nil
}
func (self *Loop) handle_end_of_bracketed_paste() {
if self.OnText != nil {
self.OnText("", false, false)
}
}
func (self *Loop) on_signal(s unix.Signal) error {
switch s {
case unix.SIGINT:

View File

@ -4,6 +4,7 @@ package readline
import (
"fmt"
"strings"
"kitty/tools/tui/loop"
"kitty/tools/wcswidth"
@ -59,7 +60,8 @@ type Readline struct {
// Input lines
lines []string
// The cursor position in the text
cursor Position
cursor Position
bracketed_paste_buffer strings.Builder
}
func New(loop *loop.Loop, r RlInit) *Readline {
@ -127,6 +129,15 @@ func (self *Readline) OnKeyEvent(event *loop.KeyEvent) error {
}
func (self *Readline) OnText(text string, from_key_event bool, in_bracketed_paste bool) error {
if in_bracketed_paste {
self.bracketed_paste_buffer.WriteString(text)
return nil
}
if self.bracketed_paste_buffer.Len() > 0 {
self.bracketed_paste_buffer.WriteString(text)
text = self.bracketed_paste_buffer.String()
self.bracketed_paste_buffer.Reset()
}
self.add_text(text)
return nil
}

View File

@ -46,13 +46,14 @@ type EscapeCodeParser struct {
current_callback func([]byte) error
// Callbacks
HandleRune func(rune) error
HandleCSI func([]byte) error
HandleOSC func([]byte) error
HandleDCS func([]byte) error
HandlePM func([]byte) error
HandleSOS func([]byte) error
HandleAPC func([]byte) error
HandleRune func(rune) error
HandleEndOfBracketedPaste func()
HandleCSI func([]byte) error
HandleOSC func([]byte) error
HandleDCS func([]byte) error
HandlePM func([]byte) error
HandleSOS func([]byte) error
HandleAPC func([]byte) error
}
func (self *EscapeCodeParser) InBracketedPaste() bool { return self.state == bracketed_paste }
@ -183,6 +184,9 @@ func (self *EscapeCodeParser) dispatch_char(ch utils.UTF8State) error {
self.bracketed_paste_buffer = append(self.bracketed_paste_buffer, ch)
if self.bracketed_paste_buffer[len(self.bracketed_paste_buffer)-1] == '~' {
self.reset_state()
if self.HandleEndOfBracketedPaste != nil {
self.HandleEndOfBracketedPaste()
}
}
return nil
} else {