screen を使う上でほぼ必須とも言っていいコマンド cdd を tmux 対応にし機能をいくつか追加しました。
オリジナルの cdd はこちら
http://d.hatena.ne.jp/secondlife/20080218/1203303528
利用方法
cdd をすでに利用している方
ファイルを差し替えるだけで使えるようになります。
cdd をまだ利用していない方
まず cdd を適当な場所に置き、
zsh の場合、.zshrc あたりに以下を記述
autoload -Uz compinit compinit . ~/path/to/cdd chpwd() { _cdd_chpwd }
bash の場合、.bashrc あたりに以下を記述
. ~/path/to/cdd cd() { builtin cd "$@" local ret=$? ((ret)) || _cdd_chpwd return $ret }
bash の cd を override するときの注意点があります。builtin cd $@ と " なしで書いてるのを見かけますが、スペースのあるパスに移動できなくなります。また必ず builtin cd の返り値を返したほうがよいです。この cdd もそうですが cd の返り値をみるプログラムが動かなくなります。
変更点
一から書き直してしまっていますがオリジナルの cdd からの機能的な変更点は以下のとおりです。
- tmux 対応(pane にも対応)
- セッション名ごとにディレクトリを記録するようにした (tmux / screen)
- zsh の補完を新しい方法に
- bash での補完に対応
- realpath/ruby に依存しないように
$ cdd[enter]で最後に cd したディレクトリに移動するようにした- cdadd/cddel => cdd add/delete
1. tmux 対応(pane にも対応)
$ cdd 3.1
で window 3 の pane 1 のディレクトリに移動できます。
pane が 0 の場合は省略可能です。
2. セッション名ごとにディレクトリを記録するようにした (screen / tmux)
私は基本的にプロジェクトごとに tmux/screen のセッションを分けて使っています。
$ tmux new -s projecta $ screen -xR -S projectb
この時に projecta の window 0 で $ cd ~/projecta としたあとに、
projectb で $ cdd 0 としたときに残念なことにならないようにしました。
projectb で $ cdd projecta,0 とすると projecta の window 0 に移動することもできます。
3. zsh の補完を新しい方法に
こんな感じに補完されます。

図らずもパスが同じ時にまとめて表示されるようになったのですが、これが地味に使いやすいです。
ちなみに、この表示にするために .zshrc で以下の設定をしています。
zstyle ':completion:*' group-name '' zstyle ':completion:*:descriptions' format '%F{yellow}Completing %B%d%b%f'
5. realpath/ruby に依存しないように
realpath/ruby を利用しなくても以下のコードでフルパスが取得可能です。
dir="$(cd "$dir" >/dev/null 2>&1 && pwd)"
6. $ cdd[enter] で最後に cd したディレクトリに移動するようにした
個人的には今回追加した機能の中で一番便利だと思っています。
tmux/screen を利用していると最後に cd したディレクトリに他のウィンドウで cd したいというケースがよくあり、それを簡単にできるようにしました。
この機能は @banyan にアイデアをもらいました!
