絶対パスでヒストリ追加するcd

C-rで履歴検索を使うと、ヒストリから以前使ったコマンド(引数付き)を呼び出して使うことができる。
ディレクトリ移動もよく行う動作なので、ヒストリから検索したいと思った。
しかし、カレントディレクトリからの相対パスでcdすることが多い。
さらに、lsで行き先を確認しながらcdするため、ヒストリに登録されるcdの履歴は、
そのままではヒストリ検索から使いづらいものになっている。
そこで、相対パス絶対パスに変換し、ヒストリ登録できるcdがあれば、
ヒストリ検索からディレクトリ移動しやすくなるのではないかと思い、つくってみた。

機能

相対パス指定でディレクトリ移動を行ったときに、絶対パスでヒストリへ登録する
zsh特有?の引数を2つ取るcdの使い方もそのまま使える

コード


#! /usr/bin/zsh

histf=$HOME/.zsh_history

if [ $# -eq 1 ]; then
builtin cd $1
if [ $? -ne 0 ] ; then
return 1
fi
echo "cd" $PWD >> $histf
fc -R
else
builtin cd $*
fi

さて、コードを載せたので、本編はここまで、これ以降はおまけ、蛇足(だと言い張っておく)

コードの説明

わざわざ説明を入れるほどのモノはつくっていないと思うが、順に説明をいれてみる。


#! /usr/bin/zsh
zshで実行しているのは、zshの引数を2つ取るcdを使いたいから。


histf=$HOME/.zsh_history
シェルで設定している履歴ファイルを指定する。


if [ $# -eq 1 ]; then

else

fi

先にif文だけを取りあえげる。それぞれ中身はあとで取り上げる。
$#は実行時引数の数を持っている特殊変数
C言語とは異なり、この数に自身のファイル名は数えられていないので、
実行時引数が1つなら$#も1,実行時引数が2つなら$#も2となる。
(Cと違って分かりやすくて助かる…)


builtin cd $1
if [ $? -ne 0 ] ; then
return 1
fi
echo "cd" $PWD >> $histf
fc -R
先ほどのif文ががtrueのときの中身。実行時引数が1つの時の処理。
とりあえず引数の場所へcdしてみる。
cd出来なかったら、cdは1を返却するので、それを見て、cd出来ないならそのまま何もせず終了する。
cdできた場合は、"cd カレントディレクトリ" という文字列を履歴ファイルへ追記する。
追記したものを今のシェルでもすぐに参照できるように、履歴ファイルからヒストリを読み込み、
ヒストリを更新する。
# 最初ヒストリの更新をしていなかったために、履歴ファイルに追記したのに、ヒストリに出てこなくて困っていた


builtin cd $*
if文のがfalseの時。つまり、実行時引数が1つでないとき。
普通に考えれば引数が0個か、2個の時にこれが呼び出される。
引数が0個なら、ホームディレクトリへ、2こなら、引数を2つとるcdとして動作する。



とりあえず、思ったものができて満足した。
次は、locateを使って、ヒストリにないディレクトリでも検索から移動できるようにしてみようかなぁと考え中