fix(ghost text): key reading loop conflict

This commit is contained in:
verse91
2026-04-19 12:52:16 +07:00
parent 5c8ac9e4a6
commit 27c7b97326
+14 -11
View File
@@ -12,6 +12,7 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"sync" "sync"
"sync/atomic"
"syscall" "syscall"
"time" "time"
@@ -162,6 +163,8 @@ func runWrapper() {
} }
}() }()
var disableGhostText atomic.Bool
// listen for suggestion requests from shell scripts via the ipc pipe // listen for suggestion requests from shell scripts via the ipc pipe
go func() { go func() {
scanner := bufio.NewScanner(r) scanner := bufio.NewScanner(r)
@@ -188,7 +191,9 @@ func runWrapper() {
os.Stdout.Write([]byte(overlay.Clear())) os.Stdout.Write([]byte(overlay.Clear()))
overlay.UpdateItems(results) overlay.UpdateItems(results)
var rBuf strings.Builder var rBuf strings.Builder
if !disableGhostText.Load() {
rBuf.WriteString(overlay.RenderGhostText(query)) rBuf.WriteString(overlay.RenderGhostText(query))
}
rBuf.WriteString(overlay.Render()) rBuf.WriteString(overlay.Render())
os.Stdout.Write([]byte(rBuf.String())) os.Stdout.Write([]byte(rBuf.String()))
} }
@@ -201,10 +206,8 @@ func runWrapper() {
var renderTimer *time.Timer var renderTimer *time.Timer
var renderMu sync.Mutex var renderMu sync.Mutex
disableGhostText := false
// renderOverlay decides whether to draw the suggestion menu based on current state // renderOverlay decides whether to draw the suggestion menu based on current state
renderOverlay := func(disableGhost bool) { renderOverlay := func() {
renderMu.Lock() renderMu.Lock()
defer renderMu.Unlock() defer renderMu.Unlock()
@@ -240,7 +243,7 @@ func runWrapper() {
b.WriteString(overlay.Clear()) b.WriteString(overlay.Clear())
} }
overlay.UpdateItems(results) overlay.UpdateItems(results)
if !disableGhost { if !disableGhostText.Load() {
b.WriteString(overlay.RenderGhostText(bufCopy)) b.WriteString(overlay.RenderGhostText(bufCopy))
} }
b.WriteString(overlay.Render()) b.WriteString(overlay.Render())
@@ -249,7 +252,7 @@ func runWrapper() {
}) })
} }
renderOverlay(disableGhostText) renderOverlay()
// reads from stdin and decides what to forward or intercept // reads from stdin and decides what to forward or intercept
// for most cases, I just handle the already have terminal shortcuts // for most cases, I just handle the already have terminal shortcuts
@@ -298,14 +301,14 @@ func runWrapper() {
} }
} }
var rBuf strings.Builder var rBuf strings.Builder
if !disableGhostText { if !disableGhostText.Load() {
rBuf.WriteString(overlay.RenderGhostText(naiveBuffer)) rBuf.WriteString(overlay.RenderGhostText(naiveBuffer))
} }
rBuf.WriteString(overlay.Render()) rBuf.WriteString(overlay.Render())
os.Stdout.Write([]byte(rBuf.String())) os.Stdout.Write([]byte(rBuf.String()))
i += 2 i += 2
continue continue
} else if overlay.Visible && inputSlice[i+2] == 'C' { // right arrow } else if overlay.Visible && !disableGhostText.Load() && inputSlice[i+2] == 'C' { // right arrow
topCmd := overlay.Items[0].Cmd topCmd := overlay.Items[0].Cmd
if strings.HasPrefix(strings.ToLower(topCmd), strings.ToLower(naiveBuffer)) { if strings.HasPrefix(strings.ToLower(topCmd), strings.ToLower(naiveBuffer)) {
ghostText := topCmd[len(naiveBuffer):] ghostText := topCmd[len(naiveBuffer):]
@@ -323,7 +326,7 @@ func runWrapper() {
// forward escape sequence to pty if not intercepted // forward escape sequence to pty if not intercepted
os.Stdout.Write([]byte(overlay.ClearAndDisable())) os.Stdout.Write([]byte(overlay.ClearAndDisable()))
disableGhostText = true disableGhostText.Store(true)
naiveBuffer = "" naiveBuffer = ""
ptmx.Write([]byte{b}) ptmx.Write([]byte{b})
@@ -357,7 +360,7 @@ func runWrapper() {
os.Stdout.Write([]byte(overlay.ClearAndDisable())) os.Stdout.Write([]byte(overlay.ClearAndDisable()))
ptmx.Write([]byte{0x0d}) ptmx.Write([]byte{0x0d})
naiveBuffer = "" naiveBuffer = ""
disableGhostText = false disableGhostText.Store(false)
shouldOverlayDraw = false shouldOverlayDraw = false
continue continue
} else if b == 0x09 { // tab: select suggestions } else if b == 0x09 { // tab: select suggestions
@@ -403,7 +406,7 @@ func runWrapper() {
shouldOverlayDraw = true shouldOverlayDraw = true
case '\r', 0x03, 0x15, 0x0C: // enter, ctrl+c, ctrl+u, ctrl+l: clear buffer on line reset case '\r', 0x03, 0x15, 0x0C: // enter, ctrl+c, ctrl+u, ctrl+l: clear buffer on line reset
naiveBuffer = "" naiveBuffer = ""
disableGhostText = false disableGhostText.Store(false)
os.Stdout.Write([]byte(overlay.ClearAndDisable())) os.Stdout.Write([]byte(overlay.ClearAndDisable()))
default: default:
// track normal printable characters in the buffer for matching // track normal printable characters in the buffer for matching
@@ -426,7 +429,7 @@ func runWrapper() {
} }
} }
if shouldOverlayDraw { if shouldOverlayDraw {
renderOverlay(disableGhostText) renderOverlay()
} }
} }
} }