petitviolet blog

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

    2014-05-30

    QiitaZsh

    やりたいこと

    • 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"
    

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

    from: https://qiita.com/petitviolet/items/b1e8b5139169dd530919