Static Named Directoryの話
abst
Static Named Directoryの話をします。historyに../../
とかが入って嫌な人は解決する可能性があります。
困り
おおよそのケースでcwdに依存したビルドは開発体験が悪くなる傾向にあると言われている(私に)
うまくMakefileを書いている場合はそれはまぁ最高なんだけど、適当にcdしてcommandを打っていると引数の中に ../
が混じってきたりする。
混じると何が困るかってhistoryの再利用性が低くなる。怠惰寄りの人間なので過去に打ったcommandを手で打ちたくないのだ。
提案手法
shellの ~
みたいにいい感じにしてぇ~って思って調べたら ~
はexpansionと呼ばれる機能らしい。
zshにはexpansion周りの機能が複数あって、Static named directoriesを使うことにした。
static named directory
~hoge
のようなものがparameterにあった際にzshは hoge
と呼ばれるnamed directoryを探して展開しようとする。
named directoryは以下の方法で定義される
/
から始まる shell のvariablehash
commandを使う (ex.hash -d hoge=/hoge/fuga
)
example
今回は git のtop levelをnamed directoryにした。
なので chpwd
のhookを使いながらnamed directoryを変えていくことになる。
chpwd_static_named_directory() { local gitroot=$(git rev-parse --show-toplevel 2>/dev/null) if [ ! "$gitroot" = "" ]; then hash -d "git=$gitroot" return else hash -d git= fi } chpwd_static_named_directory add-zsh-hook chpwd chpwd_static_named_directory
これによってgit 管理下においてはどの位置であっても~git
をprefixにつけることでgitのtop levelを使うことができる
ex. hoge ~git/src/fuga
評価
top levelにいる際は ~git
をつける手間が面倒なのであまりつけないが、それ以外にいる場合 ../
をつけなくていいのは便利だしhistoryもclean
git submoduleは使うつもりがないので試していない
あと、 git repoをおくディレクトリを named directoryにしても便利 (ex. hash -d dev=$HOME/git/atsumeta/directory
)