From 85ac76e85a276890b8924ab73d733d22431aab04 Mon Sep 17 00:00:00 2001 From: VERSE Date: Tue, 14 Jul 2026 09:09:16 +0700 Subject: [PATCH] fix(wrapper): skip alias expansion on paste (#38) When you paste text in most modern terminals (Alacritty, iTerm2, Kitty, WezTerm...), the terminal enables bracketed paste mode and wraps the pasted content between two control strings: `\x1b[200~` --> start pasting `\x1b[201~` --> end pasting Previously, iris detected these two strings but didn't track the state. Now I have: Declared `inBracketedPaste := false` before the stdin loop Set `inBracketedPaste = true` when receiving `\x1b[200~`, `false` when receiving `\x1b[201~` Checked `!inBracketedPaste` before triggering the alias expansion reset `inBracketedPaste` on enter/ctrl-c/ctrl-u and when executing --- root/wrapper.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/root/wrapper.go b/root/wrapper.go index 1910358..c43a634 100644 --- a/root/wrapper.go +++ b/root/wrapper.go @@ -547,6 +547,7 @@ func runWrapper() { // for most cases, I just handle the already have terminal shortcuts // for some shortcuts like tab, enter, shift tab, ctrl r, // they have a little bit different behavior to match our tool + inBracketedPaste := false for { inputSlice := make([]byte, 128) n, err := os.Stdin.Read(inputSlice) @@ -556,6 +557,7 @@ func runWrapper() { if n > 0 { if isExecuting() { + inBracketedPaste = false _, _ = ptmx.Write(inputSlice[:n]) continue } @@ -572,7 +574,8 @@ func runWrapper() { if i+5 < n && inputSlice[i+1] == '[' && inputSlice[i+2] == '2' && inputSlice[i+3] == '0' { if (inputSlice[i+4] == '0' || inputSlice[i+4] == '1') && inputSlice[i+5] == '~' { intercepted = true - logger.Debugf("Intercepted bracketed paste event") + inBracketedPaste = inputSlice[i+4] == '0' + logger.Debugf("Intercepted bracketed paste event inPaste=%v", inBracketedPaste) _, _ = ptmx.Write(inputSlice[i : i+6]) i += 5 continue @@ -947,6 +950,7 @@ func runWrapper() { shouldOverlayDraw = true userNavigated.Store(false) case '\r', '\n', 0x03, 0x15: // enter, ctrl+c, ctrl+u: clear buffer on line reset + inBracketedPaste = false bufferMu.Lock() naiveBuffer = "" cursorOffset = 0 @@ -961,9 +965,9 @@ func runWrapper() { default: // track normal printable characters in the buffer for matching if b >= 32 && b <= 126 { - // if user presses space, check if the current word is an alias + // expand alias on space, but only when typing manually (not pasting) bufferMu.Lock() - isSpaceAlias := b == ' ' && naiveBuffer != "" && !strings.Contains(naiveBuffer, " ") + isSpaceAlias := !inBracketedPaste && b == ' ' && naiveBuffer != "" && !strings.Contains(naiveBuffer, " ") var target string var ok bool if isSpaceAlias {