会社ブログと自身のブログに書いたのをちょっと加筆修正したので
qiitaにも上げてみた
はじめに
エンジニアとして仕事をする以上、多くの時間をコマンドライン上で過ごす方も多いでしょう。業務の大部分の時間を過ごす環境は誰でも快適にしたいですよね!よくエンジニア間ではエディタの宗教戦争が話題になりますが、今回はコマンドライン環境を快適にする為のツール群を紹介します。
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 [email protected]: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も色々変遷してきましたが、結局ポータブルなツール群がやはり生き残ってる気がします。