やりたいこと
- zshでオリジナルな関数を実装したい
- 自作関数にも補完を効くようにしたい
- ファイル一覧を表示させたい
- オプションも付けたい
参考
自作関数
rm
を~/.Trash/
にmv
するだけのコマンド(もらいもの)に置き換えており、rmf
は/bin/rm/
に置き換えている
以前は
function rmf() {
for file in $*
/bin/rm $file
}
としてあった
これだとファイル一覧の候補や、-r
などの/bin/rm
が持つオプションをうまく使えなくて困っていた
結果
こんな感じ
-
を入力した状態で<Tab>
を押すとオプションが一覧表示され、何も入力していない状態かオプションが入力された状態で<Tab>
だとファイル一覧の候補を表示する
コード
# rmfで削除
function rmf() {
# -h, --helpしたら呼ぶ
help() {
echo 'rmf help!'
echo 'Usage: rmf [option] filename'
return
}
# 引数に対してループを回す
for file in $*
do
# 引数一つ一つについてcase文で条件分岐
case $file in
# -hか--helpだった時はhelp()を呼んで終わり
-h|--help)
help
return
;;
# -rfか-frだった時は$optionに"-rf"を入れておく
-rf|-fr)
option="-rf"
;;
-r)
option="-r"
;;
-f)
option="-f"
;;
# ワイルドカード
# オプションではない時のメインとなる処理
*)
echo 'removed:' $file
/bin/rm $option $file
esac
# shiftで配列の先頭を削除出来る
# shift
done
return 1; # 必要かどうかはわからない
}
_rmfcmd() {
# 補完のための便利な関数_arguments
_arguments \
# -h, --helpを入力した時にはファイル一覧の候補を表示しない
# 複数のオプションは{foo,bar}と書く
# '[description]'でオプションの説明
'(- *)'{-h,--help}'[show help]' \
-r'[recursive]' \
-f'[force]' \
-rf'[recursive && force]' \
# ファイル一覧を出す
'*: :_files'
}
# 補完関数_rmfcmdを自作関数rmfにあてる
compdef _rmfcmd rmf
まとめ
alias rmf="/bin/rm"
これで大体事足りたのに気付いた
でもオプションの説明表示とかはこれでは出来なかったのでまあ良し...?