From ac0b89366b5a3c49ea4f9cd1201f1cd8416ea408 Mon Sep 17 00:00:00 2001 From: dwwmmn Date: Fri, 30 Mar 2018 16:40:45 -0400 Subject: [PATCH] Implement SpawnMultiCursorSelect (#1046) Add function to actions.go which adds a new cursor to the beginning of each line of a selection. Bind to Ctrl-M by default. --- cmd/micro/actions.go | 48 +++++++++++++++++++++++++++++++++++++ cmd/micro/bindings.go | 2 ++ runtime/help/keybindings.md | 1 + 3 files changed, 51 insertions(+) diff --git a/cmd/micro/actions.go b/cmd/micro/actions.go index b9af7f6d..21179e3b 100644 --- a/cmd/micro/actions.go +++ b/cmd/micro/actions.go @@ -2144,6 +2144,54 @@ func (v *View) SpawnMultiCursor(usePlugin bool) bool { return false } +// SpawnMultiCursorSelect adds a cursor at the beginning of each line of a selection +func (v *View) SpawnMultiCursorSelect(usePlugin bool) bool { + if v.Cursor == &v.Buf.Cursor { + if usePlugin && !PreActionCall("SpawnMultiCursorSelect", v) { + return false + } + + // Avoid cases where multiple cursors already exist, that would create problems + if len(v.Buf.cursors) > 1 { + return false + } + + var startLine int + var endLine int + + a, b := v.Cursor.CurSelection[0].Y, v.Cursor.CurSelection[1].Y + if a > b { + startLine, endLine = b, a + } else { + startLine, endLine = a, b + } + + if v.Cursor.HasSelection() { + v.Cursor.ResetSelection() + v.Cursor.GotoLoc(Loc{0, startLine}) + + for i := startLine; i <= endLine; i++ { + c := &Cursor{ + buf: v.Buf, + } + c.GotoLoc(Loc{0, i}) + v.Buf.cursors = append(v.Buf.cursors, c) + } + v.Buf.MergeCursors() + v.Buf.UpdateCursors() + } else { + return false + } + + if usePlugin { + PostActionCall("SpawnMultiCursorSelect", v) + } + + messenger.Message("Added cursors from selection") + } + return false +} + // MouseMultiCursor is a mouse action which puts a new cursor at the mouse position func (v *View) MouseMultiCursor(usePlugin bool, e *tcell.EventMouse) bool { if v.Cursor == &v.Buf.Cursor { diff --git a/cmd/micro/bindings.go b/cmd/micro/bindings.go index f70e5823..cc24a2b3 100644 --- a/cmd/micro/bindings.go +++ b/cmd/micro/bindings.go @@ -109,6 +109,7 @@ var bindingActions = map[string]func(*View, bool) bool{ "ScrollUp": (*View).ScrollUpAction, "ScrollDown": (*View).ScrollDownAction, "SpawnMultiCursor": (*View).SpawnMultiCursor, + "SpawnMultiCursorSelect":(*View).SpawnMultiCursorSelect, "RemoveMultiCursor": (*View).RemoveMultiCursor, "RemoveAllMultiCursors": (*View).RemoveAllMultiCursors, "SkipMultiCursor": (*View).SkipMultiCursor, @@ -600,6 +601,7 @@ func DefaultBindings() map[string]string { "Ctrl-MouseLeft": "MouseMultiCursor", "Alt-n": "SpawnMultiCursor", + "CtrlM": "SpawnMultiCursorSelect", "Alt-p": "RemoveMultiCursor", "Alt-c": "RemoveAllMultiCursors", "Alt-x": "SkipMultiCursor", diff --git a/runtime/help/keybindings.md b/runtime/help/keybindings.md index dfee40b6..4290cd1e 100644 --- a/runtime/help/keybindings.md +++ b/runtime/help/keybindings.md @@ -464,6 +464,7 @@ MouseWheelRight // Multiple cursors bindings "Alt-n": "SpawnMultiCursor", + "CtrlM": "SpawnMultiCursorSelect", "Alt-p": "RemoveMultiCursor", "Alt-c": "RemoveAllMultiCursors", "Alt-x": "SkipMultiCursor",