特定のディレクトリでのみ使用できる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

エイリアスまたは関数を定義または定義解除できます。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])
}

おすすめ記事