LoginSignup
3
2

More than 1 year has passed since last update.

git + peco + Vim — git grep でマッチしたファイルを選んでVim で編集する

Last updated at Posted at 2018-08-29

イメージ

  • echo という文字列があるファイルを git grep する
  • 12行目でマッチしているファイルを選ぶ

image

  • Vimで12行目から編集開始できる

image

ポイント

  • $EDITOR の環境変数で利用するエディタを決める
  • git grep --line-number オプションを使って、git grepで引っかかった行を読み込むようにする ( Vim を使う場合 )
  • git grep の結果からファイルパスをパースする
  • peco を使ってインクリメンタル検索をする

スクリプト例

#!/usr/bin/env bash -eu

# Usage
#
# $ command [grep-keyword] --some-grep-option

# 利用するエディタを環境変数から決める
readonly editor=${EDITOR:-vim}

# peco が入っていなければ終了する
if [ ! $(which peco) ]; then
  echo You need peco please install
  exit
fi

# git grep する
# git grep には自由なオプションを渡せるようにしておく ( --line-number をのぞいて )
readonly git_grep_result=$(git grep --line-number $@)

# git grep のマッチ結果がなければ終了する
if [ -z "$git_grep_result" ]; then
  echo No match with git grep
  exit
fi

# git grep の結果からpecoで検索モードに入る
readonly git_grep_select=$(echo "$git_grep_result" | peco --query="$1")

# peco での選択結果がなければ終了する
if [ -z "$git_grep_select" ]; then
  exit
fi

# pecoで選んだ行からファイルパスをパースする
readonly filepath=$(echo "$git_grep_select" | awk -F':' '{ print $1 }')

# git grep の結果からファイルの行番号をパースする
readonly line_number=$(echo "$git_grep_select" | awk -F':' '{ print $2 }')

if [ ! -z "$filepath" ]; then
  # エディタが Vim なら 引っかかったファイル行番号から開くようにする
  if [[ "$editor" =~ vim ]] && [ ! -z "$line_number" ]; then
    eval "$editor" +"$line_number" "$filepath"
  else
    eval "$editor" "$filepath"
  fi
fi

gitim/git-grep-edit at acdbbf9bcbfd92e10d62be3f92bff5e6e5b0366e · YumaInaura/gitim

Versions

  • git version 2.8.1
  • peco version v0.5.3 (built with go1.10)
  • bash 4.2
  • Mac OS High Sierra

Links

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

Twitter

3
2
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
3
2