シェルで,上のディレクトリに行くのがめんどくさくて,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)"
使い方
GitHubに置いた.
上に行くcd — Gist
upはシェルの関数なので,.zshrcで
source ~/co/gist/607290/up
とかして,読み込んでおく.
_upはzshの補完関数なので,~/.functions/っていうディレクトリに入れて,.zshrcに,
fpath=(~/.functions ${fpath})
とか書いておく.