モダンなコマンドライン環境で作業爆速化！peco x anyframe x zshで作るコマンドライン環境

[会社ブログ](https://developers.eure.jp/event/peco_anyframe_zsh/)と[自身のブログ](http://tech-up.jp/)に書いたのをちょっと加筆修正したので
qiitaにも上げてみた

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

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

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

このような動きをコマンド一発で実行できるようになります。[本家のREADME](https://github.com/peco/peco)の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も色々変遷してきましたが、結局ポータブルなツール群がやはり生き残ってる気がします。