cdd を tmux, bash, multi session +α に対応した

screen を使う上でほぼ必須とも言っていいコマンド cdd を tmux 対応にし機能をいくつか追加しました。

https://github.com/m4i/cdd

オリジナルの 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 からの機能的な変更点は以下のとおりです。

  1. tmux 対応(pane にも対応)
  2. セッション名ごとにディレクトリを記録するようにした (tmux / screen)
  3. zsh の補完を新しい方法に
  4. bash での補完に対応
  5. realpath/ruby に依存しないように
  6. $ cdd[enter] で最後に cd したディレクトリに移動するようにした
  7. 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 の補完を新しい方法に

こんな感じに補完されます。

zsh completion

図らずもパスが同じ時にまとめて表示されるようになったのですが、これが地味に使いやすいです。

ちなみに、この表示にするために .zshrc で以下の設定をしています。

zstyle ':completion:*' group-name ''
zstyle ':completion:*:descriptions' format '%F{yellow}Completing %B%d%b%f'

4. bash での補完に対応

こんな感じに補完されます。

bash completion

5. realpath/ruby に依存しないように

realpath/ruby を利用しなくても以下のコードでフルパスが取得可能です。

dir="$(cd "$dir" >/dev/null 2>&1 && pwd)"

6. $ cdd[enter] で最後に cd したディレクトリに移動するようにした

個人的には今回追加した機能の中で一番便利だと思っています。
tmux/screen を利用していると最後に cd したディレクトリに他のウィンドウで cd したいというケースがよくあり、それを簡単にできるようにしました。
この機能は @banyan にアイデアをもらいました!