diff --git a/internal/action/command.go b/internal/action/command.go index 7bbfe131d..d07a2ae85 100644 --- a/internal/action/command.go +++ b/internal/action/command.go @@ -141,6 +141,9 @@ func (h *BufPane) TextFilterCmd(args []string) { InfoBar.Error("usage: textfilter arguments") return } + + keepSelection := h.Buf.Settings["textfiltermode"].(string) == "keep-selection" + for _, c := range h.Buf.GetCursors() { sel := c.GetSelection() if len(sel) == 0 { @@ -158,7 +161,17 @@ func (h *BufPane) TextFilterCmd(args []string) { return } c.DeleteSelection() - h.Buf.Insert(c.Loc, bout.String()) + insertStart := c.Loc + insertedText := bout.String() + h.Buf.Insert(c.Loc, insertedText) + + if keepSelection { + charCount := util.CharacterCountInString(insertedText) + insertEnd := insertStart.Move(charCount, h.Buf) + c.SetSelectionStart(insertStart) + c.SetSelectionEnd(insertEnd) + c.Loc = insertEnd + } } } diff --git a/internal/config/settings.go b/internal/config/settings.go index b7097087a..1a33d477b 100644 --- a/internal/config/settings.go +++ b/internal/config/settings.go @@ -36,6 +36,7 @@ var optionValidators = map[string]optionValidator{ "scrollmargin": validateNonNegativeValue, "scrollspeed": validateNonNegativeValue, "tabsize": validatePositiveValue, + "textfiltermode": validateChoice, "truecolor": validateChoice, } @@ -47,6 +48,7 @@ var OptionChoices = map[string][]string{ "matchbracestyle": {"underline", "highlight"}, "multiopen": {"tab", "hsplit", "vsplit"}, "reload": {"prompt", "auto", "disabled"}, + "textfiltermode": {"drop-selection", "keep-selection"}, "truecolor": {"auto", "on", "off"}, } @@ -102,6 +104,7 @@ var defaultCommonSettings = map[string]any{ "tabmovement": false, "tabsize": float64(4), "tabstospaces": false, + "textfiltermode": "drop-selection", "truecolor": "auto", "useprimary": true, "wordwrap": false,