github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/utils/readline/update.go (about) 1 package readline 2 3 func (rl *Instance) insertStr(r []rune) string { 4 for { 5 // I don't really understand why `0` is creeping in at the end of the 6 // array but it only happens with unicode characters. Also have a similar 7 // annoyance with \r when copy/pasting from iTerm. 8 if len(r) > 1 && (r[len(r)-1] == 0 || r[len(r)-1] == '\r') { 9 r = r[:len(r)-1] 10 continue 11 } 12 break 13 } 14 15 switch { 16 case rl.line.RuneLen() == 0: 17 rl.line.Set(rl, r) 18 19 case rl.line.RunePos() == 0: 20 rl.line.Set(rl, append(r, rl.line.Runes()...)) 21 22 case rl.line.RunePos() < rl.line.RuneLen(): 23 value := rl.line.Runes() 24 new := append(r, value[rl.line.RunePos():]...) 25 new = append(value[:rl.line.RunePos()], new...) 26 rl.line.Set(rl, new) 27 28 default: 29 rl.line.Set(rl, append(rl.line.Runes(), r...)) 30 } 31 32 output := rl.moveCursorByRuneAdjustStr(len(r)) 33 output += rl.echoStr() 34 35 // TODO: check me 36 if rl.modeViMode == vimInsert { 37 output += rl.updateHelpersStr() 38 } 39 40 return output 41 } 42 43 func (rl *Instance) backspaceStr() string { 44 if rl.line.RuneLen() == 0 || rl.line.RunePos() == 0 { 45 return "" 46 } 47 48 rl.line.SetRunePos(rl.line.RunePos() - 1) 49 return rl.deleteStr() 50 } 51 52 func (rl *Instance) deleteStr() string { 53 var output string 54 switch { 55 case rl.line.RuneLen() == 0: 56 return "" 57 58 case rl.line.RunePos() == 0: 59 rl.line.Set(rl, rl.line.Runes()[1:]) 60 output = rl.echoStr() 61 62 case rl.line.RunePos() > rl.line.RuneLen(): 63 output = rl.backspaceStr() 64 return output 65 66 case rl.line.RunePos() == rl.line.RuneLen(): 67 rl.line.Set(rl, rl.line.Runes()[:rl.line.RunePos()]) 68 output = rl.echoStr() 69 70 default: 71 rl.line.Set(rl, append(rl.line.Runes()[:rl.line.RunePos()], rl.line.Runes()[rl.line.RunePos()+1:]...)) 72 output = rl.echoStr() 73 } 74 75 output += rl.updateHelpersStr() 76 return output 77 }