最近、なにかと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哲学万歳.