本日も乙

ただの自己満足な備忘録。

個人的によく使うGitエイリアス、zshキーバインド

最近、リモートワークということもあり、ペアプロというかAWS、GCPなどの操作をする際に一緒に画面を見ながら作業する機会が多いです。若手の同僚がターミナルソフトを起動してコマンドを実行するのですが、傍から見ているとエイリアスなりキーバインドなりを使えば効率的に操作できるのにと思うことがあります。

最近はGUIで操作することが多いのでターミナルソフトでコマンド操作することがあまりないのかもしれませんが、私は少し前までは(クラウドしかできない)ITインフラエンジニアをやっており、プログラミングよりもコマンド操作するのが圧倒的に多かったため、ちょっとしたことならGUIよりもターミナルで操作することが多いです。Windowsを使っていますが WSL2 + Ubuntu 20.04 LTSで開発環境を整えているため、操作に不自由はほとんどしません。

この手のエイリアスやzshなどのオススメ設定はググれば出てくるので、色々調べながら自分だけの最高の設定環境を整えるというのはとても楽しいものです(そして時間はあっという間に溶ける)。どうせ同じことをするなら打つ文字数が少ないほうが間違えづらいし、早いです。わずか1、2秒の差かもしれませんが塵も積もれば山となるです。

今回は、個人的にGit操作時によく使うエイリアスとzshキーバインドを紹介します。

エイリアス

まず、git コマンドそのものが長いです。g にしましょう。

# ~/.zshrc
alias g="git"
# 補完を効かせる
compdef g=git

私のGitエイリアスは以下の通りです。

# ~/.gitconfig
[alias]
    s = status
    b = branch
    l = log
    cm = commit
    ss = status -s
    co = checkout
    rb = rebase
    st = stash
    sh = show
    pr = pull -r
    ps = push
    # 今のブランチと同名のリモートブランチにpush
    psi = !git rev-parse --abbrev-ref HEAD | xargs git push --set-upstream origin
    # リモートブランチをローカルにチェックアウト
    cr = !git branch -r | peco --prompt 'BRANCH>' | cut -d'/' -f2- | xargs git checkout
    # エイリアス一覧
    alias = !git config --get-regexp '^alias\\.' | sed 's/alias\\.\\([^ ]*\\) \\(.*\\)/\\1\\\t => \\2/' | sort
    # グラフ
    gr = log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
    # ログからpecoで探す
    lp = !git log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s' | peco
    df = diff
    # 変更のあったファイルとそのファイルの修正ライン数を表示
    ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
    # ブランチを削除
    bd = !git branch | grep -Ev '\\*|master|main' | peco | xargs git branch -D

エイリアス一覧

設定したエイリアスを忘れたときに毎回 ~/.gitconfig を見にいくのが面倒なので g alias で一覧表示します。

pecoと組み合わせる

pecoは文字入力する度にインタラクティブにフィルタできるツールです。これと組み合わせることで利便性が格段に上がります。私の場合、以下のエイリアスで使用しています。

  • g cr でGitHub等のリモートブランチを選択するとローカルにそのブランチでチェックアウトできる
  • g lp でGitの履歴を調べたいときにうろ覚えでも調べるができる
  • g bd でmaster、mainとカレントブランチ以外を削除する

キーバインド

zshのキーバインドを使うことでエイリアスではできないショートカットが実現できます。

チェックアウト

先ほど紹介したpecoを使ってチェックアウトします。

# prefix + [
bindkey '^[' peco-git-checkout
function peco-git-checkout () {
    local selected_branch=$(git branch --list --no-color | colrm 1 2 | peco)
    if [ -n "$selected_branch" ]; then
    BUFFER="git checkout ${selected_branch}"
    zle accept-line
    fi
    zle clear-screen
}
zle -N peco-git-checkout

ghqとpecoでリポジトリ管理

詳細はghqでリポジトリ管理とpeco連携で快適git生活 - Qiitaなどを読んでいただいた方が早いですが、導入するとめっちゃリポジトリ操作が捗ります。

# prefix + F
bindkey '^F' peco-src
function peco-src() {
    local selected_dir=$(ghq list | peco --query "$LBUFFER")
    if [ -n "$selected_dir" ]; then
    selected_dir="$GOPATH/src/$selected_dir"
    BUFFER="cd ${selected_dir}"
    zle accept-line
    fi
    zle clear-screen
}
zle -N peco-src

GitHubリポジトリを開く

先ほどのghqでリポジトリ管理をしている前提ですが、コマンドラインからGitHubリポジトリを開きたいときに便利です。 WSL2を使っているのでwslviewコマンドがあるか否かで分岐させています。

# prefix + o
bindkey '^o' open-git-remote
function open-git-remote() {
    local selected=$(ghq list | peco --query "$LBUFFER")
    if [ -n "$selected" ]; then
    if [ -x "`which wslview`" ]; then
        BUFFER="wslview https://${selected}"
    else
        BUFFER="open https://${selected}"
    fi
    zle accept-line
    fi
    zle clear-screen
}
zle -N open-git-remote

参考URL