はじめに
git status
みて git add
したり、 git branch
みて git checkout
したり、定型動作が増えてきたので、 peco
にまとめました。
-
zsh
とpeco
が必要
動作
-
Ctrl
+g
でpeco
が起動
コマンド | 選択肢 | 選択後の動作 |
---|---|---|
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
のただの劣化版になってるみたいなので、そちらもご確認ください。
それにしても構成が似ている...(ぱくってないです)