ソフトウェア/peco

(1311d) 更新

公開メモ

概要

peco とは linux シェル上でコマンド引数を入力する際にリストから選択することを可能にするプログラムで、最近流行っているそうです。

特に zsh + peco の組み合わせは強力で、いろんな使い方が方々で紹介されています。例えば http://qiita.com/tags/peco

このページでは私が bash に peco を導入して使ってみた様子をメモします。

インストール

個人用にインストールするだけなら、Qiita: 例えば、pecoをビルドしない を参考にしてバイナリを落としてくれば簡単です。

~/bin へのパスが通してあることを前提にすれば、

LANG:console
$ wget https://github.com/peco/peco/releases/download/v0.2.10/peco_linux_amd64.tar.gz
 -> peco_linux_amd64.tar.gz
$ tar fxz peco_linux_amd64.tar.gz
$ ls peco_linux_amd64
 Changes  README.md  peco
$ cp peco_linux_amd64/peco ~/bin
$ rm -r peco_linux_amd64 peco_linux_amd64.tar.gz
$ peco
 You must supply something to work with via filename or stdin

これだけでOKです。

git 向け

あちこちで「zsh + peco + git がとても便利!」というような記事を見るのですが、シェルに bash を使っている場合には、zsh の alias -g にあたる機能がないために使えない Tips が多くて悔しい思いをします。

そこでいろいろ試したところ、bash の場合には bash の alias ではなく、git の alias に登録しておくと使いやすいようです。

.gitconfig の [alias] セクションで定義する alias には ! で始まる任意のシェルコマンドを書けるので、peco と組み合わせればほぼ何でもできます。

[alias]
  # SYNTAX: git d
  #
  # 履歴一覧を表示して選択した履歴との diff を取る
  # 初期状態のまま Enter を押せば単に git diff と打ったのと同様に HEAD と working copy との間の差分をとる
  # 履歴を1つ選んで Enter を押せば、その履歴と working copy との差分を取る
  # Ctrl+space で2つ選べば、その間の差分を取る
  #
  d = !git diff --minimal --ignore-all-space `git log --oneline --branches | peco | ruby -e 'STDIN.readlines.reverse.each{|s| puts s[0..6]}'`

  # SYNTAX: git add-files
  #
  # git add するファイルを peco で選択する
  add-files= "!if [ \"`git status --porcelain | grep -E '^.[^ ]'`\" != \"\" ]; then git add `git status --porcelain | grep -E '^.[^ ]' | peco | sed -e 's/.* //'`; fi"

  # SYNTAX: git rm-files
  #
  # git rmするファイルを peco で選択する
  rm-files= "!if [ \"`git status --porcelain | grep -E '^.[^ ]'`\" != \"\" ]; then git rm `git status --porcelain | grep -E '^.[^ ]' | peco | sed -e 's/.* //'`; fi"

  # SYNTAX: git reset-files
  #
  # git reset するファイルを peco で選択する
  reset-files = "!if [ \"`git status --porcelain | grep -E '^[^\\? ]'`\" != \"\" ]; then git reset `git status --porcelain | grep -E '^[^\\? ]' | peco | sed -e 's/.* //'`; fi"

if を使う場合などコマンド内に ; を含めるときには、エイリアス全体を " " で囲う必要がありました。

zsh を使っている場合にも、このように git の alias を使うことにすれば、 シェルに1文字エイリアスを定義するより環境を汚さずに済みますし、 コマンド毎に細かい指定もできますので、 alias -g を定義するより良いことも多いかもしれません。

一般コマンド

peco-cd

http://qiita.com/xtetsuji/items/05f6f4c1b17854cdd75b のスクリプトを 改変して使わせていただいています。

LANG:console
$ peco-cd

とすれば、直下のディレクトリ一覧から選んで cd できます。

LANG:console
$ peco-cd 2

とすれば、2レベル下までのディレクトリ一覧から選んで cd できます。

LANG:sh
function peco-cd() {
    local n="1"
    if [ $# -eq "1" ]; then
      n=$1
    fi
    local dir="$( find . -maxdepth $n -type d | sed -e 's;\./;;' | peco )"
    if [ ! -z "$dir" ] ; then
        cd "$dir"
    fi
}

peco-kill

kill するプロセスを選択できます。

LANG:sh
function peco-kill() {
 kill `ps aux | peco | awk '{print $2}'`
}

function peco-kill-kill() {
 kill -KILL `ps aux | peco | awk '{print $2}'`
}

peco-history

シェル履歴を呼び出します。

こちらのものが使いやすそう。

http://qiita.com/omega999/items/8717c1b9d8bc10596d67

Ctrl-r に割り当てると便利です。

コメント・質問





Counter: 1919 (from 2010/06/03), today: 1, yesterday: 0