From e7e38d09468bc1f412dade47dff41e3facb26580 Mon Sep 17 00:00:00 2001 From: Oleg Broytman Date: Sun, 15 Oct 2023 15:24:03 +0300 Subject: [PATCH] .bashrc, .shellrc: Add `cd_worktree` with completion --- .bashrc | 18 ++++++++++++++++++ .shellrc | 16 ++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/.bashrc b/.bashrc index 85cb4d8..18c00e2 100644 --- a/.bashrc +++ b/.bashrc @@ -235,6 +235,24 @@ if test -x /usr/bin/git >/dev/null 2>&1; then fi } + # completion for `cd_worktree` + + _cd_worktree_comp() { + local cur="${COMP_WORDS[COMP_CWORD]}" + COMPREPLY=(`compgen -W "$( + git worktree list | awk '{s=$3; gsub("[\\\\[\\\\]]", "", s); print s}' + )" -- "$cur"`) + } + + _cd_worktree_comp_loader() { + _completion_loader git + unset _cd_worktree_comp_loader + complete -F _cd_worktree_comp cd_worktree + return 124 + } + + complete -F _cd_worktree_comp_loader cd_worktree + # completion for aliases in global .gitconfig # fixup rbi rbia rbiap rbip - do refs name completion diff --git a/.shellrc b/.shellrc index b06ba8b..5d46454 100644 --- a/.shellrc +++ b/.shellrc @@ -72,6 +72,22 @@ if test -x /usr/bin/git >/dev/null 2>&1; then fi cd "$path_url" } + + # See https://stackoverflow.com/a/77266926/7976758 + + cd_worktree() { + if [ $# -ne 1 ]; then + echo "Usage: cd_worktree " >&2 + return 1 + fi + path="$(git worktree list | grep -F "$1" | awk '{print $1}')" + if [ -n "$path" ]; then + cd "$path" + else + echo "Cannot find path for branch '$1'" >&2 + return 1 + fi + } fi include() { -- 2.39.2