peterh / liner

Pure Go line editor with history, inspired by linenoise
MIT License
1.05k stars 132 forks source link

"Ghost cursor" artifact left behind after user types a line on Windows 10 #155

Open shueybubbles opened 2 years ago

shueybubbles commented 2 years ago

I'm evaluating line input modules to use for my Golang version of sqlcmd (github.com/microsoft/go-sqlcmd) So far liner looks like a good candidate except for this display glitch. I can't tell if it's a Windows problem or an issue with the module. When my process exits the ghost cursor images disappear.

package main

import (
    "fmt"

    "github.com/peterh/liner"
)

func main() {
    line := liner.NewLiner()
    defer line.Close()
    text := ""
    var err error
    for text != "q" {
        text, err = line.Prompt("Prompt:")
        if err == nil {
            fmt.Println("You typed:" + text)
        }
    }
}

image

image

peterh commented 2 years ago

Liner doesn't draw the cursor, it is up to the Windows Console (or terminal emulator on other platforms) to draw the cursor.

I use a program built with Liner on Windows every day. I don't recall seeing that particular issue in the past few years, but I switched from "Command Prompt" (aka "Windows Console") to "Windows Terminal" as soon as it became available. (You can get Windows Terminal from the Windows Store, and I believe Windows Terminal is the default on Windows 11), and my Windows Terminal configuration uses a block cursor instead of the underline cursor shown in your screenshot.

shueybubbles commented 2 years ago

@peterh I have another report of my app causing the bash window on a Mac to behave oddly after the app exits. The issue they opened is https://github.com/microsoft/go-sqlcmd/issues/87 "but go-sqlcmd still makes bash shell command line behave erratically after exiting sqlcmd."

Might you have a few minutes to look at our use of liner to make sure we're not using it in some obviously incorrect manner? Our wrapper class for it is at https://github.com/microsoft/go-sqlcmd/blob/e3972914801bc3492b49b6fe642a7e931e088be3/pkg/console/console.go#L24

There are probably several other go packages I could replace it with for reading lines but picking from the vast set to land on one that meets all our needs can take a while, so I'm hoping I can get liner to work.

shueybubbles commented 2 years ago

Would forgetting to call Close() before exiting the process cause any such issues in a shell?

peterh commented 2 years ago

Would forgetting to call Close() before exiting the process cause any such issues in a shell?

Yes. You must call Close() or the tty will be left in an indeterminate state.