cddで別セッションのディレクトリに手軽に移動する


ファイルの編集やコンパイル、デバッグなど作業に応じて複数の端末を開く場合、ローカル環境ではターミナルエミュレータのタブ機能で十分ですが、より柔軟な端末操作を求めてターミナルマルチプレクサを使う事が多いと思います。

ここではターミナルマルチプレクサを使って複数の端末で作業するときのディレクトリ移動にとても便利な cdd を紹介します。

chpwd_recent_dirs の設定と cdr 関数によってディレクトリの移動履歴は別セッションでも手軽に利用できますが、すぐ直前のディレクトリに移動するときには補完候補を絞り込む必要があります。また SHARE_HISTORY を有効にしてヒストリファイルを共有している場合でも、そのディレクトリに cd したときの履歴を絞り込む手間が発生します。

思うことは同じで、GNU Screen との組み合わせでディレクトリ移動を楽にするスクリプトが公開されています。

screen を使ってると、別の作業している WINDOW のカレントディレクトリに移動したくなることってありませんか?私は月1000回ぐらいあります。

さらにこれをベースに補完システムを compsys に変更して tmux にも対応し、セッション名ごとに異なる履歴を保存するようにして bash でも動作するように機能拡張されたものが公開されています。

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

今回はこちらのバージョンを GNU Screen と zsh で使う場合を例に説明します。

zsh
% git clone git://github.com/m4i/cdd
autoload -Uz compinit && compinit

zstyle ':completion:*' menu select
zstyle ':completion:*:descriptions' format '%BCompleting%b %U%d%u'

source cdd/cdd

typeset -ga chpwd_functions
chpwd_functions+=_cdd_chpwd

このように設定して複数のシェルを開いていろいろ作業している状態で cdd <TAB> すると、

zsh
% cdd <TAB>
Completing cdd directory
1        -- ~/.vim/bundle/vimproc
2        -- ~/dotfiles/dot.vim
3        -- /System/Library/Frameworks/JavaVM.framework/Versions
4        -- /Volumes
5        -- ~/dotfiles/dot.screen
6        -- ~
7        -- ~/dotfiles
8        -- ~/git
last  0  -- ~/work
Completing cdd command
add     -- add the directory to ~/.zsh_cdd_pwd_list
delete  -- delete the directory from ~/.zsh_cdd_pwd_list

こんな感じに各端末で最後に移動したときに記録されたディレクトリが補完候補として出てきます。数字を続けて入力して ENTER でそのディレクトリに cd できます。もちろんメニュー補完としても動作します。

特に便利なのが、引数を入力せずに cdd<ENTER> で最後に記録されたディレクトリに移動する機能です。(上記の例では last と表示されている ~/work に移動する)

あるディレクトリでファイルを編集していて、エディタの外からそれに対するコマンドなどを実行しようとしたときに、新しい端末を開いてすぐに移動できます。(ここでは、それエディタの○○機能でできるよ、という話はしません)

他にもディレクトリを記録したファイル $CDD_FILE を編集することなく cdd delete 数字 で削除したり、cdd add /tmp などとして任意のディレクトリをその名前で登録したりできます。

日々の作業に欠かせません。

grep で行番号を表示するオプション -n をエイリアスなどで付けているとエラーになる場合があります。そのような時は このような修正 で動きます。