Microのシェルモードを使ってみます。
今回の内容では、rg(ripgrep)とfzf(fuzzy finder)のコマンドを使用します。
junegunn/fzf: :cherry_blossom: A command-line fuzzy finder
環境
マシン : Raspberry Pi 5 8G
OS : Raspberry Pi OS(64-bit)
Micro : 2.0.11
ripgrep : 13.0.0
fzf : 0.38.0
下記コマンドでrgとfzfのコマンドを使用できるようにする。
$ sudo apt update $ sudo apt install ripgrep $ sudo apt install fzf
※最新版のfzfをインストールする場合は下記のコマンドを実行します。
$ git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf $ ~/.fzf/install # fzfのアップグレード $ cd ~/.fzf && git pull && ./install
はじめにMicroを介さずにrgとfzfの挙動を見ておきます。
どちらのコマンドも既知の場合は読み飛ばして構いません。
$ rg 検索したい文字列
で現在のディレクトリ以下のすべてのファイル(一部ファイルを除く)から検索したい文字列を含むファイルを検索します。
hogeという文字列で検索をしてみます。
$ rg hoge
存在していれば、
hoge.txt 1:hoge
のような感じで、該当するファイルと、検索ワード周辺の文字列が出力されます。
$ fzf
を実行すると、
のように現在のディレクトリ以下のファイルの相対パスが一覧で出力されます。
$ rg -l hoge | fzf
※rgに -lオプションを付けることで、ヒットしたファイル名のみ出力します。
のようにrgとfzfをパイプ( | )でつなぐことで、
rgの検索で該当した内容でfzfを実行できます。
Microのシェルモードでrgやfzfを使用してみます。
Ctrl + bでシェルモードになります。
シェルモードになると画面左下に $ が表示されます。
$ rg hoge
を実行してみます。
hello.html 5: <title>hoge</title> Press enter to continue
のような内容が出力されます。
※fzfも似たような内容になりますので、出力結果は省略します。
続いて、Microのシェルモードで下記のコマンドのようなパイプ付きのコマンドを実行してみます。
$ rg -l hoge | fzf
|: No such file or directory (os error 2) fzf: No such file or directory (os error 2) Press enter to continue
のような内容が出力されます。
どうやら、パイプ( | )以下のトークン(文字列のこと)がrgの引数として認識されているようです。
Microのシェルモードの仕様を確認してみましたところ、Go言語の標準機能のos/execを使用しているらしく、パイプ付きのコマンドを実行する場合は下記のように一工夫が必要になるそうです。
$ sh -c 'rg -l hoge | fzf'
実行したいコマンドをシングルクォーテーション( ' )で囲って、shの引数の一つとして扱うようにします。
exec package - os/exec - Go Packages
のようにパイプ付きのコマンドを実行できるようになりました。
余談ですが、今回紹介した機能をMicroのプラグインとしてインストールできるようにしました。
使用したい場合は下記のコマンドでプラグインをインストールします。
$ sudo apt update $ sudo apt install git ripgrep fzf $ git clone https://github.com/inunosinsi/micro-rg-fzf.git ~/.config/micro/plug/rg-fzf
使い方はMicroを起動して、Ctrl + eでコマンドモードにし、
> rg 検索したい文字列