-
-
Save aluxian/9c6f97557b7971c32fdff2f2b1da8209 to your computer and use it in GitHub Desktop.
function __git_fzf_is_in_git_repo | |
command -s -q git | |
and git rev-parse HEAD >/dev/null 2>&1 | |
end | |
function __git_fzf_git_status | |
__git_fzf_is_in_git_repo; or return | |
git -c color.status=always status --short | \ | |
fzf -m --ansi --preview 'git diff --color=always HEAD -- {-1} | head -500' | \ | |
cut -c4- | \ | |
sed 's/.* -> //' | |
commandline -f repaint | |
end | |
function __git_fzf_git_branch | |
__git_fzf_is_in_git_repo; or return | |
git branch -a --color=always | \ | |
grep -v '/HEAD\s' | \ | |
fzf -m --ansi --preview-window right:70% --preview 'git log --color=always --oneline --graph --date=short \ | |
--pretty="format:%C(auto)%cd %h%d %s %C(magenta)[%an]%Creset" \ | |
(echo {} | sed s/^..// | cut -d" " -f1) | head -'$LINES | \ | |
sed 's/^..//' | cut -d' ' -f1 | \ | |
sed 's#^remotes/##' | |
commandline -f repaint | |
end | |
function __git_fzf_git_tag | |
__git_fzf_is_in_git_repo; or return | |
git tag --sort -version:refname | \ | |
fzf -m --ansi --preview-window right:70% --preview 'git show --color=always {} | head -'$LINES | |
commandline -f repaint | |
end | |
function __git_fzf_git_log | |
__git_fzf_is_in_git_repo; or return | |
git log --color=always --graph --date=short --format="%C(auto)%cd %h%d %s %C(magenta)[%an]%Creset" | \ | |
fzf -m --ansi --reverse --preview 'git show --color=always (echo {} | grep -o "[a-f0-9]\{7,\}") | head -'$LINES | \ | |
sed -E 's/.*([a-f0-9]{7,}).*/\1/' | |
commandline -f repaint | |
end | |
# https://gist.github.com/junegunn/8b572b8d4b5eddd8b85e5f4d40f17236 | |
function git_fzf_key_bindings -d "Set custom key bindings for git+fzf" | |
bind \cg\cf __git_fzf_git_status | |
bind \cg\cb __git_fzf_git_branch | |
bind \cg\ct __git_fzf_git_tag | |
bind \cg\ch __git_fzf_git_log | |
end |
These are great, thank you.
I have one issue: When I select an entry and hit
Return
, the entry appears above the prompt rather than in the prompt. Here's an example. This doesn't happen for normalfzf
commands. Do you know a way off hand to make the entry stay in the prompt?
I don't, sorry.
Thanks for the code anyway!
Edit: revised & expanded here.
Here's the version that adds the entry to the commandline. I'm sure there's a better way of doing this in fish — feel free to critique.
# Deciphered from fzf-file-widget. Somewhat unclear why it doesn't exist already!
function fzf_add_to_commandline -d 'add stdin to the command line, for fzf functions'
read -l result
commandline -t ""
commandline -it -- (string escape $result)
commandline -f repaint
end
# https://gist.github.com/aluxian/9c6f97557b7971c32fdff2f2b1da8209
function __git_fzf_is_in_git_repo
command -s -q git
and git rev-parse HEAD >/dev/null 2>&1
end
function __git_fzf_git_status
__git_fzf_is_in_git_repo; or return
git -c color.status=always status --short | \
fzf -m --ansi --preview 'git diff --color=always HEAD -- {-1} | head -500' | \
cut -c4- | \
sed 's/.* -> //' | \
fzf_add_to_commandline
commandline -f repaint
end
function __git_fzf_git_branch
__git_fzf_is_in_git_repo; or return
git branch -a --color=always | \
grep -v '/HEAD\s' | \
fzf -m --ansi --preview-window right:70% --preview 'git log --color=always --oneline --graph --date=short \
--pretty="format:%C(auto)%cd %h%d %s %C(magenta)[%an]%Creset" \
--print0 \
--read0 \
(echo {} | sed s/^..// | cut -d" " -f1) | head -'$LINES | \
sed 's/^..//' | cut -d' ' -f1 | \
sed 's#^remotes/##' | \
fzf_add_to_commandline
end
function __git_fzf_git_tag
__git_fzf_is_in_git_repo; or return
git tag --sort -version:refname | \
fzf -m --ansi --preview-window right:70% --preview 'git show --color=always {} | head -'$LINES | \
fzf_add_to_commandline
end
function __git_fzf_git_log
__git_fzf_is_in_git_repo; or return
git log --color=always --graph --date=short --format="%C(auto)%cd %h%d %s %C(magenta)[%an]%Creset" | \
fzf -m --ansi --reverse --preview 'git show --color=always (echo {} | grep -o "[a-f0-9]\{7,\}") | head -'$LINES | \
sed -E 's/.*([a-f0-9]{7,}).*/\1/' | \
fzf_add_to_commandline
end
Awesome work 👍 just want to mention fzf.fish also provides key bindings for git log, git status and more.
Awesome work 👍 just want to mention fzf.fish also provides key bindings for git log, git status and more.
fzf.fish
is very sluggish for me, and exhibits weird behavior. The author also disabled issues and PRs. Hopefully this gist provides a good alternative, haven't tried it yet, but it looks promising!
These are great, thank you.
I have one issue: When I select an entry and hit
Return
, the entry appears above the prompt rather than in the prompt. Here's an example. This doesn't happen for normalfzf
commands. Do you know a way off hand to make the entry stay in the prompt?