LoginSignup
9
9

More than 5 years have passed since last update.

git logからコミットハッシュを取得するzawソース

Last updated at Posted at 2012-12-26

zshの Advent Calendar を見て使い始めたにわかzawユーザですが、zawのsourceを作ってみました。

機能としては単純で、git logの出力を見ながらコミットを選択し、選択したコミットのハッシュ値を取得するというもの。
名前はとりあえず、zaw-git-log としました。

git checkoutgit diffgit rebaseなどと一緒に使用すると良い感じに使えるかと思います。

以下使用イメージ

コミットを1つ選択
screenshot01

screenshot02

コミットを2つ選択
screeenshot03

screenshot04

3つ以上選択した場合は、空白区切りで出力します。

複数選択はzaw共通の機能で、デフォルトでは^@キーに割り当てられています。

変更する場合は、以下のように設定します。
(^@の部分を適当に書き換えて下さい)

bindkey -M filterselect '^@' set-mark-command

コードは以下

#
# zaw-src-git-log
#
#   zaw source for git log.
#   https://gist.github.com/4350604
#
#   zaw : https://github.com/nakamuray/zaw
#

# git log pretty format: For detail, refer to "man git-log"
ZAW_SRC_GIT_LOG_LOG_FORMAT=${ZAW_SRC_GIT_LOG_LOG_FORMAT:-'%ad | %s %d[%an]'}

# If true, print full SHA.
ZAW_SRC_GIT_LOG_NO_ABBREV=${ZAW_SRC_GIT_LOG_NO_ABBREV:-'false'}

# Limit the number of commits to output.
# If set the value less than 1, output unlimitedly.
ZAW_SRC_GIT_LOG_MAX_COUNT=${ZAW_SRC_GIT_LOG_MAX_COUNT:-100}

# Date style (relative, local, iso, rfc, short, raw, default)
ZAW_SRC_GIT_LOG_DATE_STYLE=${ZAW_SRC_GIT_LOG_DATE_STYLE:-'short'}

# The function to regiter to zaw.
function zaw-src-git-log () {
    # Check git directory.
    git rev-parse -q --is-inside-work-tree > /dev/null 2>&1 || return 1

    # Set up option.
    local -a opt
    opt=("--pretty=format:%h $ZAW_SRC_GIT_LOG_LOG_FORMAT")
    if [ "$ZAW_SRC_GIT_LOG_NO_ABBREV" != 'false' ]; then
        opt+=('--no-abbrev')
    fi
    if [ $ZAW_SRC_GIT_LOG_MAX_COUNT -gt 0 ]; then
        opt+=("--max-count=$ZAW_SRC_GIT_LOG_MAX_COUNT")
    fi
    if [ -n "$ZAW_SRC_GIT_LOG_DATE_STYLE" ]; then
        opt+=("--date=$ZAW_SRC_GIT_LOG_DATE_STYLE")
    fi

    # Get git log.
    local log="$(git log "${opt[@]}")"

    # Set candidates.
    candidates+=(${(f)log})
    actions=("zaw-src-git-log-append-to-buffer")
    act_descriptions=("git-log for zaw")
    # Enale multi marker.
    options+=(-m)
}
# Action function.
function zaw-src-git-log-append-to-buffer () {
    local list
    local item
    for item in "$@"; do
        list+="$(echo "$item" | cut -d ' ' -f 1) "
    done
    set -- $list

    local buf=
    if [ $# -eq 2 ]; then
        # To diff.
        buf+="$1..$2"
    else
        # 1 or 3 or more items.
        buf+="${(j: :)@}"
    fi
    # Append left buffer.
    LBUFFER+="$buf"
}
# Register this src to zaw.
zaw-register-src -n git-log zaw-src-git-log

コードをコピペして.zshrcに貼り付けるか、別ファイルに保存してsourceするか、zawのsourceディレクトリに入れるなどして使用して下さい。

また、git logのフォーマットはそれぞれ好みがあると思うので、適当に変更してご使用下さい。
先頭にハッシュ値+空白さえあれば動くはずなので。

一応Githubにも上げています。
yonchu/zaw-src-git-log · GitHub

おわり

zawはまだ使い始めて数日ですが、非常に使い勝手がいいですね。
sourceの作成が簡単で、単純なものなら数行で作れそうです。
zshの補完関数よりも手軽に書けるので、自分しか使わないような微妙なものを作るのにも良さそう。

9
9
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
9
9