mirror of
https://github.com/junegunn/fzf.git
synced 2026-10-10 07:15:58 +08:00
Wait for rest of escape sequence before parsing (#4901)
Read loop dropped its escDelay retry budget after every successful byte,
so a sequence split across reads reached the parser as a fragment, parsed
as ALT-[ with the remainder left behind as query text.
- fzf queries DECRQM at startup since dab626b, so a terminal answering
late leaked "?2004;2$y" into the query
- Same split leaked modified keys and mouse sequences: CTRL-UP left "5A",
SGR mouse left "0;1;1M"
- Bound unchanged, a stall longer than escDelay still falls back to ALT
Fix #4899
This commit is contained in:
1 parent
5cb7bab702
commit
d0377ed4dc
2 files changed
+98
No files matched your search
@@ -0,0 +1,53 @@
|
||||
package tui
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestIncompleteEscape(t *testing.T) {
|
||||
for _, c := range []struct {
|
||||
buffer string
|
||||
want bool
|
||||
}{
|
||||
// Complete sequences: nothing to wait for
|
||||
{"\x1b[A", false},
|
||||
{"\x1bOA", false},
|
||||
{"\x1b[1;5A", false},
|
||||
{"\x1b[200~", false},
|
||||
{"\x1b[<0;1;1M", false},
|
||||
{"\x1b[12;34R", false},
|
||||
{"\x1b[?2004;2$y", false},
|
||||
{"\x1b[?1;2c", false},
|
||||
|
||||
// Fragments: keep waiting
|
||||
{"\x1b[", true},
|
||||
{"\x1b[?", true},
|
||||
{"\x1b[1;", true},
|
||||
{"\x1b[?2004;2$", true},
|
||||
{"\x1bO", true},
|
||||
{"\x1b[<0;1;", true},
|
||||
|
||||
// Only the trailing sequence matters
|
||||
{"ab\x1b[?2004;2$", true},
|
||||
{"\x1b[A\x1b[", true},
|
||||
{"\x1b[A\x1b[B", false},
|
||||
|
||||
// Long buffers: only the tail is scanned, so an introducer further
|
||||
// back than escapeLookback is not waited for
|
||||
{strings.Repeat("a", 100000), false},
|
||||
{"\x1b[" + strings.Repeat("a", 100000), false},
|
||||
{strings.Repeat("a", 100000) + "\x1b[1;", true},
|
||||
|
||||
// Not a sequence fzf waits on
|
||||
{"", false},
|
||||
{"abc", false},
|
||||
{"\x1b", false}, // lone ESC, handled by the existing escDelay branch
|
||||
{"\x1ba", false}, // ALT-a
|
||||
{"\x1b[\x01", false}, // malformed, do not stall on it
|
||||
} {
|
||||
if got := incompleteEscape([]byte(c.buffer)); got != c.want {
|
||||
t.Errorf("incompleteEscape(%q) = %v, want %v", c.buffer, got, c.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user