From e7be3e02aa52f2aae5dee31ea3b1ab87e9c4737c Mon Sep 17 00:00:00 2001 From: Oliver Joseph Ash Date: Fri, 20 Mar 2026 00:02:30 +0000 Subject: [PATCH] feat(preview): set preview subprocess size via env (#608) * Set preview subprocess size via env --- internal/ui/context/command_runner.go | 10 +++++++++- internal/ui/preview/preview.go | 9 ++++++++- test/test_command_runner.go | 4 ++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/internal/ui/context/command_runner.go b/internal/ui/context/command_runner.go index d5dbc77..aeff202 100644 --- a/internal/ui/context/command_runner.go +++ b/internal/ui/context/command_runner.go @@ -21,6 +21,7 @@ import ( type CommandRunner interface { RunCommandImmediate(args []string) ([]byte, error) + RunCommandImmediateWithEnv(args []string, env []string) ([]byte, error) RunCommandStreaming(ctx context.Context, args []string) (*StreamingCommand, error) RunCommand(args []string, continuations ...tea.Cmd) tea.Cmd RunCommandWithInput(args []string, input string, continuations ...tea.Cmd) tea.Cmd @@ -35,9 +36,12 @@ type MainCommandRunner struct { func (a *MainCommandRunner) nextID() int { return int(a.idCounter.Add(1)) } -func (a *MainCommandRunner) RunCommandImmediate(args []string) ([]byte, error) { +func (a *MainCommandRunner) RunCommandImmediateWithEnv(args []string, env []string) ([]byte, error) { c := exec.Command("jj", args...) c.Dir = a.Location + if len(env) > 0 { + c.Env = append(os.Environ(), env...) + } if output, err := c.Output(); err != nil { var exitError *exec.ExitError if errors.As(err, &exitError) { @@ -49,6 +53,10 @@ func (a *MainCommandRunner) RunCommandImmediate(args []string) ([]byte, error) { } } +func (a *MainCommandRunner) RunCommandImmediate(args []string) ([]byte, error) { + return a.RunCommandImmediateWithEnv(args, nil) +} + func (a *MainCommandRunner) RunCommandStreaming(ctx context.Context, args []string) (*StreamingCommand, error) { c := exec.CommandContext(ctx, "jj", args...) c.Dir = a.Location diff --git a/internal/ui/preview/preview.go b/internal/ui/preview/preview.go index fec542a..25dcb1c 100644 --- a/internal/ui/preview/preview.go +++ b/internal/ui/preview/preview.go @@ -219,7 +219,14 @@ func (m *Model) refreshPreviewForItem(item common.SelectedItem) tea.Cmd { }) } - output, _ := m.context.RunCommandImmediate(args) + env := []string{ + // The preview subprocess does not run in a pane-sized PTY, so let + // width-sensitive tools like `jj diff` see the preview size via the + // conventional terminal size environment variables. + "COLUMNS=" + strconv.Itoa(m.view.Width()), + "LINES=" + strconv.Itoa(m.view.Height()), + } + output, _ := m.context.RunCommandImmediateWithEnv(args, env) return updatePreviewContentMsg{ Content: string(output), } diff --git a/test/test_command_runner.go b/test/test_command_runner.go index ea0a855..aa53488 100644 --- a/test/test_command_runner.go +++ b/test/test_command_runner.go @@ -59,6 +59,10 @@ func (t *CommandRunner) RunCommandImmediate(args []string) ([]byte, error) { return nil, nil } +func (t *CommandRunner) RunCommandImmediateWithEnv(args []string, _ []string) ([]byte, error) { + return t.RunCommandImmediate(args) +} + func (t *CommandRunner) RunCommandStreaming(_ context.Context, args []string) (*appContext.StreamingCommand, error) { reader, err := t.RunCommandImmediate(args) return &appContext.StreamingCommand{