Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5657

【コマンドライン作業速度ギュン上げ】grepで探してviで開く、vigコマンドを作ってみたよ!

$
0
0

vigが動いているところ

vig.mov.gif

タイトル読んで、思ってたのと違ってたらすみません。

vig作ろうと思ったきっかけ

目的のテキストファイルを探すとき、

  1. 探したい文字列でgrepして
  2. grepを目でおって、
  3. 見つけたファイルをvimで開く

ってルーティーン作業をいつもやっていて、「あれ?このコマンドって、人間の僕が残り人生を削ってまで手打ちする必要あるん・・・?」ってなり、このvigコマンドを作り、長らく使っているので、そのご紹介。

(公開することで、どなたかすごい人がもっとスマートな方法を教えてくれるかも...
と淡く期待。他人任せ。)

vigコマンドの中身を簡単にいうと...

grepで検索👉pecoで選ぶ👉vimで開く

必要なもの

zsh, vim, git, pecoが入っている前提です。
お使いの環境に入っていなければ、別途入れてあげてください。

vigコマンドの入れ方

以下のスクリプトを~/.zshrcなどに貼り付けて、source ./.zshrcを実行。

~/.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を使っています。

おしまい。


Viewing all articles
Browse latest Browse all 5657

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>