zle .push-line-or-edit case $WIDGET in *-upward ) if [[ -o autocd ]]; then BUFFER='..' else BUFFER='cd ..' fi ;; *-backward ) if [[ -o pushdminus ]]; then BUFFER='pushd -1' else BUFFER='pushd +1' fi ;; *-forward ) if [[ -o pushdminus ]]; then BUFFER='pushd +0' else BUFFER='pushd -0' fi ;; * ) print -u2 'change-directory: widget name should end in -(up|back|for)ward' return 1 ;; esac zle .accept-line