根据当前别名集创建新的别名集(例如 gst -> dst)?

根据当前别名集创建新的别名集(例如 gst -> dst)?

我正在使用 zsh 插件中的 git 别名:https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git

所以它有 git 别名,例如:

gst # git status
ga # git add
gc "commit" # git commit -v "commit"
...

...而且我还使用 git bare repo 来备份我的所有点文件:https://github.com/Anthonyive/dotfiles/blob/0706bc81daa3aeb7899b506cd89d4ab78fc7b176/USAGE.md

特别是, git bare repo 技术将 git 命令别名为dotfiles

alias dotfiles='git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
alias d='dotfiles'

那么如何将所有 git alias 命令映射到d?喜欢:

dst # similar to gst, but uses the dotfiles alias
da # similar to ga
dc "commit" # similar to gc "commit"
...

一张一张地映射它们似乎很乏味......

答案1

关联数组aliases包含所有别名定义。

for name in "${(@k)aliases}"; do
  if [[ $name == g* && $aliases[$name] == 'git '* ]]; then
    alias d${name#g}="dotfiles ${aliases[$name]#git }"
  fi
done

或者,您可以将d别名更改为需要以下 git 命令的函数,但首先扩展 shell 别名并删除任何前导git.

alias d='d ' # expand aliases after d
function d {
  if [[ $1 == "git" ]]; then shift; fi
  dotfiles "$@"
}

然后d gst将运行dotfiles statusd gc myfile将运行dotfiles commit myfiled ls-tree将运行dotfiles ls-tree等等。完成是可行的,但并不容易。

答案2

要将所有调用替换gitgit --git-dir=$HOME/.dotfiles/ --work-tree=$HOME,您可以使用一个函数:

git() {
  command git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME "$@"
}

然而,对于这种情况,您实际上不必这样做。git您可以通过环境变量指定它们,而不是将这些选项标志传递给:

export GIT_DIR=$HOME/.dotfiles/
export GIT_WORK_TREE=$HOME

https://www.git-scm.com/docs/git#Documentation/git.txt---git-dirltpathgt


顺便说一句,您可以只使用,而不是维护和尝试记住大量别名zsh-autocomplete的历史补全模式。 (免责声明:我是这个插件的维护者。)

在此输入图像描述

相关内容