Static Named Directoryの話

abst

Static Named Directoryの話をします。history../../とかが入って嫌な人は解決する可能性があります。

困り

おおよそのケースでcwdに依存したビルドは開発体験が悪くなる傾向にあると言われている(私に)

うまくMakefileを書いている場合はそれはまぁ最高なんだけど、適当にcdしてcommandを打っていると引数の中に ../ が混じってきたりする。

混じると何が困るかってhistoryの再利用性が低くなる。怠惰寄りの人間なので過去に打ったcommandを手で打ちたくないのだ。

提案手法

shellの ~ みたいにいい感じにしてぇ~って思って調べたら ~ はexpansionと呼ばれる機能らしい。

zshにはexpansion周りの機能が複数あって、Static named directoriesを使うことにした。

static named directory

zsh: 14 Expansion

~hoge のようなものがparameterにあった際にzshhoge と呼ばれるnamed directoryを探して展開しようとする。

named directoryは以下の方法で定義される

  1. / から始まる shell のvariable
  2. hash 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 )