是否可以创建一个仅在当前目录或其任何子目录中可用的命令。例如,假设我想创建一个名为的命令/别名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])
}