最近、なにかとpecoというキーワードをきくようになった。

ナウいツールのようなので、流行に乗り遅れないように、僕も試してみた!

pecoとは

pecoとは、コマンドラインからインタラクティブに情報源を検索するためのツール。

みんな大好き、Emacs helmのようなことが、コマンドラインから可能になる。

インストール

pecoはgo言語でかかれているよう。まだ自分のPCにgoが入っていなかったので、まずはインストールした。

$ sudo pacman -S go

パスの設定をする。.zshrcに追記。

# for go lang
if [ -x "`which go`" ]; then
  export GOPATH=$HOME/go
  export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
fi

次に、以下のコマンドでインストール。

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

簡単 :-)

pecoをつかってみる

pecoにパイプで標準入力を渡す。

$ ls | peco

lsのフィルタができた!やたー!!

pecoの設定

設定ファイルを用意

設定ファイルを用意します。$HOME/.peco/config.jsonを用意。

なるべく、Emacsに合わせて、キーバインドを設定。

{
    "Keymap": {
        "M-v": "peco.SelectPreviousPage",
        "C-v": "peco.SelectNextPage",
        "C-g": "peco.Cancel"
    }
}

alias設定

aliasを設定して、もっと便利に。.zshrcに追記。

alias -g P='| peco'

よく利用しそうな、top, ps, lsあたりにもaliasを切っておく。llあたりは置き換えてしまう。

if [ -x "`which peco`" ]; then
  alias ll='ls -la | peco'
  alias tp='top | peco'
  alias pp='ps aux | peco'
fi

いろいろとpecoする

コマンド履歴をpecoする

まずは、定番のコマンド履歴をフィルター。

以下の記事を参考にして、.zshrcに関数を定義しました。Ctrl+rでフィルタがかかる。便利。

# history filter
# https://qiita.com/uchiko/items/f6b1528d7362c9310da0
function peco-select-history() {
    local tac
    if which tac > /dev/null; then
        tac="tac"
    else
        tac="tail -r"
    fi
    BUFFER=$(\history -n 1 | \
        eval $tac | \
        peco --query "$LBUFFER")
    CURSOR=$#BUFFER
    zle clear-screen
}
zle -N peco-select-history
bindkey '^[x' peco-select-history # M-xに割り当て

ディレクトリ履歴をpecoする

cdrというコマンドを利用すると、最近訪れたディレクトリの一覧を見ることができる。

autoload -Uz is-at-least
if is-at-least 4.3.11
then
  autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
  add-zsh-hook chpwd chpwd_recent_dirs
  zstyle ':chpwd:*' recent-dirs-max 5000
  zstyle ':chpwd:*' recent-dirs-default yes
  zstyle ':completion:*' recent-dirs-insert both
fi

このコマンドを利用して、cdrをpecoでフィルターする。以下を参考にしました。

function peco-cdr () {
    local selected_dir=$(cdr -l | awk '{ print $2 }' | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-cdr
bindkey '^xr' peco-cdr

クリップボード履歴をpecoする

Linuxでは、 anamnesisというツールを利用するとクリップボードの履歴管理ができる。

xclipもインストールする必要あり!

以下のaliasを切る。

alias ap='anamnesis -l 200 | peco'

本当はフィルタ結果をcutして再度クリップボードに挿入したい。それはまた今度。

migemoでpecoする

CustomMatcherというものを利用すると、検索する際にフィルタをかけられる。最近登場した、Go/Migemoもpecoに対応しているようなので、早速ためす。

   go get github.com/koron/gomigemo/cmd/gmigemo
   go get github.com/koron/gomigemo/cmd/gmigemogrep

以下のように、.peco/config.jsonに追記した。

JSONの記法を知らなかったので、CustomMatcherとKeymapの間に,をいれていなくてしばらく悩んでた。

{
    "CustomMatcher": {
        "Migemo": [
            "/home/tsu-nera/go/bin/migemogrep",
            "$QUERY"
        ]
    },
    "Keymap": {
        "M-v": "peco.SelectPreviousPage",
        "C-v": "peco.SelectNextPage",
        "C-g": "peco.Cancel"
    }
}

カスタムマッチャは、pecoの検索中に Ctrl + r を入力することで、トグルすることができる。これで、Migemoを選択すると、gmigemoが利用できる。

pecoからアプリを起動する

pecoでprocess killする

pecoでフィルタした内容をcut や xargsに渡すことで検索結果をさらに加工する。

以下のコマンドで firefoxを killする。

ps -ef | peco | awk '{ print $2 }' | xargs kill

長いので、functionに。

function peco-kill-process () {
    ps -ef | peco | awk '{ print $2 }' | xargs kill
    zle clear-screen
}
zle -N peco-kill-process
bindkey '^xk' peco-kill-process   # C-x k

ls で 検索したファイルを emacsでひらく

たとえば、ブログ記事記事なんかをサクッと検索して emacsclientで開きたい。

function peco-find-file () {
    ls | peco | xargs emacsclient -nw
    zle clear-screen
}
zle -N peco-find-file
bindkey '^x^f' peco-find-file     # C-x C-f

ls で 検索したファイルを なにかで開く

linuxなので、 xdg-openを利用します。

function peco-open-app () {
    ls | peco | xargs xdg-open
    zle clear-screen
}
zle -N peco-open-app
bindkey '^xo' peco-open-app     # C-x o

agで検索して、指定行をemacsでひらく

以下のような記事を見つけました。

emacsも負けてられないので、指定行をemacsで開くfunctionを作成。

if [ -x "`which ag`" ]; then
function peco-ag () {
    ag $@ | peco --query "$LBUFFER" | awk -F : '{print "+" $2 " " $1}' | xargs emacsclient -nw
}
fi

Unix哲学万歳.