zsh で cd の時に peco 使って移動先を選んだ後に移動までやってもらいたい
実は4月から社会人デビューしていたのですが、
職場で使いやすいターミナル環境整えている時に peco
でディレクトリ移動をするいろんな記事を思い出し導入しました。
試行錯誤した結果、上記の記事を参考にしてバッファ上に
$ 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 については完全に疎い人間なので改めて設定を見直してこんがらがっていますが、開発環境が改善されて気持ち良くなるのは良いですね。