diff --git a/cmd/cmd.go b/cmd/cmd.go index cae35f51..1606e9f1 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -25,7 +25,7 @@ import ( "time" "github.com/containerd/console" - + "github.com/mattn/go-runewidth" "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" "golang.org/x/crypto/ssh" @@ -739,12 +739,13 @@ type displayResponseState struct { wordBuffer string } +// using runewidth instead of len (cus length is number of bytes, we wnat display length) func displayResponse(content string, wordWrap bool, state *displayResponseState) { termWidth, _, _ := term.GetSize(int(os.Stdout.Fd())) if wordWrap && termWidth >= 10 { for _, ch := range content { - if state.lineLength+1 > termWidth-5 { - if len(state.wordBuffer) > termWidth-10 { + if state.lineLength+1 > termWidth - 5 { + if runewidth.StringWidth(state.wordBuffer) > termWidth - 10 { fmt.Printf("%s%c", state.wordBuffer, ch) state.wordBuffer = "" state.lineLength = 0 @@ -752,12 +753,18 @@ func displayResponse(content string, wordWrap bool, state *displayResponseState) } // backtrack the length of the last word and clear to the end of the line - fmt.Printf("\x1b[%dD\x1b[K\n", len(state.wordBuffer)) + fmt.Printf("\x1b[%dD\x1b[K\n", runewidth.StringWidth(state.wordBuffer)) fmt.Printf("%s%c", state.wordBuffer, ch) - state.lineLength = len(state.wordBuffer) + 1 + chWidth := runewidth.RuneWidth(ch) + + state.lineLength = runewidth.StringWidth(state.wordBuffer) + chWidth } else { fmt.Print(string(ch)) - state.lineLength += 1 + state.lineLength += runewidth.RuneWidth(ch) + if runewidth.RuneWidth(ch) >= 2 { + state.wordBuffer = "" + continue + } switch ch { case ' ':