From 29d70f27c508206da27b500ad9b11242bea31acc Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Fri, 13 Dec 2024 17:35:24 +0200 Subject: Implemented B motion in vimniput --- internal/client/ui/viminput/viminput.go | 58 +++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'internal/client/ui/viminput/viminput.go') diff --git a/internal/client/ui/viminput/viminput.go b/internal/client/ui/viminput/viminput.go index 274b7f0..8a5d96c 100644 --- a/internal/client/ui/viminput/viminput.go +++ b/internal/client/ui/viminput/viminput.go @@ -577,6 +577,64 @@ func (m *Model) Motion(motion string) (line, col int) { } return lnum, i - 1 } + case "B": + lnum := m.cursorLine + col := m.cursorColumn + for { + line := m.lines[lnum] + isFirstLine := lnum == 0 + isColAtStart := col == 0 + + // Skip if empty + if len(line) == 0 && !isFirstLine { + lnum-- + col = len(m.lines[lnum]) - 1 + continue + } + + // Search previous whitespace + i, ok := SearchCharFunc(line, col-1, -1, unicode.IsSpace) + if !ok { + if isFirstLine || !isColAtStart { + return lnum, 0 + } + lnum-- + col = len(m.lines[lnum]) - 1 + continue + } + + // Found next word - Simple case + if i+1 != col { + return lnum, i + 1 + } + + // Search end of previous word + i, ok = SearchCharFunc(line, col-1, -1, func(c rune) bool { + return !unicode.IsSpace(c) + }) + if !ok { + if isFirstLine { + return lnum, 0 + } + lnum-- + col = len(m.lines[lnum]) - 1 + continue + } + + // Previous word exists, find it's start + i, ok = SearchCharFunc(line, i, -1, unicode.IsSpace) + if !ok { + if isFirstLine || !isColAtStart { + return lnum, 0 + } + // If at the start, continue to previous line (if it exists) + lnum-- + col = len(m.lines[lnum]) - 1 + continue + } + return lnum, i + 1 + } + default: return Unchanged, Unchanged } -- cgit v1.3.1