petitviolet_blog

@petitviolet blog

git addするファイルをpecoで選択できるようにした

みんな大好きpecoを使って、git add出来るようにした

作ったもの

f:id:petitviolet:20140723143253g:plain
深いディレクトリにあるファイルが複数ある時、zshのtab補完でやるのも面倒だったので、peco使ってやりたいな〜と思ったからzsh関数書いた

コード

複数選択に対応した

上のgifのように複数選択出来る
検索のハイライトと選択中のハイライトの色が被ってるため見難くなってしまっている

function peco-select-gitadd() {
    local SELECTED_FILE_TO_ADD="$(git status --porcelain | \
                                  peco --query "$LBUFFER" | \
                                  awk -F ' ' '{print $NF}')"
    if [ -n "$SELECTED_FILE_TO_ADD" ]; then
      BUFFER="git add $(echo "$SELECTED_FILE_TO_ADD" | tr '\n' ' ')"
      CURSOR=$#BUFFER
    fi
    zle accept-line
    # zle clear-screen
}
zle -N peco-select-gitadd
bindkey "^g^a" peco-select-gitadd

改行をスペースに置換するだけで良さそうだった
これでCtrl-g+Ctrl-aとtypeすると上のデモのようにgit addするファイルが選べる

git add出来るファイル一覧をいい感じに取るのが難しく、git status --porcelain(--short)での出力結果をパースしてファイル名を取るようにした。
結果としてgit add出来る理由も表示出来たので、これはこれでいいかもしれない

疑問

git add出来るファイル、つまりunstagedあるいはuntrackedなファイルって、何か名称があるんだろうか

以前のバージョン

複数選択は出来ない

function peco-select-gitadd() {
    local selected_file_to_add=$(git status --porcelain | \
        peco --query "$LBUFFER" | \
        awk -F ' ' '{print $NF}')
    if [ -n "$selected_file_to_add" ]; then
      BUFFER="git add ${selected_file_to_add}"
      CURSOR=$#BUFFER
      zle accept-line
    fi
    zle clear-screen
}
zle -N peco-select-gitadd
bindkey "^g^a" peco-select-gitadd