Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(jj): completions, aliases and prompt utils
- Loading branch information
Showing
2 changed files
with
115 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
# jj - Jujutsu CLI | ||
|
||
This plugin provides autocompletion for [jj](https://martinvonz.github.io/jj). | ||
|
||
To use it, add `jj` to the plugins array of your zshrc file: | ||
|
||
```zsh | ||
plugins=(... jj) | ||
``` | ||
|
||
## Prompt usage | ||
|
||
Because `jj` has a very powerful [template syntax](https://martinvonz.github.io/jj/latest/templates/), 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`: | ||
|
||
```sh | ||
_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: | ||
|
||
```sh | ||
_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](https://github.com/nasso/omzsh/blob/e439e494f22f4fd4ef1b6cb64626255f4b341c1b/themes/sunakayu.zsh-theme). | ||
|
||
### Performance | ||
|
||
Sometimes `jj` can be slower than `git`. | ||
|
||
If you feel slowdowns, you can try adding `ZSH_THEME_JJ_IGNORE_WORKING_COPY=1` to your theme, which will add | ||
`--ignore-working-copy` to all calls made to `jj`. The downside here is that your prompt might stay outdated | ||
until the next time `jj` gets a chance to _not_ ignore the working copy. | ||
|
||
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. | ||
|
||
## See Also | ||
|
||
- [martinvonz/jj](https://github.com/martinvonz/jj) | ||
|
||
## Contributors | ||
|
||
- [nasso](https://github.com/nasso) - Plugin Author |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
# if jj is not found, don't do the rest of the script | ||
if (( ! $+commands[jj] )); then | ||
return | ||
fi | ||
|
||
source <(jj util completion zsh) | ||
compdef _jj jj | ||
|
||
function __jj_prompt_jj() { | ||
local flags=("--no-pager") | ||
if (( ${ZSH_THEME_JJ_IGNORE_WORKING_COPY:-0} )); then | ||
flags+=("--ignore-working-copy") | ||
fi | ||
command jj $flags "$@" | ||
} | ||
|
||
# convenience functions for themes | ||
function jj_prompt_template_raw() { | ||
__jj_prompt_jj log --no-graph -r @ -T "$@" 2> /dev/null | ||
} | ||
|
||
function jj_prompt_template() { | ||
local out | ||
out=$(jj_prompt_template_raw "$@") || return 1 | ||
echo "${out:gs/%/%%}" | ||
} | ||
|
||
# Aliases (sorted alphabetically) | ||
alias j='jj' | ||
alias jb='jj branch' | ||
alias jbc='jj branch create' | ||
alias jbd='jj branch d' | ||
alias jbl='jj branch list' | ||
alias jbr='jj branch rename' | ||
alias jbs='jj branch set' | ||
alias jc='jj commit' | ||
alias jcmsg='jj commit --message' | ||
alias jd='jj diff' | ||
alias jdmsg='jj desc --message' | ||
alias jds='jj desc' | ||
alias je='jj edit' | ||
alias jgcl='jj git clone' | ||
alias jgf='jj git fetch' | ||
alias jgp='jj git push' | ||
alias jl='jj log' | ||
alias jn='jj new' | ||
alias jrb='jj rebase' | ||
alias jrs='jj restore' | ||
alias jrt='cd "$(jj root || echo .)"' | ||
alias js='jj squash' | ||
alias jsp='jj split' | ||
alias jsps='jj split --siblings' | ||
alias jst='jj st' | ||
alias jsto='jj squash --into' |