From fe429c6184ea209a70ed4b0def0b15bc5975f08b Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Mon, 20 Jan 2025 17:52:51 +0100 Subject: [PATCH 1/2] Bump gocui --- go.mod | 2 +- go.sum | 4 ++-- vendor/github.com/jesseduffield/gocui/view.go | 2 +- vendor/modules.txt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 89d6d8fb9..8a31b6376 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/integrii/flaggy v1.4.0 github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68 github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d - github.com/jesseduffield/gocui v0.3.1-0.20250111205211-82d518436b5a + github.com/jesseduffield/gocui v0.3.1-0.20250120165138-5935496e64e2 github.com/jesseduffield/kill v0.0.0-20250101124109-e216ddbe133a github.com/jesseduffield/lazycore v0.0.0-20221012050358-03d2e40243c5 github.com/jesseduffield/minimal/gitignore v0.3.3-0.20211018110810-9cde264e6b1e diff --git a/go.sum b/go.sum index 76d556961..7db94843a 100644 --- a/go.sum +++ b/go.sum @@ -188,8 +188,8 @@ github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68 h1:EQP2Tv8T github.com/jesseduffield/generics v0.0.0-20220320043834-727e535cbe68/go.mod h1:+LLj9/WUPAP8LqCchs7P+7X0R98HiFujVFANdNaxhGk= github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d h1:bO+OmbreIv91rCe8NmscRwhFSqkDJtzWCPV4Y+SQuXE= github.com/jesseduffield/go-git/v5 v5.1.2-0.20221018185014-fdd53fef665d/go.mod h1:nGNEErzf+NRznT+N2SWqmHnDnF9aLgANB1CUNEan09o= -github.com/jesseduffield/gocui v0.3.1-0.20250111205211-82d518436b5a h1:GLFWB8rESraTt2eIe2yssy4d4VEkCnmKbPeeZ5vCT2s= -github.com/jesseduffield/gocui v0.3.1-0.20250111205211-82d518436b5a/go.mod h1:sLIyZ2J42R6idGdtemZzsiR3xY5EF0KsvYEGh3dQv3s= +github.com/jesseduffield/gocui v0.3.1-0.20250120165138-5935496e64e2 h1:hTLMy8PImlsblWrKcs3ATfNHT5d1IhW3QUcieMrvnOE= +github.com/jesseduffield/gocui v0.3.1-0.20250120165138-5935496e64e2/go.mod h1:sLIyZ2J42R6idGdtemZzsiR3xY5EF0KsvYEGh3dQv3s= github.com/jesseduffield/kill v0.0.0-20250101124109-e216ddbe133a h1:UDeJ3EBk04bXDLOPvuqM3on8HvyJfISw0+UMqW+0a4g= github.com/jesseduffield/kill v0.0.0-20250101124109-e216ddbe133a/go.mod h1:FSWDLKT0NQpntbDd1H3lbz51fhCVlMzy/J0S6nM727Q= github.com/jesseduffield/lazycore v0.0.0-20221012050358-03d2e40243c5 h1:CDuQmfOjAtb1Gms6a1p5L2P8RhbLUq5t8aL7PiQd2uY= diff --git a/vendor/github.com/jesseduffield/gocui/view.go b/vendor/github.com/jesseduffield/gocui/view.go index 0a54c51c1..248f158a9 100644 --- a/vendor/github.com/jesseduffield/gocui/view.go +++ b/vendor/github.com/jesseduffield/gocui/view.go @@ -787,7 +787,7 @@ func (v *View) writeRunes(p []rune) { } until := len(p) - if until > 0 && p[until-1] == '\n' { + if !v.Editable && until > 0 && p[until-1] == '\n' { v.pendingNewline = true until-- } diff --git a/vendor/modules.txt b/vendor/modules.txt index d45aeefd0..c02415d3d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -171,7 +171,7 @@ github.com/jesseduffield/go-git/v5/utils/merkletrie/filesystem github.com/jesseduffield/go-git/v5/utils/merkletrie/index github.com/jesseduffield/go-git/v5/utils/merkletrie/internal/frame github.com/jesseduffield/go-git/v5/utils/merkletrie/noder -# github.com/jesseduffield/gocui v0.3.1-0.20250111205211-82d518436b5a +# github.com/jesseduffield/gocui v0.3.1-0.20250120165138-5935496e64e2 ## explicit; go 1.12 github.com/jesseduffield/gocui # github.com/jesseduffield/kill v0.0.0-20250101124109-e216ddbe133a From 20d0b4316d01fe523cff0cd78b61ba583e36026e Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sat, 18 Jan 2025 20:03:57 +0100 Subject: [PATCH 2/2] Only avoid the blank line at end of view if view is not editable For editable views it is important to actually show the blank line so that we can put the cursor there for typing. This fixes problems with adding blank lines at the end of longer commit messages. --- .../helpers/confirmation_helper.go | 15 +++--- pkg/gui/patch_exploring/state.go | 2 +- pkg/utils/lines.go | 6 ++- pkg/utils/lines_test.go | 47 ++++++++++++++++++- 4 files changed, 59 insertions(+), 11 deletions(-) diff --git a/pkg/gui/controllers/helpers/confirmation_helper.go b/pkg/gui/controllers/helpers/confirmation_helper.go index f7f6f8720..7a53f9243 100644 --- a/pkg/gui/controllers/helpers/confirmation_helper.go +++ b/pkg/gui/controllers/helpers/confirmation_helper.go @@ -56,8 +56,8 @@ func (self *ConfirmationHelper) DeactivateConfirmationPrompt() { self.clearConfirmationViewKeyBindings() } -func getMessageHeight(wrap bool, message string, width int) int { - wrappedLines, _, _ := utils.WrapViewLinesToWidth(wrap, message, width) +func getMessageHeight(wrap bool, editable bool, message string, width int) int { + wrappedLines, _, _ := utils.WrapViewLinesToWidth(wrap, editable, message, width) return len(wrappedLines) } @@ -265,7 +265,7 @@ func (self *ConfirmationHelper) resizeMenu(parentPopupContext types.Context) { if selectedItem != nil { tooltip = self.TooltipForMenuItem(selectedItem) } - tooltipHeight := getMessageHeight(true, tooltip, contentWidth) + 2 // plus 2 for the frame + tooltipHeight := getMessageHeight(true, false, tooltip, contentWidth) + 2 // plus 2 for the frame _, _ = self.c.GocuiGui().SetView(self.c.Views().Tooltip.Name(), x0, tooltipTop, x1, tooltipTop+tooltipHeight-1, 0) } @@ -276,7 +276,7 @@ func (self *ConfirmationHelper) layoutMenuPrompt(contentWidth int) int { var promptLines []string prompt := self.c.Contexts().Menu.GetPrompt() if len(prompt) > 0 { - promptLines, _, _ = utils.WrapViewLinesToWidth(true, prompt, contentWidth) + promptLines, _, _ = utils.WrapViewLinesToWidth(true, false, prompt, contentWidth) promptLines = append(promptLines, "") } self.c.Contexts().Menu.SetPromptLines(promptLines) @@ -307,11 +307,12 @@ func (self *ConfirmationHelper) resizeConfirmationPanel(parentPopupContext types contentWidth := panelWidth - 2 // minus 2 for the frame prompt := self.c.Views().Confirmation.Buffer() wrap := true - if self.c.Views().Confirmation.Editable { + editable := self.c.Views().Confirmation.Editable + if editable { prompt = self.c.Views().Confirmation.TextArea.GetContent() wrap = false } - panelHeight := getMessageHeight(wrap, prompt, contentWidth) + suggestionsViewHeight + panelHeight := getMessageHeight(wrap, editable, prompt, contentWidth) + suggestionsViewHeight x0, y0, x1, y1 := self.getPopupPanelDimensionsAux(panelWidth, panelHeight, parentPopupContext) confirmationViewBottom := y1 - suggestionsViewHeight _, _ = self.c.GocuiGui().SetView(self.c.Views().Confirmation.Name(), x0, y0, x1, confirmationViewBottom, 0) @@ -324,7 +325,7 @@ func (self *ConfirmationHelper) ResizeCommitMessagePanels(parentPopupContext typ panelWidth := self.getPopupPanelWidth() content := self.c.Views().CommitDescription.TextArea.GetContent() summaryViewHeight := 3 - panelHeight := getMessageHeight(false, content, panelWidth) + panelHeight := getMessageHeight(false, true, content, panelWidth) minHeight := 7 if panelHeight < minHeight { panelHeight = minHeight diff --git a/pkg/gui/patch_exploring/state.go b/pkg/gui/patch_exploring/state.go index 40b2e8706..2b32d1e7f 100644 --- a/pkg/gui/patch_exploring/state.go +++ b/pkg/gui/patch_exploring/state.go @@ -323,6 +323,6 @@ func (s *State) CalculateOrigin(currentOrigin int, bufferHeight int, numLines in func wrapPatchLines(diff string, view *gocui.View) ([]int, []int) { _, viewLineIndices, patchLineIndices := utils.WrapViewLinesToWidth( - view.Wrap, strings.TrimSuffix(diff, "\n"), view.InnerWidth()) + view.Wrap, view.Editable, strings.TrimSuffix(diff, "\n"), view.InnerWidth()) return viewLineIndices, patchLineIndices } diff --git a/pkg/utils/lines.go b/pkg/utils/lines.go index d2ce7fdc6..ebb131c1c 100644 --- a/pkg/utils/lines.go +++ b/pkg/utils/lines.go @@ -109,8 +109,10 @@ func ScanLinesAndTruncateWhenLongerThanBuffer(maxBufferSize int) func(data []byt // - the line indices of the original lines, indexed by the wrapped line indices // If wrap is false, the text is returned as is. // This code needs to behave the same as `gocui.lineWrap` does. -func WrapViewLinesToWidth(wrap bool, text string, width int) ([]string, []int, []int) { - text = strings.TrimSuffix(text, "\n") +func WrapViewLinesToWidth(wrap bool, editable bool, text string, width int) ([]string, []int, []int) { + if !editable { + text = strings.TrimSuffix(text, "\n") + } lines := strings.Split(text, "\n") if !wrap { indices := make([]int, len(lines)) diff --git a/pkg/utils/lines_test.go b/pkg/utils/lines_test.go index c2b90356f..6011cf1fd 100644 --- a/pkg/utils/lines_test.go +++ b/pkg/utils/lines_test.go @@ -170,6 +170,7 @@ func TestWrapViewLinesToWidth(t *testing.T) { tests := []struct { name string wrap bool + editable bool text string width int expectedWrappedLines []string @@ -378,10 +379,53 @@ func TestWrapViewLinesToWidth(t *testing.T) { expectedWrappedLinesIndices: []int{0, 2, 6}, expectedOriginalLinesIndices: []int{0, 0, 1, 1, 1, 1, 2, 2}, }, + { + name: "Avoid blank line at end if not editable", + wrap: true, + editable: false, + text: "First\nSecond\nThird\n", + width: 10, + expectedWrappedLines: []string{ + "First", + "Second", + "Third", + }, + expectedWrappedLinesIndices: []int{0, 1, 2}, + expectedOriginalLinesIndices: []int{0, 1, 2}, + }, + { + name: "Avoid blank line at end if not editable", + wrap: true, + editable: false, + text: "First\nSecond\nThird\n", + width: 10, + expectedWrappedLines: []string{ + "First", + "Second", + "Third", + }, + expectedWrappedLinesIndices: []int{0, 1, 2}, + expectedOriginalLinesIndices: []int{0, 1, 2}, + }, + { + name: "Keep blank line at end if editable", + wrap: true, + editable: true, + text: "First\nSecond\nThird\n", + width: 10, + expectedWrappedLines: []string{ + "First", + "Second", + "Third", + "", + }, + expectedWrappedLinesIndices: []int{0, 1, 2, 3}, + expectedOriginalLinesIndices: []int{0, 1, 2, 3}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - wrappedLines, wrappedLinesIndices, originalLinesIndices := WrapViewLinesToWidth(tt.wrap, tt.text, tt.width) + wrappedLines, wrappedLinesIndices, originalLinesIndices := WrapViewLinesToWidth(tt.wrap, tt.editable, tt.text, tt.width) assert.Equal(t, tt.expectedWrappedLines, wrappedLines) if tt.expectedWrappedLinesIndices != nil { assert.Equal(t, tt.expectedWrappedLinesIndices, wrappedLinesIndices) @@ -394,6 +438,7 @@ func TestWrapViewLinesToWidth(t *testing.T) { view := gocui.NewView("", 0, 0, tt.width+1, 1000, gocui.OutputNormal) assert.Equal(t, tt.width, view.InnerWidth()) view.Wrap = tt.wrap + view.Editable = tt.editable view.SetContent(tt.text) assert.Equal(t, wrappedLines, view.ViewBufferLines()) })