え、まだpecoを使ってないの???

  • 76
    Like
  • 5
    Comment

概要

煽ってる感じのタイトルになってしまいましたがそれぐらい僕にとって無くてはならないものになっています。
前からpecoを使っていたんですが、周りに結構使っていない人がいて教えたら感謝されたので自分の見直しも兼ねて書いて起こしておきます。
みんな使おうね!

pecoって?

pecoは 「標準入力されたデータをインクリメンタルサーチをして選択したら出力する」だけ のコマンドです。シンプルですね。だからいいんですよ。
もともとpythonで書かれたpecolてのがあったんですが、binaryでのが欲しいよ〜となったのでgoで作られたらしいです(by github)。ついでに開発者は日本人です。isuueとかも出しやすいね!

なにが出来るの?

こんなのや(ps auxの結果をpecoで選択して出力している)↓
peco_demo.gif

こんなの↓(ghqの一覧からレポジトリを選択して移動)が出来ます
peco_demo2.gif
(by github)
ワクワクしてきましたか?
ではinstallしましょうね。

インストール

goをすでに入れている人は以下のとおりで入ります。

$ go get github.com/peco/peco/cmd/peco

brewでもおk(ですがバイナリ版の方がおすすめ)

$ brew install peco

(17/01/09追記)
作者さまから指摘頂いたようにgo getだと依存関係が意図しないものになるので、自分でビルドする場合はクローンしてからglideでビルドしましょう。

$ glide install
$ go build cmd/peco/peco.go

(追記終わり)

pecoの基礎

peco単体ではシンプルすぎてこのままでは少し使うのが面倒です。なので自分で設定しないといけないのですが、その前にpecoの基本的な使い方を学びましょう。そんなの興味ねーよて方は飛ばしても結構です。

pecoは一行を一つのデータとして複数行からなるデータをインクリメンタルサーチ出来ます。

$ ls -l | peco

とすればls -lの結果がpecoに渡されているのが分かる思います。検索してenterを押すと標準出力に出来ます。

ではもう少し実用的なものを作っていきましょう。
適当なディレクトリに移動して

$ cd "$(find . -type d | peco)"

としてみましょう。現在のディレクトリ以下のフォルダの一覧がpecoに渡されて、選択したら移動するはずです。
簡単ですね。感動ですね。素晴らしいですね。

いちいち打つのが面倒なので関数にしてしまいましょう(この程度ならaliasで十分ですが)

function find_cd() {
    cd "$(find . -type d | peco)"  
}
alias fc="find_cd"

これでfcと打つとさっきのが実行されるはずです。

実用例

では無くてはならないpecoの実用例を見てみましょう。
先に謝っておきますがここにあるのは僕が作ったものではなくネットの海からサルベージしてきたものが大半でしかもどこから取って来たのか忘れてしまったので参照先がありません。盗用だ!とお怒りの方がいらっしゃたら言ってくれれば取り下げます。おそらくpeco おすすめとかで調べたらでるんじゃないでしょうか。

過去に実行したコマンドを選択できます。ctrl-rにバインドしています。

#pecoでhistory検索
function peco-select-history() {
  BUFFER=$(\history -n -r 1 | peco --query "$LBUFFER")
  CURSOR=$#BUFFER
  zle clear-screen
}
zle -N peco-select-history
bindkey '^r' peco-select-history

過去移動したディレクトリに移動します。ctrl-xにバインドしています。

# ### search a destination from cdr list
function peco-get-destination-from-cdr() {
  cdr -l | \
  sed -e 's/^[[:digit:]]*[[:blank:]]*//' | \
  peco --query "$LBUFFER"
}

### search a destination from cdr list and cd the destination
function peco-cdr() {
  local destination="$(peco-get-destination-from-cdr)"
  if [ -n "$destination" ]; then
    BUFFER="cd $destination"
    zle accept-line
  else
    zle reset-prompt
  fi
}
zle -N peco-cdr
bindkey '^x' peco-cdr

少し改良しました。

実行中のプロセスを選択してkillします。

間違って使わないように使うときは注意してください。

#pecoでkill
function peco-pkill() {
  for pid in `ps aux | peco | awk '{ print $2 }'`
  do
    kill $pid
    echo "Killed ${pid}"
  done
}
alias pk="peco-pkill"

ghqのlist一覧から選択して移動します。

alias gh='cd $(ghq list -p | peco)'
alias gho='gh-open $(ghq list -p | peco)'

gh-openはgithubページを開きます。以下のようにしてインストール出来ます。

$ go get github.com/typester/gh-open

sublimeのプロジェクトの一覧から起動します

function sublime-projects() {
  subl_root='/User/izuku/Dropbox/app/sublimeText3/Packages/User/Projects'
  root_len=${#subl_root}+3
  # files=`(ls -l ~/Projects/sublime_projects | grep project | cut -d " " -f 10)`
  files=`find ~/Dropbox/app/sublimeText3/Packages/User/Projects -name "*sublime-project"`
  if [[ -n "$files" ]]; then
    project=`echo $files | awk '{ name=substr($0,'${root_len}'); print substr(name,0,index(name,".sublime-project"))}'| peco`
    if [[ -n "$project" ]]; then
      subl `echo $files | grep $project`
    fi
  else
    echo "no projects"
  fi
}
alias subp='sublime-projects'

その他

便利な関数をまとめたcool-pecoなるものがあるらしい。
pecoの便利な関数を集約した奴がいたんですよぉ〜