ソフトウェア/peco の変更点

更新


[[公開メモ]]

* 概要 [#d4dac70d]

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

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

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

* インストール [#q32e64e7]

個人用にインストールするだけなら、[[Qiita: 例えば、pecoをビルドしない>http://qiita.com/lestrrat/items/de8565fe32864f76ac19]] を参考にしてバイナリを落としてくれば簡単です。

~~/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 向け [#ed219f35]

あちこちで「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 を定義するより良いことも多いかもしれません。

* 一般コマンド [#gb28205d]

** peco-cd [#v5a78be4]

http://qiita.com/xtetsuji/items/05f6f4c1b17854cdd75b のスクリプトを改変しました。
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 [#j414b776]

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 [#wefeec80]

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

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

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

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

* コメント・質問 [#zbf1610a]

#article_kcaptcha

Counter: 3027 (from 2010/06/03), today: 2, yesterday: 0