既に存在しないディレクトリを cdrのリストから削除する - Life is very short をみて perl を使っていて、 ファイル名の変更にも対応していなくてポータブルではないと思ったので、 zsh の機能のみで実装してみました。

動作確認バージョン

  • zsh 5.0.2

実装

cdr の実装の中の chpwd_recent_add chpwd_recent_dirs chpwd_recent_filehandler の中を良くみてみると 引数なしで chpwd_recent_filehandler を呼び出すと $reply に配列でディレクトリ一覧を返してくれて、 引数を渡すとファイルに保存してくれるとわかりました。

そこで、その間で (N) を使って存在しないディレクトリを除外すれば良いということで 以下の実装になりました。 emulate -L zsh などは参考にした部分にあったので、そのまま使っています。

my-compact-chpwd-recent-dirs () {
    emulate -L zsh
    setopt extendedglob
    local -aU reply
    integer history_size
    autoload -Uz chpwd_recent_filehandler
    chpwd_recent_filehandler
    history_size=$#reply
    reply=(${^reply}(N))
    (( $history_size == $#reply )) || chpwd_recent_filehandler $reply
}

使い方としては

  • 必要に応じて手で my-compact-chpwd-recent-dirs を呼び出す
  • .zshrc から起動時に my-compact-chpwd-recent-dirs を実行
  • add-zsh-hook chpwd my-compact-chpwd-recent-dirs で毎回実行

などが考えられます。

pecoとcdrなどを組み合わせてみたときに、 peco に渡す前のところで (N-/) でフィルタリングしていたので、 個人的には必要に応じて手で呼び出す使い方にしようと思っています。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published