summaryrefslogtreecommitdiff
path: root/internal/viinput/edit.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/viinput/edit.go')
-rw-r--r--internal/viinput/edit.go61
1 files changed, 53 insertions, 8 deletions
diff --git a/internal/viinput/edit.go b/internal/viinput/edit.go
index 1f89e62..98a6be1 100644
--- a/internal/viinput/edit.go
+++ b/internal/viinput/edit.go
@@ -40,20 +40,65 @@ func (m *Model) insertText(text string) {
}
func (m *Model) deleteBeforeCursor() {
- if m.cursor <= 0 || len(m.runes) == 0 {
- return
+ m.deleteRange(m.cursor-1, m.cursor)
+}
+
+func (m *Model) deleteAtCursor() {
+ m.deleteRange(m.cursor, m.cursor+1)
+}
+
+func (m *Model) deleteLine() {
+ m.deleteRange(0, len(m.runes))
+}
+
+func (m *Model) deleteToLineEnd() {
+ m.deleteRange(m.cursor, len(m.runes))
+}
+
+func (m *Model) deleteFromLineStart() {
+ m.deleteRange(0, m.cursor)
+}
+
+func (m *Model) deleteWordForward() {
+ m.deleteRange(m.cursor, wordForward(m.runes, m.cursor))
+}
+
+func (m *Model) deleteWordEnd() {
+ end := wordEnd(m.runes, m.cursor)
+ if end < len(m.runes) {
+ end++
}
+ m.deleteRange(m.cursor, end)
+}
- m.snapshot()
- m.runes = append(append([]rune(nil), m.runes[:m.cursor-1]...), m.runes[m.cursor:]...)
- m.cursor--
+func (m *Model) deleteWordBackward() {
+ m.deleteRange(wordBackward(m.runes, m.cursor), m.cursor)
}
-func (m *Model) deleteAtCursor() {
- if len(m.runes) == 0 || m.cursor >= len(m.runes) {
+func (m *Model) changeToLineEnd() {
+ m.deleteToLineEnd()
+ m.mode = ModeInsert
+ m.pending = 0
+}
+
+func (m *Model) deleteRange(start, end int) {
+ if len(m.runes) == 0 {
+ return
+ }
+
+ start = clampInt(start, 0, len(m.runes))
+ end = clampInt(end, 0, len(m.runes))
+ if start > end {
+ start, end = end, start
+ }
+ if start == end {
return
}
m.snapshot()
- m.runes = append(append([]rune(nil), m.runes[:m.cursor]...), m.runes[m.cursor+1:]...)
+ next := make([]rune, 0, len(m.runes)-(end-start))
+ next = append(next, m.runes[:start]...)
+ next = append(next, m.runes[end:]...)
+ m.runes = next
+ m.cursor = start
}