いものやま。

雑多な知識の寄せ集め

wpコマンドの紹介。

昨日、Screenの紹介をした。

それに関連して、wpコマンドを紹介したい。

別の仮想端末と同じディレクトリに移動したい

Screenを使っていてよくあるのが、「別の仮想端末と同じディレクトリに移動したい」ということ。
そんなときに使えるのが、wpコマンド。
(厳密には、Shellスクリプトに定義された関数)

例えば、次のように使える:

(仮想端末0で)
$ pwd
/home/somebody
$ cd some/deep/deep/path/to/directory
$ pwd
/home/somebody/some/deep/deep/path/to/directory

(仮想端末1で)
$ pwd
/home/somebody
$ wp
0:/home/somebody/some/deep/deep/path/to/directory
1:/home/somebody
$ wp 0
$ pwd
/home/somebody/some/deep/deep/path/to/directory

このように、wpコマンドを引数なしで使うと、各仮想端末の現在のディレクトリのリストが表示され、引数で仮想端末の番号を指定すると、その番号の仮想端末の現在のディレクトリに移動することが出来る。

なお、以下で紹介するShellスクリプトはネットで見つけたものをちょっといじったものだけど、そのスクリプトではcddコマンドとなっていた。
ただ、cddとかタイプが面倒くさいので、wpコマンドに変更した。
wpはワープ(warp)の意。

.wp.sh

wpコマンドを使えるようにするためのShellスクリプトは、以下のとおり:

#----------------------------------------
# wp  warp-command
#----------------------------------------

wpdir=$HOME/.wp
wpfile=$wpdir/wpfile
wpmax=9

function wp_init() {
    if [ ! -d $wpdir ]; then
        mkdir $wpdir
    fi
    if [ ! -f $wpfile ]; then
        for i in `jot - 0 $wpmax`; do  # for mac os x
#      for i in `seq 0 $wpmax`; do # for linux, cygwin
            echo "$i:" >> $wpfile
        done
    fi
}

function wp_cd() {
    dir=`sed -n "s/$1:\(.*\)$/\1/p" $wpfile`
    cd "$dir"
}

function wp_ls() {
    cat $wpfile
}

function wp_rec() {
    sed -e "s|$1:.*$|$1:$2|" -i "" $wpfile  # for mac os x
#  sed -i "s|$1:.*$|$1:$2|" $wpfile  # for linux, cygwin
}

function wp() {
    if [ $1 ]; then
        wp_cd $1
    else
        wp_ls
    fi
}

function cd() {
    if [ "$1" ]; then
        builtin cd "$1"
    else
        builtin cd
    fi

    if [ $WINDOW ]; then
        wp_rec $WINDOW "`pwd`"
    fi
}

_wp() {
    COMPREPLY=(`wp_ls`)
}
complete -F _wp wp

wp_init

組込みのcdコマンドを置き換えて、cdでディレクトリを移動したときに、どのディレクトリに移動したのかを記録するようにしている。

これを使えるようにするには、このShellスクリプトをホームディレクトリに置いておき、.bashrcで次のようにこのスクリプトを呼び出すようにしておく:

source .wp.sh

ちょっと便利な使い方

自分のようにScreenをローカルで使っていて、デタッチや再アタッチがうまく働かない場合も、wpコマンドは有益。
というのも、cdしたときのディレクトリが記録されているから。
このおかげで、仮想端末を作ったあとにwpを行えば、以前作業していたディレクトリで作業を再開することが出来る。

今日はここまで!