Last active
July 3, 2025 07:40
-
-
Save hroi/d0dc0e95221af858ee129fd66251897e to your computer and use it in GitHub Desktop.
Jujutsu (jj) prompt for fish-shell
This file contains hidden or 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
# Place me in ~/.config/fish/functions | |
# Then add me to `fish_vcs_prompt`: `funced fish_vcs_prompt` and save it to | |
# your personal config: `funcsave fish_vcs_prompt;` | |
function fish_jj_prompt --description 'Write out the jj prompt' | |
# Is jj installed? | |
if not command -sq jj | |
return 1 | |
end | |
# Are we in a jj repo? | |
if not jj root --quiet &>/dev/null | |
return 1 | |
end | |
# Generate prompt | |
jj log --ignore-working-copy --no-graph --color always -r @ -T ' | |
surround( | |
" (", | |
")", | |
separate( | |
" ", | |
bookmarks.join(", "), | |
coalesce( | |
surround( | |
"\"", | |
"\"", | |
if( | |
description.first_line().substr(0, 24).starts_with(description.first_line()), | |
description.first_line().substr(0, 24), | |
description.first_line().substr(0, 23) ++ "…" | |
) | |
), | |
"(no description set)" | |
), | |
change_id.shortest(), | |
commit_id.shortest(), | |
if(conflict, "(conflict)"), | |
if(empty, "(empty)"), | |
if(divergent, "(divergent)"), | |
if(hidden, "(hidden)"), | |
) | |
) | |
' | |
end |
Could you provide a more complete example that shows a jj bookmark in a JJ repo, but otherwise shows a Git branch in a git repo.
The fish_vcs_prompt
function that is distributed with fish tries the different prompt generators in order. It is called from fish_prompt
. Edit it with funced fish_vcs_prompt
.
Mine looks like this:
function fish_vcs_prompt --description "Print all vcs prompts"
# If a prompt succeeded, we assume that it's printed the correct info.
# This is so we don't try svn if git already worked.
fish_jj_prompt $argv
or fish_git_prompt $argv
or fish_hg_prompt $argv
or fish_fossil_prompt $argv
# The svn prompt is disabled by default because it's quite slow on common svn repositories.
# To enable it uncomment it.
# You can also only use it in specific directories by checking $PWD.
# or fish_svn_prompt
end
This is my modification based on the fish-shell fish_jj_prompt and this gist:
function fish_jj_prompt
# If jj isn't installed, there's nothing we can do
# Return 1 so the calling prompt can deal with it
if not command -sq jj
return 1
end
set -l info "$(
jj log 2>/dev/null --no-graph --ignore-working-copy --color=always --revisions @ --template '
surround(
"(",
")",
separate(" ",
bookmarks,
if(conflict, label("conflict", "conflict")),
if(divergent, label("divergent", "divergent")),
if(parents.len() > 1, label("merge", "merged")),
coalesce(
if(
empty,
label("empty", "empty"),
),
label("change", "change"),
),
)
)
'
)"
or return 1
if test -n "$info"
printf ' %s' $info
end
end
I love this! Thanks for making this, I forked yours and added some usage of the label
function to closer match jj st
, which adds colours to (empty) and (conflict).
https://gist.github.com/camtheman256/028aa2f1ced68cd435093a2d4680cf88
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Done.