LoginSignup
5
6

More than 5 years have passed since last update.

gitでよく使う操作をpecoにまとめた

Last updated at Posted at 2017-03-05

はじめに

git status みて git add したり、 git branch みて git checkout したり、定型動作が増えてきたので、 peco にまとめました。

  • zshpeco が必要

動作

  • Ctrl + gpeco が起動
コマンド 選択肢 選択後の動作
diff git status の結果 実行
add add -p reset HEAD git status の結果 バッファに入力(実行しない)
checkout merge push origin git branch の結果 バッファに入力(実行しない)
commit -m コミットメッセージのテンプレ git commit -m 'hoge : バッファに入力(実行しない)
log status なし 実行
reset --hard commit -F- <<EOM なし バッファに入力(実行しない)

ソースコード

.zshrc
function peco-git() {
  local actions=( "add" "add -p" "checkout" "checkout -b" \
                  "commit -m" "commit -F- <<EOM" "diff" "log" "merge" \
                  "push origin" "reset HEAD" "reset --hard" "status" )
  local action=`echo "$(IFS=$'\n'; echo "${actions[*]}")" | peco --prompt 'GIT>'`
  [ -z "$action" ] && return

  # 選択したactionによって実行コマンドを振り分け
  case "$action" in
    'checkout' | 'push origin' | 'merge' )
      local branch=`git branch | peco --prompt 'GIT>' | awk -F ' ' '{print $NF}'`
      [ -z "$branch" ] && return
      BUFFER="git $action $branch" ;;

    'diff' | 'add' | 'add -p' | 'reset HEAD' )
      local file=`git status -uall --porcelain -s | peco --prompt 'GIT>' | awk -F ' ' '{print $NF}'`
      [ -z "$file" ] && return
      BUFFER="git $action $file" ;;

    'commit -m' )
      local cmd="commit -m '"
      local templates=( "${cmd}mod : " "${cmd}fix : " "${cmd}add : " "${cmd}remove : " )
      local template=`echo "$(IFS=$'\n'; echo "${templates[*]}")" | peco --prompt 'GIT>'`
      [ -z "$template" ] && return
      BUFFER="git $template" ;;

    'status' | 'reset --hard' | 'commit -F- <<EOM' )
      BUFFER="git $action" ;;

    'log' )
      local logformat='format:%C(yellow)%h %C(green)%cd %C(blue)%an%C(red)%d %C(reset)%s'
      BUFFER="git log --no-merges --date=short --pretty='$logformat'" < /dev/tty ;;
  esac

  # 選択したactionによっては即時実行する
  case "$action" in
    'diff' | 'log' | 'status' )
      eval "$BUFFER" < /dev/tty
      BUFFER="" ;;
  esac

  CURSOR=$#BUFFER
  zle reset-prompt
}
zle -N peco-git
bindkey '^G' peco-git

おまけ

配列を改行区切りで結合

  • IFS に改行を指定するには $'\n'
  • 全部結合するには echo "${ary[*]}"
arr=("a" "b" "c")
str=`echo "$(IFS=$'\n'; echo "${ary[*]}")"`

zsh widget の中で対話的なコマンドを実行する

  • < /dev/tty を入れないと入力待たずに終了する
eval "$BUFFER" < /dev/tty

shのswitch文

case "$flag" in
  'a' )
    command1 ;;
  'b' | 'c' )
    command2 ;;
esac

おわりに

どなたかが本記事をツイートしてくださったときに zaw-git なるものに言及されているのを発見し、確認してみました。 zaw-git のただの劣化版になってるみたいなので、そちらもご確認ください。

それにしても構成が似ている...(ぱくってないです)

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6