peco/pecoはインタラクティブフィルタリングツールです。
このツールにより、ターミナルでの操作が何倍にも高速化できると言っても過言ではありません(過言)。
本記事では私が設定している3種のpecoの使い方と、その設定方法を紹介します。
環境
以下の環境で使用しています。
- Linux Mint 18.2
- zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
インストール
go getによるインストールは推奨されていないため、githubのreleasesページから取得しパスを通します。
history with peco
zshやbashにはCtrl + R
でのコマンド履歴検索機能があります。
ですが、1行しか表示されないので、類似のコマンドが多く履歴にある場合、なかなかお目当てのコマンドをサーチすることは難しいです。
pecoによるコマンド履歴検索は次のようになります。
1文字入力するごとにインタラクティブに絞り込んでくれます。
設定に関してですが、まずはhistory周りの設定は次のようになっています。
けっこうな数の履歴を保存しています。
# history
HISTFILE=$HOME/.zsh-history
HISTSIZE=100000
SAVEHIST=1000000
# share .zshhistory
setopt inc_append_history
setopt share_history
続いてpecoの設定です。
関数を設定し、Ctrl + R
にこの関数呼び出しを割り当てる設定になっています。
function peco-history-selection() {
BUFFER=`history -n 1 | tac | awk '!a[$0]++' | peco`
CURSOR=$#BUFFER
zle reset-prompt
}
zle -N peco-history-selection
bindkey '^R' peco-history-selection
cdr with peco
過去に実行したコマンドに関しては、上記のhistory + pecoで高速に検索できるようになりました。
しかし、ディレクトリ移動はどうでしょうか?
$ cd work
$ cd hoge
$ cd ../fuga
上記のように相対パスで移動することがほとんどだと思います。
これではコマンド履歴検索でヒットしたとしても、カレントディレクトリが異なる場合では無意味です。
そこで使用するのがcdrです。(zsh 4.3.11
以降で使用することができます)
cdrはディレクトリ移動の履歴検索機能です。
pecoと組み合わせた場合の挙動は以下のようになります。
まずはcdr自体の設定です。
# cdr
if [[ -n $(echo ${^fpath}/chpwd_recent_dirs(N)) && -n $(echo ${^fpath}/cdr(N)) ]]; then
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
add-zsh-hook chpwd chpwd_recent_dirs
zstyle ':completion:*' recent-dirs-insert both
zstyle ':chpwd:*' recent-dirs-default true
zstyle ':chpwd:*' recent-dirs-max 1000
zstyle ':chpwd:*' recent-dirs-file "$HOME/.cache/chpwd-recent-dirs"
fi
次にpecoの設定です。
こちらもhistoryの場合と同様に関数を用意しています。
ショートカットはCtrl + E
に割り当てています。
function peco-cdr () {
local selected_dir="$(cdr -l | sed 's/^[0-9]\+ \+//' | peco --prompt="cdr >" --query "$LBUFFER")"
if [ -n "$selected_dir" ]; then
BUFFER="cd ${selected_dir}"
zle accept-line
fi
}
zle -N peco-cdr
bindkey '^E' peco-cdr
ghq with peco
様々なgitリポジトリを管理していると、cdrだけではディレクトリ検索が面倒になってきます。
そこでリポジトリ管理コマンドのghqと組み合わせます。
ghqはghq get reireias/dotfiles
のようなコマンドでリポジトリのcloneが可能です。
cloneされたリポジトリは、.gitconfig等で設定したrootディレクトリ以下にcloneされます。
管理しているリポジトリ一覧を取得するghq list
コマンドとpecoを組み合わせると以下のようになります。
gitリポジトリのみが抽出対象となるので、cdrよりも高速にリポジトリへ移動することができます。
pecoの設定は次のようになっています。
ショートカットはCtrl + G
を割り当てています。
function peco-ghq-look () {
local ghq_roots="$(git config --path --get-all ghq.root)"
local selected_dir=$(ghq list --full-path | \
xargs -I{} ls -dl --time-style=+%s {}/.git | sed 's/.*\([0-9]\{10\}\)/\1/' | sort -nr | \
sed "s,.*\(${ghq_roots/$'\n'/\|}\)/,," | \
sed 's/\/.git//' | \
peco --prompt="cd-ghq >" --query "$LBUFFER")
if [ -n "$selected_dir" ]; then
BUFFER="cd $(ghq list --full-path | grep --color=never -E "/$selected_dir$")"
zle accept-line
fi
}
zle -N peco-ghq-look
bindkey '^G' peco-ghq-look
おわり
これでターミナルでの作業が爆速になるはず!!!