びぃえるくぅと。

ガラケーは打楽器。

zsh で cd の時に peco 使って移動先を選んだ後に移動までやってもらいたい

実は4月から社会人デビューしていたのですが、 職場で使いやすいターミナル環境整えている時に pecoディレクトリ移動をするいろんな記事を思い出し導入しました。

blog.hotolab.net

試行錯誤した結果、上記の記事を参考にしてバッファ上に

$ cd

と入力されている時だけ C-h を押すと、近い階層のディレクトリ一覧を peco で表示するところまではできました。

function peco-path-find() {
    if [[ $LBUFFER =~ \s*cd\s* ]]; then
        # バッファに cd が入力されていた場合は5階層分のディレクトリを選択できるようにする
        local filepath="$(find . -maxdepth 5 -type d -not -path '*/\.*/*' | peco --prompt 'CHANGE DIRECTORY>')"
        BUFFER=$LBUFFER$filepath
    else
        # 上記以外の場合は近場のファイルやディレクトリを選択できるようにする
        local filepath="$(find . -maxdepth 3 -not -path '*/\.*/*' | peco --prompt 'PATH>')"
        BUFFER=$LBUFFER$filepath
    fi
    CURSOR=$#BUFFER
}
zle -N peco-path-find
bindkey '^h' peco-path-find

ただ、peco で選択したディレクトリをバッファに入力してくれるところまではしてくれるものの、 どうせなら peco で選択した後は実際に移動までしてもらいたいです。

その際に

zle accept-line

をするとバッファ上にある文字列で実行してくれるということを最近ようやく知れたので (参考: https://qiita.com/ymorired/items/4b0d8e95786efc1378b4)、結果以下のようになりました。

function peco-path-find() {
    if [[ $LBUFFER =~ \s*cd\s* ]]; then
        local filepath="$(find . -maxdepth 5 -type d -not -path '*/\.*/*' | peco --prompt 'CHANGE DIRECTORY>')"
        BUFFER=$LBUFFER$filepath
        zle accept-line # これ!!!!!!
    else
        local filepath="$(find . -maxdepth 3 -not -path '*/\.*/*' | peco --prompt 'PATH>')"
        BUFFER=$LBUFFER$filepath
    fi
    CURSOR=$#BUFFER
}
zle -N peco-path-find
bindkey '^h' peco-path-find

zsh については完全に疎い人間なので改めて設定を見直してこんがらがっていますが、開発環境が改善されて気持ち良くなるのは良いですね。

Copyright © 2015 Yadex205