Improve performance when pasting large amounts of text into readline by not redrawing on every char
This commit is contained in:
parent
c0f17c279e
commit
834385baff
@ -61,6 +61,7 @@ type Loop struct {
|
|||||||
OnKeyEvent func(event *KeyEvent) error
|
OnKeyEvent func(event *KeyEvent) error
|
||||||
|
|
||||||
// Called when text is received either from a key event or directly from the terminal
|
// 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
|
OnText func(text string, from_key_event bool, in_bracketed_paste bool) error
|
||||||
|
|
||||||
// Called when the terminal is resized
|
// Called when the terminal is resized
|
||||||
|
|||||||
@ -31,6 +31,7 @@ func new_loop() *Loop {
|
|||||||
l.escape_code_parser.HandleSOS = l.handle_sos
|
l.escape_code_parser.HandleSOS = l.handle_sos
|
||||||
l.escape_code_parser.HandlePM = l.handle_pm
|
l.escape_code_parser.HandlePM = l.handle_pm
|
||||||
l.escape_code_parser.HandleRune = l.handle_rune
|
l.escape_code_parser.HandleRune = l.handle_rune
|
||||||
|
l.escape_code_parser.HandleEndOfBracketedPaste = l.handle_end_of_bracketed_paste
|
||||||
return &l
|
return &l
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,6 +129,12 @@ func (self *Loop) handle_rune(raw rune) error {
|
|||||||
return nil
|
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 {
|
func (self *Loop) on_signal(s unix.Signal) error {
|
||||||
switch s {
|
switch s {
|
||||||
case unix.SIGINT:
|
case unix.SIGINT:
|
||||||
|
|||||||
@ -4,6 +4,7 @@ package readline
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"kitty/tools/tui/loop"
|
"kitty/tools/tui/loop"
|
||||||
"kitty/tools/wcswidth"
|
"kitty/tools/wcswidth"
|
||||||
@ -59,7 +60,8 @@ type Readline struct {
|
|||||||
// Input lines
|
// Input lines
|
||||||
lines []string
|
lines []string
|
||||||
// The cursor position in the text
|
// The cursor position in the text
|
||||||
cursor Position
|
cursor Position
|
||||||
|
bracketed_paste_buffer strings.Builder
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(loop *loop.Loop, r RlInit) *Readline {
|
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 {
|
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)
|
self.add_text(text)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,13 +46,14 @@ type EscapeCodeParser struct {
|
|||||||
current_callback func([]byte) error
|
current_callback func([]byte) error
|
||||||
|
|
||||||
// Callbacks
|
// Callbacks
|
||||||
HandleRune func(rune) error
|
HandleRune func(rune) error
|
||||||
HandleCSI func([]byte) error
|
HandleEndOfBracketedPaste func()
|
||||||
HandleOSC func([]byte) error
|
HandleCSI func([]byte) error
|
||||||
HandleDCS func([]byte) error
|
HandleOSC func([]byte) error
|
||||||
HandlePM func([]byte) error
|
HandleDCS func([]byte) error
|
||||||
HandleSOS func([]byte) error
|
HandlePM func([]byte) error
|
||||||
HandleAPC func([]byte) error
|
HandleSOS func([]byte) error
|
||||||
|
HandleAPC func([]byte) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *EscapeCodeParser) InBracketedPaste() bool { return self.state == bracketed_paste }
|
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)
|
self.bracketed_paste_buffer = append(self.bracketed_paste_buffer, ch)
|
||||||
if self.bracketed_paste_buffer[len(self.bracketed_paste_buffer)-1] == '~' {
|
if self.bracketed_paste_buffer[len(self.bracketed_paste_buffer)-1] == '~' {
|
||||||
self.reset_state()
|
self.reset_state()
|
||||||
|
if self.HandleEndOfBracketedPaste != nil {
|
||||||
|
self.HandleEndOfBracketedPaste()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user