hitode909の日記

以前はプログラミング日記でしたが、今は子育て日記です

上に行くcd作った

シェルで,上のディレクトリに行くのがめんどくさくて,cd ../../../../とかしないといけなくて,指を痛める.
上に行くためのupっていうコマンドを作ることにした.

その1

up 3ってやると,3つ上に行くのを作った.

function up()
{
    i=0
    while [ $i -lt $1 ]
    do
        cd ../
        i=`expr $i + 1`
    done
}

使い方

% pwd
/Users/fkd/co/dev/dotfiles
% up 3
% pwd
/Users/fkd
%

これは使いにくくて,cd ../../って打つときは,いくつ上に行くか考えながら,../って打ってる.これだと,先に数えておかないといけなくて,難しかった.

その2

考えながら入力できるようにしてみた.引数の数だけ見る.

function up()
{
    i=0
    while [ $i -lt $# ]
    do
        cd ../
        i=`expr $i + 1`
    done
}

使い方

% pwd
/Users/fkd/co/dev/dotfiles
% up a a a
% pwd
/Users/fkd
%

a a aってやると,3つ上に行くけど,どこに行くのか分からないし,使いにくい.

その3

上に行きたいとき,行きたい場所は決まってるのだから,ディレクトリ名を入力することにした.普通のcdはカレントディレクトリから探すけど,これは,pwdに含まれるパスから探す.

function up()
{
    to=$(perl -le '$p=$ENV{PWD}."/";$d="/".$ARGV[0]."/";$r=rindex($p,$d);\
                   $r>=0 && print substr($p, 0, $r+length($d))' $1)
    if [ "$to" = "" ]; then
        echo "no such file or directory: $1" 1>&2
        return 1
    fi
    cd $to
}

使い方

% pwd
/Users/fkd/co/dev/dotfiles
% up fkd
% pwd
/Users/fkd
% up poepoepoe
no such file or directory: poepoepoe
%

zshの補完関数も書いた.

#compdef up

segments=$(perl -le '$p=$ENV{PWD};$p =~ tr/\// /; print $p')
_arguments "1:first:($segments)"

大文字が先に来たりするけど,まあよいと思う.
http://gyazo.com/d7f2c1627f3aab5e183a475dbd2640a7.png

使い方

GitHubに置いた.
上に行くcd — Gist
upはシェルの関数なので,.zshrcで

source ~/co/gist/607290/up

とかして,読み込んでおく.
_upはzshの補完関数なので,~/.functions/っていうディレクトリに入れて,.zshrcに,

fpath=(~/.functions ${fpath})

とか書いておく.

関連

これも上に行くやつ.これも便利なので,今回作ったのと使いわけるとよさそう.