diff options
Diffstat (limited to 'home-config/fish/functions/_fzf_search_git_status.fish')
-rw-r--r-- | home-config/fish/functions/_fzf_search_git_status.fish | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/home-config/fish/functions/_fzf_search_git_status.fish b/home-config/fish/functions/_fzf_search_git_status.fish new file mode 100644 index 0000000..358f88c --- /dev/null +++ b/home-config/fish/functions/_fzf_search_git_status.fish | |||
@@ -0,0 +1,41 @@ | |||
1 | function _fzf_search_git_status --description "Search the output of git status. Replace the current token with the selected file paths." | ||
2 | if not git rev-parse --git-dir >/dev/null 2>&1 | ||
3 | echo '_fzf_search_git_status: Not in a git repository.' >&2 | ||
4 | else | ||
5 | set -f preview_cmd '_fzf_preview_changed_file {}' | ||
6 | if set --query fzf_diff_highlighter | ||
7 | set preview_cmd "$preview_cmd | $fzf_diff_highlighter" | ||
8 | end | ||
9 | |||
10 | set -f selected_paths ( | ||
11 | # Pass configuration color.status=always to force status to use colors even though output is sent to a pipe | ||
12 | git -c color.status=always status --short | | ||
13 | _fzf_wrapper --ansi \ | ||
14 | --multi \ | ||
15 | --prompt="Git Status> " \ | ||
16 | --query=(commandline --current-token) \ | ||
17 | --preview=$preview_cmd \ | ||
18 | --nth="2.." \ | ||
19 | $fzf_git_status_opts | ||
20 | ) | ||
21 | if test $status -eq 0 | ||
22 | # git status --short automatically escapes the paths of most files for us so not going to bother trying to handle | ||
23 | # the few edges cases of weird file names that should be extremely rare (e.g. "this;needs;escaping") | ||
24 | set -f cleaned_paths | ||
25 | |||
26 | for path in $selected_paths | ||
27 | if test (string sub --length 1 $path) = R | ||
28 | # path has been renamed and looks like "R LICENSE -> LICENSE.md" | ||
29 | # extract the path to use from after the arrow | ||
30 | set --append cleaned_paths (string split -- "-> " $path)[-1] | ||
31 | else | ||
32 | set --append cleaned_paths (string sub --start=4 $path) | ||
33 | end | ||
34 | end | ||
35 | |||
36 | commandline --current-token --replace -- (string join ' ' $cleaned_paths) | ||
37 | end | ||
38 | end | ||
39 | |||
40 | commandline --function repaint | ||
41 | end | ||