06 Jul 2014, 10:40

最近ナウイpecoを試してみたメモ

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

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

[toc]

pecoとは

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

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

インストール

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

$ sudo pacman -S go
<p>
  パスの設定をする。.zshrcに追記。
</p>

<div class="org-src-container">
  <pre class="src src-language"># for go lang

if [ -x “which go” ]; then export GOPATH=$HOME/go export PATH=$PATH:$GOROOT/bin:$GOPATH/bin fi

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

<div class="org-src-container">
  <pre class="src src-sh">$ go get github.com/peco/peco/cmd/peco

<p>
  簡単 🙂
</p>

pecoをつかってみる

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

$ ls | peco
<p>
  lsのフィルタができた!やたー!!
</p>

pecoの設定

設定ファイルを用意

<div class="outline-text-3" id="text-4-1">
  <p>
    設定ファイルを用意します。$HOME/.peco/config.jsonを用意。
  </p>

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

  <div class="org-src-container">
    <pre class="src src-json">{
"Keymap": {
    "M-v": "peco.SelectPreviousPage",
    "C-v": "peco.SelectNextPage",
    "C-g": "peco.Cancel"
}

}

alias設定

<div class="outline-text-3" id="text-4-2">
  <p>
    aliasを設定して、もっと便利に。.zshrcに追記。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #a6e22e;">alias</span> -g <span style="color: #fd971f;">P</span>=<span style="color: #e6db74;">'| peco'</span>

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

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #f92672; font-weight: bold;">if</span> [ -x <span style="color: #e6db74;">"`which peco`"</span> ]; <span style="color: #f92672; font-weight: bold;">then</span>

alias ll=‘ls -la | peco’ alias tp=‘top | peco’ alias pp=‘ps aux | peco’ fi

いろいろとpecoする

コマンド履歴をpecoする

<div class="outline-text-3" id="text-5-1">
  <p>
    まずは、定番のコマンド履歴をフィルター。
  </p>

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

  <ul class="org-ul">
    <li>
      <a href="http://qiita.com/uchiko/items/f6b1528d7362c9310da0">oh-my-zsh の環境で、peco-select-history が動かない &#8211; Qiita</a>
    </li>
  </ul>

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #a9a9a9;"># </span><span style="color: #a9a9a9;">history filter</span>

# http://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 | </span> eval $tac | </span> peco –query ”$LBUFFER”) CURSOR=$#BUFFER zle clear-screen } zle -N peco-select-history bindkey ’^[x’ peco-select-history # M-xに割り当て

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

<div class="outline-text-3" id="text-5-2">
  <p>
    cdrというコマンドを利用すると、最近訪れたディレクトリの一覧を見ることができる。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://keisanbutsuriya.blog.fc2.com/blog-entry-77.html">計算物理屋の研究備忘録 最近移動したディレクトリに一発で移動できるcdrを使う</a>
    </li>
  </ul>

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #a6e22e;">autoload</span> -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

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

  <ul class="org-ul">
    <li>
      <a href="http://shibayu36.hatenablog.com/entry/2014/06/27/223538">pecoを使い始めた &#8211; $shibayu36->blog;</a>
    </li>
    <li>
      <a href="http://piyopiyoducky.net/blog/2013/08/17/cdr-with-percol/">Zshのcdrとpercolで最近移動したディレクトリにAnythingライクに移動する &#8211; PiyoPiyoDucky</a>
    </li>
  </ul>

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #f92672; font-weight: bold;">function</span> <span style="color: #00ffff;">peco-cdr</span> () {
<span style="color: #a6e22e;">local</span> <span style="color: #fd971f;">selected_dir</span>=$(cdr -l | awk <span style="color: #e6db74;">'{ print $2 }'</span> | peco)
<span style="color: #f92672; font-weight: bold;">if</span> [ -n <span style="color: #e6db74;">"$selected_dir"</span> ]; <span style="color: #f92672; font-weight: bold;">then</span>
    <span style="color: #fd971f;">BUFFER</span>=<span style="color: #e6db74;">"cd ${selected_dir}"</span>
    zle accept-line
<span style="color: #f92672; font-weight: bold;">fi</span>
zle clear-screen

} zle -N peco-cdr bindkey ’^xr’ peco-cdr

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

<div class="outline-text-3" id="text-5-3">
  <p>
    Linuxでは、 anamnesisというツールを利用するとクリップボードの履歴管理ができる。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://anamnesis.sourceforge.net/">Anamnesis clipboard history manager</a>
    </li>
  </ul>

  <p>
    xclipもインストールする必要あり!
  </p>

  <p>
    以下のaliasを切る。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #a6e22e;">alias</span> <span style="color: #fd971f;">ap</span>=<span style="color: #e6db74;">'anamnesis -l 200 | peco'</span>

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

migemoでpecoする

<div class="outline-text-3" id="text-5-4">
  <p>
    CustomMatcherというものを利用すると、検索する際にフィルタをかけられる。 最近登場した、Go/Migemoもpecoに対応しているようなので、早速ためす。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh">go get github.com/koron/gomigemo/cmd/gmigemo

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

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

  <ul class="org-ul">
    <li>
      <a href="https://github.com/peco/peco/wiki/CustomMatcher#migemo">CustomMatcher · peco/peco Wiki · GitHub</a><a href="https://github.com/peco/peco/wiki/CustomMatcher#migemo">CustomMatcher · peco/peco Wiki · GitHub</a>
    </li>
  </ul>

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

  <div class="org-src-container">
    <pre class="src src-json">{
"CustomMatcher": {
    "Migemo": [
        "/home/tsu-nera/go/bin/migemogrep",
        "$QUERY"
    ]
},
"Keymap": {
    "M-v": "peco.SelectPreviousPage",
    "C-v": "peco.SelectNextPage",
    "C-g": "peco.Cancel"
}

}

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

pecoからアプリを起動する

pecoでprocess killする

<div class="outline-text-3" id="text-6-1">
  <p>
    pecoでフィルタした内容をcut や xargsに渡すことで検索結果をさらに加工する。
  </p>

  <p>
    以下のコマンドで firefoxを killする。
  </p>

  <div class="org-src-container">
    <pre class="src src-language">ps -ef | peco | awk '{ print $2 }' | xargs kill

  <p>
    長いので、functionに。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #f92672; font-weight: bold;">function</span> <span style="color: #00ffff;">peco-kill-process</span> () {
ps -ef | peco | awk <span style="color: #e6db74;">'{ print $2 }'</span> | xargs kill
zle clear-screen

} zle -N peco-kill-process bindkey ’^xk’ peco-kill-process # C-x k

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

<div class="outline-text-3" id="text-6-2">
  <p>
    たとえば、ブログ記事記事なんかをサクッと検索して emacsclientで開きたい。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #f92672; font-weight: bold;">function</span> <span style="color: #00ffff;">peco-find-file</span> () {
ls | peco | xargs emacsclient -nw
zle clear-screen

} zle -N peco-find-file bindkey ’^x^f’ peco-find-file # C-x C-f

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

<div class="outline-text-3" id="text-6-3">
  <p>
    linuxなので、 xdg-openを利用します。
  </p>

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #f92672; font-weight: bold;">function</span> <span style="color: #00ffff;">peco-open-app</span> () {
ls | peco | xargs xdg-open
zle clear-screen

} zle -N peco-open-app bindkey ’^xo’ peco-open-app # C-x o

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

<div class="outline-text-3" id="text-6-4">
  <p>
    以下のような記事を見つけました。
  </p>

  <ul class="org-ul">
    <li>
      <a href="http://qiita.com/fmy/items/b92254d14049996f6ec3">ag(The Silver Searcher)で検索しpecoで更に絞り込みvimで該当行を開く &#8211; Qiita</a>
    </li>
  </ul>

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

  <div class="org-src-container">
    <pre class="src src-sh"><span style="color: #f92672; font-weight: bold;">if</span> [ -x <span style="color: #e6db74;">"`which ag`"</span> ]; <span style="color: #f92672; font-weight: bold;">then</span>

function peco-ag () { ag $@ | peco –query ”$LBUFFER” | awk -F : ’{print “+” $2 “ ” $1}’ | xargs emacsclient -nw } fi

  <p>
    Unix哲学万歳.
  </p>
</div>