pushd と dirs を peco でちょっと便利に使う


6 日目担当の @tsubasaogawa です。5 日目は @yk-m さんの「iOS11 / iPhone X 対応をした話」でした。

この記事は以下について書かれています

  • Bash における pushd と dirs の使い方
  • peco を使って両者をちょっと便利に使う tips

解決したいこと

  • 過去に移動したディレクトリへ戻りたい
    • けど打つのが面倒
    • むしろパスの一部を忘れた

解決案: pushd と dirs

各コマンドについて

  • pushd: 基本的には cd と同じ。これに加えて、カレントディレクトリの絶対パスを スタック する
  • dirs: スタックした一覧を表示

popd というコマンドもありますが、今回は使いません。

使い方

$ pushd /var
/var 

$ pushd cache/
/var/cache /var 

(中略)

$ pushd epel/
/var/cache/yum/x86_64/6/epel /var/cache/yum/x86_64/6 /var/cache/yum/x86_64 /var/cache/yum /var/cache /var 

$ pwd
/var/cache/yum/x86_64/6/epel

$ dirs -v
 0  /var/cache/yum/x86_64/6/epel
 1  /var/cache/yum/x86_64/6
 2  /var/cache/yum/x86_64
 3  /var/cache/yum
 4  /var/cache
 5  /var

pushd +[番号] で一気にジャンプできます。

$ pushd +4
/var/cache /var /var/cache/yum/x86_64/6/epel /var/cache/yum/x86_64/6 /var/cache/yum/x86_64 /var/cache/yum

$ pwd
/var/cache

dirs ~ pushd +[番号] するのが地味に面倒です。

peco を使って少しラクに移動する

peco について

  • お馴染みのあの娘です。詳しくは 公式

.bashrc にエイリアスとファンクションを追加

  • pushd へのエイリアス pd
    • 普段の移動はコレ
  • pushd + dirs + peco を使ったファンクション pds
    • 過去のディレクトリに戻りたくなったらコレ
.bashrc
alias pd='pushd'

# 慣例に習うなら関数名は peco-pushd がいいかも
function pds() {
  # peco が無ければ何もしない
  ! which peco >/dev/null 2>&1 && echo 'please install peco' 1>&2 && return 1
  # dirs -v の結果を peco でフィルタリングして、キューの番号を取得
  local pushd_number=$(dirs -v | peco | perl -anE 'say $F[0]')
  # peco が強制終了されたら何もしない
  [[ -z $pushd_number ]] && return 1
  # 移動
  pushd +$pushd_number
  return $?
}

実行例

さいごに

明日 7 日目は @esu_eichi さんです。お楽しみに。