diff --git a/readline/line.go b/readline/line.go index 5b3b282..274d11b 100644 --- a/readline/line.go +++ b/readline/line.go @@ -182,3 +182,27 @@ func (rl *Instance) deleteToEnd() { // Keep everything before the cursor rl.line = rl.line[:rl.pos] } + +func (rl *Instance) emacsForwardWord(tokeniser tokeniser) (adjust int) { + // when emacs has more specific stuff, move this in a file with then + split, index, pos := tokeniser(rl.line, rl.pos) + if len(split) == 0 { + return + } + + word := rTrimWhiteSpace(split[index]) + + switch { + case len(split) == 0: + return + case index == len(split)-1 && pos >= len(word)-1: + return + case pos >= len(word)-1: + word = rTrimWhiteSpace(split[index+1]) + adjust = len(split[index]) - pos + adjust += len(word) + default: + adjust = len(word) - pos + } + return +} diff --git a/readline/readline.go b/readline/readline.go index b4ae201..b897811 100644 --- a/readline/readline.go +++ b/readline/readline.go @@ -785,8 +785,9 @@ func (rl *Instance) escapeSeq(r []rune) { if rl.modeViMode != VimInsert { return } - rl.saveToRegister(rl.viJumpW(tokeniseLine)) - rl.viDeleteByAdjust(rl.viJumpW(tokeniseLine)) + rl.saveToRegister(rl.emacsForwardWord(tokeniseLine)) + // vi delete, emacs forward, funny huh + rl.viDeleteByAdjust(rl.emacsForwardWord(tokeniseLine)) rl.updateHelpers() default: