Parent directory

README.md

4581 bytes

jj - Jujutsu CLI

This plugin provides autocompletion for jj.

To use it, add jj to the plugins array of your zshrc file:

plugins=(... jj)

Aliases

| Alias | Command | | ------ | ----------------------------- | | jja | jj abandon | | jjb | jj bookmark | | jjba | jj bookmark advance | | jjbc | jj bookmark create | | jjbd | jj bookmark delete | | jjbf | jj bookmark forget | | jjbl | jj bookmark list | | jjbm | jj bookmark move | | jjbr | jj bookmark rename | | jjbs | jj bookmark set | | jjbt | jj bookmark track | | jjbu | jj bookmark untrack | | jjc | jj commit | | jjcmsg | jj commit --message | | jjd | jj diff | | jjdmsg | jj desc --message | | jjds | jj desc | | jje | jj edit | | jjgcl | jj git clone | | jjgf | jj git fetch | | jjgfa | jj git fetch --all-remotes | | jjgp | jj git push | | jjgpa | jj git push --all | | jjgpd | jj git push --deleted | | jjgpt | jj git push --tracked | | jjl | jj log | | jjla | jj log -r "all()" | | jjn | jj new | | jjnt | jj new "trunk()" | | jjrb | jj rebase | | jjrbm | jj rebase -d "trunk()" | | jjrs | jj restore | | jjrt | cd "$(jj root \|\| echo .)" | | jjsp | jj split | | jjsq | jj squash | | jjst | jj status |

Prompt usage

Because jj has a very powerful template syntax, this plugin only exposes a convenience function jj_prompt_template to read information from the current change. It is basically the same as jj log --no-graph -r @ -T $1:

_my_theme_jj_info() {
  jj_prompt_template 'self.change_id().shortest(3)'
}

PROMPT='$(_my_theme_jj_info) $'

jj_prompt_template escapes % signs in the output. Use jj_prompt_template_raw if you don't want that (e.g. to colorize the output).

However, because jj can be used inside a Git repository, some themes might clash with it. Generally, you can fix it with a wrapper function that tries jj first and then falls back to git if it didn't work:

_my_theme_vcs_info() {
  jj_prompt_template 'self.change_id().shortest(3)' \
  || git_prompt_info
}

PROMPT='$(_my_theme_vcs_info) $'

You can find an example here.

Performance

Sometimes jj can be slower than git.

If you feel slowdowns, consider using the following:

zstyle :omz:plugins:jj ignore-working-copy yes

This will add --ignore-working-copy to all jj commands executed by your prompt. The downside here is that your prompt might be out-of-sync until the next time jj gets a chance to not ignore the working copy (i.e. you manually run a jj command).

If you prefer to keep your prompt always up-to-date but still don't want to feel the slowdown, you can make your prompt asynchronous. This plugin doesn't do this automatically so you'd have to hack your theme a bit for that.

Git async-prompt compatibility

If you use a wrapper function that calls git_prompt_info (as shown above), it won't work with the default git async-prompt mode. This is because async-prompt only registers its background worker when it detects $(git_prompt_info) literally in your prompt variables. A wrapper like $(_my_theme_vcs_info) won't match, so the async output stays empty.

To fix this, add one of the following to your .zshrc before Oh My Zsh is sourced:

# Option 1: force async handlers to always register (recommended, keeps async behavior)
zstyle ':omz:alpha:lib:git' async-prompt force

# Option 2: disable async-prompt entirely (simpler, but prompt may feel slower in large repos)
zstyle ':omz:alpha:lib:git' async-prompt no

See #13555 for details.

See Also

Contributors

  • nasso - Plugin Author
  • imp - Occasional Alias Contributor