モチベーション
ghqをfzf(またはpeco等)と組み合わせる工夫をしている方は多いのではないでしょうか。
私も下記のような設定でghq管理下のリポジトリへの快適な移動を実現していました。
function cd_ghq_list() {
local destination_dir="$(ghq list | fzf)"
if [ -n "$destination_dir" ]; then
BUFFER="cd $destination_dir"
zle accept-line
fi
zle clear-screen
}
zle -N cd_ghq_list
bindkey '^]' cd_ghq_list
ここでは具体的にshift+]で 「ghq listコマンドの出力結果をfzfでフィルタリングしcdコマンドに渡す」ことをしています。
この便利設定にハマりきった私は😌『もはやこの方法でしかcdしたくない』と思うようになりました。
普段の私は~/memo/に適当なメモを書いて置いています。
また docker-compose.yml などたまに使う設定ファイルを ~/Dev/に置いています。
移動は毎回cd ~/memo cd ~/Devしています。これは面倒です。
解決策として「特定ディクレトリへのcdコマンドをエイリアスにしておく」「すべてghq/に置いてgit initしておく」といった方法が考えられますが、エイリアスは覚えておくのが面倒だし、ghq配下はリモートリポジトリと合わせたいのです。
それならばとシェルスクリプトを書くことにしました。
『Starting-Directory-List』
シンプルなシェルスクリプトを用意しました。

ついでに、ちょっとカッコよく『Starting-Directory-List』という名前をつけてsdlというコマンドにしました。
コンセプト
やっていることは管理したいディレクトリ群へのパス一覧を出力することだけです。
管理対象のディレクトリ群は環境変数SDL_ROOTで指定したディレクトリ配下におくことを想定しています。
たとえば以下のようなディレクトリ構造があるとします。ここでは$SDL_ROOT="~/sdl-root/と設定しています。
$ tree ~/sdl-root/
~/sdl-root/
├── category1
│ ├── child-category1-1
│ │ ├── child-category-1-1-1
│ │ │ └── avocado.text
│ │ ├── mango.text
│ │ └── melon.text
│ ├── child-category1-2
│ │ └── cherry.text
│ └── orange.text
└── category2
├── apple.text
└── child-category2-1
└── peach.text
ここでコマンドを実行すると以下のようにディレクトリ群へのパス一覧がが出力がされます。
$ sdl
~/sdl-root/category1/
~/sdl-root/category2/
~/sdl-root/category1/child-category1-1/
~/sdl-root/category1/child-category1-2/
~/sdl-root/category2/child-category2-1/
出力対象はSDL_ROOT直下のcategory1 category2、さらにその下のchild-category1-1 child-category1-2 child-category2-1までです。
SDL_ROOT直下の2階層はネームスペースとして利用すると便利です。
fzfと組み合わせて快適にcdする
ghq listと同じ要領でfzfと組み合わせます。
一番シンプルな例は以下のようなエイリアスを設定しておくことです。
export SDL_ROOT=$HOME/Dev
alias dev='cd $(sdl | fzf)'
ghqと合わせて使いたい場合は以下のような設定が便利です。
function cd_ghq_and_sdl() {
local destination_dir=$(echo "$(ghq list --full-path) $(sdl)" | fzf)
if [ -n "$destination_dir" ]; then
BUFFER="cd $destination_dir"
zle accept-line
fi
zle clear-screen
}
zle -N cd_ghq_and_sdl
bindkey '^]' cd_ghq_and_sdl
😔「毎回コマンドを実行したくないなあ」という場合は以下のようにsdlの実行をシェルログイン時だけにしても良いかもしれません。
export ENV_CACHE_SDL=$(sdl)
function cd_ghq_and_sdl() {
local destination_dir=$(echo "$(ghq list --full-path) $ENV_CACHE_SDL" | fzf)
if [ -n "$destination_dir" ]; then
BUFFER="cd $destination_dir"
zle accept-line
fi
zle clear-screen
}
zle -N cd_ghq_and_sdl
bindkey '^]' cd_ghq_and_sdl
まとめ
シェルスクリプトを書くことでghq管理外のディレクトリへも快適にcdできるようになりました。

とりあえずshift+]しておけば大体の目的地へたどり着けるようになり私は満足です😌
お知らせ
この記事を読んで「面白かった」「学びがあった」と思っていただけた方、よろしければ Twitter や facebook、はてなブックマークにてコメントをお願いします!
また DeNA 公式 Twitter アカウント @DeNAxTech では、 Blog記事だけでなく色々な勉強会での登壇資料も発信してます。ぜひフォローして下さい!
Follow @DeNAxTech