🖥

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

2023/08/26に公開

イメージ

  • 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

チャットメンバー募集

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

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2018-08-30

Discussion