LoginSignup
13
5

More than 3 years have passed since last update.

ghq管理外でもfzfで快適にcdしたい

Last updated at Posted at 2020-12-07

モチベーション

ghqfzf(またはpeco等)と組み合わせる工夫をしている方は多いのではないでしょうか。

私も下記のような設定でghq管理下のリポジトリへの快適な移動を実現していました。

.zshrc
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と組み合わせます。
一番シンプルな例は以下のようなエイリアスを設定しておくことです。

.zshrc(パターン①)
 export SDL_ROOT=$HOME/Dev
 alias dev='cd $(sdl | fzf)'

ghqと合わせて使いたい場合は以下のような設定が便利です。

.zshrc(パターン②)
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の実行をシェルログイン時だけにしても良いかもしれません。

.zprofile(パターン③)
export ENV_CACHE_SDL=$(sdl)
.zshrc(パターン③)

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できるようになりました。
Image from Gyazo
とりあえずshift+]しておけば大体の目的地へたどり着けるようになり私は満足です😌


お知らせ

この記事を読んで「面白かった」「学びがあった」と思っていただけた方、よろしければ Twitter や facebook、はてなブックマークにてコメントをお願いします!
また DeNA 公式 Twitter アカウント @DeNAxTech では、 Blog記事だけでなく色々な勉強会での登壇資料も発信してます。ぜひフォローして下さい!
Follow @DeNAxTech

13
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
5