summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2024-12-16 16:46:41 +0200
committerKyren223 <Kyren223@proton.me>2024-12-16 16:46:41 +0200
commitb0bb27ca25e70fca520cff5603bf13877eb5cb45 (patch)
tree827b921fdec6444d627b639beb73b6b1928714d8
parent0a0492156aace08c06ba163e63d5db2de0de3588 (diff)
Implemented multiline x/d/c in visual mode and fixed a bug in visual
mode where multiline yank caused crashes/was incorrect
-rw-r--r--internal/client/ui/viminput/viminput.go28
1 files changed, 25 insertions, 3 deletions
diff --git a/internal/client/ui/viminput/viminput.go b/internal/client/ui/viminput/viminput.go
index a986e2e..87bb577 100644
--- a/internal/client/ui/viminput/viminput.go
+++ b/internal/client/ui/viminput/viminput.go
@@ -1521,13 +1521,15 @@ func (m *Model) handleVisualModeKeys(key tea.KeyMsg) {
var builder strings.Builder
builder.WriteString(string(m.lines[lower][lowerCol:]))
builder.WriteByte('\n')
- for i := lower - 1; i < upper; i++ {
+ for i := lower + 1; i < upper; i++ {
builder.WriteString(string(m.lines[i]))
builder.WriteByte('\n')
}
builder.WriteString(string(m.lines[upper][:upperCol]))
- if upperCol == len(m.lines[upperCol]) {
+ if upperCol == len(m.lines[upper]) {
builder.WriteByte('\n')
+ } else {
+ builder.WriteRune(m.lines[upper][upperCol])
}
m.Yank(builder.String())
}
@@ -1569,7 +1571,27 @@ func (m *Model) handleVisualModeKeys(key tea.KeyMsg) {
m.SetCursorColumn(lowerCol)
}
} else {
- // TODO: multiline support for x/d/c
+ lowerCol := m.vcol
+ upperCol := m.cursorColumn
+ if m.vline > m.cursorLine {
+ lowerCol = m.cursorColumn
+ upperCol = m.vcol
+ }
+ lowerLine := m.lines[lower]
+ upperLine := m.lines[upper]
+
+ lowerLine = lowerLine[:lowerCol]
+ if upperCol != len(upperLine) {
+ lowerLine = append(lowerLine, upperLine[upperCol+1:]...)
+ } else if upper != len(m.lines)-1 {
+ lowerLine = append(lowerLine, m.lines[upper+1]...)
+ m.lines = slices.Delete(m.lines, upper+1, upper+2)
+ }
+ m.lines = slices.Delete(m.lines, lower+1, upper+1)
+
+ m.lines[lower] = lowerLine
+ m.SetCursorLine(lower)
+ m.SetCursorColumn(lowerCol)
}
if motion == "c" {