絶対パスでヒストリ追加するcd
C-rで履歴検索を使うと、ヒストリから以前使ったコマンド(引数付き)を呼び出して使うことができる。
ディレクトリ移動もよく行う動作なので、ヒストリから検索したいと思った。
しかし、カレントディレクトリからの相対パスでcdすることが多い。
さらに、lsで行き先を確認しながらcdするため、ヒストリに登録されるcdの履歴は、
そのままではヒストリ検索から使いづらいものになっている。
そこで、相対パス絶対パスに変換し、ヒストリ登録できるcdがあれば、
ヒストリ検索からディレクトリ移動しやすくなるのではないかと思い、つくってみた。
コード
#! /usr/bin/zshhistf=$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
さて、コードを載せたので、本編はここまで、これ以降はおまけ、蛇足(だと言い張っておく)
コードの説明
わざわざ説明を入れるほどのモノはつくっていないと思うが、順に説明をいれてみる。
zshで実行しているのは、zshの引数を2つ取るcdを使いたいから。
#! /usr/bin/zsh
シェルで設定している履歴ファイルを指定する。
histf=$HOME/.zsh_history
先にif文だけを取りあえげる。それぞれ中身はあとで取り上げる。
if [ $# -eq 1 ]; thenelse
fi
$#は実行時引数の数を持っている特殊変数
C言語とは異なり、この数に自身のファイル名は数えられていないので、
実行時引数が1つなら$#も1,実行時引数が2つなら$#も2となる。
(Cと違って分かりやすくて助かる…)
先ほどのif文ががtrueのときの中身。実行時引数が1つの時の処理。
builtin cd $1
if [ $? -ne 0 ] ; then
return 1
fi
echo "cd" $PWD >> $histf
fc -R
とりあえず引数の場所へcdしてみる。
cd出来なかったら、cdは1を返却するので、それを見て、cd出来ないならそのまま何もせず終了する。
cdできた場合は、"cd カレントディレクトリ" という文字列を履歴ファイルへ追記する。
追記したものを今のシェルでもすぐに参照できるように、履歴ファイルからヒストリを読み込み、
ヒストリを更新する。
# 最初ヒストリの更新をしていなかったために、履歴ファイルに追記したのに、ヒストリに出てこなくて困っていた
if文のがfalseの時。つまり、実行時引数が1つでないとき。
builtin cd $*
普通に考えれば引数が0個か、2個の時にこれが呼び出される。
引数が0個なら、ホームディレクトリへ、2こなら、引数を2つとるcdとして動作する。
とりあえず、思ったものができて満足した。
次は、locateを使って、ヒストリにないディレクトリでも検索から移動できるようにしてみようかなぁと考え中