Skip to content

feat: add $width variable for preview commands#452

Merged
idursun merged 5 commits intoidursun:mainfrom
pablospe:feature/preview-width-variable
Jan 7, 2026
Merged

feat: add $width variable for preview commands#452
idursun merged 5 commits intoidursun:mainfrom
pablospe:feature/preview-width-variable

Conversation

@pablospe
Copy link
Copy Markdown
Contributor

@pablospe pablospe commented Jan 3, 2026

Summary

  • Add a new $width placeholder variable that exposes the actual view width (in columns) to preview commands
  • Enables tools like delta to use --side-by-side with the correct width
  • Width updates dynamically when the preview pane is resized

Motivation

When using delta with --side-by-side in preview commands, there's no way to pass the correct width because jjui pipes command output to an internal buffer (no TTY). This is similar to Discussion #163.

Similar to how fzf exposes $FZF_PREVIEW_COLUMNS, this adds a $width variable.

Example usage

[preview]
revision_command = ["util", "exec", "--", "bash", "-c",
  """jj show --color always --git -r $change_id | delta --side-by-side --width $width"""]

Add a new placeholder variable $width that exposes the actual
view width (in columns) to preview commands. This enables tools
like delta to use --side-by-side with the correct width.

Similar to how fzf exposes $FZF_PREVIEW_COLUMNS, this allows users to
configure preview commands that adapt to the view size:

```toml
[preview]
revision_command = ["util", "exec", "--", "bash", "-c",
  """jj show --color always --git -r $change_id | delta --side-by-side --width $width"""]
```

The width updates dynamically when the preview pane is resized.
@idursun
Copy link
Copy Markdown
Owner

idursun commented Jan 4, 2026

Hey thanks,

I’d suggest renaming the placeholder to $preview_width for specificity as it is only populated by the preview.

Also, go fmt is needed.

@pablospe
Copy link
Copy Markdown
Contributor Author

pablospe commented Jan 4, 2026

I’d suggest renaming the placeholder to $preview_width for specificity as it is only populated by the preview.

The initial implementation used $preview_width, but I renamed it to $width because the upcoming feature/configurable-diff-command branch (PR #453) will reuse this placeholder in diff commands as well. A generic $width avoids the situation of having $preview_width in non-preview contexts. But I can change it if you prefer, let me know.

Also, go fmt is needed.

done, thanks!

- Rename WidthPlaceholder to PreviewWidthPlaceholder
- Change placeholder value from $width to $preview_width
- Rename local variable back to previewWidth for consistency
@pablospe
Copy link
Copy Markdown
Contributor Author

pablospe commented Jan 6, 2026

I’d suggest renaming the placeholder to $preview_width for specificity as it is only populated by the preview.

done! This PR is ready, let me know otherwise.

Copy link
Copy Markdown
Owner

@idursun idursun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@idursun idursun merged commit 036eb76 into idursun:main Jan 7, 2026
4 checks passed
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jan 9, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [idursun/jjui](https://github.com/idursun/jjui) | patch | `v0.9.8` → `v0.9.9` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>idursun/jjui (idursun/jjui)</summary>

### [`v0.9.9`](https://github.com/idursun/jjui/releases/tag/v0.9.9)

[Compare Source](idursun/jjui@v0.9.8...v0.9.9)

### Release Notes

Another release with small improvements and bug fixes. Thanks to all contributors!

#### 🎉 New Features

##### Custom Commands & Lua API Enhancements

- **Custom Commands with Sequence Keys** ([#&#8203;420](idursun/jjui#420))
  - Added `key_sequence` property allowing custom commands to be invoked with multiple key presses in sequence
  - Added `desc` property for command descriptions
  - Introduced sequence overlay UI showing available key sequences when first key is pressed
  - Example: `key_sequence = ["w", "b", "l"]`

- **Lua API: Choose Method and UI** ([#&#8203;427](idursun/jjui#427)) ([#&#8203;442](idursun/jjui#442))
  - New `choose()` function for interactive selection prompts in Lua scripts
  - New `input()` function to prompt users for text input with customizable title and prompt
  - New `split_lines()` function for text processing

- **Lua API: Await on Operation Results** ([#&#8203;422](idursun/jjui#422))
  - `start_inline_describe()` now returns boolean indicating if operation was applied or cancelled
  - Enables conditional command execution based on user actions
  - Fixes [#&#8203;310](idursun/jjui#310)

- **Lua API: Interactive Commands** ([commit 8b257263](idursun/jjui@8b257263))
  - Added `jj_interactive` Lua function for interactive jj command execution

##### Navigation & UI Improvements

- **Ace Jump for Operations** ([#&#8203;445](idursun/jjui#445))
  - Pressing 'f' in set\_parents/duplicate/rebase/squash modes now triggers ace jump
  - After jump completes, returns to the original operation mode instead of normal mode
  - Closes [#&#8203;394](idursun/jjui#394)

- **Preview Width Variable** ([#&#8203;452](idursun/jjui#452))
  - Added `$preview_width` placeholder variable for preview commands
  - Exposes actual view width (in columns) to enable tools like delta to use `--side-by-side` correctly
  - Width updates dynamically when preview pane is resized
  - Similar to fzf's `$FZF_PREVIEW_COLUMNS`

- **Configurable Flash Message Display Time** ([#&#8203;456](idursun/jjui#456))
  - New config key: `ui.flash_message_display_seconds` (default: 4)
  - Special value `0` means messages display until manually dismissed
  - Fixes [#&#8203;455](idursun/jjui#455)

- **Page Up/Down Key Configuration** ([#&#8203;437](idursun/jjui#437))
  - ScrollUp/Down keys now registered in config instead of hardcoded
  - Keys exposed to configuration for customization
  - Fixes [#&#8203;360](idursun/jjui#360)

##### SSH & Authentication

- **SSH Askpass Support** ([#&#8203;423](idursun/jjui#423))
  - New `[ssh] hijack_askpass` setting to prompt for SSH passphrases/PINs within jjui
  - Works on Linux and macOS
  - Properly handles prompt overriding and cancellation
  - Fixes [#&#8203;100](idursun/jjui#100)

#### 🐛 Bug Fixes

- **Exec Command History** ([#&#8203;458](idursun/jjui#458))
  - Fixed issue where selected command history wasn't applied in exec mode
  - Input value now properly updated when selecting from fuzzy/regex suggestions
  - Selected commands correctly saved to history

- **Menu Pagination Display** ([#&#8203;446](idursun/jjui#446))
  - Fixed incorrect `%d/%d` pagination display
  - Height now calculated before pagination render
  - Added tab/shift+tab to short help menu
  - Fixes [#&#8203;444](idursun/jjui#444)

- **Flash Message Width** ([#&#8203;432](idursun/jjui#432))
  - Added maxWidth (50% of screen) to flash message rendering
  - Messages now properly line-wrap instead of extending beyond window width

- **Operation Log Refresh** ([#&#8203;431](idursun/jjui#431))
  - Operation log now returns Refresh and SelectionChanged messages upon closing
  - Fixes [#&#8203;430](idursun/jjui#430)

- **Custom Commands List Sorting** ([commit 3fa9783a](idursun/jjui@3fa9783a))
  - Fixed custom commands list to use stable sort
  - Fixes [#&#8203;424](idursun/jjui#424)

- **JJ Error Pass-through** ([#&#8203;421](idursun/jjui#421))
  - jjui now properly passes through stderr from jj commands
  - Error messages are more informative and show actual jj errors

- **Navigation Message Display** ([commit 94a4a874](idursun/jjui@94a4a874))
  - Navigation messages now only shown for paged scrolls

#### What's Changed

- main: pass through jj error by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;421](idursun/jjui#421)
- feat(lua): add ability to await on operation results (cancelled/applied) by [@&#8203;idursun](https://github.com/idursun) in [#&#8203;422](idursun/jjui#422)
- oplog: return Refresh and SelectionChanged upon oplog closing by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;431](idursun/jjui#431)
- feat(nix): add comprehensive nix flake by [@&#8203;doprz](https://github.com/doprz) in [#&#8203;426](idursun/jjui#426)
- Add option to hijack SSH Askpass to prompt for passphrase/pin by [@&#8203;oliverpool](https://github.com/oliverpool) in [#&#8203;423](idursun/jjui#423)
- feat(lua): add choose method and ui by [@&#8203;idursun](https://github.com/idursun) in [#&#8203;427](idursun/jjui#427)
- flash: add maxWidth to flash msg rendering by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;432](idursun/jjui#432)
- keys: add pageup/down to keys config by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;437](idursun/jjui#437)
- chore(github): Add Adda0 as an automatic reviewer for Nix-related changes by [@&#8203;Adda0](https://github.com/Adda0) in [#&#8203;440](idursun/jjui#440)
- feat: add .editorconfig by [@&#8203;doprz](https://github.com/doprz) in [#&#8203;434](idursun/jjui#434)
- Add input and log to custom\_commands API by [@&#8203;ArnaudBger](https://github.com/ArnaudBger) in [#&#8203;442](idursun/jjui#442)
- oplog,list: refactor scrolling with Scrollable/StreamableList interface by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;429](idursun/jjui#429)
- menu: calculate height before pagination render by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;446](idursun/jjui#446)
- operations: enable ace jump for set\_parents/duplicate/rebase/squash by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;445](idursun/jjui#445)
- feat: make flash message display time configurable by [@&#8203;living180](https://github.com/living180) in [#&#8203;456](idursun/jjui#456)
- feat: add $width variable for preview commands by [@&#8203;pablospe](https://github.com/pablospe) in [#&#8203;452](idursun/jjui#452)
- status: fix exec command history not applied by [@&#8203;baggiiiie](https://github.com/baggiiiie) in [#&#8203;458](idursun/jjui#458)

#### New Contributors

- [@&#8203;doprz](https://github.com/doprz) made their first contribution in [#&#8203;426](idursun/jjui#426)
- [@&#8203;oliverpool](https://github.com/oliverpool) made their first contribution in [#&#8203;423](idursun/jjui#423)
- [@&#8203;living180](https://github.com/living180) made their first contribution in [#&#8203;456](idursun/jjui#456)
- [@&#8203;pablospe](https://github.com/pablospe) made their first contribution in [#&#8203;452](idursun/jjui#452)

**Full Changelog**: <idursun/jjui@v0.9.8...v0.9.9>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43NS4xIiwidXBkYXRlZEluVmVyIjoiNDIuNzUuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90IiwiYXV0b21hdGlvbjpib3QtYXV0aG9yZWQiLCJkZXBlbmRlbmN5LXR5cGU6OnBhdGNoIl19-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants