154
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

pecoを使って端末操作を爆速にする

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によるコマンド履歴検索は次のようになります。

history.gif

1文字入力するごとにインタラクティブに絞り込んでくれます。


設定に関してですが、まずはhistory周りの設定は次のようになっています。
けっこうな数の履歴を保存しています。

.zshrc
# history
HISTFILE=$HOME/.zsh-history
HISTSIZE=100000
SAVEHIST=1000000

# share .zshhistory
setopt inc_append_history
setopt share_history

続いてpecoの設定です。
関数を設定し、Ctrl + Rにこの関数呼び出しを割り当てる設定になっています。

.zshrc
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.gif

まずはcdr自体の設定です。

.zshrc
# 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に割り当てています。

.zshrc
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よりも高速にリポジトリへ移動することができます。

ghq.gif

pecoの設定は次のようになっています。
ショートカットはCtrl + Gを割り当てています。

.zshrc
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

おわり

これでターミナルでの作業が爆速になるはず!!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
154
Help us understand the problem. What are the problem?