新社会人に送る。peco + anyframe + zshで実現する快適コマンドライン環境

はじめに

こんにちは!エンジニアの恩田です。
エンジニアとして仕事をする以上、多くの時間をコマンドライン上で過ごす方も多いでしょう。業務の大部分の時間を過ごす環境は誰でも快適にしたいですよね!よくエンジニア間ではエディタの宗教戦争が話題になりますが、今回はコマンドライン環境を快適にする為のツール群を紹介します。

pecoとは?

コマンド出力結果のインクリメントサーチを行う為のツールです。これだけだとイメージしづらいですが、導入すると以下のような事が実現できます。

  • bash history一覧をインクリメントサーチ => 実行
  • branch一覧をインクリメントサーチ => git checkout
  • よく移動するディレクトリ一覧をインクリメントサーチ => 移動
  • デタッチされてるtmuxセッション一覧をサーチ => アタッチ

このような動きをコマンド一発で実行できるようになります。本家のREADMEのGIFを見るとイメージしやすいと思います。また、pecoはPureGoで書かれていいるので、バイナリファイル1つで動作します。つまりPATHの通ってる場所に設置すれば即使えるのも利点です。。(自分はdotfiles内でpecoのbinaryファイルを管理、initスクリプト的な物でパス通してるディレクトリに設置してます)

インストール

$ wget https://github.com/peco/peco/releases/download/v0.3.3/peco_linux_amd64.tar.gz
$ tar xzvf peco_linux_amd64.tar.gz
$ mv peco_linux_amd64/peco /usr/local/bin
$ peco --version

pecoは単純に「渡したリスト一覧からインクリメンタルに絞り込む」機能のみ提供します。一番簡単な使い方は以下のようになります

$ ls | peco
QUERY>                                                                                                                          
Applications
Box
Desktop
Documents
Downloads
Gemfile
Library
Movies
Music
Pictures
Public
Str,
Vagrantfile
VirtualBox VMs
dotfiles
repos
anyframeとは
pecoは単純に「渡したリスト一覧からインクリメンタルに絞り込む」機能しか提供しません。「選んだ結果を実行する」、「選んだ結果をさらにフィルターして実行する」 といったシェルの処理は自分で記述しなければなりません。anyframeは、こういったshellを書く手間を無くすために提供されたzshプラグインで、導入すると即便利なコマンドライン関数が使えるようになります。
インストール
mkdir $HOME/.zsh/
cd $HOME/.zsh/
git clone git@github.com:mollifier/anyframe.git
# .zshrcに以下追記
fpath=($HOME/.zsh/anyframe(N-/) $fpath)
autoload -Uz anyframe-init
anyframe-init
これで完了です。
各種便利関数のキーバインドを設定
anyframeでは様々な関数が定義されていますが、設定しておくと便利な関数は以下あたりでしょうか。これを.zshrcなりにキーバインドとして設定しておくことで、anyframeから提供している各種pecoメソッドを利用することができます
## よく移動するディレクトリ一覧をインクリメントサーチ & 移動
bindkey '^@' anyframe-widget-cdr
## bash history一覧インクリメントサーチ & 実行
bindkey '^r' anyframe-widget-execute-history
## branch一覧をインクリメントサーチ & checkout
bindkey '^b' anyframe-widget-checkout-git-branch
## プロセス一覧をインクリメントサーチ & kill
bindkey '^x^k' anyframe-widget-kill
独自でpecoを用いた便利メソッドを書きたい
anyframeが提供している仕組みに乗っかる事で、~/.zshrcに関数を追加して簡単に実装できます。anyframeでは、peco/percol/fzfで選択した結果をどうするか、という動作として以下3つのパターンに対応しています。
  • 選択した結果をzshですぐに実行する
  • 選択した結果で現在のコマンドラインを置き換える
  • 選択した結果をコマンドラインのカーソル位置に挿入する
例えば1.のパターンのときは、基本的には次のような形の関数を書きます。
# 選択した結果をzshですぐに実行する関数のひな形
function hogehoge () {
anyframe-selector-auto
anyframe-action-execute
}
ここで、筆者が自身で定義している関数をお見せします。
# screenのデタッチ済セッション一覧からアタッチ先を選択,アタッチ
function pscreen() {
screen -ls | grep -i "Detached" > /dev/null 2>&1
if [ $? -eq 0 ]; then
screen -ls \
| anyframe-selector-auto \
| cut -d '.' -f01 | sed -e 's/^\t//g' \
| anyframe-action-execute screen -R
else
echo "No Detached Sockets found"
return
fi
}
# route53に登録されてるレコード一覧を取得、選択したhostにssh
function pssh() {
aws route53 list-resource-record-sets --hosted-zone-id hogehoge | jq '.ResourceRecordSets[]' | jq 'select(.Type == "A")' | jq -r '.Name' \
| anyframe-selector-auto \
| anyframe-action-execute ssh
}
終わりに
最近のトレンドとして、pure golangで書かれたツールが増えてきてる気がします。自分のdotfilesも色々変遷してきましたが、結局ポータブルなツール群がやはり生き残ってる気がします。
Like what you read? Give eureka_developers a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.