自作の cd 履歴管理が ~/VirtualBox VMs という空白入りのディレクトリ名の扱いに対応していなかったので、 せっかくなので独自で頑張るのは止めて、 cdr の履歴を使うことにしました。

さらに選択部分は peco と組み合わせて ghqcdpath にも対応してみました。

動作確認バージョン

  • peco 0.2.0
  • zsh 5.0.2

peco のインストール

Homebrew でインストールするなら brew install peco/peco/peco

brew tap peco/peco
brew install peco

です。

アンインストールは

brew uninstall peco
brew untap peco/peco

です。

go get でインストールするなら GOPATH を設定して go get github.com/peco/peco/cmd/peco です。 アンインストールは GOPATH にあるインストールされたファイルを消すしかなさそうです。

peco の設定

pecoを使い始めた - $shibayu36->blog; はいろいろキーバインドを設定していますが、 デフォルトのまま使っています。

zsh の設定

50peco.zshpeco-go-to-dir のように設定して M-g で使えるようにしました。

以下に該当部分を抜き出しておきます。

50peco.zsh:

if (( ${+commands[peco]} )); then
  peco-go-to-dir () {
    local line
    local selected="$(
      {
        (
          autoload -Uz chpwd_recent_filehandler
          chpwd_recent_filehandler && for line in $reply; do
            if [[ -d "$line" ]]; then
              echo "$line"
            fi
          done
        )
        ghq list --full-path
        for line in *(-/) ${^cdpath}/*(N-/); do echo "$line"; done | sort -u
      } | peco --query "$LBUFFER"
    )"
    if [ -n "$selected" ]; then
      BUFFER="cd ${(q)selected}"
      zle accept-line
    fi
    zle clear-screen
  }
  zle -N peco-go-to-dir
  bindkey '^[g' peco-go-to-dir
fi

まず (( ${+commands[peco]} ))peco コマンドの存在チェックをしています。 zsh スクリプトの中では type peco >/dev/null 2>&1 のようなチェック方法の代わりに使えます。

次にカレントディレクトリと $cdpath の処理に使っている line をローカル変数にしています。

次がメイン部分で

  1. cdr のディレクトリ一覧
  2. ghq のディレクトリ一覧
  3. カレントディレクトリと $cdpath の中のディレクトリ一覧

peco に渡して選択しています。 順番や何を選択肢に入れるかなどは好みで調節してください。

最後に参考にした記事と同じように、選択されていたら cd コマンドを実行しています。

空白ディレクトリ対応

selected=$()selected="$()" に変更するなど適切にクオートした上で、 さらに最後の cd コマンドに渡す部分では q という Parameter Expansion Flag (${(q)var} の部分) を使って 適切にエスケープしています。

Disqus Comments

Kazuhiro NISHIYAMA

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

znz znz


Published