この記事はエイチーム引越し侍 / エイチームコネクトの社員による、
Ateam Hikkoshi samurai Inc.× Ateam Connect Inc. Advent Calendar 2021 23日目の記事です。
本日は引越し侍Webエンジニアの@kaitatが担当します!
はじめに
エディタは何を使っていますか?
僕はプライベートでも仕事でもVimを使っています。
普段はag.vimとfzf.vim等のプラグインをたくさん入れて開発をしていますが、最近プラグイン無しのVim環境を使うことがあります。
プラグイン無しのVimでたいへんだと思ったのはファイルを跨ぐパターン検索でした。
調べてみるとVim本体にもパターン検索機能は備わっており、様々な機能があります。その使い方をご紹介します。
プラグインを設定していない環境でも Ctrl-Z + fg
してコピーをする手間がなくなり快適です。
Vimには大きく2種類の検索機能があります。
Vimの検索が使える内部grepと標準的なgrepがVim上で使える外部grepです。
内部grepから使い方を説明します。
:vimgrep
処理は重めですが、Vimの高機能な検索を使うことができます。
基本的には以下のように該当ファイル{file}を対象にパターン{pattern}検索をします。
:vimgrep {pattern} {file}
ファイルは*で複数検索でき、パターンにはVimの正規表現が使えます。
例えば、phpのタグを検索したければ、このように\zs
や\ze
を使って検索できます。
:vim /<?php\zs.*\ze?>/ ~/*.php
内部的にはVimでファイルをメモリに読み込み検索をしているため処理は重いですが、
どんな環境でも検索ができ、Vimの高機能なパターン検索が使えるのは便利です。
また、ファイルを%で記述してカレントファイルを検索します。
使いかたによっては/
で検索するよりも使いやすい場面もあるのではないでしょうか?
僕はファイル対象を小さく絞った上で後ほどご紹介するquickfix と連携すると実用的だと思っています。
:grep
上記ではvimに実装されている内部grepの使い方を書きましたが
次は端末から実行ができるgrep等と連携できる外部grepのご紹介をします。
vimgrepでは大量のファイルを検索したいときはやりずらいと思います。
高速検索したいときにはこのgrep
を使います。似ていますが、以下のように実行します。
:grep {pattern} {file}
これを使うことで検索速度は上がったのではないでしょうか?
こちらを使うと高速に検索できると思います。
また、Gitリポジトリの中であれば以下を実行することでgit grep
と連携します。
set grepprg=git\ grep\ -n
これでより高速に検索することができました。
Gitリポジトリで開発することが多いと思うので.vimrcに書いておいても良いかもしれません。
quickfix
検索の方法はここまで紹介しましたが、複数結果があるときに見にくい状態だと思います。
検索結果を一覧表示し、該当箇所へジャンプできるquickfixのご紹介です。
vimgrepやgregの直後に以下を実行します。
:copen
試しにNextjsのプロジェクトでimport箇所を検索しました。実行すると検索結果の一覧が表示されます。
細かな操作方法もありますが、基本的には以下の操作で完結すると思います。
コマンド | 動作 |
---|---|
:copen | 一覧の表示/quickfixのwindowに遷移 |
:ccl | quickfixを閉じる |
j,k | 移動 |
リストの上でEnter | 該当箇所へジャンプ |
:cn | 次の検索結果へ移動 |
:cp | 前の検索結果へ移動 |
また、次の設定をすることで毎回:copen
と実行せずにvimgrepをすることができます。
au QuickfixCmdPost vimgrep copen
おわりに
まだまだ別の方法や詳細なコマンド、操作方法はありますが、
vimgrepを使うことでVimから抜けることなくファイルを跨いだ検索ができます。
僕はCtrl-Z+fgに比べて検索とジャンプで開発効率はあがりました。:wq
明日
クリスマスは@zwirkyの担当です。
引越し業界初の新サービスを支える開発体制についてです。お楽しみに!