vigが動いているところ
タイトル読んで、思ってたのと違ってたらすみません。
vig作ろうと思ったきっかけ
目的のテキストファイルを探すとき、
- 探したい文字列でgrepして
- grepを目でおって、
- 見つけたファイルをvimで開く
ってルーティーン作業をいつもやっていて、「あれ?このコマンドって、人間の僕が残り人生を削ってまで手打ちする必要あるん・・・?」ってなり、このvigコマンドを作り、長らく使っているので、そのご紹介。
(公開することで、どなたかすごい人がもっとスマートな方法を教えてくれるかも...
と淡く期待。他人任せ。)
vigコマンドの中身を簡単にいうと...
grepで検索👉pecoで選ぶ👉vimで開く
必要なもの
zsh, vim, git, pecoが入っている前提です。
お使いの環境に入っていなければ、別途入れてあげてください。
vigコマンドの入れ方
以下のスクリプトを~/.zshrc
などに貼り付けて、source ./.zshrc
を実行。
# gitリポジトリ内か調べる
is_in_git(){
git rev-parse --is-inside-work-tree&> /dev/null
return$status}# grepした結果をpecoで選択してviで開くfunction vig(){local strings=""# vifに渡される文字列local result=""# git grep/grep後の結果local file=""# pecoフィルタ後のファイルパスlocal line=""# 行番号local force_grep=0 # git grep:0, grep:1# オプションがなければ、異常終了if[[$# -eq 0 ]];then
echo"Error: no param"return 1
fi
if[[$1="-f"]];then# -fが指定されたshift
local force_grep=1
elif! is_in_git;then# git外なのでgit grepは使えないlocal force_grep=1
fi
strings="$*"if[[$force_grep-eq 1 ]];then# grep# -n: 行番号表示# -I: バイナリ除外# -i: 大文字小文字無視# -a: テキストとみなす Binary file (standard input) matches回避# peco# --select-1 : 候補が1つしかなければ、そのまま決定result="$(grep-rnIia"$strings" ./.* 2> /dev/null | peco --select-1--query$1)"else# git grepresult="$(git grep-i-n"$strings" 2> /dev/null | peco --select-1--query$1)"fi# head -1を入れたのはgrepの結果に\nが入っていると、# pecoが改行してしまい、意図せず複数行になるためその回避file="$(echo$result | head-1 | cut-d: -f1)"line="$(echo$result | head-1 | cut-d: -f2)"if[[-n"$file"]];then# $fileが空白でないならviで開く# pecoの画面でESCなどを使って何も選択しないときを考慮# あとで履歴から引けるように、~/.zsh_historyに追加する
print -S"vim -c /\"$1\" -c $line$file"# silentで"Press ENTER or type command to continue"の表示抑止# 抑止できていない?echo"vim -c silent -c /\"$1\" -c $file"
vim -c silent -c /"$1"-c$line$filefi}
ソース、汚くて申し訳ないです。🙏
気に入らない箇所があれば、自由に直してください。
vigコマンドの使い方
こんな感じで使ってください。
vig hogehoge
実行すると、カレントディレクトでhogehoge
をgrepした結果を、pecoで表示します。pecoでさらに絞り込んだり、カーソルキー⬆️⬇️で目的のファイルを選択し、Enterを押せば、そのファイルのその行がvimで開きます。(もし、grepの時点で候補が1つになれば、いきなりvimで開きます)
また、gitワーキングツリー内にいるときは、grep
ではなく自動的にgit grep
を使います。その場合、gitのインデックスに入っていないファイル(コミットされていないファイルとか)は、ひっかかりません。
もし、grep
を強制したいときは、-f
を足して、
vig -f hogehoge
とやってください。
あと、zshのヒストリに、ファイル名と行数を指定したvim実行結果を残すようになってます。なので、1度開いた箇所をヒストリからすぐに開けます。
vigの作りのいまいちな点
エスケープの処理を作り込んでいないので、バックスラッシュなどの記号を含む文字列をvigで検索すると、うまく動きません。他にもいろいろといまいちな点はあるかと。
そもそもごちゃごちゃしていて汚いし、もっと綺麗に描けるはず...
TODO
GNU GLOBALにも簡単に対応できると思うが、まだやっていない。
このvigが必要ない人
vim-fugitiveとかを使ってvimから直接git grepする人とか、gtags使いの人は、vigは必要ないかもしれません。
僕もvim-fugitiveを使っていますが、コンソールからgrepしたくなることが間々あるので、vigを使っています。
おしまい。