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  }