on main help sign in
feat: open editor in the right position (#1803)

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

commit7c99274dd8a8cbbd0afadbadfc0ae550854a9c23 authorCarlos Alexandro Becker <caarlos0@users.noreply.github.com> dateFri 9 Jan 2026, 08:38 (9 months ago) parentfa5c593
3 files changed+19−16
go.mod+2−1 go.sum+4−2 internal/ui/model/ui.go+13−13
go.mod+2−1
@@ -3,7 +3,7 @@ module github.com/charmbracelet/crush
33go 1.25.5
44
55require (
6− charm.land/bubbles/v2 v2.0.0-rc.1
6+ charm.land/bubbles/v2 v2.0.0-rc.1.0.20260109112849-ae99f46cec66
77 charm.land/bubbletea/v2 v2.0.0-rc.2.0.20251216153312-819e2e89c62e
88 charm.land/fantasy v0.6.0
99 charm.land/glamour/v2 v2.0.0-20251110203732-69649f93d3b1
@@ -23,6 +23,7 @@ require (
2323 github.com/charmbracelet/fang v0.4.4
2424 github.com/charmbracelet/ultraviolet v0.0.0-20251212194010-b927aa605560
2525 github.com/charmbracelet/x/ansi v0.11.3
26+ github.com/charmbracelet/x/editor v0.2.0
2627 github.com/charmbracelet/x/etag v0.2.0
2728 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3
2829 github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f
go.sum+4−2
@@ -1,5 +1,5 @@
1−charm.land/bubbles/v2 v2.0.0-rc.1 h1:EiIFVAc3Zi/yY86td+79mPhHR7AqZ1OxF+6ztpOCRaM=
2−charm.land/bubbles/v2 v2.0.0-rc.1/go.mod h1:5AbN6cEd/47gkEf8TgiQ2O3RZ5QxMS14l9W+7F9fPC4=
1+charm.land/bubbles/v2 v2.0.0-rc.1.0.20260109112849-ae99f46cec66 h1:2BdJynsAW+8rv9xq6ZS+x0mtacfxpxjIK1KUIeTqBOs=
2+charm.land/bubbles/v2 v2.0.0-rc.1.0.20260109112849-ae99f46cec66/go.mod h1:5AbN6cEd/47gkEf8TgiQ2O3RZ5QxMS14l9W+7F9fPC4=
33charm.land/bubbletea/v2 v2.0.0-rc.2.0.20251216153312-819e2e89c62e h1:tXwTmgGpwZT7ParKF5xbEQBVjM2e1uKhKi/GpfU3mYQ=
44charm.land/bubbletea/v2 v2.0.0-rc.2.0.20251216153312-819e2e89c62e/go.mod h1:pDM18flq3Z4njKZPA3zCvyVSSIJbMcoqlE82BdGUtL8=
55charm.land/fantasy v0.6.0 h1:0PZfZ/w6c70UdlumGGFW6s9zTV6f4xAV/bXo6vGuZsc=
@@ -104,6 +104,8 @@ github.com/charmbracelet/ultraviolet v0.0.0-20251212194010-b927aa605560 h1:j3PW2
104104github.com/charmbracelet/ultraviolet v0.0.0-20251212194010-b927aa605560/go.mod h1:VWATWLRwYP06VYCEur7FsNR2B1xAo7Y+xl1PTbd1ePc=
105105github.com/charmbracelet/x/ansi v0.11.3 h1:6DcVaqWI82BBVM/atTyq6yBoRLZFBsnoDoX9GCu2YOI=
106106github.com/charmbracelet/x/ansi v0.11.3/go.mod h1:yI7Zslym9tCJcedxz5+WBq+eUGMJT0bM06Fqy1/Y4dI=
107+github.com/charmbracelet/x/editor v0.2.0 h1:7XLUKtaRaB8jN7bWU2p2UChiySyaAuIfYiIRg8gGWwk=
108+github.com/charmbracelet/x/editor v0.2.0/go.mod h1:p3oQ28TSL3YPd+GKJ1fHWcp+7bVGpedHpXmo0D6t1dY=
107109github.com/charmbracelet/x/etag v0.2.0 h1:Euj1VkheoHfTYA9y+TCwkeXF/hN8Fb9l4LqZl79pt04=
108110github.com/charmbracelet/x/etag v0.2.0/go.mod h1:C1B7/bsgvzzxpfu0Rabbd+rTHJa5TmC/qgTseCf6DF0=
109111github.com/charmbracelet/x/exp/charmtone v0.0.0-20250708181618-a60a724ba6c3 h1:1xwHZg6eMZ9Wv5TE1UGub6ARubyOd1Lo5kPUI/6VL50=
internal/ui/model/ui.go+13−13
@@ -9,7 +9,6 @@ import (
99 "net/http"
1010 "os"
1111 "path/filepath"
12− "runtime"
1312 "slices"
1413 "strings"
1514
@@ -39,6 +38,7 @@ import (
3938 "github.com/charmbracelet/crush/internal/version"
4039 uv "github.com/charmbracelet/ultraviolet"
4140 "github.com/charmbracelet/ultraviolet/screen"
41+ "github.com/charmbracelet/x/editor"
4242)
4343
4444// Max file size set to 5M.
@@ -1562,16 +1562,6 @@ type layout struct {
15621562}
15631563
15641564func (m *UI) openEditor(value string) tea.Cmd {
1565− editor := os.Getenv("EDITOR")
1566− if editor == "" {
1567− // Use platform-appropriate default editor
1568− if runtime.GOOS == "windows" {
1569− editor = "notepad"
1570− } else {
1571− editor = "nvim"
1572− }
1573− }
1574−
15751565 tmpfile, err := os.CreateTemp("", "msg_*.md")
15761566 if err != nil {
15771567 return uiutil.ReportError(err)
@@ -1580,8 +1570,18 @@ func (m *UI) openEditor(value string) tea.Cmd {
15801570 if _, err := tmpfile.WriteString(value); err != nil {
15811571 return uiutil.ReportError(err)
15821572 }
1583− cmdStr := editor + " " + tmpfile.Name()
1584− return uiutil.ExecShell(context.TODO(), cmdStr, func(err error) tea.Msg {
1573+ cmd, err := editor.Command(
1574+ "crush",
1575+ tmpfile.Name(),
1576+ editor.AtPosition(
1577+ m.textarea.Line()+1,
1578+ m.textarea.Column()+1,
1579+ ),
1580+ )
1581+ if err != nil {
1582+ return uiutil.ReportError(err)
1583+ }
1584+ return tea.ExecProcess(cmd, func(err error) tea.Msg {
15851585 if err != nil {
15861586 return uiutil.ReportError(err)
15871587 }