Help us understand the problem. What is going on with this article?

zshでの自作関数と、それに対する補完関数を実装する

More than 5 years have passed since last update.

やりたいこと

  • zshでオリジナルな関数を実装したい
  • 自作関数にも補完を効くようにしたい
    • ファイル一覧を表示させたい
  • オプションも付けたい

参考

自作関数

rm~/.Trash/mvするだけのコマンド(もらいもの)に置き換えており、rmf/bin/rm/に置き換えている
以前は

function rmf() {
  for file in $*
  /bin/rm $file
}

としてあった
これだとファイル一覧の候補や、-rなどの/bin/rmが持つオプションをうまく使えなくて困っていた

結果

こんな感じ

output.gif

-を入力した状態で<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"

これで大体事足りたのに気付いた
でもオプションの説明表示とかはこれでは出来なかったのでまあ良し...?

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away