fish シェルを使っていて、最近訪れたディレクトリに peco で選択して移動する方法を紹介します。

zsh のときは

最近訪れたディレクトリをどうやって覚えるかが最大の課題だった。 zsh のときは、zsh の組み込み関数があったので以下のように対応していた。

# ------------------------------------------------------------------------
# Name     : cdr
# Function : 最近訪れたフォルダへ移動
# ------------------------------------------------------------------------
autoload -Uz is-at-least
if is-at-least 4.3.11
then
  autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
  add-zsh-hook chpwd chpwd_recent_dirs
  zstyle ':chpwd:*' recent-dirs-max 5000
  zstyle ':chpwd:*' recent-dirs-default yes
  zstyle ':completion:*' recent-dirs-insert both
fi
# ------------------------------------------------------------------------
# peco-recentd
# 最近訪れたディレクトリに移動
# ------------------------------------------------------------------------
function peco-recentd () {
    local selected_dir=$(cdr -l | awk '{ print $2 }' | peco)
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-recentd

fish 版 z の導入

fish で、最近訪れたディレクトリをどう管理するか? z という fish 用のライブラリがあり、これが利用できそうだ。

以下のコマンドで最近訪れたディレクトリの一覧を取得できる。

$ z -l 

peco と組み合わせる

以下のような関数を用意した。これを config.fish に書くか、 .config/fish/functions ディレクトリ配下に peco_recentd.fish ファイルを作成して書けばよい。

function peco_recentd
        z -l | peco | awk '{ print $2 }' | read recentd
        cd $recentd
end

キーバインドを以下のように設定する。.config/fish/config.fish に以下を記述。

function fish_user_key_bindings
        # 最近見たディレクトリに移動
        bind \cx\cr peco_recentd
end

これで、zsh でできていた、選択的ディレクトリ移動が fish でもできるようになった。