fine, later feeling

晴れのち気分

pecoって快適ターミナル生活

インタラクティブにフィルタリングしてくれるgolang製のpecoというツールが 大変便利だったのでシェアしたいと思います。 記事を探してると2年前くらいに話題なったそうです。 pecoにデジャブを感じたのはおそらく当時その話題を見たからだと思います。

pecoのインストール

さくっとpecoをインストールします。

$ brew install peco

goのランタイムがあればgo get github.com/peco/pecoでもOKですが、公式でもstableであるbrewからのインストールを推奨しています。

試しにフィルタリングしてみましょう。 小さい機能を合成して大きな機能を実現するUnixの思想が踏襲されているのでパイプでつなげることができます。

$ ps -ef | peco

実行するとpecoのインタラクティブUIに変わりました。 ファジー検索なので適当にタイプすると徐々に絞り込まれていきます。

zshに変更する

ここからより便利にpecoるためにzshにしたいと思います。 なぜzshにしたいかというとautocomplite機能があることとグローバルエイリアスの設定できるのが理由です。

bashになっているのでzshに変更します。

現在のシェルの確認
$ echo $SHELL
# デフォルトシェルの変更
$ chsh -s /bin/zsh

ログインし直しzshに変更されていればOKです。 このままでは味気ないので.zshrcを設定してあげればOKです。 oh-my-zshという集合知みたいなツールもあるのでこれを入れてもOKだと思います。 僕は自分で色々設定するのがめんどうだったのでこれ入れてます。

ghqとpecoのコンビネーション

ghqとはGit/Mercurialリポジトリの管理ツールです。ghq get リポジトリで指定したパスへクローンし、統一的に管理することができます。 brewで入れたあと、git config --global ghq.root $GOPATH/srcで統一的に管理するパスの設定をしておきます。 使い方はgo getと似ていて、柔軟な形でクローンすることができます。

# こんな形でも
ghq get git@github.com:motemen/ghq.git
# こんな形でも
ghq get https://github.com/motemen/ghq

機能としては小さいですがpecoと組み合わせると絶大な効果を発揮します。

以下の関数を追加してリポジトリ移動を便利にしてみます。

# リポジトリ移動
function peco-src() {
    local selected_dir=$(ghq list | peco --query "$LBUFFER")
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${GOPATH}/src/${selected_dir}"
        zle accept-line
    fi
    zle redisplay
}
zle -N peco-src
stty -ixon
bindkey '^s' peco-src

f:id:suzumidokoro:20161027125557g:plain

ctrl+sインタラクティブUIに変わりリポジトリを選択すると移動することができます。

他にも便利にする関数を追加すると幸せになるかもしれません。

履歴検索

f:id:suzumidokoro:20161027125552g:plain

ctrl+r

# 履歴検索
function peco-select-history() {
    BUFFER=$(fc -l -r -n 1 | peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle redisplay
}
zle -N peco-select-history
bindkey '^r' peco-select-history

ファイル検索

f:id:suzumidokoro:20161027125549g:plain

ctrl+z

# ファイル検索
function peco-path() {
  local filepath="$(find . | grep -v '/\.' | peco --prompt 'PATH>')"
  [ -z "$filepath" ] && return
  if [ -n "$LBUFFER" ]; then
    BUFFER="$LBUFFER$filepath"
  else
    if [ -d "$filepath" ]; then
      BUFFER="cd $filepath"
    elif [ -f "$filepath" ]; then
      BUFFER="$EDITOR $filepath"
    fi
  fi
  CURSOR=$#BUFFER
}

zle -N peco-path
bindkey '^z' peco-path

プロセスkill

f:id:suzumidokoro:20161027125556g:plain

ctrl+k

# プロセスkill
function peco-kill-process () {
    ps -ef | peco | awk '{ print $2 }' | xargs kill
    zle clear-screen
}
zle -N peco-kill-process
bindkey '^k' peco-kill-process

まとめ

ターミナル生活が楽しくなりそうですね。

勉強用にpecoのRust実装でもしてみたいです。

参考にしたサイト