diff --git a/shared/home/default.nix b/shared/home/default.nix index 46c3a1b..0fe7313 100644 --- a/shared/home/default.nix +++ b/shared/home/default.nix @@ -210,9 +210,10 @@ in { bash = { enable = true; shellAliases = { - "l" = "echo -n ł | xclip -selection clipboard"; + "l" = "echo -n ł | ${pkgs.xclip}/bin/xclip -selection clipboard"; "gp" = "${pkgs.git}/bin/git remote | ${pkgs.parallel}/bin/parallel --verbose git push"; }; + initExtra = "source ${./gg.sh}"; }; } ) diff --git a/shared/home/gg.sh b/shared/home/gg.sh new file mode 100644 index 0000000..11b2e34 --- /dev/null +++ b/shared/home/gg.sh @@ -0,0 +1,45 @@ +maxdepth=5 +_gopath=$(git rev-parse --show-toplevel) + +gg() { + paths=($(g "$@")) + path_index=0 + + if [ ${#paths[@]} -gt 1 ]; then + c=1 + for path in "${paths[@]}"; do + echo [$c]: cd ${_gopath}/${path} + c=$((c+1)) + done + echo -n "Go to which path: " + read path_index + + path_index=$(($path_index-1)) + fi + + path=${paths[$path_index]} + cd $_gopath/$path +} + +# +# Print the directories of the specified Go package name. +# +g() { + local pkg_candidates="$((cd $_gopath && find . -mindepth 1 -maxdepth ${maxdepth} -type d -path "*/$1" -and -not -path '*/vendor/*' -print) | sed 's/^\.\///g')" + echo "$pkg_candidates" | awk '{print length, $0 }' | sort -n | awk '{print $2}' +} +# +# Bash autocomplete for g and gg functions. +# +_g_complete() +{ + COMPREPLY=() + local cur + local prev + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + COMPREPLY=( $(compgen -W "$(for f in $(find "$_gopath" -mindepth 1 -maxdepth ${maxdepth} -type d -name "${cur}*" ! -name '.*' ! -path '*/.git/*' ! -path '*/test/*' ! -path '*/vendor/*'); do echo "${f##*/}"; done)" -- "$cur") ) + return 0 +} +complete -F _g_complete g +complete -F _g_complete gg