From ce625aca0cb1b9218b4652216ef76e1f73d6ff3c Mon Sep 17 00:00:00 2001 From: sammyette <38820196+TorchedSammy@users.noreply.github.com> Date: Tue, 12 Apr 2022 23:08:44 -0400 Subject: [PATCH] feat: add ctrl delete to forward delete word (#138) * feat: add ctrl delete to forward delete word (closes #124) * fix: make delete word function accurately * fix: make ctrl delete work on st --- readline/codes.go | 2 ++ readline/line.go | 24 ++++++++++++++++++++++++ readline/readline.go | 13 +++++++++++++ 3 files changed, 39 insertions(+) diff --git a/readline/codes.go b/readline/codes.go index e524bc6..56d44fb 100644 --- a/readline/codes.go +++ b/readline/codes.go @@ -49,6 +49,8 @@ var ( seqEndSc = string([]byte{27, 91, 52, 126}) seqDelete = string([]byte{27, 91, 51, 126}) seqDelete2 = string([]byte{27, 91, 80}) + seqCtrlDelete = string([]byte{27, 91, 51, 59, 53, 126}) + seqCtrlDelete2 = string([]byte{27, 91, 77}) seqShiftTab = string([]byte{27, 91, 90}) seqAltQuote = string([]byte{27, 34}) // Added for showing registers ^[" seqAltR = string([]byte{27, 114}) // Used for alternative history 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 c8d485a..939b288 100644 --- a/readline/readline.go +++ b/readline/readline.go @@ -786,6 +786,19 @@ func (rl *Instance) escapeSeq(r []rune) { rl.viDeleteByAdjust(rl.viJumpB(tokeniseLine)) rl.updateHelpers() + case seqCtrlDelete, seqCtrlDelete2: + if rl.modeTabCompletion { + rl.resetVirtualComp(false) + } + // This is only available in Insert mode + if rl.modeViMode != VimInsert { + return + } + rl.saveToRegister(rl.emacsForwardWord(tokeniseLine)) + // vi delete, emacs forward, funny huh + rl.viDeleteByAdjust(rl.emacsForwardWord(tokeniseLine)) + rl.updateHelpers() + default: if rl.modeTabFind { return