在 zsh 中创建仅在特定目录中可用的命令/别名

在 zsh 中创建仅在特定目录中可用的命令/别名

是否可以创建一个仅在当前目录或其任何子目录中可用的命令。例如,假设我想创建一个名为的命令/别名cdtheme,并且我有以下目录结构

~/code

# PROJECTNAME and THEMENAME can be anything the rest of the structure will stay the same
~/code/PROJECTNAME/web/themes/THEMENAME

~/code/projectA/web/themes/theme1
~/code/projectB/web/themes/theme2
~/code/xyzproject/web/themes/randomthemename

cdtheme在以下目录中运行将导致以下结果

~/code # error

~/code/projectA # cd to theme1
~/code/projectA/web # cd to theme1

~/code/projectB # cd to theme2

~/code/xyzproject # cd to randomthemename

cdtheme这只是一个例子,我想添加更多命令,例如cdproject.我最初的想法是能够将文件添加到目录中,例如projectB/.zshrc我可以在其中定义自定义命令/别名/变量并自动获取它。

编辑:清晰度并添加上下文

答案1

您可以在 a 中定义和取消定义别名或函数chpwd

function set_theme_dir {
  case $PWD/ in
    ~/code/projectA/) alias cdtheme='cd ~/code/projectA/web/themes/theme1';;
    ~/code/projectB/) alias cdtheme='cd ~/code/projectB/web/themes/theme2';;
    *) unalias cdtheme;;
  esac
}
chpwd_functions+=(set_theme_dir)

但考虑到您的要求,我认为cdtheme始终定义并在运行时分析当前目录更有意义。

function cdtheme {
  case $PWD/ in
    ~/code/projectA/) cd ~/code/projectA/web/themes/theme1;;
    ~/code/projectB/) cd ~/code/projectB/web/themes/theme2;;
    *) echo "Error: not inside a project tree" >&2; return 2;;
  esac
}

目前尚不清楚主题目录是硬编码的还是可以从项目中确定,或者如何判断项目目录是什么。下面是一个实现cdtheme,假设每个项目都有自己的 Git 工作树,并且您想要按字典顺序排列第一个主题。

function cdtheme {
  emulate -L zsh
  setopt err_return
  local root
  root=$(git rev-parse --show-toplevel)
  cd $root/web/themes/theme*([1])
}

相关内容