新社会人に送る。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も色々変遷してきましたが、結局ポータブルなツール群がやはり生き残ってる気がします。

  • このエントリーをはてなブックマークに追加

エウレカでは、一緒に働いていただける方を絶賛募集中です。募集中の職種はこちらからご確認ください!皆様のエントリーをお待ちしております!

Recommend

Androidで”動くスライドショー”を実装する〜Ken Burns Effect〜

第一回 Goもくもく会(ごもく会)を開催しました!