オレ流pecoリズムを置いてくる。

# はじめに
pecoってめっちゃ便利〜と機嫌よく使っていたある日、「あれ？これもっと色んな面倒なコマンド操作もカスタマイズ出来んちゃう？」と思い立ち、色々調べながら自分なりの便利コマンド作ってみました◎
リズミカルな開発ができると気分も良くなりますよね！
この記事が皆さんの爆速エンジニアライフのきっかけになれたら幸いです。

# この記事が対象としている人
- あんまりマウスパッドでポチポチしたくない人
- そろそろターミナルで出来る操作増やしたーいって人
- shellがzshの人
- 一部駆け出しVimmer向け（※ファイルオープンコマンド弄ったら他のエディタでも使える）
    - ガチVimmerには逆に不要なものもある、きっと。

# pecoってなんぞ？
雑に紹介するとターミナル上で何でもインクリメントサーチできるやつです（雑）
使ってみたら分かるのでまずはダウンロードしましょう！
公式にデモ画面が紹介されてる + Pecoの記事は大体ググったら出てくるので詳細は省きますm(_ _)m

https://github.com/peco/peco

# それでは置いてきます。
因みに突貫で作った設定なので、細かい挙動が気になる方は各々で修正して使ってください〜
キーバインドも適当なんでお好みに合わせて変えてください◎

## ① ^r で過去に実行したコマンドを絞り込み(重複を除く)コマンド入力を補助する
```shell
function peco-select-history() {
  BUFFER=$(history 1 | sort -k1,1nr | perl -ne 'BEGIN { my @lines = (); } s/^\s*\d+\*?\s*//; $in=$_; if (!(grep {$in eq $_} @lines)) { push(@lines, $in); print $in; }' | peco --query "$LBUFFER" --prompt 'HISTORY>')
  CURSOR=${#BUFFER}
  zle reset-prompt
}
zle -N peco-select-history
bindkey '^r' peco-select-history
```
定番の設定◎よだれ出るやつ。

## ② ^o でブランチ一覧を絞り込み切り替える
```shell
function peco-git-checkout {
  git branch | peco --prompt 'LOCAL_BRANCH>' | xargs git checkout
}
zle -N peco-git-checkout
bindkey '^o' peco-git-checkout
```
ブランチ名をインクリメントサーチで検索して選択するだけでチェックアウトしてくれる。

## ③ ^e でカレントディレクトリ以下のファイルを絞り込みvimで開く
```shell
function peco-dir-open-app () {
  local selected_file=$(find . | peco --query "$LBUFFER" --prompt 'OPEN_FILE>')
  if [ -n "$selected_file" ]; then
    BUFFER="vim ${selected_file}"
    zle accept-line
    print -s "vim ${selected_file}"
  fi
}
zle -N peco-dir-open-app
bindkey '^e' peco-dir-open-app
```
ファイル構造ガン無視でファイル検索できる。できればファイル構造理解した上で使おう。
てか^eやと行末にカーソル動かすショートカット使えんくなるんで別のキーバインドにすること推奨。

## ④ ^\ で差分ファイルを絞り込みvimで開く
```shell
function peco-file-open-changed-app () {
  local selected_file=$(git diff --name-only | peco --query "$LBUFFER" --prompt 'CHANGED_FILE>')
  if [ -n "$selected_file"  ]; then
    BUFFER="vim ${selected_file}"
    zle accept-line
  fi
}
zle -N peco-file-open-changed-app
bindkey '^\' peco-file-open-changed-app
```
最新コミットとの差分があるファイルをインクリメントサーチして開ける。
変更差分だけなんでnewファイルがヒットしてくれないのが難点。。

## ⑤ vig [検索ワード] [カレントディレクトリ直下のディレクトリ名] でgrepでの検索結果を絞り込み、検索ワードを指定した状態でvimで開く
```shell
function vig () {
  local selected_file=$(grep $1 -rl $2 | peco --prompt 'SEARCH_FILE>')
  if [ -n "$selected_file" ]; then
    vim ${selected_file} -c /$1
    print -s "vim ${selected_file}" -c /$1
  fi
}
```
グローバル検索して、検索ワードを選択したままファイルを開ける。
これでgrepしてヒットしたファイルをまた開いてってゆう手間無くなった。

## ⑥ ^] でsrcディレクトリ以下のgit管理リポジトリ一覧を絞り込み移動する
```shell
function peco-src () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER" --prompt 'PROJECT>')
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-src
bindkey '^]' peco-src
```
ghpとの合わせ技。別途設定必要なんで調べて使おう。
プロジェクトが増えてきても管理が楽々♪
ghpもググったら大体載ってる。

https://github.com/x-motemen/ghq

## ⑦ ^v でsrcディレクトリ以下のgit管理リポジトリ一覧を絞り込みVSCodeで開く
```shell
function peco-vscode () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER" --prompt 'VSCODE>')
  if [ -n "$selected_dir" ]; then
    BUFFER="code ${selected_dir}"
    zle accept-line
  fi
  cd ${selected_dir}
}
zle -N peco-vscode
bindkey '^v' peco-vscode
```
これもghpとの合わせ技。
たま〜にVSCodeでリポジトリ開きたい時に使う。たま〜にね。

## ⑧ ^g でsrcディレクトリ以下のgit管理リポジトリ一覧を絞り込みGitHubレポジトリを開く
```shell
function peco-github () {
  selected_dir="$(ghq list | peco --prompt 'GITHUB>')"
  if [ -n "$selected_dir" ]; then
    open https://${selected_dir}
  fi
}
zle -N peco-github
bindkey '^g' peco-github
```
GitHubのリポジトリ開きたいときにGitHub上でポチポチせずに済む。
ghpとの合わせ技。

## ⑨ ^^ でリモートブランチを絞り込みローカルへチェックアウト
```shell
function peco-gcr () {
  local selected_branch="$(git branch -r | peco --prompt 'REMOTE_BRANCH>' | cut -c 10- )"
  if [ -n "$selected_branch" ]; then
    git checkout -b ${selected_branch} origin/${selected_branch}
  fi
}
zle -N peco-gcr
bindkey '^^' peco-gcr
```
ブランチ名コピペしてローカルに取り込むの面倒なんでめっちゃ良い^^ニコ

## ⑩ ^[ でローカルブランチを絞り込み削除する
```shell
function peco-gbd () {
  git branch | peco --prompt 'DELETE_LOCAL_BRANCH>' | xargs git branch -D
}
zle -N peco-gbd
bindkey '^[' peco-gbd
```
不要になったローカルブランチ消す用。
（他にも良い方法ありそうやけどちゃんと調べてないんでとりあえず使ってる）

## （おまけ） ^x でカレントディレクトリ以下のファイルを絞り込み削除する
```shell
function peco-file-del () {
  local selected_file="$(find . | peco --query "$LBUFFER" --prompt 'DELETE_FILE>')"
  if [ -n "$selected_file" ]; then
    BUFFER="rm ${selected_file}"
    zle accept-line
  fi
}
zle -N peco-file-del
bindkey '^x' peco-file-del
```
あんま使わん。もはや危険コマンド笑

# おわりに
各設定に番号を振っておいたので、何となく気が向いたら役に立った設定の番号をコメントしてもらえると嬉しいです^^ニコ
もっとこうした方が良いのではと言った意見も歓迎です！！
こんな便利な設定もあるよ！って人もいたら是非教えて欲しいです◎
（Twitterからもどうぞ）
https://twitter.com/runmizzo